X-Git-Url: http://git.phpeclipse.com diff --git a/archive/net.sourceforge.phpeclipse.quantum.sql/src/com/quantum/model/Database.java b/archive/net.sourceforge.phpeclipse.quantum.sql/src/com/quantum/model/Database.java index cdc3501..058c48d 100644 --- a/archive/net.sourceforge.phpeclipse.quantum.sql/src/com/quantum/model/Database.java +++ b/archive/net.sourceforge.phpeclipse.quantum.sql/src/com/quantum/model/Database.java @@ -5,6 +5,7 @@ import java.sql.DatabaseMetaData; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; +import java.util.Collection; import java.util.Collections; import java.util.HashSet; import java.util.List; @@ -36,10 +37,16 @@ public class Database { private static final int TYPE_INFO_METADATA_TYPE_NAME = 1; private static final int TYPE_INFO_METADATA_DATA_TYPE = 2; + private static final int TYPE_INFO_METADATA_PRECISION = 3; + private static final int TYPE_INFO_METADATA_LITERAL_PREFIX = 4; + private static final int TYPE_INFO_METADATA_LITERAL_SUFFIX = 5; + private static final int TYPE_INFO_METADATA_CREATE_PARMS = 6; private DatabaseAdapter databaseAdapter; private Bookmark bookmark; + private List entityTypes; + public Database(Bookmark bookmark) { this.bookmark = bookmark; this.databaseAdapter = bookmark.getAdapter(); @@ -61,9 +68,13 @@ public class Database { } } - public String[] getEntityTypes() + public synchronized String[] getEntityTypes() throws NotConnectedException, SQLException { - return getEntityTypes(this.bookmark.getConnection()); + if (this.entityTypes == null) { + Collection collection = initializeEntityTypes(this.bookmark.getConnection()); + this.entityTypes = Collections.synchronizedList(new ArrayList(collection)); + } + return (String[]) this.entityTypes.toArray(new String[this.entityTypes.size()]); } public String getUsername() throws NotConnectedException, SQLException { @@ -72,7 +83,7 @@ public class Database { /** - *

This method returns a list of entity types supported by the database + *

This method returns a set of entity types supported by the database * adapter. This list will always be limited to Tables, Views and * Sequences.

* @@ -81,10 +92,10 @@ public class Database { * Tables, Views and Sequences.

* * @param connection - * @return + * @return a set of Strings, typically "TABLE", "VIEW", and "SEQUENCE" * @throws SQLException */ - public String[] getEntityTypes(Connection connection) throws SQLException { + private Set initializeEntityTypes(Connection connection) throws SQLException { Set set = new HashSet(); if (this.databaseAdapter.getShowTableQuery(this.bookmark.getUsername()) != null) { @@ -107,8 +118,7 @@ public class Database { set.add(type); } } - - return (String[]) set.toArray(new String[set.size()]); + return set; } public String getInformation() throws SQLException { @@ -165,30 +175,8 @@ public class Database { protected List getEntitiesList(Bookmark bookmark, Connection connection, String type, Schema schema) throws SQLException { - String sql = getSQL(bookmark, type, schema); List list = new ArrayList(); - SQLResultSetResults results = null; - if (sql != null) { - results = (SQLResultSetResults) MultiSQLServer.getInstance().execute( - bookmark, connection, sql, Integer.MAX_VALUE); - for (int i = 1, size = (results == null) ? 0 : results.getRowCount(); i <= size; i++) { - String schemaName = results.getColumnCount() == 1 - ? schema.getName() : results.getElement(1, i).toString(); - String tableName = results.getColumnCount() == 1 - ? results.getElement(1, i).toString() - : results.getElement(2, i).toString(); - if (tableName != null && tableName.length() > 0) { - Entity entity = EntityFactory.getInstance().create( - bookmark, schemaName, tableName, type); - if (entity != null) { - list.add(entity); - } - } - } - } - // If we have some results, we go back - if (results != null) return list; - // Else, we try the JDBC driver + // We try first the JDBC driver DatabaseMetaData metaData = connection.getMetaData(); // getTables needs a null schema to get all the schemas. So we don't pass a "" schema, but a null one ResultSet set = null; @@ -212,6 +200,38 @@ public class Database { } } set.close(); + // If we have some results, then the JDBC driver is working, + // so we return the results and quit + if (list.size() > 0) + return list; + + + // If no results, we check also the sql query to get the list of entities + SQLResultSetResults results = null; + // Get the proper sql query to the appropiate type of entity + String sql = getSQL(bookmark, type, schema); + // If nothing returned, too bad, it seems there is no sql query for that database and entity type + if (sql != null) { + results = (SQLResultSetResults) MultiSQLServer.getInstance().execute( + bookmark, connection, sql, Integer.MAX_VALUE); + for (int i = 1, size = (results == null) ? 0 : results.getRowCount(); i <= size; i++) { + String schemaName = results.getColumnCount() == 1 + ? schema.getName() : results.getElement(1, i).toString(); + if (schemaName != null) { + schemaName = schemaName.trim(); + } + String tableName = results.getColumnCount() == 1 + ? results.getElement(1, i).toString() + : results.getElement(2, i).toString(); + if (tableName != null && tableName.length() > 0) { + Entity entity = EntityFactory.getInstance().create( + bookmark, schemaName, tableName, type); + if (entity != null) { + list.add(entity); + } + } + } + } return list; } @@ -221,9 +241,14 @@ public class Database { ResultSet results = metaData.getTypeInfo(); try { while (results.next()) { - String name = results.getString(TYPE_INFO_METADATA_TYPE_NAME); - int type = results.getInt(TYPE_INFO_METADATA_DATA_TYPE); - list.add(new DataType(type, name)); + list.add(new DataType( + results.getInt(TYPE_INFO_METADATA_DATA_TYPE), + results.getString(TYPE_INFO_METADATA_TYPE_NAME), + results.getInt(TYPE_INFO_METADATA_PRECISION), + results.getString(TYPE_INFO_METADATA_LITERAL_PREFIX), + results.getString(TYPE_INFO_METADATA_LITERAL_SUFFIX), + results.getString(TYPE_INFO_METADATA_CREATE_PARMS) + )); } } finally { results.close(); @@ -313,15 +338,18 @@ public class Database { public Schema[] getSchemas() throws NotConnectedException, SQLException { DatabaseMetaData metaData = getMetaData(); List list = new ArrayList(); - ResultSet resultSet = metaData.getSchemas(); - try { - while (resultSet.next()) { - String schemaName = resultSet.getString("TABLE_SCHEM"); - list.add(new Schema(schemaName)); + + if (metaData.supportsSchemasInTableDefinitions()) { + ResultSet resultSet = metaData.getSchemas(); + try { + while (resultSet.next()) { + String schemaName = resultSet.getString("TABLE_SCHEM"); + list.add(new Schema(schemaName)); + } + } finally { + resultSet.close(); } - return (Schema[]) list.toArray(new Schema[list.size()]); - } finally { - resultSet.close(); } + return (Schema[]) list.toArray(new Schema[list.size()]); } }