package com.totvslabs.mdm.client.util;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import com.totvslabs.mdm.client.pojo.JDBCConnectionParameter;
import com.totvslabs.mdm.client.pojo.JDBCDatabaseVO;
import com.totvslabs.mdm.client.pojo.JDBCFieldVO;
import com.totvslabs.mdm.client.pojo.JDBCTableVO;
public class JDBCConnectionFactory {
private static Connection getJDBCConnection(String url, String user, String password) {
Connection connection = null;
Properties connectionProps = new Properties();
connectionProps.put("user", user);
connectionProps.put("password", password);
try {
connection = DriverManager.getConnection(url, connectionProps);
} catch (SQLException e1) {
e1.printStackTrace();
}
return connection;
}
public static Integer getTotalRecords(JDBCConnectionParameter param, JDBCTableVO tableVO) {
StringBuffer sql = new StringBuffer();
sql.append("SELECT count(*) FROM ");
sql.append(tableVO.getName());
Connection connection = JDBCConnectionFactory.getJDBCConnection(param.getUrl(), param.getUser(), param.getPassword());
Integer totalRecords = 0;
try {
Statement st = null;
try {
st = connection.createStatement();
ResultSet rs = st.executeQuery(sql.toString());
while(rs.next()) {
totalRecords = rs.getInt(1);
}
if(rs != null) {
rs.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
finally {
if(st != null) {
try {
st.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
finally {
try {
if(connection != null) {
connection.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
return totalRecords;
}
public static JsonArray loadData(JDBCConnectionParameter param, JDBCTableVO tableVO, int initialRecord, int quantity) {
JsonArray jsonRecords = new JsonArray();
StringBuffer sql = new StringBuffer();
sql.append("SELECT * FROM ");
sql.append(tableVO.getName());
Connection connection = JDBCConnectionFactory.getJDBCConnection(param.getUrl(), param.getUser(), param.getPassword());
try {
Statement st = null;
try {
st = connection.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
ResultSet rs = st.executeQuery(sql.toString());
ResultSetMetaData metaData = rs.getMetaData();
int columnCount = metaData.getColumnCount();
int totalRecordsLoaded = 0;
if(quantity > 0) {
st.setMaxRows(quantity);
}
if(initialRecord > 0) {
rs.absolute(initialRecord);
}
while(rs.next() && (quantity == 0 || (quantity != totalRecordsLoaded))) {
JsonObject jsonRecord = new JsonObject();
for(int i=1; i<=columnCount; i++) {
String columnName = metaData.getColumnName(i);
jsonRecord.addProperty(columnName, rs.getString(i));
}
jsonRecords.add(jsonRecord);
totalRecordsLoaded++;
}
if(rs != null) {
rs.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
finally {
if(st != null) {
try {
st.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
finally {
try {
if(connection != null) {
connection.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
return jsonRecords;
}
public static JsonArray loadData(JDBCConnectionParameter param, JDBCTableVO tableVO) {
return loadData(param, tableVO, 0, 0);
}
public static void loadFisicModelFields(String url, String user, String password, JDBCTableVO tableVO) {
StringBuffer sql = new StringBuffer();
sql.append("SELECT * FROM ");
sql.append(tableVO.getName());
sql.append(" WHERE 1=0 ");
Connection connection = JDBCConnectionFactory.getJDBCConnection(url, user, password);
try {
Statement st = null;
try {
st = connection.createStatement();
ResultSet rs = st.executeQuery(sql.toString());
ResultSetMetaData metaData = rs.getMetaData();
int columnCount = metaData.getColumnCount();
for(int i=1; i<=columnCount; i++) {
String columnName = metaData.getColumnName(i);
String columnClassName = metaData.getColumnClassName(i);
int precision = metaData.getPrecision(i);
columnName = columnName.toUpperCase();
JDBCFieldVO fieldVO = new JDBCFieldVO();
fieldVO.setName(columnName);
fieldVO.setSize(Double.parseDouble(Integer.toString(precision)));
fieldVO.setType(columnClassName);
tableVO.getFields().add(fieldVO);
}
if(rs != null) {
rs.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
finally {
if(st != null) {
try {
st.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
finally {
try {
if(connection != null) {
connection.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public static JDBCDatabaseVO loadFisicModelTables(String url, String user, String password) {
Connection connection = JDBCConnectionFactory.getJDBCConnection(url, user, password);
JDBCDatabaseVO databaseByFisicModelVO = new JDBCDatabaseVO();
if(connection == null) {
return null;
}
try {
ResultSet tables = connection.getMetaData().getTables(null, "%", "%", new String[] { "TABLE" });
while (tables.next()) {
String databaseName = tables.getString("TABLE_CAT");
String tableName = tables.getString("TABLE_NAME");
tableName = tableName.toLowerCase();
databaseByFisicModelVO.setName(databaseName);
JDBCTableVO tableVO = new JDBCTableVO(tableName);
databaseByFisicModelVO.addTable(tableVO);
}
tables.close();
connection.close();
} catch (SQLException e) {
System.err.println("Error getting all entities from JDBC Database...");
e.printStackTrace();
}
return databaseByFisicModelVO;
}
}