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