/*
* JDBCMetadata.java
*
* Created on June 6, 2007, 10:47 AM
*
* CodaServer and related original technologies are copyright 2008, 18th Street Software, LLC.
*
* Permission to use them is granted under the terms of the GNU GPLv2.
*/
package org.codalang.codaserver.database;
import java.sql.*;
import java.util.Vector;
/**
*
* @author michaelarace
*/
public class JDBCMetadata implements CodaDatabaseMetadata {
Connection conn;
/** Creates a new instance of JDBCMetadata */
public JDBCMetadata(Connection conn) {
this.conn = conn;
}
public String[] getTables() {
try {
DatabaseMetaData metadata = conn.getMetaData();
ResultSet rs = metadata.getTables(null, "PUBLIC", null, null);
Vector<String> retval = new Vector();
while(rs.next()) {
retval.add(rs.getString("TABLE_NAME").toUpperCase());
}
return retval.toArray(new String[retval.size()]);
} catch (SQLException ex) {
return new String[0];
}
}
public ColumnDefinition[] getColumnsForTable(String tableName) {
try {
Vector<ColumnDefinition> retvalTemp = new Vector<ColumnDefinition>();
DatabaseMetaData metadata = conn.getMetaData();
ResultSet rs = metadata.getColumns(null, null, tableName.toLowerCase(), null);
while(rs.next()) {
retvalTemp.add(new ColumnDefinition(rs.getString("COLUMN_NAME").toUpperCase(), rs.getInt("DATA_TYPE"), (rs.getInt("NULLABLE") == DatabaseMetaData.columnNullable)));
}
return retvalTemp.toArray(new ColumnDefinition[retvalTemp.size()]);
} catch (SQLException ex) {
return new ColumnDefinition[0];
}
}
public boolean isTable(String tableName) {
try {
String [] retval = new String[0];
DatabaseMetaData metadata = conn.getMetaData();
ResultSet rs = metadata.getTables(null, null, tableName.toUpperCase(), null);
if (rs.next()) {
return true;
} else {
return false;
}
} catch (SQLException ex) {
return false;
}
}
public boolean isColumn(String tableName, String columnName) {
try {
String [] retval = new String[0];
DatabaseMetaData metadata = conn.getMetaData();
ResultSet rs = metadata.getColumns(null, null, tableName.toUpperCase(), columnName.toUpperCase());
if (rs.next()) {
return true;
} else {
return false;
}
} catch (SQLException ex) {
return false;
}
}
public boolean isColumnDefinition(String tableName, ColumnDefinition definition) {
try {
String [] retval = new String[0];
DatabaseMetaData metadata = conn.getMetaData();
ResultSet rs = metadata.getColumns(null, null, tableName.toUpperCase(), definition.getName().toUpperCase());
if (rs.next()) {
if (definition.getName().toUpperCase().equals(rs.getString("COLUMN_NAME").toUpperCase()) && definition.getSqlType() == rs.getInt("COLUMN_TYPE") && definition.getNullable() == (rs.getInt("NULLABLE") == DatabaseMetaData.columnNullable)) {
return true;
} else {
return false;
}
} else {
return false;
}
} catch (SQLException ex) {
return false;
}
}
public boolean doTablesExist(CodaTable[] tables) {
boolean retval = true;
for (int i = 0; i < tables.length; i++) {
if (retval) {
ColumnDefinition[] tempColumnDefinitions = tables[i].getColumnDefinitions();
for (int j = 0; j < tempColumnDefinitions.length; j++) {
if (retval) {
if (!isColumnDefinition(tables[i].getTableName(), tempColumnDefinitions[j])) {
retval = false;
}
}
}
}
}
return retval;
}
public CodaSystemTable getSystemTable() {
try {
boolean codaServerFlag = false;
long revisionId = 0, refTableRevisionId = 0;
String applicationName = "", prefixString = "";
float codaFormatVersion = 1;
Statement sql = conn.createStatement();
ResultSet rs = sql.executeQuery("select system_property, system_value from coda_system_information");
while(rs.next()) {
if (rs.getString(1).toUpperCase().equals("REVISION_ID")) {
revisionId = rs.getLong(2);
} else if (rs.getString(1).toUpperCase().equals("REF_TABLE_REVISION_ID")) {
refTableRevisionId = rs.getLong(2);
} else if (rs.getString(1).toUpperCase().equals("APPLICATION_NAME")) {
applicationName = rs.getString(2);
} else if (rs.getString(1).toUpperCase().equals("PREFIX")) {
prefixString = rs.getString(2);
} else if (rs.getString(1).toUpperCase().equals("FORMAT_VERSION")) {
codaFormatVersion = rs.getFloat(2);
} else if (rs.getString(1).toUpperCase().equals("CODA_SERVER")) {
codaServerFlag = rs.getString(2).toUpperCase().equals("TRUE");
}
}
return new CodaSystemTable(codaServerFlag, revisionId, refTableRevisionId, applicationName, prefixString, codaFormatVersion);
} catch (Exception e) {
return null;
}
}
public int getMaxTableNameLength() {
try {
return conn.getMetaData().getMaxTableNameLength();
} catch (SQLException ex) {
return 30;
}
}
public int getMaxColumnNameLength() {
try {
return conn.getMetaData().getMaxColumnNameLength();
} catch (SQLException ex) {
return 30;
}
}
public int getMaxSchemaNameLength() {
try {
return conn.getMetaData().getMaxSchemaNameLength();
} catch (SQLException ex) {
return 30;
}
}
}