1.1 --- a/java/sql-dk/src/info/globalcode/sql/dk/DatabaseConnection.java Sat Dec 21 22:22:30 2013 +0100
1.2 +++ b/java/sql-dk/src/info/globalcode/sql/dk/DatabaseConnection.java Sun Dec 22 18:19:38 2013 +0100
1.3 @@ -17,9 +17,13 @@
1.4 */
1.5 package info.globalcode.sql.dk;
1.6
1.7 +import info.globalcode.sql.dk.batch.Batch;
1.8 import info.globalcode.sql.dk.configuration.DatabaseDefinition;
1.9 +import info.globalcode.sql.dk.formatting.Formatter;
1.10 import java.sql.Connection;
1.11 import java.sql.DriverManager;
1.12 +import java.sql.PreparedStatement;
1.13 +import java.sql.ResultSet;
1.14 import java.sql.SQLException;
1.15
1.16 /**
1.17 @@ -36,4 +40,76 @@
1.18
1.19 connection = DriverManager.getConnection(databaseDefinition.getUrl(), databaseDefinition.getName(), databaseDefinition.getPassword());
1.20 }
1.21 +
1.22 + public void executeQuery(SQLCommand sqlCommand, Formatter formatter) throws SQLException {
1.23 + formatter.writeStartDatabase(databaseDefinition);
1.24 + processCommand(sqlCommand, formatter);
1.25 + formatter.writeEndDatabase();
1.26 + }
1.27 +
1.28 + public void executeBatch(Batch batch, Formatter formatter) throws SQLException {
1.29 + formatter.writeStartDatabase(databaseDefinition);
1.30 + while (batch.hasNext()) {
1.31 + processCommand(batch.next(), formatter);
1.32 + }
1.33 + formatter.writeEndDatabase();
1.34 + }
1.35 +
1.36 + private void processCommand(SQLCommand sqlCommand, Formatter formatter) throws SQLException {
1.37 + SQLCommand.COMMAND_TYPE commandType = sqlCommand.getCommandType();
1.38 + switch (commandType) {
1.39 + case QUERY:
1.40 + processQueryCommand(sqlCommand, formatter);
1.41 + break;
1.42 + case UPDATE:
1.43 + processUpdateCommand(sqlCommand, formatter);
1.44 + break;
1.45 + default:
1.46 + throw new IllegalArgumentException("Unexpected command type: " + commandType);
1.47 + }
1.48 + }
1.49 +
1.50 + private void processQueryCommand(SQLCommand sqlCommand, Formatter formatter) throws SQLException {
1.51 + formatter.writeStartResultSet();
1.52 + formatter.writeQuery(sqlCommand.getQuery());
1.53 + /** TODO: formatter.writeParameters(null); */
1.54 + try (PreparedStatement ps = sqlCommand.prepareStatement(connection)) {
1.55 + sqlCommand.parametrize(ps);
1.56 + try (ResultSet rs = ps.executeQuery()) {
1.57 + processResultSet(rs, formatter);
1.58 + }
1.59 + }
1.60 +
1.61 + formatter.writeEndResultSet();
1.62 + }
1.63 +
1.64 + private void processUpdateCommand(SQLCommand sqlCommand, Formatter formatter) throws SQLException {
1.65 + formatter.writeStartUpdatesResult();
1.66 + formatter.writeQuery(sqlCommand.getQuery());
1.67 + /** TODO: formatter.writeParameters(null); */
1.68 + try (PreparedStatement ps = sqlCommand.prepareStatement(connection)) {
1.69 + sqlCommand.parametrize(ps);
1.70 + int updatedRowsCount = ps.executeUpdate();
1.71 + formatter.writeUpdatedRowsCount(updatedRowsCount);
1.72 +
1.73 + formatter.writeStartGeneratedKeys();
1.74 + try (ResultSet rs = ps.getGeneratedKeys()) {
1.75 + processResultSet(rs, formatter);
1.76 + }
1.77 + formatter.writeEndGeneratedKeys();
1.78 +
1.79 + }
1.80 +
1.81 + formatter.writeEndUpdatesResult();
1.82 + }
1.83 +
1.84 + private void processResultSet(ResultSet rs, Formatter formatter) throws SQLException {
1.85 + /** TODO: formatter.writeColumnsHeader(null); */
1.86 + while (rs.next()) {
1.87 + formatter.writeStartRow();
1.88 +
1.89 + /** TODO: formatter.writeColumnValue(rs.get); */
1.90 + formatter.writeEndRow();
1.91 + }
1.92 + }
1.93 }