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