diff options
author | smallsql <smallsql> | 2009-01-19 00:47:51 +0300 |
---|---|---|
committer | smallsql <smallsql> | 2009-01-19 00:47:51 +0300 |
commit | 479417eefc21377331e7e6504e53ca860700fd6b (patch) | |
tree | 084e652125f727ef6f9fef2a46025460ecb70518 /openjdk/sun/jdbc/odbc/JdbcOdbcResultSetMetaData.java | |
parent | 3b9b7e6c72f237425ec0699c9eefcde186a47e94 (diff) |
JDBC-ODBC-Bridge Step 2
Diffstat (limited to 'openjdk/sun/jdbc/odbc/JdbcOdbcResultSetMetaData.java')
-rw-r--r-- | openjdk/sun/jdbc/odbc/JdbcOdbcResultSetMetaData.java | 182 |
1 files changed, 137 insertions, 45 deletions
diff --git a/openjdk/sun/jdbc/odbc/JdbcOdbcResultSetMetaData.java b/openjdk/sun/jdbc/odbc/JdbcOdbcResultSetMetaData.java index 8f75f868..e3908b06 100644 --- a/openjdk/sun/jdbc/odbc/JdbcOdbcResultSetMetaData.java +++ b/openjdk/sun/jdbc/odbc/JdbcOdbcResultSetMetaData.java @@ -23,139 +23,227 @@ */ package sun.jdbc.odbc; -import java.sql.*; +import ikvm.lang.CIL; +import java.sql.ResultSetMetaData; +import java.sql.SQLException; +import java.sql.Types; + +import cli.System.Convert; +import cli.System.DBNull; import cli.System.Data.*; import cli.System.Data.Common.*; /** - * This JDBC Driver is a wrapper to the ODBC.NET Data Provider + * This JDBC Driver is a wrapper to the ODBC.NET Data Provider. */ public class JdbcOdbcResultSetMetaData implements ResultSetMetaData{ private final DbDataReader reader; - private final DataTable table; - - - public JdbcOdbcResultSetMetaData(DbDataReader reader, DataTable table){ + + private final DataTable schema; + + JdbcOdbcResultSetMetaData(DbDataReader reader){ this.reader = reader; - this.table = table; + schema = reader.GetSchemaTable(); } - - - public String getCatalogName(int column){ - return ""; + + public String getCatalogName(int column) throws SQLException{ + Object obj = getColumnMeta(column, "BaseCatalogName"); + if(obj == null || obj == DBNull.Value){ + return ""; + } + return obj.toString(); } - public String getColumnClassName(int column){ - cli.System.Type type = getDataColumn(column).get_DataType(); - return type.get_FullName(); + public String getColumnClassName(int column) throws SQLException{ + String type = getColumnMeta(column, "DataType").toString(); + return JdbcOdbcUtils.getJavaClassName(type); } public int getColumnCount(){ - return table.get_Columns().get_Count(); + return schema.get_Rows().get_Count(); } public int getColumnDisplaySize(int column) throws SQLException{ - // TODO Auto-generated method stub - return 0; + int precision = getPrecision(column); + int type = CIL.unbox_int( getColumnMeta(column, "ProviderType") ); + switch(type){ + case DbType.Decimal: + case DbType.Currency: + case DbType.VarNumeric: + return precision + (getScale(column) > 0 ? 2 : 1); // + sign and comma + } + return precision; } public String getColumnLabel(int column) throws SQLException{ - return getDataColumn(column).get_Caption(); + return getColumnMeta(column, "ColumnName").toString(); } public String getColumnName(int column) throws SQLException{ - return getDataColumn(column).get_ColumnName(); + return getColumnMeta(column, "ColumnName").toString(); } public int getColumnType(int column) throws SQLException{ - cli.System.Type type = getDataColumn(column).get_DataType(); - // TODO Auto-generated method stub + int type = CIL.unbox_int( getColumnMeta(column, "ProviderType") ); + switch(type){ + case DbType.AnsiString: + return Types.VARCHAR; + case DbType.AnsiStringFixedLength: + return Types.CHAR; + case DbType.Binary: + return Types.BINARY; + case DbType.Boolean: + return Types.BOOLEAN; + case DbType.Byte: + case DbType.SByte: + return Types.TINYINT; + case DbType.Date: + return Types.DATE; + case DbType.DateTime: + case DbType.DateTime2: + case DbType.DateTimeOffset: + return Types.TIMESTAMP; + case DbType.Decimal: + case DbType.Currency: + return Types.DECIMAL; + case DbType.Double: + return Types.DOUBLE; + case DbType.Guid: + return Types.ROWID; + case DbType.Int16: + case DbType.UInt16: + return Types.SMALLINT; + case DbType.Int32: + case DbType.UInt32: + return Types.INTEGER; + case DbType.Int64: + case DbType.UInt64: + return Types.BIGINT; + case DbType.Single: + return Types.FLOAT; + case DbType.String: + return Types.NVARCHAR; + case DbType.StringFixedLength: + return Types.NCHAR; + case DbType.Time: + return Types.TIME; + case DbType.VarNumeric: + return Types.NUMERIC; + case DbType.Xml: + return Types.SQLXML; + } return Types.OTHER; } public String getColumnTypeName(int column) throws SQLException{ - return reader != null ? reader.GetDataTypeName(column - 1) : ""; + try{ + return reader.GetDataTypeName(column - 1); + }catch(ArrayIndexOutOfBoundsException ex){ + throw new SQLException("Invalid column number ("+column+"). A number between 1 and "+schema.get_Rows().get_Count()+" is valid.", "S1002"); + }catch(Throwable ex){ + throw JdbcOdbcUtils.createSQLException(ex); + } } public int getPrecision(int column) throws SQLException{ - return getDataColumn(column).get_MaxLength(); + Object obj = getColumnMeta(column, "NumericPrecision"); + return Convert.ToInt32(obj); } public int getScale(int column) throws SQLException{ - // TODO Auto-generated method stub - return 0; + Object obj = getColumnMeta(column, "NumericScale"); + return Convert.ToInt32(obj); } public String getSchemaName(int column) throws SQLException{ - // TODO Auto-generated method stub - return null; + Object obj = getColumnMeta(column, "BaseSchemaName"); + if(obj == null || obj == DBNull.Value){ + return ""; + } + return obj.toString(); } public String getTableName(int column) throws SQLException{ - return table.get_TableName(); + Object obj = getColumnMeta(column, "BaseTableName"); + if(obj == null || obj == DBNull.Value){ + return ""; + } + return obj.toString(); } public boolean isAutoIncrement(int column) throws SQLException{ - return getDataColumn(column).get_AutoIncrement(); + Object obj = getColumnMeta(column, "IsAutoIncrement"); + return Convert.ToBoolean(obj); } - public boolean isCaseSensitive(int column) throws SQLException{ - // TODO Auto-generated method stub + public boolean isCaseSensitive(int column){ return false; } public boolean isCurrency(int column) throws SQLException{ - // TODO Auto-generated method stub - return false; + return CIL.unbox_int( getColumnMeta(column, "ProviderType") ) == DbType.Currency; } - public boolean isDefinitelyWritable(int column) throws SQLException{ - // TODO Auto-generated method stub + public boolean isDefinitelyWritable(int column){ return false; } public int isNullable(int column) throws SQLException{ - return getDataColumn(column).get_AllowDBNull() ? columnNullable : columnNoNulls; + Object obj = getColumnMeta(column, "AllowDBNull"); + return Convert.ToBoolean(obj) ? columnNullable : columnNoNulls; } public boolean isReadOnly(int column) throws SQLException{ - return getDataColumn(column).get_ReadOnly(); + Object obj = getColumnMeta(column, "IsReadOnly"); + return Convert.ToBoolean(obj); } public boolean isSearchable(int column) throws SQLException{ - // TODO Auto-generated method stub - return false; + return !CIL.unbox_boolean( getColumnMeta(column, "IsLong") ); } public boolean isSigned(int column) throws SQLException{ - // TODO Auto-generated method stub + int type = CIL.unbox_int( getColumnMeta(column, "ProviderType") ); + switch(type){ + case DbType.Currency: + case DbType.Decimal: + case DbType.Double: + case DbType.Int16: + case DbType.Int32: + case DbType.Int64: + case DbType.SByte: + case DbType.Single: + case DbType.VarNumeric: + return true; + } return false; } public boolean isWritable(int column) throws SQLException{ - return !getDataColumn(column).get_ReadOnly(); + Object obj = getColumnMeta(column, "IsReadOnly"); + return !Convert.ToBoolean(obj); } @@ -170,9 +258,13 @@ public class JdbcOdbcResultSetMetaData implements ResultSetMetaData{ } throw new SQLException(this.getClass().getName() + " does not implements " + iface.getName() + ".", "01000"); } - - - private DataColumn getDataColumn(int column){ - return table.get_Columns().get_Item(column - 1); + + private Object getColumnMeta(int column, String metaKey) throws SQLException{ + try{ + DataRow columnMeta = schema.get_Rows().get_Item(column-1); + return columnMeta.get_Item(metaKey); + }catch(ArrayIndexOutOfBoundsException ex){ + throw new SQLException("Invalid column number ("+column+"). A number between 1 and "+schema.get_Rows().get_Count()+" is valid.", "S1002"); + } } } |