Author: suresh
Date: 2005-03-22 04:19:13 -0500 (Tue, 22 Mar 2005)
New Revision: 42071
Modified:
trunk/mcs/class/System.Data/System.Data.Odbc/ChangeLog
trunk/mcs/class/System.Data/System.Data.Odbc/OdbcDataReader.cs
trunk/mcs/class/System.Data/System.Data.Odbc/libodbc.cs
Log:
2005-03-22 Sureshkumar T <[EMAIL PROTECTED]>
Appsamy <[EMAIL PROTECTED]>
* libodbc.cs (System.Data.Odbc): Added enum FieldIdentifier. Added
library functions SQLPrimaryKeys, SQLBindCol and SQLColAttribute.
* OdbcDataReader.cs: Implemented GetPrimaryKeys to get the primary
keys associated with resultset using SQLPrimaryKeys.
Modified: trunk/mcs/class/System.Data/System.Data.Odbc/ChangeLog
===================================================================
--- trunk/mcs/class/System.Data/System.Data.Odbc/ChangeLog 2005-03-22
09:12:02 UTC (rev 42070)
+++ trunk/mcs/class/System.Data/System.Data.Odbc/ChangeLog 2005-03-22
09:19:13 UTC (rev 42071)
@@ -1,3 +1,12 @@
+2005-03-22 Sureshkumar T <[EMAIL PROTECTED]>
+ Appsamy <[EMAIL PROTECTED]>
+
+ * libodbc.cs (System.Data.Odbc): Added enum FieldIdentifier. Added
+ library functions SQLPrimaryKeys, SQLBindCol and SQLColAttribute.
+
+ * OdbcDataReader.cs: Implemented GetPrimaryKeys to get the primary
+ keys associated with resultset using SQLPrimaryKeys.
+
2005-03-15 Sureshkumar T <[EMAIL PROTECTED]>
* OdbcConnection.cs: re-throw error on exception in Open method.
Modified: trunk/mcs/class/System.Data/System.Data.Odbc/OdbcDataReader.cs
===================================================================
--- trunk/mcs/class/System.Data/System.Data.Odbc/OdbcDataReader.cs
2005-03-22 09:12:02 UTC (rev 42070)
+++ trunk/mcs/class/System.Data/System.Data.Odbc/OdbcDataReader.cs
2005-03-22 09:19:13 UTC (rev 42071)
@@ -501,6 +501,7 @@
// otherwise, DataTable is null reference
if(cols.Length > 0)
{
+ string [] keys = GetPrimaryKeys ();
dataTableSchema = new DataTable ();
@@ -545,8 +546,16 @@
schemaRow["NumericPrecision"] = 0;
schemaRow["NumericScale"] = 0;
// TODO: need to get KeyInfo
+
schemaRow["IsUnique"] = false;
- schemaRow["IsKey"] = DBNull.Value;
+ schemaRow["IsKey"] = DBNull.Value;
+
+ for (int j=0; j < keys.Length; j++) {
+ if (keys [j] ==
col.ColumnName) {
+ schemaRow ["IsUnique"]
= true;
+ schemaRow ["IsKey"] =
true;
+ }
+ }
schemaRow["BaseCatalogName"] = "";
schemaRow["BaseColumnName"] =
col.ColumnName;
@@ -812,6 +821,101 @@
return (ret == OdbcReturn.Success);
}
+
+ private int GetColumnAttribute (int column, FieldIdentifier
fieldId)
+ {
+ OdbcReturn ret = OdbcReturn.Error;
+ byte [] buffer = new byte [255];
+ int outsize = 0;
+ int val = 0;
+ ret = libodbc.SQLColAttribute (hstmt, column, fieldId,
+ buffer, buffer.Length,
+ ref outsize, ref val);
+ if (ret != OdbcReturn.Success && ret !=
OdbcReturn.SuccessWithInfo)
+ throw new OdbcException (new OdbcError
("SQLColAttribute",
+
OdbcHandleType.Stmt,
+ hstmt)
+ );
+ return val;
+
+ }
+
+ private string GetColumnAttributeStr (int column,
FieldIdentifier fieldId)
+ {
+ OdbcReturn ret = OdbcReturn.Error;
+ byte [] buffer = new byte [255];
+ int outsize = 0;
+ int val = 0;
+ ret = libodbc.SQLColAttribute (hstmt, column, fieldId,
+ buffer, buffer.Length,
+ ref outsize, ref val);
+ if (ret != OdbcReturn.Success && ret !=
OdbcReturn.SuccessWithInfo)
+ throw new OdbcException (new OdbcError
("SQLColAttribute",
+
OdbcHandleType.Stmt,
+ hstmt)
+ );
+ string value = Encoding.Default.GetString (buffer);
+ return value;
+ }
+
+ private string [] GetPrimaryKeys ()
+ {
+ if (cols.Length <= 0)
+ return new string [0];
+
+ string [] keys = new string [cols.Length];
+ IntPtr handle = IntPtr.Zero;
+ OdbcReturn ret = OdbcReturn.Error;
+ try {
+
ret=libodbc.SQLAllocHandle(OdbcHandleType.Stmt,
+
command.Connection.hDbc, ref handle);
+ if ((ret!=OdbcReturn.Success) &&
(ret!=OdbcReturn.SuccessWithInfo))
+ throw new OdbcException(new
OdbcError("SQLAllocHandle",
+
OdbcHandleType.Dbc,
+
command.Connection.hDbc));
+
+ string tableName = GetColumnAttributeStr (1,
FieldIdentifier.TableName);
+ string schemaName = GetColumnAttributeStr (1,
FieldIdentifier.SchemaName);
+ string catalogName = GetColumnAttributeStr (1,
FieldIdentifier.CatelogName);
+ ret = libodbc.SQLPrimaryKeys (handle,
catalogName, -3,
+ schemaName, -3,
+ tableName, -3);
+ if (ret != OdbcReturn.Success && ret !=
OdbcReturn.SuccessWithInfo)
+ throw new OdbcException (new OdbcError
("SQLPrimaryKeys", OdbcHandleType.Stmt, handle));
+
+ int length = 0;
+ byte [] primaryKey = new byte [255];
+
+ ret = libodbc.SQLBindCol (handle, 4,
SQL_C_TYPE.CHAR, primaryKey, primaryKey.Length, ref length);
+ if (ret != OdbcReturn.Success && ret !=
OdbcReturn.SuccessWithInfo)
+ throw new OdbcException (new OdbcError
("SQLBindCol", OdbcHandleType.Stmt, handle));
+
+ int i = 0;
+ while (true) {
+ ret = libodbc.SQLFetch (handle);
+ if (ret != OdbcReturn.Success && ret
!= OdbcReturn.SuccessWithInfo)
+ break;
+ string pkey =
Encoding.Default.GetString (primaryKey);
+ keys [i++] = pkey;
+ }
+ } catch (OdbcException){
+ // FIXME: Try using SQLStatistics
+ } finally {
+ if (handle != IntPtr.Zero) {
+ ret = libodbc.SQLFreeStmt (handle,
libodbc.SQLFreeStmtOptions.Close);
+ if ((ret!=OdbcReturn.Success) &&
(ret!=OdbcReturn.SuccessWithInfo))
+ throw new OdbcException(new
OdbcError("SQLFreeStmt",OdbcHandleType.Stmt,handle));
+
+ ret = libodbc.SQLFreeHandle( (ushort)
OdbcHandleType.Stmt, handle);
+ if ((ret!=OdbcReturn.Success)
&& (ret!=OdbcReturn.SuccessWithInfo))
+ throw new
OdbcException(new OdbcError("SQLFreeHandle",OdbcHandleType.Stmt,handle));
+ }
+
+ }
+
+ return keys;
+ }
+
public
#if NET_2_0
override
Modified: trunk/mcs/class/System.Data/System.Data.Odbc/libodbc.cs
===================================================================
--- trunk/mcs/class/System.Data/System.Data.Odbc/libodbc.cs 2005-03-22
09:12:02 UTC (rev 42070)
+++ trunk/mcs/class/System.Data/System.Data.Odbc/libodbc.cs 2005-03-22
09:19:13 UTC (rev 42071)
@@ -91,8 +91,41 @@
NoTotal = -4,
NullData = -1
}
-
- [StructLayout(LayoutKind.Sequential)]
+
+ // Keep this sorted.
+ internal enum FieldIdentifier
+ {
+ AutoUniqueValue = 11, /*
SQL_DESC_AUTO_UNIQUE_VALUE */
+ BaseColumnName = 22, /*
SQL_DESC_BASE_COLUMN_NAME */
+ BaseTableName = 23, /*
SQL_DESC_BASE_TABLE_NAME */
+ CaseSensitive = 12, /*
SQL_DESC_CASE_SENSITIVE */
+ CatelogName = 17, /* SQL_DESC_CATALOG_NAME
*/
+ ConsiseType = 2, /* SQL_DESC_CONCISE_TYPE
*/
+ Count = 1001, /* SQL_DESC_COUNT */
+ DisplaySize = 6, /* SQL_DESC_DISPLAY_SIZE
*/
+ FixedPrecScale = 9, /*
SQL_DESC_FIXED_PREC_SCALE */
+ Label = 18, /* SQL_DESC_LABEL */
+ Length = 1003, /* SQL_DESC_LENGTH */
+ LiteralPrefix = 27, /*
SQL_DESC_LITERAL_PREFIX */
+ LiteralSuffix = 28, /*
SQL_DESC_LITERAL_SUFFIX */
+ LocalTypeName = 29, /*
SQL_DESC_LOCAL_TYPE_NAME */
+ Name = 1011, /* SQL_DESC_NAME */
+ Nullable = 1008, /* SQL_DESC_NULLABLE */
+ NumPrecRadix = 32, /*
SQL_DESC_NUM_PREC_RADIX */
+ OctetLength = 1013, /* SQL_DESC_OCTET_LENGTH
*/
+ Precision = 1005, /* SQL_DESC_PRECISION */
+ Scale = 1006, /* SQL_DESC_SCALE */
+ SchemaName = 16, /* SQL_DESC_SCHEMA_NAME
*/
+ Searchable = 13, /* SQL_DESC_SEARCHABLE */
+ TableName = 15, /* SQL_DESC_TABLE_NAME */
+ Type = 1002, /* SQL_DESC_TYPE */
+ TypeName = 14, /* SQL_DESC_TYPE_NAME */
+ Unnamed = 1012, /* SQL_DESC_UNNAMED */
+ Unsigned = 8, /* SQL_DESC_UNSIGNED */
+ Updatable = 10 /* SQL_DESC_UPDATABLE */
+ }
+
+ [StructLayout(LayoutKind.Sequential)]
internal struct OdbcTimestamp
{
internal short year;
@@ -261,7 +294,32 @@
byte [] buffer,
short
buffLength,
ref short
remainingStrLen);
+ [DllImport ("odbc32.dll")]
+ internal static extern OdbcReturn SQLColAttribute (IntPtr
StmtHandle,
+ int column,
+
FieldIdentifier fieldId,
+ byte []
charAttributePtr,
+ int
bufferLength,
+ ref int
strLengthPtr,
+ ref int
numericAttributePtr
+ );
+ [DllImport ("odbc32.dll")]
+ internal static extern OdbcReturn SQLPrimaryKeys (IntPtr
StmtHandle,
+ string
catalog,
+ int
catalogLength,
+ string
schema,
+ int
schemaLength,
+ string
tableName,
+ int
tableLength
+ );
-
+ [DllImport ("odbc32.dll")]
+ internal static extern OdbcReturn SQLBindCol (IntPtr
StmtHandle,
+ int column,
+ SQL_C_TYPE
targetType,
+ byte []
buffer,
+ int
bufferLength,
+ ref int
indicator
+ );
}
}
_______________________________________________
Mono-patches maillist - [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches