java/sql-dk/src/info/globalcode/sql/dk/DatabaseConnection.java
branchv_0
changeset 192 a32bfcbdee51
parent 179 236332caeb29
child 229 7699133f5a01
equal deleted inserted replaced
191:862d0a8747ac 192:a32bfcbdee51
    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 			}