15 * You should have received a copy of the GNU General Public License |
15 * You should have received a copy of the GNU General Public License |
16 * along with this program. If not, see <http://www.gnu.org/licenses/>. |
16 * along with this program. If not, see <http://www.gnu.org/licenses/>. |
17 */ |
17 */ |
18 package info.globalcode.sql.dk; |
18 package info.globalcode.sql.dk; |
19 |
19 |
|
20 import info.globalcode.sql.dk.batch.Batch; |
20 import info.globalcode.sql.dk.configuration.DatabaseDefinition; |
21 import info.globalcode.sql.dk.configuration.DatabaseDefinition; |
|
22 import info.globalcode.sql.dk.formatting.Formatter; |
21 import java.sql.Connection; |
23 import java.sql.Connection; |
22 import java.sql.DriverManager; |
24 import java.sql.DriverManager; |
|
25 import java.sql.PreparedStatement; |
|
26 import java.sql.ResultSet; |
23 import java.sql.SQLException; |
27 import java.sql.SQLException; |
24 |
28 |
25 /** |
29 /** |
26 * |
30 * |
27 * @author Ing. František Kučera (frantovo.cz) |
31 * @author Ing. František Kučera (frantovo.cz) |
34 public DatabaseConnection(DatabaseDefinition databaseDefinition) throws SQLException { |
38 public DatabaseConnection(DatabaseDefinition databaseDefinition) throws SQLException { |
35 this.databaseDefinition = databaseDefinition; |
39 this.databaseDefinition = databaseDefinition; |
36 |
40 |
37 connection = DriverManager.getConnection(databaseDefinition.getUrl(), databaseDefinition.getName(), databaseDefinition.getPassword()); |
41 connection = DriverManager.getConnection(databaseDefinition.getUrl(), databaseDefinition.getName(), databaseDefinition.getPassword()); |
38 } |
42 } |
|
43 |
|
44 public void executeQuery(SQLCommand sqlCommand, Formatter formatter) throws SQLException { |
|
45 formatter.writeStartDatabase(databaseDefinition); |
|
46 processCommand(sqlCommand, formatter); |
|
47 formatter.writeEndDatabase(); |
|
48 } |
|
49 |
|
50 public void executeBatch(Batch batch, Formatter formatter) throws SQLException { |
|
51 formatter.writeStartDatabase(databaseDefinition); |
|
52 while (batch.hasNext()) { |
|
53 processCommand(batch.next(), formatter); |
|
54 } |
|
55 formatter.writeEndDatabase(); |
|
56 } |
|
57 |
|
58 private void processCommand(SQLCommand sqlCommand, Formatter formatter) throws SQLException { |
|
59 SQLCommand.COMMAND_TYPE commandType = sqlCommand.getCommandType(); |
|
60 switch (commandType) { |
|
61 case QUERY: |
|
62 processQueryCommand(sqlCommand, formatter); |
|
63 break; |
|
64 case UPDATE: |
|
65 processUpdateCommand(sqlCommand, formatter); |
|
66 break; |
|
67 default: |
|
68 throw new IllegalArgumentException("Unexpected command type: " + commandType); |
|
69 } |
|
70 } |
|
71 |
|
72 private void processQueryCommand(SQLCommand sqlCommand, Formatter formatter) throws SQLException { |
|
73 formatter.writeStartResultSet(); |
|
74 formatter.writeQuery(sqlCommand.getQuery()); |
|
75 /** TODO: formatter.writeParameters(null); */ |
|
76 try (PreparedStatement ps = sqlCommand.prepareStatement(connection)) { |
|
77 sqlCommand.parametrize(ps); |
|
78 try (ResultSet rs = ps.executeQuery()) { |
|
79 processResultSet(rs, formatter); |
|
80 } |
|
81 } |
|
82 |
|
83 formatter.writeEndResultSet(); |
|
84 } |
|
85 |
|
86 private void processUpdateCommand(SQLCommand sqlCommand, Formatter formatter) throws SQLException { |
|
87 formatter.writeStartUpdatesResult(); |
|
88 formatter.writeQuery(sqlCommand.getQuery()); |
|
89 /** TODO: formatter.writeParameters(null); */ |
|
90 try (PreparedStatement ps = sqlCommand.prepareStatement(connection)) { |
|
91 sqlCommand.parametrize(ps); |
|
92 int updatedRowsCount = ps.executeUpdate(); |
|
93 formatter.writeUpdatedRowsCount(updatedRowsCount); |
|
94 |
|
95 formatter.writeStartGeneratedKeys(); |
|
96 try (ResultSet rs = ps.getGeneratedKeys()) { |
|
97 processResultSet(rs, formatter); |
|
98 } |
|
99 formatter.writeEndGeneratedKeys(); |
|
100 |
|
101 } |
|
102 |
|
103 formatter.writeEndUpdatesResult(); |
|
104 } |
|
105 |
|
106 private void processResultSet(ResultSet rs, Formatter formatter) throws SQLException { |
|
107 /** TODO: formatter.writeColumnsHeader(null); */ |
|
108 while (rs.next()) { |
|
109 formatter.writeStartRow(); |
|
110 |
|
111 /** TODO: formatter.writeColumnValue(rs.get); */ |
|
112 formatter.writeEndRow(); |
|
113 } |
|
114 } |
39 } |
115 } |