New test.
[mono.git] / mcs / class / System.Data / System.Data.Odbc / libodbc.cs
1 //
2 // System.Data.Odbc.libodbc
3 //
4 // Authors:
5 //   Brian Ritchie (brianlritchie@hotmail.com) 
6 //   Sureshkumar T (tsureshkumar@novell.com)
7 //  
8 //
9 // Copyright (C) Brian Ritchie, 2002
10 // 
11 //
12
13 //
14 // Copyright (C) 2004 Novell, Inc (http://www.novell.com)
15 //
16 // Permission is hereby granted, free of charge, to any person obtaining
17 // a copy of this software and associated documentation files (the
18 // "Software"), to deal in the Software without restriction, including
19 // without limitation the rights to use, copy, modify, merge, publish,
20 // distribute, sublicense, and/or sell copies of the Software, and to
21 // permit persons to whom the Software is furnished to do so, subject to
22 // the following conditions:
23 // 
24 // The above copyright notice and this permission notice shall be
25 // included in all copies or substantial portions of the Software.
26 // 
27 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
28 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
29 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
30 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
31 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
32 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
33 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
34 //
35
36 using System.Data;
37 using System.Data.Common;
38 using System.Runtime.InteropServices;
39
40 namespace System.Data.Odbc
41 {
42         internal enum OdbcHandleType : short {
43                 Env = 1,
44                 Dbc = 2,
45                 Stmt = 3,
46                 Desc = 4
47         };
48
49         internal enum OdbcReturn : short {
50                 Error = -1,
51                 InvalidHandle = -2,
52                 StillExecuting = 2,
53                 NeedData = 99,
54                 Success = 0,
55                 SuccessWithInfo = 1,
56                 NoData=100
57         }
58
59         internal enum OdbcEnv : ushort {
60                 OdbcVersion = 200,
61                 ConnectionPooling = 201,
62                 CPMatch = 202
63         }
64
65         internal enum OdbcConnectionAttribute : int \r
66         {
67                 AutoCommit=102,
68                 TransactionIsolation=108,
69                 CurrentCatalog=109
70         }
71
72         internal enum OdbcInfo : ushort
73         {
74                 DataSourceName          = 2,
75                 DriverName              = 6,
76                 DriverVersion           = 7,
77                 DatabaseName            = 16,
78                 DbmsVersion             = 18
79         }
80
81         internal enum OdbcInputOutputDirection : short
82         {
83                 Input=1,
84                 InputOutput=2,
85                 ResultCol=3,
86                 Output=4,
87                 ReturnValue=5
88         }
89
90         internal enum OdbcLengthIndicator : short
91         {
92                 NoTotal         = -4,
93                 NullData        = -1
94         }
95         
96         // Keep this sorted.
97         internal enum FieldIdentifier 
98         {
99                 AutoUniqueValue              = 11,    /* SQL_DESC_AUTO_UNIQUE_VALUE */
100                 BaseColumnName               = 22,    /* SQL_DESC_BASE_COLUMN_NAME */
101                 BaseTableName                = 23,    /* SQL_DESC_BASE_TABLE_NAME */
102                 CaseSensitive                = 12,    /* SQL_DESC_CASE_SENSITIVE */
103                 CatelogName                  = 17,    /* SQL_DESC_CATALOG_NAME */
104                 ConsiseType                  = 2,     /* SQL_DESC_CONCISE_TYPE */
105                 Count                        = 1001,  /* SQL_DESC_COUNT */
106                 DisplaySize                  = 6,     /* SQL_DESC_DISPLAY_SIZE */
107                 FixedPrecScale               = 9,     /* SQL_DESC_FIXED_PREC_SCALE */
108                 Label                        = 18,    /* SQL_DESC_LABEL */
109                 Length                       = 1003,  /* SQL_DESC_LENGTH */
110                 LiteralPrefix                = 27,    /* SQL_DESC_LITERAL_PREFIX */
111                 LiteralSuffix                = 28,    /* SQL_DESC_LITERAL_SUFFIX */
112                 LocalTypeName                = 29,    /* SQL_DESC_LOCAL_TYPE_NAME */
113                 Name                         = 1011,  /* SQL_DESC_NAME */
114                 Nullable                     = 1008,  /* SQL_DESC_NULLABLE */
115                 NumPrecRadix                 = 32,    /* SQL_DESC_NUM_PREC_RADIX */
116                 OctetLength                  = 1013,  /* SQL_DESC_OCTET_LENGTH */
117                 Precision                    = 1005,  /* SQL_DESC_PRECISION */
118                 Scale                        = 1006,  /* SQL_DESC_SCALE */
119                 SchemaName                   = 16,    /* SQL_DESC_SCHEMA_NAME */
120                 Searchable                   = 13,    /* SQL_DESC_SEARCHABLE */
121                 TableName                    = 15,    /* SQL_DESC_TABLE_NAME */
122                 Type                         = 1002,  /* SQL_DESC_TYPE */
123                 TypeName                     = 14,    /* SQL_DESC_TYPE_NAME */
124                 Unnamed                      = 1012,  /* SQL_DESC_UNNAMED */
125                 Unsigned                     = 8,     /* SQL_DESC_UNSIGNED */
126                 Updatable                    = 10     /* SQL_DESC_UPDATABLE */                
127         }
128         
129         [StructLayout(LayoutKind.Sequential)]
130         internal struct OdbcTimestamp
131         {
132                 internal short year;
133                 internal ushort month;
134                 internal ushort day;
135                 internal ushort hour;
136                 internal ushort minute;
137                 internal ushort second;
138                 internal ulong fraction;
139         }
140
141         
142 //      sealed internal class libodbc
143         internal class libodbc
144         {
145                 #region global constants
146                 internal const int              SQL_OV_ODBC2            = 2;
147                 internal const int              SQL_OV_ODBC3            = 3;
148
149                 internal const string           SQLSTATE_RIGHT_TRUNC    = "01004";
150                 internal const char             C_NULL                  = '\0';
151
152                 internal const short            SQL_TRUE                = 1;
153                 internal const short            SQL_FALSE               = 0;
154
155                 // SQLStatistics
156                 internal const short            SQL_INDEX_UNIQUE        = 0;
157                 internal const short            SQL_INDEX_ALL           = 1;
158                 internal const short            SQL_QUICK               = 0;
159                 internal const short            SQL_ENSURE              = 1;
160
161                 // SQLColumnAttribute
162                 internal const short            SQL_NO_NULLS            = 0;
163                 internal const short            SQL_NULLABLE            = 1;
164                 internal const short            SQL_NULLABLE_UNKNOWN    = 2;
165                 internal const short            SQL_ATTR_READONLY       = 0;
166                 internal const short            SQL_ATTR_WRITE          = 1;
167                 internal const short            SQL_ATTR_READWRITE_UNKNOWN = 2;
168                 #endregion
169
170                 internal static OdbcInputOutputDirection ConvertParameterDirection(
171                         ParameterDirection dir)
172                 {
173                         switch (dir)
174                         {
175                                 case ParameterDirection.Input:
176                                         return OdbcInputOutputDirection.Input;
177                                 case ParameterDirection.InputOutput:
178                                         return OdbcInputOutputDirection.InputOutput;
179                                 case ParameterDirection.Output:
180                                         return OdbcInputOutputDirection.Output;
181                                 case ParameterDirection.ReturnValue:
182                                         return OdbcInputOutputDirection.ReturnValue;
183                                 default:
184                                         return OdbcInputOutputDirection.Input;
185                         }
186                 }
187
188                 [DllImport("odbc32.dll")]
189                 internal static extern OdbcReturn SQLAllocHandle (OdbcHandleType HandleType, IntPtr InputHandle, ref IntPtr OutputHandlePtr);
190
191                 [DllImport("odbc32.dll")]
192                 internal static extern OdbcReturn SQLSetEnvAttr (IntPtr EnvHandle, OdbcEnv Attribute, IntPtr Value, int StringLength);
193
194                 [DllImport("odbc32.dll")]
195                 internal static extern OdbcReturn SQLConnect (IntPtr ConnectionHandle, string ServerName, short NameLength1, string UserName, short NameLength2, string Authentication, short NameLength3);
196
197                 [DllImport("odbc32.dll")]
198                 internal static extern OdbcReturn  SQLDriverConnect(IntPtr ConnectionHandle, IntPtr WindowHandle, string InConnectionString, short StringLength1, string OutConnectionString, short BufferLength,       ref short StringLength2Ptr,     ushort DriverCompletion);
199
200                 [DllImport("odbc32.dll")]
201                 internal static extern OdbcReturn SQLExecDirect (IntPtr StatementHandle, string StatementText, int TextLength);
202
203                 [DllImport("odbc32.dll")]
204                 internal static extern OdbcReturn SQLRowCount (IntPtr StatementHandle, ref int RowCount);
205
206                 [DllImport("odbc32.dll")]
207                 internal static extern OdbcReturn SQLNumResultCols (IntPtr StatementHandle, ref short ColumnCount);
208
209                 [DllImport("odbc32.dll")]
210                 internal static extern OdbcReturn SQLFetch (IntPtr StatementHandle);
211
212                 [DllImport("odbc32.dll")]
213                 internal static extern OdbcReturn SQLGetData (IntPtr StatementHandle, ushort ColumnNumber, SQL_C_TYPE TargetType, ref bool TargetPtr, int BufferLen, ref int Len);
214
215                 [DllImport("odbc32.dll")]
216                 internal static extern OdbcReturn SQLGetData (IntPtr StatementHandle, ushort ColumnNumber, SQL_C_TYPE TargetType, ref double TargetPtr, int BufferLen, ref int Len);
217
218                 [DllImport("odbc32.dll")]
219                 internal static extern OdbcReturn SQLGetData (IntPtr StatementHandle, ushort ColumnNumber, SQL_C_TYPE TargetType, ref long TargetPtr, int BufferLen, ref int Len);
220
221                 [DllImport("odbc32.dll")]
222                 internal static extern OdbcReturn SQLGetData (IntPtr StatementHandle, ushort ColumnNumber, SQL_C_TYPE TargetType, ref short TargetPtr, int BufferLen, ref int Len);
223
224                 [DllImport("odbc32.dll")]
225                 internal static extern OdbcReturn SQLGetData (IntPtr StatementHandle, ushort ColumnNumber, SQL_C_TYPE TargetType, ref float TargetPtr, int BufferLen, ref int Len);
226         
227                 [DllImport("odbc32.dll")]
228                 internal static extern OdbcReturn SQLGetData (IntPtr StatementHandle, ushort ColumnNumber, SQL_C_TYPE TargetType, ref OdbcTimestamp TargetPtr, int BufferLen, ref int Len);
229
230                 [DllImport("odbc32.dll")]
231                 internal static extern OdbcReturn SQLGetData (IntPtr StatementHandle, ushort ColumnNumber, SQL_C_TYPE TargetType, ref int TargetPtr, int BufferLen, ref int Len);
232         
233                 [DllImport("odbc32.dll")]
234                 internal static extern OdbcReturn SQLGetData (IntPtr StatementHandle, ushort ColumnNumber, SQL_C_TYPE TargetType, byte[] TargetPtr, int BufferLen, ref int Len);
235
236                 [DllImport("odbc32.dll")]
237                 internal static extern OdbcReturn SQLDescribeCol(IntPtr StatementHandle, ushort ColumnNumber, byte[] ColumnName, short BufferLength, ref short NameLength, ref short DataType, ref uint ColumnSize, ref short DecimalDigits, ref short Nullable);
238
239                 [DllImport("odbc32.dll")]
240                 internal static extern OdbcReturn SQLFreeHandle(ushort HandleType, IntPtr SqlHandle);
241
242                 [DllImport("odbc32.dll")]
243                 internal static extern OdbcReturn SQLDisconnect(IntPtr ConnectionHandle);
244
245                 [DllImport("odbc32.dll")]
246                 internal static extern OdbcReturn SQLPrepare(IntPtr StatementHandle, string Statement, int TextLength);
247
248                 [DllImport("odbc32.dll")]
249                 internal static extern OdbcReturn SQLExecute(IntPtr StatementHandle);
250
251                 [DllImport("odbc32.dll")]
252                 internal static extern OdbcReturn SQLSetConnectAttr(IntPtr ConnectionHandle, OdbcConnectionAttribute Attribute, IntPtr Value, int Length);
253
254                 [DllImport("odbc32.dll")]
255                 internal static extern OdbcReturn SQLEndTran(int HandleType, IntPtr Handle, short CompletionType);
256
257                 [DllImport("odbc32.dll")]
258                 internal static extern OdbcReturn SQLBindParameter(IntPtr StatementHandle, ushort ParamNum, 
259                                 short InputOutputType, SQL_C_TYPE ValueType, SQL_TYPE ParamType, uint ColSize, 
260                                 short DecimalDigits, IntPtr ParamValue, int BufLen, IntPtr StrLen);
261
262                 [DllImport("odbc32.dll")]
263                 internal static extern OdbcReturn SQLCancel(IntPtr StatementHandle);
264                 
265                 [DllImport("odbc32.dll")]
266                 internal static extern OdbcReturn SQLCloseCursor(IntPtr StatementHandle);
267
268                 [DllImport("odbc32.dll")]
269                 internal static extern OdbcReturn SQLError(IntPtr EnvironmentHandle,\r
270                                                            IntPtr ConnectionHandle, IntPtr StatementHandle,\r
271                                                            byte[] Sqlstate, ref int NativeError,\r
272                                                            byte[] MessageText, short BufferLength,\r
273                                                            ref short TextLength);\r
274 \r
275                 [DllImport("odbc32.dll")]
276                 internal static extern OdbcReturn SQLGetStmtAttr(IntPtr StatementHandle,\r
277                                                                 int Attribute, ref IntPtr Value, int BufLen, int StrLen);\r
278 \r
279                 [DllImport("odbc32.dll")]
280                 internal static extern OdbcReturn SQLSetDescField(IntPtr DescriptorHandle,\r
281                         short RecNumber, short FieldIdentifier, byte[] Value, int BufLen);\r
282                         
283                 [DllImport("odbc32.dll")]
284                 internal static extern OdbcReturn SQLGetDiagRec (OdbcHandleType HandleType,\r
285                                                            IntPtr Handle, ushort RecordNumber,\r
286                                                            byte [] Sqlstate, ref int NativeError,\r
287                                                            byte [] MessageText, short BufferLength,\r
288                                                            ref short TextLength);\r
289
290                 [DllImport ("odbc32.dll")]
291                 internal static extern OdbcReturn SQLMoreResults (IntPtr Handle);
292
293                 internal enum SQLFreeStmtOptions : short
294                 {
295                         Close = 0,
296                         Drop,
297                         Unbind,
298                         ResetParams
299                 }
300
301                 [DllImport ("odbc32.dll")]
302                 internal static extern OdbcReturn SQLFreeStmt (IntPtr Handle,  SQLFreeStmtOptions option);
303
304                 [DllImport ("odbc32.dll")]
305                 internal static extern OdbcReturn SQLGetInfo (IntPtr connHandle, 
306                                                               OdbcInfo info, 
307                                                               byte [] buffer, 
308                                                               short buffLength, 
309                                                               ref short remainingStrLen);
310                 [DllImport ("odbc32.dll")]
311                 internal static extern OdbcReturn SQLColAttribute (IntPtr StmtHandle,
312                                                                    int column,
313                                                                    FieldIdentifier fieldId,
314                                                                    byte [] charAttributePtr, 
315                                                                    int bufferLength,
316                                                                    ref int strLengthPtr,
317                                                                    ref int numericAttributePtr
318                                                                    );
319                 [DllImport ("odbc32.dll")]
320                 internal static extern OdbcReturn SQLPrimaryKeys (IntPtr StmtHandle,
321                                                                    string catalog,
322                                                                    int catalogLength,
323                                                                    string schema, 
324                                                                    int schemaLength,
325                                                                    string tableName,
326                                                                    int tableLength
327                                                                    );
328
329                 [DllImport ("odbc32.dll")]
330                 internal static extern OdbcReturn SQLStatistics (IntPtr StmtHandle,
331                                                                  string catalog,
332                                                                  int catalogLength,
333                                                                  string schema, 
334                                                                  int schemaLength,
335                                                                  string tableName,
336                                                                  int tableLength,
337                                                                  short unique,
338                                                                  short Reserved
339                                                                  );
340
341                 [DllImport ("odbc32.dll")]
342                 internal static extern OdbcReturn SQLBindCol (IntPtr StmtHandle,
343                                                                    int column,
344                                                                    SQL_C_TYPE targetType,
345                                                                    byte [] buffer, 
346                                                                    int bufferLength,
347                                                                    ref int indicator
348                                                                    );
349
350                 [DllImport ("odbc32.dll")]
351                 internal static extern OdbcReturn SQLBindCol (IntPtr StmtHandle,
352                                                                    int column,
353                                                                    SQL_C_TYPE targetType,
354                                                                    ref short value, 
355                                                                    int bufferLength,
356                                                                    ref int indicator
357                                                                    );
358         }
359 }