import java.util.List;
import java.util.Map;
+import com.quantum.adapters.AdapterFactory;
import com.quantum.adapters.DatabaseAdapter;
+import com.quantum.sql.MultiSQLServer;
+import com.quantum.sql.SQLMetaDataResults;
+import com.quantum.util.sql.SQLStates;
/**
* This class models a table or view.
}
public Column[] getColumns() throws NotConnectedException, SQLException {
- Map temp = new HashMap();
Connection connection = this.bookmark.getConnection();
- DatabaseMetaData metaData = connection.getMetaData();
- ResultSet resultSet = metaData.getColumns(null, getSchema(), getName(), null);
try {
- while (resultSet.next()) {
- ColumnImpl column = new ColumnImpl(
- this,
- resultSet.getString(COLUMN_METADATA_COLUMN_NAME),
- resultSet.getString(COLUMN_METATDATA_TYPE_NAME),
- resultSet.getInt(COLUMN_METATDATA_DATA_TYPE),
- resultSet.getInt(COLUMN_METADATA_COLUMN_SIZE),
- resultSet.getInt(COLUMN_METADATA_DECIMAL_DIGITS),
- "YES".equalsIgnoreCase(resultSet.getString(COLUMN_METADATA_IS_NULLABLE)),
- resultSet.getInt(COLUMN_METADATA_ORDINAL_POSITION),
+ return getColumnsFromMetaData(connection);
+ } catch (SQLException e) {
+ if (SQLStates.ODBC_DRIVER_NOT_CAPABLE.equals(e.getSQLState())
+ && AdapterFactory.JDBC_ODBC_BRIDGE.equals(
+ getBookmark().getJDBCDriver().getType())) {
+ return getColumnsFromQuery(connection);
+ } else {
+ throw e;
+ }
+ }
+
+ }
+
+ /**
+ * @param connection
+ * @return
+ * @throws SQLException
+ */
+ private Column[] getColumnsFromMetaData(Connection connection) throws SQLException {
+ Map temp = new HashMap();
+ DatabaseMetaData metaData = connection.getMetaData();
+ ResultSet resultSet = metaData.getColumns(null, getSchema(), getName(), null);
+ try {
+ while (resultSet.next()) {
+ ColumnImpl column = new ColumnImpl(
+ this,
+ resultSet.getString(COLUMN_METADATA_COLUMN_NAME),
+ resultSet.getString(COLUMN_METATDATA_TYPE_NAME),
+ resultSet.getInt(COLUMN_METATDATA_DATA_TYPE),
+ resultSet.getInt(COLUMN_METADATA_COLUMN_SIZE),
+ resultSet.getInt(COLUMN_METADATA_DECIMAL_DIGITS),
+ "YES".equalsIgnoreCase(resultSet.getString(COLUMN_METADATA_IS_NULLABLE)),
+ resultSet.getInt(COLUMN_METADATA_ORDINAL_POSITION),
getComments(
resultSet.getString(COLUMN_METADATA_REMARKS),
getQualifiedName(),
resultSet.getString(COLUMN_METADATA_COLUMN_NAME))
- );
- temp.put(column.getName(), column);
- }
- } finally {
- resultSet.close();
- }
+ );
+ temp.put(column.getName(), column);
+ }
+ } finally {
+ resultSet.close();
+ }
- resultSet = metaData.getPrimaryKeys(null, getSchema(), getName());
- try {
- while (resultSet.next()) {
- String name = resultSet.getString(PRIMARY_KEYS_METADATA_COLUMN_NAME);
- short keySequence = resultSet.getShort(PRIMARY_KEYS_METADATA_KEY_SEQ);
- ColumnImpl column = (ColumnImpl) temp.get(name);
- if (column != null) {
- column.setPrimaryKeyOrder(keySequence);
- }
- }
- resultSet.close();
-
- List columnList = Collections.synchronizedList(
- new ArrayList(temp.values()));
- Collections.sort(columnList);
- return (Column[]) columnList.toArray(new Column[columnList.size()]);
- } finally {
- resultSet.close();
- }
- }
-
- /**
+ resultSet = metaData.getPrimaryKeys(null, getSchema(), getName());
+ try {
+ while (resultSet.next()) {
+ String name = resultSet.getString(PRIMARY_KEYS_METADATA_COLUMN_NAME);
+ short keySequence = resultSet.getShort(PRIMARY_KEYS_METADATA_KEY_SEQ);
+ ColumnImpl column = (ColumnImpl) temp.get(name);
+ if (column != null) {
+ column.setPrimaryKeyOrder(keySequence);
+ }
+
+ }
+
+ List columnList = Collections.synchronizedList(
+ new ArrayList(temp.values()));
+ Collections.sort(columnList);
+ return (Column[]) columnList.toArray(new Column[columnList.size()]);
+
+ } finally {
+ resultSet.close();
+ }
+ }
+
+ /**
+ * Some databases, (in particular, MS Access under ODBC) aren't terribly friendly
+ * about supporting metadata. This method scrapes out the data the old-fashioned way.
+ *
+ * @param temp
+ * @param connection
+ * @throws SQLException
+ */
+ private Column[] getColumnsFromQuery(Connection connection) throws SQLException {
+ List temp = new ArrayList();
+ SQLMetaDataResults results =
+ (SQLMetaDataResults) MultiSQLServer.getInstance().getMetaData(
+ this, connection);
+ SQLMetaDataResults.Row[] rows = results.getRows();
+ for (int i = 0, length = results.getRowCount(); i < length; i++) {
+ ColumnImpl column = new ColumnImpl(
+ this,
+ (String) rows[i].get(1),
+ (String) rows[i].get(2),
+ ((Integer) rows[i].get(7)).intValue(),
+ ((Integer) rows[i].get(3)).intValue(),
+ ((Integer) rows[i].get(4)).intValue(),
+ "Nullable".equalsIgnoreCase((String) rows[i].get(5)),
+ i+1, "");
+ temp.add(column);
+ }
+ return (Column[]) temp.toArray(new Column[temp.size()]);
+ }
+ /**
* Some JDBC drivers (Oracle for example) won't return the comments
* We recheck with a custom query, if it's defined
* @param iniComment The already got comment