TDS 8 changes
[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                 IdentifierQuoteChar = 29
82         }
83
84         internal enum OdbcInputOutputDirection : short
85         {
86                 Input = 1,
87                 InputOutput = 2,
88                 ResultCol = 3,
89                 Output = 4,
90                 ReturnValue = 5
91         }
92
93         internal enum OdbcIsolationLevel
94         {
95                 ReadUncommitted = 1,
96                 ReadCommitted = 2,
97                 RepeatableRead = 4,
98                 Serializable = 8,
99                 Snapshot = 32           /* SQL_TXN_SS_SNAPSHOT */
100         }
101
102         internal enum OdbcLengthIndicator : short
103         {
104                 NoTotal = -4,
105                 NullData = -1
106         }
107
108         // Keep this sorted.
109         internal enum FieldIdentifier : short
110         {
111                 AutoUniqueValue = 11,   /* SQL_DESC_AUTO_UNIQUE_VALUE */
112                 BaseColumnName = 22,    /* SQL_DESC_BASE_COLUMN_NAME */
113                 BaseTableName = 23,     /* SQL_DESC_BASE_TABLE_NAME */
114                 CaseSensitive = 12,     /* SQL_DESC_CASE_SENSITIVE */
115                 CatelogName = 17,       /* SQL_DESC_CATALOG_NAME */
116                 ConsiseType = 2,        /* SQL_DESC_CONCISE_TYPE */
117                 Count = 1001,           /* SQL_DESC_COUNT */
118                 DisplaySize = 6,        /* SQL_DESC_DISPLAY_SIZE */
119                 FixedPrecScale = 9,     /* SQL_DESC_FIXED_PREC_SCALE */
120                 Label = 18,             /* SQL_DESC_LABEL */
121                 Length = 1003,          /* SQL_DESC_LENGTH */
122                 LiteralPrefix = 27,     /* SQL_DESC_LITERAL_PREFIX */
123                 LiteralSuffix = 28,     /* SQL_DESC_LITERAL_SUFFIX */
124                 LocalTypeName = 29,     /* SQL_DESC_LOCAL_TYPE_NAME */
125                 Name = 1011,            /* SQL_DESC_NAME */
126                 Nullable = 1008,        /* SQL_DESC_NULLABLE */
127                 NumPrecRadix = 32,      /* SQL_DESC_NUM_PREC_RADIX */
128                 OctetLength = 1013,     /* SQL_DESC_OCTET_LENGTH */
129                 Precision = 1005,       /* SQL_DESC_PRECISION */
130                 Scale = 1006,           /* SQL_DESC_SCALE */
131                 SchemaName = 16,        /* SQL_DESC_SCHEMA_NAME */
132                 Searchable = 13,        /* SQL_DESC_SEARCHABLE */
133                 TableName = 15,         /* SQL_DESC_TABLE_NAME */
134                 Type = 1002,            /* SQL_DESC_TYPE */
135                 TypeName = 14,          /* SQL_DESC_TYPE_NAME */
136                 Unnamed = 1012,         /* SQL_DESC_UNNAMED */
137                 Unsigned = 8,           /* SQL_DESC_UNSIGNED */
138                 Updatable = 10          /* SQL_DESC_UPDATABLE */
139         }
140
141         [StructLayout(LayoutKind.Sequential)]
142         internal struct OdbcTimestamp
143         {
144                 internal short year;
145                 internal ushort month;
146                 internal ushort day;
147                 internal ushort hour;
148                 internal ushort minute;
149                 internal ushort second;
150                 internal ulong fraction;
151         }
152
153         internal class libodbc
154         {
155                 #region global constants
156                 internal const int              SQL_OV_ODBC2            = 2;
157                 internal const int              SQL_OV_ODBC3            = 3;
158
159                 internal const string           SQLSTATE_RIGHT_TRUNC    = "01004";
160                 internal const char             C_NULL                  = '\0';
161                 internal const int              SQL_NTS                 = -3;
162
163                 internal const short            SQL_TRUE                = 1;
164                 internal const short            SQL_FALSE               = 0;
165
166                 // SQLStatistics
167                 internal const short            SQL_INDEX_UNIQUE        = 0;
168                 internal const short            SQL_INDEX_ALL           = 1;
169                 internal const short            SQL_QUICK               = 0;
170                 internal const short            SQL_ENSURE              = 1;
171
172                 // SQLColumnAttribute
173                 internal const short            SQL_NO_NULLS            = 0;
174                 internal const short            SQL_NULLABLE            = 1;
175                 internal const short            SQL_NULLABLE_UNKNOWN    = 2;
176                 internal const short            SQL_ATTR_READONLY       = 0;
177                 internal const short            SQL_ATTR_WRITE          = 1;
178                 internal const short            SQL_ATTR_READWRITE_UNKNOWN = 2;
179                 #endregion
180
181                 internal static OdbcInputOutputDirection ConvertParameterDirection(
182                         ParameterDirection dir)
183                 {
184                         switch (dir) {
185                         case ParameterDirection.Input:
186                                 return OdbcInputOutputDirection.Input;
187                         case ParameterDirection.InputOutput:
188                                 return OdbcInputOutputDirection.InputOutput;
189                         case ParameterDirection.Output:
190                                 return OdbcInputOutputDirection.Output;
191                         case ParameterDirection.ReturnValue:
192                                 return OdbcInputOutputDirection.ReturnValue;
193                         default:
194                                 return OdbcInputOutputDirection.Input;
195                         }
196                 }
197
198                 [DllImport ("odbc32.dll", CharSet = CharSet.Unicode)]
199                 internal static extern OdbcReturn SQLAllocHandle (
200                         OdbcHandleType HandleType,
201                         IntPtr InputHandle,
202                         ref IntPtr OutputHandlePtr);
203
204                 [DllImport ("odbc32.dll", CharSet = CharSet.Unicode)]
205                 internal static extern OdbcReturn SQLSetEnvAttr (
206                         IntPtr EnvHandle,
207                         OdbcEnv Attribute,
208                         IntPtr Value,
209                         int StringLength);
210
211                 [DllImport ("odbc32.dll", CharSet = CharSet.Unicode)]
212                 internal static extern OdbcReturn SQLConnect (
213                         IntPtr ConnectionHandle,
214                         string ServerName,
215                         short NameLength1,
216                         string UserName,
217                         short NameLength2,
218                         string Authentication,
219                         short NameLength3);
220
221                 [DllImport ("odbc32.dll", CharSet = CharSet.Unicode)]
222                 internal static extern OdbcReturn SQLDriverConnect (
223                         IntPtr ConnectionHandle,
224                         IntPtr WindowHandle,
225                         string InConnectionString,
226                         short StringLength1,
227                         string OutConnectionString,
228                         short BufferLength,
229                         ref short StringLength2Ptr,
230                         ushort DriverCompletion);
231
232                 [DllImport ("odbc32.dll", CharSet = CharSet.Unicode)]
233                 internal static extern OdbcReturn SQLExecDirect (
234                         IntPtr StatementHandle,
235                         string StatementText,
236                         int TextLength);
237
238                 [DllImport ("odbc32.dll", CharSet = CharSet.Unicode)]
239                 internal static extern OdbcReturn SQLRowCount (
240                         IntPtr StatementHandle,
241                         ref int RowCount);
242
243                 [DllImport ("odbc32.dll", CharSet = CharSet.Unicode)]
244                 internal static extern OdbcReturn SQLNumResultCols (
245                         IntPtr StatementHandle,
246                         ref short ColumnCount);
247
248                 [DllImport ("odbc32.dll", CharSet = CharSet.Unicode)]
249                 internal static extern OdbcReturn SQLFetch (
250                         IntPtr StatementHandle);
251
252                 [DllImport ("odbc32.dll", CharSet = CharSet.Unicode)]
253                 internal static extern OdbcReturn SQLGetData (
254                         IntPtr StatementHandle,
255                         ushort ColumnNumber,
256                         SQL_C_TYPE TargetType,
257                         ref bool TargetPtr,
258                         int BufferLen,
259                         ref int Len);
260
261                 [DllImport ("odbc32.dll", CharSet = CharSet.Unicode)]
262                 internal static extern OdbcReturn SQLGetData (
263                         IntPtr StatementHandle,
264                         ushort ColumnNumber,
265                         SQL_C_TYPE TargetType,
266                         ref double TargetPtr,
267                         int BufferLen,
268                         ref int Len);
269
270                 [DllImport ("odbc32.dll", CharSet = CharSet.Unicode)]
271                 internal static extern OdbcReturn SQLGetData (
272                         IntPtr StatementHandle,
273                         ushort ColumnNumber,
274                         SQL_C_TYPE TargetType,
275                         ref long TargetPtr,
276                         int BufferLen,
277                         ref int Len);
278
279                 [DllImport ("odbc32.dll", CharSet = CharSet.Unicode)]
280                 internal static extern OdbcReturn SQLGetData (
281                         IntPtr StatementHandle,
282                         ushort ColumnNumber,
283                         SQL_C_TYPE TargetType,
284                         ref short TargetPtr,
285                         int BufferLen,
286                         ref int Len);
287
288                 [DllImport ("odbc32.dll", CharSet = CharSet.Unicode)]
289                 internal static extern OdbcReturn SQLGetData (
290                         IntPtr StatementHandle,
291                         ushort ColumnNumber,
292                         SQL_C_TYPE TargetType,
293                         ref float TargetPtr,
294                         int BufferLen,
295                         ref int Len);
296
297                 [DllImport ("odbc32.dll", CharSet = CharSet.Unicode)]
298                 internal static extern OdbcReturn SQLGetData (
299                         IntPtr StatementHandle,
300                         ushort ColumnNumber,
301                         SQL_C_TYPE TargetType,
302                         ref OdbcTimestamp TargetPtr,
303                         int BufferLen,
304                         ref int Len);
305
306                 [DllImport ("odbc32.dll", CharSet = CharSet.Unicode)]
307                 internal static extern OdbcReturn SQLGetData (
308                         IntPtr StatementHandle,
309                         ushort ColumnNumber,
310                         SQL_C_TYPE TargetType,
311                         ref int TargetPtr,
312                         int BufferLen,
313                         ref int Len);
314
315                 [DllImport ("odbc32.dll", CharSet = CharSet.Unicode)]
316                 internal static extern OdbcReturn SQLGetData (
317                         IntPtr StatementHandle,
318                         ushort ColumnNumber,
319                         SQL_C_TYPE TargetType,
320                         byte[] TargetPtr,
321                         int BufferLen,
322                         ref int Len);
323
324                 [DllImport ("odbc32.dll", CharSet = CharSet.Unicode)]
325                 internal static extern OdbcReturn SQLDescribeCol (
326                         IntPtr StatementHandle,
327                         ushort ColumnNumber,
328                         byte[] ColumnName,
329                         short BufferLength,
330                         ref short NameLength,
331                         ref short DataType,
332                         ref uint ColumnSize,
333                         ref short DecimalDigits,
334                         ref short Nullable);
335
336                 [DllImport ("odbc32.dll", CharSet = CharSet.Unicode)]
337                 internal static extern OdbcReturn SQLFreeHandle (
338                         ushort HandleType,
339                         IntPtr SqlHandle);
340
341                 [DllImport ("odbc32.dll", CharSet = CharSet.Unicode)]
342                 internal static extern OdbcReturn SQLDisconnect (
343                         IntPtr ConnectionHandle);
344
345                 [DllImport ("odbc32.dll", CharSet = CharSet.Unicode)]
346                 internal static extern OdbcReturn SQLPrepare (
347                         IntPtr StatementHandle,
348                         string Statement,
349                         int TextLength);
350
351                 [DllImport ("odbc32.dll", CharSet = CharSet.Unicode)]
352                 internal static extern OdbcReturn SQLExecute (
353                         IntPtr StatementHandle);
354
355                 [DllImport ("odbc32.dll", CharSet = CharSet.Unicode)]
356                 internal static extern OdbcReturn SQLGetConnectAttr (
357                         IntPtr ConnectionHandle,
358                         OdbcConnectionAttribute Attribute,
359                         out int value,
360                         int BufferLength,
361                         out int StringLength);
362
363                 [DllImport ("odbc32.dll", CharSet = CharSet.Unicode)]
364                 internal static extern OdbcReturn SQLSetConnectAttr (
365                         IntPtr ConnectionHandle,
366                         OdbcConnectionAttribute Attribute,
367                         IntPtr Value,
368                         int Length);
369
370                 [DllImport ("odbc32.dll", CharSet = CharSet.Unicode)]
371                 internal static extern OdbcReturn SQLEndTran (
372                         int HandleType,
373                         IntPtr Handle,
374                         short CompletionType);
375
376                 [DllImport ("odbc32.dll", CharSet = CharSet.Unicode)]
377                 internal static extern OdbcReturn SQLBindParameter (
378                         IntPtr StatementHandle,
379                         ushort ParamNum,
380                         short InputOutputType,
381                         SQL_C_TYPE ValueType,
382                         SQL_TYPE ParamType,
383                         uint ColSize,
384                         short DecimalDigits,
385                         IntPtr ParamValue,
386                         int BufLen,
387                         IntPtr StrLen);
388
389                 [DllImport ("odbc32.dll", CharSet = CharSet.Unicode)]
390                 internal static extern OdbcReturn SQLCancel (
391                         IntPtr StatementHandle);
392
393                 [DllImport ("odbc32.dll", CharSet = CharSet.Unicode)]
394                 internal static extern OdbcReturn SQLCloseCursor (
395                         IntPtr StatementHandle);
396
397                 [DllImport ("odbc32.dll", CharSet = CharSet.Unicode)]
398                 internal static extern OdbcReturn SQLError (
399                         IntPtr EnvironmentHandle,
400                         IntPtr ConnectionHandle,
401                         IntPtr StatementHandle,
402                         byte[] Sqlstate,
403                         ref int NativeError,
404                         byte[] MessageText,
405                         short BufferLength,
406                         ref short TextLength);
407
408                 [DllImport ("odbc32.dll", CharSet = CharSet.Unicode)]
409                 internal static extern OdbcReturn SQLGetStmtAttr (
410                         IntPtr StatementHandle,
411                         int Attribute,
412                         ref IntPtr Value,
413                         int BufLen,
414                         int StrLen);
415
416                 [DllImport ("odbc32.dll", CharSet = CharSet.Unicode)]
417                 internal static extern OdbcReturn SQLSetDescField (
418                         IntPtr DescriptorHandle,
419                         short RecNumber,
420                         short FieldIdentifier,
421                         byte[] Value,
422                         int BufLen);
423
424                 [DllImport ("odbc32.dll", CharSet = CharSet.Unicode)]
425                 internal static extern OdbcReturn SQLGetDiagRec (
426                         OdbcHandleType HandleType,
427                         IntPtr Handle,
428                         ushort RecordNumber,
429                         byte [] Sqlstate,
430                         ref int NativeError,
431                         byte [] MessageText,
432                         short BufferLength,
433                         ref short TextLength);
434
435                 [DllImport ("odbc32.dll", CharSet = CharSet.Unicode)]
436                 internal static extern OdbcReturn SQLMoreResults (
437                         IntPtr Handle);
438
439                 internal enum SQLFreeStmtOptions : short
440                 {
441                         Close = 0,
442                         Drop,
443                         Unbind,
444                         ResetParams
445                 }
446
447                 [DllImport ("odbc32.dll", CharSet = CharSet.Unicode)]
448                 internal static extern OdbcReturn SQLFreeStmt (
449                         IntPtr Handle,
450                         SQLFreeStmtOptions option);
451
452                 [DllImport ("odbc32.dll", CharSet = CharSet.Unicode)]
453                 internal static extern OdbcReturn SQLGetInfo (
454                         IntPtr connHandle,
455                         OdbcInfo info,
456                         byte [] buffer,
457                         short buffLength,
458                         ref short remainingStrLen);
459
460                 [DllImport ("odbc32.dll", CharSet = CharSet.Unicode)]
461                 internal static extern OdbcReturn SQLColAttribute (
462                         IntPtr StmtHandle,
463                         short column,
464                         FieldIdentifier fieldId,
465                         byte [] charAttributePtr,
466                         short bufferLength,
467                         ref short strLengthPtr,
468                         ref int numericAttributePtr);
469
470                 [DllImport ("odbc32.dll", CharSet = CharSet.Unicode)]
471                 internal static extern OdbcReturn SQLPrimaryKeys (
472                         IntPtr StmtHandle,
473                         string catalog,
474                         short catalogLength,
475                         string schema,
476                         short schemaLength,
477                         string tableName,
478                         short tableLength);
479
480                 [DllImport ("odbc32.dll", CharSet = CharSet.Unicode)]
481                 internal static extern OdbcReturn SQLStatistics (
482                         IntPtr StmtHandle,
483                         string catalog,
484                         short catalogLength,
485                         string schema,
486                         short schemaLength,
487                         string tableName,
488                         short tableLength,
489                         short unique,
490                         short Reserved);
491
492                 [DllImport ("odbc32.dll", CharSet = CharSet.Unicode)]
493                 internal static extern OdbcReturn SQLBindCol (
494                         IntPtr StmtHandle,
495                         short column,
496                         SQL_C_TYPE targetType,
497                         byte [] buffer,
498                         int bufferLength,
499                         ref int indicator);
500
501                 [DllImport ("odbc32.dll", CharSet = CharSet.Unicode)]
502                 internal static extern OdbcReturn SQLBindCol (
503                         IntPtr StmtHandle,
504                         short column,
505                         SQL_C_TYPE targetType,
506                         ref short value,
507                         int bufferLength,
508                         ref int indicator);
509         }
510 }