* support-test-*.cs: Rename from test-*-p2.cs.
[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         }
70
71         internal enum OdbcInfo : ushort
72         {
73                 DataSourceName          = 2,
74                 DriverName              = 6,
75                 DriverVersion           = 7,
76                 DatabaseName            = 16,
77                 DbmsVersion             = 18
78         }
79
80         internal enum OdbcInputOutputDirection : short
81         {
82                 Input=1,
83                 InputOutput=2,
84                 ResultCol=3,
85                 Output=4,
86                 ReturnValue=5
87         }
88
89         internal enum OdbcLengthIndicator : short
90         {
91                 NoTotal         = -4,
92                 NullData        = -1
93         }
94         
95         // Keep this sorted.
96         internal enum FieldIdentifier 
97         {
98                 AutoUniqueValue              = 11,    /* SQL_DESC_AUTO_UNIQUE_VALUE */
99                 BaseColumnName               = 22,    /* SQL_DESC_BASE_COLUMN_NAME */
100                 BaseTableName                = 23,    /* SQL_DESC_BASE_TABLE_NAME */
101                 CaseSensitive                = 12,    /* SQL_DESC_CASE_SENSITIVE */
102                 CatelogName                  = 17,    /* SQL_DESC_CATALOG_NAME */
103                 ConsiseType                  = 2,     /* SQL_DESC_CONCISE_TYPE */
104                 Count                        = 1001,  /* SQL_DESC_COUNT */
105                 DisplaySize                  = 6,     /* SQL_DESC_DISPLAY_SIZE */
106                 FixedPrecScale               = 9,     /* SQL_DESC_FIXED_PREC_SCALE */
107                 Label                        = 18,    /* SQL_DESC_LABEL */
108                 Length                       = 1003,  /* SQL_DESC_LENGTH */
109                 LiteralPrefix                = 27,    /* SQL_DESC_LITERAL_PREFIX */
110                 LiteralSuffix                = 28,    /* SQL_DESC_LITERAL_SUFFIX */
111                 LocalTypeName                = 29,    /* SQL_DESC_LOCAL_TYPE_NAME */
112                 Name                         = 1011,  /* SQL_DESC_NAME */
113                 Nullable                     = 1008,  /* SQL_DESC_NULLABLE */
114                 NumPrecRadix                 = 32,    /* SQL_DESC_NUM_PREC_RADIX */
115                 OctetLength                  = 1013,  /* SQL_DESC_OCTET_LENGTH */
116                 Precision                    = 1005,  /* SQL_DESC_PRECISION */
117                 Scale                        = 1006,  /* SQL_DESC_SCALE */
118                 SchemaName                   = 16,    /* SQL_DESC_SCHEMA_NAME */
119                 Searchable                   = 13,    /* SQL_DESC_SEARCHABLE */
120                 TableName                    = 15,    /* SQL_DESC_TABLE_NAME */
121                 Type                         = 1002,  /* SQL_DESC_TYPE */
122                 TypeName                     = 14,    /* SQL_DESC_TYPE_NAME */
123                 Unnamed                      = 1012,  /* SQL_DESC_UNNAMED */
124                 Unsigned                     = 8,     /* SQL_DESC_UNSIGNED */
125                 Updatable                    = 10     /* SQL_DESC_UPDATABLE */                
126         }
127         
128         [StructLayout(LayoutKind.Sequential)]
129         internal struct OdbcTimestamp
130         {
131                 internal short year;
132                 internal ushort month;
133                 internal ushort day;
134                 internal ushort hour;
135                 internal ushort minute;
136                 internal ushort second;
137                 internal ulong fraction;
138         }
139
140         
141 //      sealed internal class libodbc
142         internal class libodbc
143         {
144                 #region global constants
145                 internal const int              SQL_OV_ODBC2            = 2;
146                 internal const int              SQL_OV_ODBC3            = 3;
147
148                 internal const string           SQLSTATE_RIGHT_TRUNC    = "01004";
149                 internal const char             C_NULL                  = '\0';
150
151                 internal const short            SQL_TRUE                = 1;
152                 internal const short            SQL_FALSE               = 0;
153
154                 // SQLStatistics
155                 internal const short            SQL_INDEX_UNIQUE        = 0;
156                 internal const short            SQL_INDEX_ALL           = 1;
157                 internal const short            SQL_QUICK               = 0;
158                 internal const short            SQL_ENSURE              = 1;
159
160                 // SQLColumnAttribute
161                 internal const short            SQL_NO_NULLS            = 0;
162                 internal const short            SQL_NULLABLE            = 1;
163                 internal const short            SQL_NULLABLE_UNKNOWN    = 2;
164                 internal const short            SQL_ATTR_READONLY       = 0;
165                 internal const short            SQL_ATTR_WRITE          = 1;
166                 internal const short            SQL_ATTR_READWRITE_UNKNOWN = 2;
167                 #endregion
168
169                 internal static OdbcInputOutputDirection ConvertParameterDirection(
170                         ParameterDirection dir)
171                 {
172                         switch (dir)
173                         {
174                                 case ParameterDirection.Input:
175                                         return OdbcInputOutputDirection.Input;
176                                 case ParameterDirection.InputOutput:
177                                         return OdbcInputOutputDirection.InputOutput;
178                                 case ParameterDirection.Output:
179                                         return OdbcInputOutputDirection.Output;
180                                 case ParameterDirection.ReturnValue:
181                                         return OdbcInputOutputDirection.ReturnValue;
182                                 default:
183                                         return OdbcInputOutputDirection.Input;
184                         }
185                 }
186
187                 [DllImport("odbc32.dll")]
188                 internal static extern OdbcReturn SQLAllocHandle (OdbcHandleType HandleType, IntPtr InputHandle, ref IntPtr OutputHandlePtr);
189
190                 [DllImport("odbc32.dll")]
191                 internal static extern OdbcReturn SQLSetEnvAttr (IntPtr EnvHandle, OdbcEnv Attribute, IntPtr Value, int StringLength);
192
193                 [DllImport("odbc32.dll")]
194                 internal static extern OdbcReturn SQLConnect (IntPtr ConnectionHandle, string ServerName, short NameLength1, string UserName, short NameLength2, string Authentication, short NameLength3);
195
196                 [DllImport("odbc32.dll")]
197                 internal static extern OdbcReturn  SQLDriverConnect(IntPtr ConnectionHandle, IntPtr WindowHandle, string InConnectionString, short StringLength1, string OutConnectionString, short BufferLength,       ref short StringLength2Ptr,     ushort DriverCompletion);
198
199                 [DllImport("odbc32.dll")]
200                 internal static extern OdbcReturn SQLExecDirect (IntPtr StatementHandle, string StatementText, int TextLength);
201
202                 [DllImport("odbc32.dll")]
203                 internal static extern OdbcReturn SQLRowCount (IntPtr StatementHandle, ref int RowCount);
204
205                 [DllImport("odbc32.dll")]
206                 internal static extern OdbcReturn SQLNumResultCols (IntPtr StatementHandle, ref short ColumnCount);
207
208                 [DllImport("odbc32.dll")]
209                 internal static extern OdbcReturn SQLFetch (IntPtr StatementHandle);
210
211                 [DllImport("odbc32.dll")]
212                 internal static extern OdbcReturn SQLGetData (IntPtr StatementHandle, ushort ColumnNumber, SQL_C_TYPE TargetType, ref bool TargetPtr, int BufferLen, ref int Len);
213
214                 [DllImport("odbc32.dll")]
215                 internal static extern OdbcReturn SQLGetData (IntPtr StatementHandle, ushort ColumnNumber, SQL_C_TYPE TargetType, ref double TargetPtr, int BufferLen, ref int Len);
216
217                 [DllImport("odbc32.dll")]
218                 internal static extern OdbcReturn SQLGetData (IntPtr StatementHandle, ushort ColumnNumber, SQL_C_TYPE TargetType, ref long TargetPtr, int BufferLen, ref int Len);
219
220                 [DllImport("odbc32.dll")]
221                 internal static extern OdbcReturn SQLGetData (IntPtr StatementHandle, ushort ColumnNumber, SQL_C_TYPE TargetType, ref short TargetPtr, int BufferLen, ref int Len);
222
223                 [DllImport("odbc32.dll")]
224                 internal static extern OdbcReturn SQLGetData (IntPtr StatementHandle, ushort ColumnNumber, SQL_C_TYPE TargetType, ref float TargetPtr, int BufferLen, ref int Len);
225         
226                 [DllImport("odbc32.dll")]
227                 internal static extern OdbcReturn SQLGetData (IntPtr StatementHandle, ushort ColumnNumber, SQL_C_TYPE TargetType, ref OdbcTimestamp TargetPtr, int BufferLen, ref int Len);
228
229                 [DllImport("odbc32.dll")]
230                 internal static extern OdbcReturn SQLGetData (IntPtr StatementHandle, ushort ColumnNumber, SQL_C_TYPE TargetType, ref int TargetPtr, int BufferLen, ref int Len);
231         
232                 [DllImport("odbc32.dll")]
233                 internal static extern OdbcReturn SQLGetData (IntPtr StatementHandle, ushort ColumnNumber, SQL_C_TYPE TargetType, byte[] TargetPtr, int BufferLen, ref int Len);
234
235                 [DllImport("odbc32.dll")]
236                 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);
237
238                 [DllImport("odbc32.dll")]
239                 internal static extern OdbcReturn SQLFreeHandle(ushort HandleType, IntPtr SqlHandle);
240
241                 [DllImport("odbc32.dll")]
242                 internal static extern OdbcReturn SQLDisconnect(IntPtr ConnectionHandle);
243
244                 [DllImport("odbc32.dll")]
245                 internal static extern OdbcReturn SQLPrepare(IntPtr StatementHandle, string Statement, int TextLength);
246
247                 [DllImport("odbc32.dll")]
248                 internal static extern OdbcReturn SQLExecute(IntPtr StatementHandle);
249
250                 [DllImport("odbc32.dll")]
251                 internal static extern OdbcReturn SQLSetConnectAttr(IntPtr ConnectionHandle, OdbcConnectionAttribute Attribute, IntPtr Value, int Length);
252
253                 [DllImport("odbc32.dll")]
254                 internal static extern OdbcReturn SQLEndTran(int HandleType, IntPtr Handle, short CompletionType);
255
256                 [DllImport("odbc32.dll")]
257                 internal static extern OdbcReturn SQLBindParameter(IntPtr StatementHandle, ushort ParamNum, 
258                                 short InputOutputType, SQL_C_TYPE ValueType, SQL_TYPE ParamType, uint ColSize, 
259                                 short DecimalDigits, IntPtr ParamValue, int BufLen, IntPtr StrLen);
260
261                 [DllImport("odbc32.dll")]
262                 internal static extern OdbcReturn SQLCancel(IntPtr StatementHandle);
263                 
264                 [DllImport("odbc32.dll")]
265                 internal static extern OdbcReturn SQLCloseCursor(IntPtr StatementHandle);
266
267                 [DllImport("odbc32.dll")]
268                 internal static extern OdbcReturn SQLError(IntPtr EnvironmentHandle,\r
269                                                            IntPtr ConnectionHandle, IntPtr StatementHandle,\r
270                                                            byte[] Sqlstate, ref int NativeError,\r
271                                                            byte[] MessageText, short BufferLength,\r
272                                                            ref short TextLength);\r
273 \r
274                 [DllImport("odbc32.dll")]
275                 internal static extern OdbcReturn SQLGetStmtAttr(IntPtr StatementHandle,\r
276                                                                 int Attribute, ref IntPtr Value, int BufLen, int StrLen);\r
277 \r
278                 [DllImport("odbc32.dll")]
279                 internal static extern OdbcReturn SQLSetDescField(IntPtr DescriptorHandle,\r
280                         short RecNumber, short FieldIdentifier, byte[] Value, int BufLen);\r
281                         
282                 [DllImport("odbc32.dll")]
283                 internal static extern OdbcReturn SQLGetDiagRec (OdbcHandleType HandleType,\r
284                                                            IntPtr Handle, ushort RecordNumber,\r
285                                                            byte [] Sqlstate, ref int NativeError,\r
286                                                            byte [] MessageText, short BufferLength,\r
287                                                            ref short TextLength);\r
288
289                 [DllImport ("odbc32.dll")]
290                 internal static extern OdbcReturn SQLMoreResults (IntPtr Handle);
291
292                 internal enum SQLFreeStmtOptions : short
293                 {
294                         Close = 0,
295                         Drop,
296                         Unbind,
297                         ResetParams
298                 }
299
300                 [DllImport ("odbc32.dll")]
301                 internal static extern OdbcReturn SQLFreeStmt (IntPtr Handle,  SQLFreeStmtOptions option);
302
303                 [DllImport ("odbc32.dll")]
304                 internal static extern OdbcReturn SQLGetInfo (IntPtr connHandle, 
305                                                               OdbcInfo info, 
306                                                               byte [] buffer, 
307                                                               short buffLength, 
308                                                               ref short remainingStrLen);
309                 [DllImport ("odbc32.dll")]
310                 internal static extern OdbcReturn SQLColAttribute (IntPtr StmtHandle,
311                                                                    int column,
312                                                                    FieldIdentifier fieldId,
313                                                                    byte [] charAttributePtr, 
314                                                                    int bufferLength,
315                                                                    ref int strLengthPtr,
316                                                                    ref int numericAttributePtr
317                                                                    );
318                 [DllImport ("odbc32.dll")]
319                 internal static extern OdbcReturn SQLPrimaryKeys (IntPtr StmtHandle,
320                                                                    string catalog,
321                                                                    int catalogLength,
322                                                                    string schema, 
323                                                                    int schemaLength,
324                                                                    string tableName,
325                                                                    int tableLength
326                                                                    );
327
328                 [DllImport ("odbc32.dll")]
329                 internal static extern OdbcReturn SQLStatistics (IntPtr StmtHandle,
330                                                                  string catalog,
331                                                                  int catalogLength,
332                                                                  string schema, 
333                                                                  int schemaLength,
334                                                                  string tableName,
335                                                                  int tableLength,
336                                                                  short unique,
337                                                                  short Reserved
338                                                                  );
339
340                 [DllImport ("odbc32.dll")]
341                 internal static extern OdbcReturn SQLBindCol (IntPtr StmtHandle,
342                                                                    int column,
343                                                                    SQL_C_TYPE targetType,
344                                                                    byte [] buffer, 
345                                                                    int bufferLength,
346                                                                    ref int indicator
347                                                                    );
348
349                 [DllImport ("odbc32.dll")]
350                 internal static extern OdbcReturn SQLBindCol (IntPtr StmtHandle,
351                                                                    int column,
352                                                                    SQL_C_TYPE targetType,
353                                                                    ref short value, 
354                                                                    int bufferLength,
355                                                                    ref int indicator
356                                                                    );
357         }
358 }