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

github.com/mono/mono.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSureshkumar T <suresh@mono-cvs.ximian.com>2005-03-22 12:19:13 +0300
committerSureshkumar T <suresh@mono-cvs.ximian.com>2005-03-22 12:19:13 +0300
commitfbf1f2c678d8b7f9b9d44ec2186daedaaa2fbe0f (patch)
treef4675d1a98315114d95d0345828b9b48241e8ce6 /mcs/class/System.Data/System.Data.Odbc
parent03a5e795d2daa91e568ec7c1a0cc7d973337bb02 (diff)
2005-03-22 Sureshkumar T <tsureshkumar@novell.com>
Appsamy <appasamy@rediffmail.com> * 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. svn path=/trunk/mcs/; revision=42071
Diffstat (limited to 'mcs/class/System.Data/System.Data.Odbc')
-rw-r--r--mcs/class/System.Data/System.Data.Odbc/ChangeLog9
-rw-r--r--mcs/class/System.Data/System.Data.Odbc/OdbcDataReader.cs106
-rw-r--r--mcs/class/System.Data/System.Data.Odbc/libodbc.cs66
3 files changed, 176 insertions, 5 deletions
diff --git a/mcs/class/System.Data/System.Data.Odbc/ChangeLog b/mcs/class/System.Data/System.Data.Odbc/ChangeLog
index 356572b167e..2295ab9c3cf 100644
--- a/mcs/class/System.Data/System.Data.Odbc/ChangeLog
+++ b/mcs/class/System.Data/System.Data.Odbc/ChangeLog
@@ -1,3 +1,12 @@
+2005-03-22 Sureshkumar T <tsureshkumar@novell.com>
+ Appsamy <appasamy@rediffmail.com>
+
+ * 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 <tsureshkumar@novell.com>
* OdbcConnection.cs: re-throw error on exception in Open method.
diff --git a/mcs/class/System.Data/System.Data.Odbc/OdbcDataReader.cs b/mcs/class/System.Data/System.Data.Odbc/OdbcDataReader.cs
index 1a9f27d43e0..984718353fa 100644
--- a/mcs/class/System.Data/System.Data.Odbc/OdbcDataReader.cs
+++ b/mcs/class/System.Data/System.Data.Odbc/OdbcDataReader.cs
@@ -501,6 +501,7 @@ namespace System.Data.Odbc
// otherwise, DataTable is null reference
if(cols.Length > 0)
{
+ string [] keys = GetPrimaryKeys ();
dataTableSchema = new DataTable ();
@@ -545,8 +546,16 @@ namespace System.Data.Odbc
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 @@ namespace System.Data.Odbc
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
diff --git a/mcs/class/System.Data/System.Data.Odbc/libodbc.cs b/mcs/class/System.Data/System.Data.Odbc/libodbc.cs
index e5e85047b46..771dab8e5f9 100644
--- a/mcs/class/System.Data/System.Data.Odbc/libodbc.cs
+++ b/mcs/class/System.Data/System.Data.Odbc/libodbc.cs
@@ -91,8 +91,41 @@ namespace System.Data.Odbc
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 @@ namespace System.Data.Odbc
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
+ );
}
}