20 import static info.globalcode.sql.dk.jmx.ConnectionManagement.incrementCounter; |
20 import static info.globalcode.sql.dk.jmx.ConnectionManagement.incrementCounter; |
21 import static info.globalcode.sql.dk.jmx.ConnectionManagement.resetCounter; |
21 import static info.globalcode.sql.dk.jmx.ConnectionManagement.resetCounter; |
22 import info.globalcode.sql.dk.batch.Batch; |
22 import info.globalcode.sql.dk.batch.Batch; |
23 import info.globalcode.sql.dk.batch.BatchException; |
23 import info.globalcode.sql.dk.batch.BatchException; |
24 import info.globalcode.sql.dk.configuration.DatabaseDefinition; |
24 import info.globalcode.sql.dk.configuration.DatabaseDefinition; |
|
25 import info.globalcode.sql.dk.configuration.Loader; |
25 import info.globalcode.sql.dk.configuration.Properties; |
26 import info.globalcode.sql.dk.configuration.Properties; |
26 import info.globalcode.sql.dk.configuration.Property; |
|
27 import info.globalcode.sql.dk.formatting.ColumnsHeader; |
27 import info.globalcode.sql.dk.formatting.ColumnsHeader; |
28 import info.globalcode.sql.dk.formatting.Formatter; |
28 import info.globalcode.sql.dk.formatting.Formatter; |
29 import info.globalcode.sql.dk.jmx.ConnectionManagement; |
29 import info.globalcode.sql.dk.jmx.ConnectionManagement; |
30 import info.globalcode.sql.dk.jmx.ConnectionManagement.COUNTER; |
30 import info.globalcode.sql.dk.jmx.ConnectionManagement.COUNTER; |
31 import java.sql.Connection; |
31 import java.sql.Connection; |
32 import java.sql.DriverManager; |
|
33 import java.sql.PreparedStatement; |
32 import java.sql.PreparedStatement; |
34 import java.sql.ResultSet; |
33 import java.sql.ResultSet; |
35 import java.sql.SQLException; |
34 import java.sql.SQLException; |
36 import java.sql.SQLWarning; |
35 import java.sql.SQLWarning; |
37 import java.util.logging.Level; |
36 import java.util.logging.Level; |
47 * @author Ing. František Kučera (frantovo.cz) |
46 * @author Ing. František Kučera (frantovo.cz) |
48 */ |
47 */ |
49 public class DatabaseConnection implements AutoCloseable { |
48 public class DatabaseConnection implements AutoCloseable { |
50 |
49 |
51 private static final Logger log = Logger.getLogger(DatabaseConnection.class.getName()); |
50 private static final Logger log = Logger.getLogger(DatabaseConnection.class.getName()); |
52 private static final String JDBC_PROPERTY_USER = "user"; |
51 public static final String JDBC_PROPERTY_USER = "user"; |
53 public static final String JDBC_PROPERTY_PASSWORD = "password"; |
52 public static final String JDBC_PROPERTY_PASSWORD = "password"; |
54 private final DatabaseDefinition databaseDefinition; |
53 private final DatabaseDefinition databaseDefinition; |
55 private final Connection connection; |
54 private final Connection connection; |
56 private final Properties properties; |
55 private final Properties properties; |
57 /** |
56 /** |
69 */ |
68 */ |
70 public DatabaseConnection(DatabaseDefinition databaseDefinition, Properties properties, ConnectionManagement connectionMBean) throws SQLException { |
69 public DatabaseConnection(DatabaseDefinition databaseDefinition, Properties properties, ConnectionManagement connectionMBean) throws SQLException { |
71 this.databaseDefinition = databaseDefinition; |
70 this.databaseDefinition = databaseDefinition; |
72 this.properties = properties; |
71 this.properties = properties; |
73 this.connectionMBean = connectionMBean; |
72 this.connectionMBean = connectionMBean; |
74 |
73 this.connection = Loader.jdbcConnect(databaseDefinition, properties); |
75 if (properties.hasProperty(JDBC_PROPERTY_PASSWORD)) { |
|
76 log.log(Level.WARNING, "Passing DB password as CLI parameter is insecure!"); |
|
77 } |
|
78 |
|
79 Properties credentials = new Properties(); |
|
80 credentials.add(new Property(JDBC_PROPERTY_USER, databaseDefinition.getUserName())); |
|
81 credentials.add(new Property(JDBC_PROPERTY_PASSWORD, databaseDefinition.getPassword())); |
|
82 credentials.setDefaults(databaseDefinition.getProperties()); |
|
83 properties.setDefaults(credentials); |
|
84 java.util.Properties javaProperties = properties.getJavaProperties(); |
|
85 |
|
86 connection = DriverManager.getConnection(databaseDefinition.getUrl(), javaProperties); |
|
87 } |
74 } |
88 |
75 |
89 public void executeQuery(SQLCommand sqlCommand, Formatter formatter) throws SQLException { |
76 public void executeQuery(SQLCommand sqlCommand, Formatter formatter) throws SQLException { |
90 formatter.writeStartBatch(); |
77 formatter.writeStartBatch(); |
91 formatter.writeStartDatabase(databaseDefinition); |
78 formatter.writeStartDatabase(databaseDefinition); |
114 } |
101 } |
115 |
102 |
116 private void processCommand(SQLCommand sqlCommand, Formatter formatter) throws SQLException { |
103 private void processCommand(SQLCommand sqlCommand, Formatter formatter) throws SQLException { |
117 incrementCounter(connectionMBean, COUNTER.COMMAND); |
104 incrementCounter(connectionMBean, COUNTER.COMMAND); |
118 resetCounter(connectionMBean, COUNTER.RECORD_CURRENT); |
105 resetCounter(connectionMBean, COUNTER.RECORD_CURRENT); |
119 |
106 |
120 try (PreparedStatement ps = sqlCommand.prepareStatement(connection)) { |
107 try (PreparedStatement ps = sqlCommand.prepareStatement(connection)) { |
121 log.log(Level.FINE, "Statement prepared"); |
108 log.log(Level.FINE, "Statement prepared"); |
122 sqlCommand.parametrize(ps); |
109 sqlCommand.parametrize(ps); |
123 |
110 |
124 boolean isRS = ps.execute(); |
111 boolean isRS = ps.execute(); |
155 int columnCount = rs.getMetaData().getColumnCount(); |
142 int columnCount = rs.getMetaData().getColumnCount(); |
156 |
143 |
157 while (rs.next()) { |
144 while (rs.next()) { |
158 incrementCounter(connectionMBean, COUNTER.RECORD_CURRENT); |
145 incrementCounter(connectionMBean, COUNTER.RECORD_CURRENT); |
159 incrementCounter(connectionMBean, COUNTER.RECORD_TOTAL); |
146 incrementCounter(connectionMBean, COUNTER.RECORD_TOTAL); |
160 |
147 |
161 formatter.writeStartRow(); |
148 formatter.writeStartRow(); |
162 |
149 |
163 for (int i = 1; i <= columnCount; i++) { |
150 for (int i = 1; i <= columnCount; i++) { |
164 formatter.writeColumnValue(rs.getObject(i)); |
151 formatter.writeColumnValue(rs.getObject(i)); |
165 } |
152 } |