copying the latest Sys.Web.Services from trunk.
[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 static int             SQL_OV_ODBC2            = 2;
146                 internal static int             SQL_OV_ODBC3            = 3;
147
148                 internal static string          SQLSTATE_RIGHT_TRUNC    = "01004";
149                 internal static char            C_NULL                  = '\0';
150                 #endregion
151
152                 internal static OdbcInputOutputDirection ConvertParameterDirection(
153                         ParameterDirection dir)
154                 {
155                         switch (dir)
156                         {
157                                 case ParameterDirection.Input:
158                                         return OdbcInputOutputDirection.Input;
159                                 case ParameterDirection.InputOutput:
160                                         return OdbcInputOutputDirection.InputOutput;
161                                 case ParameterDirection.Output:
162                                         return OdbcInputOutputDirection.Output;
163                                 case ParameterDirection.ReturnValue:
164                                         return OdbcInputOutputDirection.ReturnValue;
165                                 default:
166                                         return OdbcInputOutputDirection.Input;
167                         }
168                 }
169
170                 [DllImport("odbc32.dll")]
171                 internal static extern OdbcReturn SQLAllocHandle (OdbcHandleType HandleType, IntPtr InputHandle, ref IntPtr OutputHandlePtr);
172
173                 [DllImport("odbc32.dll")]
174                 internal static extern OdbcReturn SQLSetEnvAttr (IntPtr EnvHandle, OdbcEnv Attribute, IntPtr Value, int StringLength);
175
176                 [DllImport("odbc32.dll")]
177                 internal static extern OdbcReturn SQLConnect (IntPtr ConnectionHandle, string ServerName, short NameLength1, string UserName, short NameLength2, string Authentication, short NameLength3);
178
179                 [DllImport("odbc32.dll")]
180                 internal static extern OdbcReturn  SQLDriverConnect(IntPtr ConnectionHandle, IntPtr WindowHandle, string InConnectionString, short StringLength1, string OutConnectionString, short BufferLength,       ref short StringLength2Ptr,     ushort DriverCompletion);
181
182                 [DllImport("odbc32.dll")]
183                 internal static extern OdbcReturn SQLExecDirect (IntPtr StatementHandle, string StatementText, int TextLength);
184
185                 [DllImport("odbc32.dll")]
186                 internal static extern OdbcReturn SQLRowCount (IntPtr StatementHandle, ref int RowCount);
187
188                 [DllImport("odbc32.dll")]
189                 internal static extern OdbcReturn SQLNumResultCols (IntPtr StatementHandle, ref short ColumnCount);
190
191                 [DllImport("odbc32.dll")]
192                 internal static extern OdbcReturn SQLFetch (IntPtr StatementHandle);
193
194                 [DllImport("odbc32.dll")]
195                 internal static extern OdbcReturn SQLGetData (IntPtr StatementHandle, ushort ColumnNumber, SQL_C_TYPE TargetType, ref bool TargetPtr, int BufferLen, ref int Len);
196
197                 [DllImport("odbc32.dll")]
198                 internal static extern OdbcReturn SQLGetData (IntPtr StatementHandle, ushort ColumnNumber, SQL_C_TYPE TargetType, ref double TargetPtr, int BufferLen, ref int Len);
199
200                 [DllImport("odbc32.dll")]
201                 internal static extern OdbcReturn SQLGetData (IntPtr StatementHandle, ushort ColumnNumber, SQL_C_TYPE TargetType, ref long TargetPtr, int BufferLen, ref int Len);
202
203                 [DllImport("odbc32.dll")]
204                 internal static extern OdbcReturn SQLGetData (IntPtr StatementHandle, ushort ColumnNumber, SQL_C_TYPE TargetType, ref short TargetPtr, int BufferLen, ref int Len);
205
206                 [DllImport("odbc32.dll")]
207                 internal static extern OdbcReturn SQLGetData (IntPtr StatementHandle, ushort ColumnNumber, SQL_C_TYPE TargetType, ref float TargetPtr, int BufferLen, ref int Len);
208         
209                 [DllImport("odbc32.dll")]
210                 internal static extern OdbcReturn SQLGetData (IntPtr StatementHandle, ushort ColumnNumber, SQL_C_TYPE TargetType, ref OdbcTimestamp TargetPtr, int BufferLen, ref int Len);
211
212                 [DllImport("odbc32.dll")]
213                 internal static extern OdbcReturn SQLGetData (IntPtr StatementHandle, ushort ColumnNumber, SQL_C_TYPE TargetType, ref int 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, byte[] TargetPtr, int BufferLen, ref int Len);
217
218                 [DllImport("odbc32.dll")]
219                 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);
220
221                 [DllImport("odbc32.dll")]
222                 internal static extern OdbcReturn SQLFreeHandle(ushort HandleType, IntPtr SqlHandle);
223
224                 [DllImport("odbc32.dll")]
225                 internal static extern OdbcReturn SQLDisconnect(IntPtr ConnectionHandle);
226
227                 [DllImport("odbc32.dll")]
228                 internal static extern OdbcReturn SQLPrepare(IntPtr StatementHandle, string Statement, int TextLength);
229
230                 [DllImport("odbc32.dll")]
231                 internal static extern OdbcReturn SQLExecute(IntPtr StatementHandle);
232
233                 [DllImport("odbc32.dll")]
234                 internal static extern OdbcReturn SQLSetConnectAttr(IntPtr ConnectionHandle, OdbcConnectionAttribute Attribute, IntPtr Value, int Length);
235
236                 [DllImport("odbc32.dll")]
237                 internal static extern OdbcReturn SQLEndTran(int HandleType, IntPtr Handle, short CompletionType);
238
239                 [DllImport("odbc32.dll")]
240                 internal static extern OdbcReturn SQLBindParameter(IntPtr StatementHandle, ushort ParamNum, 
241                                 short InputOutputType, SQL_C_TYPE ValueType, SQL_TYPE ParamType, uint ColSize, 
242                                 short DecimalDigits, byte[] ParamValue, int BufLen, ref int StrLen);
243
244                 [DllImport("odbc32.dll")]
245                 internal static extern OdbcReturn SQLBindParameter(IntPtr StatementHandle, ushort ParamNum, 
246                                 short InputOutputType, SQL_C_TYPE ValueType, SQL_TYPE ParamType, uint ColSize, 
247                                 short DecimalDigits, ref int ParamValue, int BufLen, ref int StrLen);
248
249                 [DllImport("odbc32.dll")]
250                 internal static extern OdbcReturn SQLCancel(IntPtr StatementHandle);
251                 
252                 [DllImport("odbc32.dll")]
253                 internal static extern OdbcReturn SQLCloseCursor(IntPtr StatementHandle);
254
255                 [DllImport("odbc32.dll")]
256                 internal static extern OdbcReturn SQLError(IntPtr EnvironmentHandle,\r
257                                                            IntPtr ConnectionHandle, IntPtr StatementHandle,\r
258                                                            byte[] Sqlstate, ref int NativeError,\r
259                                                            byte[] MessageText, short BufferLength,\r
260                                                            ref short TextLength);\r
261 \r
262                 [DllImport("odbc32.dll")]
263                 internal static extern OdbcReturn SQLGetStmtAttr(IntPtr StatementHandle,\r
264                                                                 int Attribute, ref IntPtr Value, int BufLen, int StrLen);\r
265 \r
266                 [DllImport("odbc32.dll")]
267                 internal static extern OdbcReturn SQLSetDescField(IntPtr DescriptorHandle,\r
268                         short RecNumber, short FieldIdentifier, byte[] Value, int BufLen);\r
269                         
270                 [DllImport("odbc32.dll")]
271                 internal static extern OdbcReturn SQLGetDiagRec (OdbcHandleType HandleType,\r
272                                                            IntPtr Handle, ushort RecordNumber,\r
273                                                            byte [] Sqlstate, ref int NativeError,\r
274                                                            byte [] MessageText, short BufferLength,\r
275                                                            ref short TextLength);\r
276
277                 [DllImport ("odbc32.dll")]
278                 internal static extern OdbcReturn SQLMoreResults (IntPtr Handle);
279
280                 internal enum SQLFreeStmtOptions : short
281                 {
282                         Close = 0,
283                         Drop,
284                         Unbind,
285                         ResetParams
286                 }
287
288                 [DllImport ("odbc32.dll")]
289                 internal static extern OdbcReturn SQLFreeStmt (IntPtr Handle,  SQLFreeStmtOptions option);
290
291                 [DllImport ("odbc32.dll")]
292                 internal static extern OdbcReturn SQLGetInfo (IntPtr connHandle, 
293                                                               OdbcInfo info, 
294                                                               byte [] buffer, 
295                                                               short buffLength, 
296                                                               ref short remainingStrLen);
297                 [DllImport ("odbc32.dll")]
298                 internal static extern OdbcReturn SQLColAttribute (IntPtr StmtHandle,
299                                                                    int column,
300                                                                    FieldIdentifier fieldId,
301                                                                    byte [] charAttributePtr, 
302                                                                    int bufferLength,
303                                                                    ref int strLengthPtr,
304                                                                    ref int numericAttributePtr
305                                                                    );
306                 [DllImport ("odbc32.dll")]
307                 internal static extern OdbcReturn SQLPrimaryKeys (IntPtr StmtHandle,
308                                                                    string catalog,
309                                                                    int catalogLength,
310                                                                    string schema, 
311                                                                    int schemaLength,
312                                                                    string tableName,
313                                                                    int tableLength
314                                                                    );
315
316                 [DllImport ("odbc32.dll")]
317                 internal static extern OdbcReturn SQLBindCol (IntPtr StmtHandle,
318                                                                    int column,
319                                                                    SQL_C_TYPE targetType,
320                                                                    byte [] buffer, 
321                                                                    int bufferLength,
322                                                                    ref int indicator
323                                                                    );
324         }
325 }