java/sql-dk/src/info/globalcode/sql/dk/DatabaseConnection.java
branchv_0
changeset 29 d66858b4b563
parent 28 57c44a6baedb
child 34 9335cf31c0f2
--- 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();
+		}
+	}
 }