diff -r 57c44a6baedb -r d66858b4b563 java/sql-dk/src/info/globalcode/sql/dk/DatabaseConnection.java --- a/java/sql-dk/src/info/globalcode/sql/dk/DatabaseConnection.java Sat Dec 21 22:22:30 2013 +0100 +++ b/java/sql-dk/src/info/globalcode/sql/dk/DatabaseConnection.java Sun Dec 22 18:19:38 2013 +0100 @@ -17,9 +17,13 @@ */ package info.globalcode.sql.dk; +import info.globalcode.sql.dk.batch.Batch; import info.globalcode.sql.dk.configuration.DatabaseDefinition; +import info.globalcode.sql.dk.formatting.Formatter; import java.sql.Connection; import java.sql.DriverManager; +import java.sql.PreparedStatement; +import java.sql.ResultSet; import java.sql.SQLException; /** @@ -36,4 +40,76 @@ connection = DriverManager.getConnection(databaseDefinition.getUrl(), databaseDefinition.getName(), databaseDefinition.getPassword()); } + + public void executeQuery(SQLCommand sqlCommand, Formatter formatter) throws SQLException { + formatter.writeStartDatabase(databaseDefinition); + processCommand(sqlCommand, formatter); + formatter.writeEndDatabase(); + } + + public void executeBatch(Batch batch, Formatter formatter) throws SQLException { + formatter.writeStartDatabase(databaseDefinition); + while (batch.hasNext()) { + processCommand(batch.next(), formatter); + } + formatter.writeEndDatabase(); + } + + private void processCommand(SQLCommand sqlCommand, Formatter formatter) throws SQLException { + SQLCommand.COMMAND_TYPE commandType = sqlCommand.getCommandType(); + switch (commandType) { + case QUERY: + processQueryCommand(sqlCommand, formatter); + break; + case UPDATE: + processUpdateCommand(sqlCommand, formatter); + break; + default: + throw new IllegalArgumentException("Unexpected command type: " + commandType); + } + } + + private void processQueryCommand(SQLCommand sqlCommand, Formatter formatter) throws SQLException { + formatter.writeStartResultSet(); + formatter.writeQuery(sqlCommand.getQuery()); + /** TODO: formatter.writeParameters(null); */ + try (PreparedStatement ps = sqlCommand.prepareStatement(connection)) { + sqlCommand.parametrize(ps); + try (ResultSet rs = ps.executeQuery()) { + processResultSet(rs, formatter); + } + } + + formatter.writeEndResultSet(); + } + + private void processUpdateCommand(SQLCommand sqlCommand, Formatter formatter) throws SQLException { + formatter.writeStartUpdatesResult(); + formatter.writeQuery(sqlCommand.getQuery()); + /** TODO: formatter.writeParameters(null); */ + try (PreparedStatement ps = sqlCommand.prepareStatement(connection)) { + sqlCommand.parametrize(ps); + int updatedRowsCount = ps.executeUpdate(); + formatter.writeUpdatedRowsCount(updatedRowsCount); + + formatter.writeStartGeneratedKeys(); + try (ResultSet rs = ps.getGeneratedKeys()) { + processResultSet(rs, formatter); + } + formatter.writeEndGeneratedKeys(); + + } + + formatter.writeEndUpdatesResult(); + } + + private void processResultSet(ResultSet rs, Formatter formatter) throws SQLException { + /** TODO: formatter.writeColumnsHeader(null); */ + while (rs.next()) { + formatter.writeStartRow(); + + /** TODO: formatter.writeColumnValue(rs.get); */ + formatter.writeEndRow(); + } + } }