Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/ikvm-fork.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsmallsql <smallsql>2009-01-19 00:47:51 +0300
committersmallsql <smallsql>2009-01-19 00:47:51 +0300
commit479417eefc21377331e7e6504e53ca860700fd6b (patch)
tree084e652125f727ef6f9fef2a46025460ecb70518 /openjdk/sun/jdbc/odbc/JdbcOdbcResultSetMetaData.java
parent3b9b7e6c72f237425ec0699c9eefcde186a47e94 (diff)
JDBC-ODBC-Bridge Step 2
Diffstat (limited to 'openjdk/sun/jdbc/odbc/JdbcOdbcResultSetMetaData.java')
-rw-r--r--openjdk/sun/jdbc/odbc/JdbcOdbcResultSetMetaData.java182
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");
+ }
}
}