Updates referencesource to .NET 4.7
[mono.git] / mcs / class / referencesource / System.Data / System / Data / OleDb / OLEDB_Util.cs
1 //------------------------------------------------------------------------------
2 // <copyright file="OLEDB_Util.cs" company="Microsoft">
3 //      Copyright (c) Microsoft Corporation.  All rights reserved.
4 // </copyright>
5 // <owner current="true" primary="true">Microsoft</owner>
6 // <owner current="true" primary="false">Microsoft</owner>
7 //------------------------------------------------------------------------------
8
9 namespace System.Data.OleDb {
10
11     using System;
12     using System.Collections;
13     using System.ComponentModel;
14     using System.Data;
15     using System.Data.Common;
16     using System.Diagnostics;
17     using System.Globalization;
18     using System.Runtime.InteropServices;
19     using System.Text;
20
21     internal static class ODB {
22
23         // OleDbCommand
24         static internal void CommandParameterStatus(StringBuilder builder, int index, DBStatus status) {
25             switch (status) {
26             case DBStatus.S_OK:
27             case DBStatus.S_ISNULL:
28             case DBStatus.S_IGNORE:
29                 break;
30
31             case DBStatus.E_BADACCESSOR:
32                 builder.Append(Res.GetString(Res.OleDb_CommandParameterBadAccessor,index.ToString(CultureInfo.InvariantCulture), ""));
33                 builder.Append(Environment.NewLine);
34                 break;
35
36             case DBStatus.E_CANTCONVERTVALUE:
37                 builder.Append(Res.GetString(Res.OleDb_CommandParameterCantConvertValue,index.ToString(CultureInfo.InvariantCulture), ""));
38                 builder.Append(Environment.NewLine);
39                 break;
40
41             case DBStatus.E_SIGNMISMATCH:
42                 builder.Append(Res.GetString(Res.OleDb_CommandParameterSignMismatch,index.ToString(CultureInfo.InvariantCulture), ""));
43                 builder.Append(Environment.NewLine);
44                 break;
45
46             case DBStatus.E_DATAOVERFLOW:
47                 builder.Append(Res.GetString(Res.OleDb_CommandParameterDataOverflow,index.ToString(CultureInfo.InvariantCulture), ""));
48                 builder.Append(Environment.NewLine);
49                 break;
50
51             case DBStatus.E_CANTCREATE:
52                 Debug.Assert(false, "CommandParameterStatus: unexpected E_CANTCREATE");
53                 goto default;
54
55             case DBStatus.E_UNAVAILABLE:
56                 builder.Append(Res.GetString(Res.OleDb_CommandParameterUnavailable,index.ToString(CultureInfo.InvariantCulture), ""));
57                 builder.Append(Environment.NewLine);
58                 break;
59
60             case DBStatus.E_PERMISSIONDENIED:
61                 Debug.Assert(false, "CommandParameterStatus: unexpected E_PERMISSIONDENIED");
62                 goto default;
63
64             case DBStatus.E_INTEGRITYVIOLATION:
65                 Debug.Assert(false, "CommandParameterStatus: unexpected E_INTEGRITYVIOLATION");
66                 goto default;
67
68             case DBStatus.E_SCHEMAVIOLATION:
69                 Debug.Assert(false, "CommandParameterStatus: unexpected E_SCHEMAVIOLATION");
70                 goto default;
71
72             case DBStatus.E_BADSTATUS:
73                 Debug.Assert(false, "CommandParameterStatus: unexpected E_BADSTATUS");
74                 goto default;
75
76             case DBStatus.S_DEFAULT: // MDAC 66626
77                 builder.Append(Res.GetString(Res.OleDb_CommandParameterDefault,index.ToString(CultureInfo.InvariantCulture), ""));
78                 builder.Append(Environment.NewLine);
79                 break;
80
81             default:
82                 builder.Append(Res.GetString(Res.OleDb_CommandParameterError, index.ToString(CultureInfo.InvariantCulture), status.ToString()));
83                 builder.Append(Environment.NewLine);
84                 break;
85             }
86         }
87         static internal Exception CommandParameterStatus(string value, Exception inner) {
88             if (ADP.IsEmpty(value)) { return inner; }
89             return ADP.InvalidOperation(value, inner);
90         }
91         static internal Exception UninitializedParameters(int index, OleDbType dbtype) {
92             return ADP.InvalidOperation(Res.GetString(Res.OleDb_UninitializedParameters, index.ToString(CultureInfo.InvariantCulture), dbtype.ToString()));
93         }
94         static internal Exception BadStatus_ParamAcc(int index, DBBindStatus status) {
95             return ADP.DataAdapter(Res.GetString(Res.OleDb_BadStatus_ParamAcc, index.ToString(CultureInfo.InvariantCulture), status.ToString()));
96         }
97         static internal Exception NoProviderSupportForParameters(string provider, Exception inner) {
98             return ADP.DataAdapter(Res.GetString(Res.OleDb_NoProviderSupportForParameters, provider), inner);
99         }
100         static internal Exception NoProviderSupportForSProcResetParameters(string provider) {
101             return ADP.DataAdapter(Res.GetString(Res.OleDb_NoProviderSupportForSProcResetParameters, provider));
102         }
103
104         // OleDbProperties
105         static internal void PropsetSetFailure(StringBuilder builder, string description, OleDbPropertyStatus status) {
106             if (OleDbPropertyStatus.Ok == status) {
107                 return;
108             }
109             switch (status) {
110             case OleDbPropertyStatus.NotSupported:
111                 if (0 < builder.Length) { builder.Append(Environment.NewLine); }
112                 builder.Append(Res.GetString(Res.OleDb_PropertyNotSupported, description));
113                 break;
114             case OleDbPropertyStatus.BadValue:
115                 if (0 < builder.Length) { builder.Append(Environment.NewLine); }
116                 builder.Append(Res.GetString(Res.OleDb_PropertyBadValue, description));
117                 break;
118             case OleDbPropertyStatus.BadOption:
119                 if (0 < builder.Length) { builder.Append(Environment.NewLine); }
120                 builder.Append(Res.GetString(Res.OleDb_PropertyBadOption, description));
121                 break;
122             case OleDbPropertyStatus.BadColumn:
123                 if (0 < builder.Length) { builder.Append(Environment.NewLine); }
124                 builder.Append(Res.GetString(Res.OleDb_PropertyBadColumn, description));
125                 break;
126             case OleDbPropertyStatus.NotAllSettable:
127                 if (0 < builder.Length) { builder.Append(Environment.NewLine); }
128                 builder.Append(Res.GetString(Res.OleDb_PropertyNotAllSettable, description));
129                 break;
130             case OleDbPropertyStatus.NotSettable:
131                 if (0 < builder.Length) { builder.Append(Environment.NewLine); }
132                 builder.Append(Res.GetString(Res.OleDb_PropertyNotSettable, description));
133                 break;
134             case OleDbPropertyStatus.NotSet:
135                 if (0 < builder.Length) { builder.Append(Environment.NewLine); }
136                 builder.Append(Res.GetString(Res.OleDb_PropertyNotSet, description));
137                 break;
138             case OleDbPropertyStatus.Conflicting:
139                 if (0 < builder.Length) { builder.Append(Environment.NewLine); }
140                 builder.Append(Res.GetString(Res.OleDb_PropertyConflicting, description));
141                 break;
142             case OleDbPropertyStatus.NotAvailable:
143                 if (0 < builder.Length) { builder.Append(Environment.NewLine); }
144                 builder.Append(Res.GetString(Res.OleDb_PropertyNotAvailable, description));
145                 break;
146             default:
147                 if (0 < builder.Length) { builder.Append(Environment.NewLine); }
148                 builder.Append(Res.GetString(Res.OleDb_PropertyStatusUnknown, ((int) status).ToString(CultureInfo.InvariantCulture)));
149                 break;
150             }
151         }
152         static internal Exception PropsetSetFailure(string value, Exception inner) {
153             if (ADP.IsEmpty(value)) { return inner; }
154             return ADP.InvalidOperation(value, inner);
155         }
156
157         // OleDbConnection
158         static internal ArgumentException SchemaRowsetsNotSupported(string provider) {
159             return ADP.Argument(Res.GetString(Res.OleDb_SchemaRowsetsNotSupported, "IDBSchemaRowset", provider));
160         }
161         static internal OleDbException NoErrorInformation(string provider, OleDbHResult hr, Exception inner) {
162             OleDbException e;
163             if (!ADP.IsEmpty(provider)) {
164                 e = new OleDbException(Res.GetString(Res.OleDb_NoErrorInformation2, provider, ODB.ELookup(hr)), hr, inner);
165             }
166             else {
167                 e = new OleDbException(Res.GetString(Res.OleDb_NoErrorInformation, ODB.ELookup(hr)), hr, inner);
168             }
169             ADP.TraceExceptionAsReturnValue(e);
170             return e;
171         }
172         static internal InvalidOperationException MDACNotAvailable(Exception inner) {
173             return ADP.DataAdapter(Res.GetString(Res.OleDb_MDACNotAvailable), inner);
174         }
175         static internal ArgumentException MSDASQLNotSupported() {
176             return ADP.Argument(Res.GetString(Res.OleDb_MSDASQLNotSupported)); // MDAC 69975
177         }
178         static internal InvalidOperationException CommandTextNotSupported(string provider, Exception inner) {
179             return ADP.DataAdapter(Res.GetString(Res.OleDb_CommandTextNotSupported, provider), inner); // 72632
180         }
181         static internal InvalidOperationException PossiblePromptNotUserInteractive() {
182             return ADP.DataAdapter(Res.GetString(Res.OleDb_PossiblePromptNotUserInteractive));
183         }
184         static internal InvalidOperationException ProviderUnavailable(string provider, Exception inner) {
185             //return new OleDbException(Res.GetString(Res.OleDb_ProviderUnavailable, provider), (int)OleDbHResult.CO_E_CLASSSTRING, inner);
186             return ADP.DataAdapter(Res.GetString(Res.OleDb_ProviderUnavailable, provider), inner);
187         }
188         static internal InvalidOperationException TransactionsNotSupported(string provider, Exception inner) {
189             return ADP.DataAdapter(Res.GetString(Res.OleDb_TransactionsNotSupported, provider), inner); // 72632
190         }
191         static internal ArgumentException AsynchronousNotSupported() {
192             return ADP.Argument(Res.GetString(Res.OleDb_AsynchronousNotSupported));
193         }
194         static internal ArgumentException NoProviderSpecified() {
195             return ADP.Argument(Res.GetString(Res.OleDb_NoProviderSpecified));
196         }
197         static internal ArgumentException InvalidProviderSpecified() {
198             return ADP.Argument(Res.GetString(Res.OleDb_InvalidProviderSpecified));
199         }
200         static internal ArgumentException InvalidRestrictionsDbInfoKeywords(string parameter) {
201             return ADP.Argument(Res.GetString(Res.OleDb_InvalidRestrictionsDbInfoKeywords), parameter);
202         }
203         static internal ArgumentException InvalidRestrictionsDbInfoLiteral(string parameter) {
204             return ADP.Argument(Res.GetString(Res.OleDb_InvalidRestrictionsDbInfoLiteral), parameter);
205         }
206         static internal ArgumentException InvalidRestrictionsSchemaGuids(string parameter) {
207             return ADP.Argument(Res.GetString(Res.OleDb_InvalidRestrictionsSchemaGuids), parameter);
208         }
209         static internal ArgumentException NotSupportedSchemaTable(Guid schema, OleDbConnection connection) {
210             return ADP.Argument(Res.GetString(Res.OleDb_NotSupportedSchemaTable, OleDbSchemaGuid.GetTextFromValue(schema), connection.Provider));
211         }
212
213         // OleDbParameter
214         static internal Exception InvalidOleDbType(OleDbType value) {
215             return ADP.InvalidEnumerationValue(typeof(OleDbType), (int)value);
216         }
217
218         // Getting Data
219         static internal InvalidOperationException BadAccessor() {
220             return ADP.DataAdapter(Res.GetString(Res.OleDb_BadAccessor));
221         }
222         static internal InvalidCastException ConversionRequired() {
223             return ADP.InvalidCast();
224         }
225         static internal InvalidCastException CantConvertValue() {
226             return ADP.InvalidCast(Res.GetString(Res.OleDb_CantConvertValue));
227         }
228         static internal InvalidOperationException SignMismatch(Type type) {
229             return ADP.DataAdapter(Res.GetString(Res.OleDb_SignMismatch, type.Name));
230         }
231         static internal InvalidOperationException DataOverflow(Type type) {
232             return ADP.DataAdapter(Res.GetString(Res.OleDb_DataOverflow, type.Name));
233         }
234         static internal InvalidOperationException CantCreate(Type type) {
235             return ADP.DataAdapter(Res.GetString(Res.OleDb_CantCreate, type.Name));
236         }
237         static internal InvalidOperationException Unavailable(Type type) {
238             return ADP.DataAdapter(Res.GetString(Res.OleDb_Unavailable, type.Name));
239         }
240         static internal InvalidOperationException UnexpectedStatusValue(DBStatus status) {
241             return ADP.DataAdapter(Res.GetString(Res.OleDb_UnexpectedStatusValue, status.ToString()));
242         }
243         static internal InvalidOperationException GVtUnknown(int wType) {
244             return ADP.DataAdapter(Res.GetString(Res.OleDb_GVtUnknown, wType.ToString("X4", CultureInfo.InvariantCulture), wType.ToString(CultureInfo.InvariantCulture)));
245         }
246         static internal InvalidOperationException SVtUnknown(int wType) {
247             return ADP.DataAdapter(Res.GetString(Res.OleDb_SVtUnknown, wType.ToString("X4", CultureInfo.InvariantCulture), wType.ToString(CultureInfo.InvariantCulture)));
248         }
249
250         // OleDbDataReader
251         static internal InvalidOperationException BadStatusRowAccessor(int i, DBBindStatus rowStatus) {
252             return ADP.DataAdapter(Res.GetString(Res.OleDb_BadStatusRowAccessor, i.ToString(CultureInfo.InvariantCulture), rowStatus.ToString()));
253         }
254         static internal InvalidOperationException ThreadApartmentState(Exception innerException) {
255             return ADP.InvalidOperation(Res.GetString(Res.OleDb_ThreadApartmentState), innerException);
256         }
257
258         // OleDbDataAdapter
259         static internal ArgumentException Fill_NotADODB(string parameter) {
260             return ADP.Argument(Res.GetString(Res.OleDb_Fill_NotADODB), parameter);
261         }
262         static internal ArgumentException Fill_EmptyRecordSet(string parameter, Exception innerException) {
263             return ADP.Argument(Res.GetString(Res.OleDb_Fill_EmptyRecordSet, "IRowset"), parameter, innerException);
264         }
265         static internal ArgumentException Fill_EmptyRecord(string parameter, Exception innerException) {
266             return ADP.Argument(Res.GetString(Res.OleDb_Fill_EmptyRecord), parameter, innerException);
267         }
268
269         static internal string NoErrorMessage(OleDbHResult errorcode) {
270             return Res.GetString(Res.OleDb_NoErrorMessage, ODB.ELookup(errorcode));
271         }
272         static internal string FailedGetDescription(OleDbHResult errorcode) {
273             return Res.GetString(Res.OleDb_FailedGetDescription, ODB.ELookup(errorcode));
274         }
275         static internal string FailedGetSource(OleDbHResult errorcode) {
276             return Res.GetString(Res.OleDb_FailedGetSource, ODB.ELookup(errorcode));
277         }
278
279         static internal InvalidOperationException DBBindingGetVector() {
280             return ADP.InvalidOperation(Res.GetString(Res.OleDb_DBBindingGetVector));
281         }
282
283         static internal OleDbHResult GetErrorDescription(UnsafeNativeMethods.IErrorInfo errorInfo, OleDbHResult hresult, out string message) {
284             Bid.Trace("<oledb.IErrorInfo.GetDescription|API|OS>\n");
285             OleDbHResult hr = errorInfo.GetDescription(out message);
286             Bid.Trace("<oledb.IErrorInfo.GetDescription|API|OS|RET> %08X{HRESULT}, Message='%ls'\n", hr, message);
287             if (((int)hr < 0) && ADP.IsEmpty(message)) {
288                 message = FailedGetDescription(hr) + Environment.NewLine + ODB.ELookup(hresult);
289             }
290             if (ADP.IsEmpty(message)) {
291                 message = ODB.ELookup(hresult);
292             }
293             return hr;
294         }
295
296         // OleDbEnumerator
297         internal static ArgumentException ISourcesRowsetNotSupported() {
298             throw ADP.Argument(Res.OleDb_ISourcesRowsetNotSupported);
299         }
300
301         // OleDbMetaDataFactory
302         static internal InvalidOperationException IDBInfoNotSupported() {
303             return ADP.InvalidOperation(Res.GetString(Res.OleDb_IDBInfoNotSupported));
304         }
305
306         // explictly used error codes
307         internal const int ADODB_AlreadyClosedError = unchecked((int)0x800A0E78);
308         internal const int ADODB_NextResultError    = unchecked((int)0x800A0CB3);
309
310         // internal command states
311         internal const int InternalStateExecuting = (int) (ConnectionState.Open | ConnectionState.Executing);
312         internal const int InternalStateFetching = (int) (ConnectionState.Open | ConnectionState.Fetching);
313         internal const int InternalStateClosed = (int) (ConnectionState.Closed);
314
315         internal const int ExecutedIMultipleResults = 0;
316         internal const int ExecutedIRowset          = 1;
317         internal const int ExecutedIRow             = 2;
318         internal const int PrepareICommandText      = 3;
319
320         // internal connection states, a superset of the command states
321         internal const int InternalStateExecutingNot = (int) ~(ConnectionState.Executing);
322         internal const int InternalStateFetchingNot = (int) ~(ConnectionState.Fetching);
323         internal const int InternalStateConnecting = (int) (ConnectionState.Connecting);
324         internal const int InternalStateOpen = (int) (ConnectionState.Open);
325
326         // constants used to trigger from binding as WSTR to BYREF|WSTR
327         // used by OleDbCommand, OleDbDataReader
328         internal const int LargeDataSize = (1 << 13); // 8K
329         internal const int CacheIncrement = 10;
330
331         // constants used by OleDbDataReader
332         internal static readonly IntPtr DBRESULTFLAG_DEFAULT = IntPtr.Zero;
333
334         internal const short VARIANT_TRUE = -1;
335         internal const short VARIANT_FALSE = 0;
336
337         // OleDbConnection constants
338         internal const int CLSCTX_ALL = /*CLSCTX_INPROC_SERVER*/1 | /*CLSCTX_INPROC_HANDLER*/2 | /*CLSCTX_LOCAL_SERVER*/4 | /*CLSCTX_REMOTE_SERVER*/16;
339         internal const int MaxProgIdLength = 255;
340
341         internal const int DBLITERAL_CATALOG_SEPARATOR = 3;
342         internal const int DBLITERAL_QUOTE_PREFIX      = 15;
343         internal const int DBLITERAL_QUOTE_SUFFIX      = 28;
344         internal const int DBLITERAL_SCHEMA_SEPARATOR  = 27;
345         internal const int DBLITERAL_TABLE_NAME        = 17;
346         internal const int DBPROP_ACCESSORDER          = 0xe7;
347
348         internal const int DBPROP_AUTH_CACHE_AUTHINFO  = 0x5;
349         internal const int DBPROP_AUTH_ENCRYPT_PASSWORD= 0x6;
350         internal const int DBPROP_AUTH_INTEGRATED      = 0x7;
351         internal const int DBPROP_AUTH_MASK_PASSWORD   = 0x8;
352         internal const int DBPROP_AUTH_PASSWORD        = 0x9;
353         internal const int DBPROP_AUTH_PERSIST_ENCRYPTED            = 0xa;
354         internal const int DBPROP_AUTH_PERSIST_SENSITIVE_AUTHINFO   = 0xb;
355         internal const int DBPROP_AUTH_USERID          = 0xc;
356
357         internal const int DBPROP_CATALOGLOCATION      = 0x16;
358         internal const int DBPROP_COMMANDTIMEOUT       = 0x22;
359         internal const int DBPROP_CONNECTIONSTATUS     = 0xf4;
360         internal const int DBPROP_CURRENTCATALOG       = 0x25;
361         internal const int DBPROP_DATASOURCENAME       = 0x26;
362         internal const int DBPROP_DBMSNAME             = 0x28;
363         internal const int DBPROP_DBMSVER              = 0x29;
364         internal const int DBPROP_GROUPBY              = 0x2c;
365         internal const int DBPROP_HIDDENCOLUMNS        = 0x102;
366         internal const int DBPROP_IColumnsRowset       = 0x7b;
367         internal const int DBPROP_IDENTIFIERCASE       = 0x2e;
368
369         internal const int DBPROP_INIT_ASYNCH          = 0xc8;
370         internal const int DBPROP_INIT_BINDFLAGS       = 0x10e;
371         internal const int DBPROP_INIT_CATALOG         = 0xe9;
372         internal const int DBPROP_INIT_DATASOURCE      = 0x3b;
373         internal const int DBPROP_INIT_GENERALTIMEOUT  = 0x11c;
374         internal const int DBPROP_INIT_HWND            = 0x3c;
375         internal const int DBPROP_INIT_IMPERSONATION_LEVEL = 0x3d;
376         internal const int DBPROP_INIT_LCID            = 0xba;
377         internal const int DBPROP_INIT_LOCATION        = 0x3e;
378         internal const int DBPROP_INIT_LOCKOWNER       = 0x10f;
379         internal const int DBPROP_INIT_MODE            = 0x3f;
380         internal const int DBPROP_INIT_OLEDBSERVICES   = 0xf8;
381         internal const int DBPROP_INIT_PROMPT          = 0x40;
382         internal const int DBPROP_INIT_PROTECTION_LEVEL= 0x41;
383         internal const int DBPROP_INIT_PROVIDERSTRING  = 0xa0;
384         internal const int DBPROP_INIT_TIMEOUT         = 0x42;
385
386         internal const int DBPROP_IRow                 = 0x107;
387         internal const int DBPROP_MAXROWS              = 0x49;
388         internal const int DBPROP_MULTIPLERESULTS      = 0xc4;
389         internal const int DBPROP_ORDERBYCOLUNSINSELECT= 0x55;
390         internal const int DBPROP_PROVIDERFILENAME     = 0x60;
391         internal const int DBPROP_QUOTEDIDENTIFIERCASE = 0x64;
392         internal const int DBPROP_RESETDATASOURCE      = 0xf7;
393         internal const int DBPROP_SQLSUPPORT           = 0x6d;
394         internal const int DBPROP_UNIQUEROWS           = 0xee;
395
396         // property status
397         internal const int DBPROPSTATUS_OK             = 0;
398         internal const int DBPROPSTATUS_NOTSUPPORTED   = 1;
399         internal const int DBPROPSTATUS_BADVALUE       = 2;
400         internal const int DBPROPSTATUS_BADOPTION      = 3;
401         internal const int DBPROPSTATUS_BADCOLUMN      = 4;
402         internal const int DBPROPSTATUS_NOTALLSETTABLE = 5;
403         internal const int DBPROPSTATUS_NOTSETTABLE    = 6;
404         internal const int DBPROPSTATUS_NOTSET         = 7;
405         internal const int DBPROPSTATUS_CONFLICTING    = 8;
406         internal const int DBPROPSTATUS_NOTAVAILABLE   = 9;
407
408         internal const int DBPROPOPTIONS_REQUIRED = 0;
409         internal const int DBPROPOPTIONS_OPTIONAL = 1;
410
411         internal const int DBPROPFLAGS_WRITE   = 0x400;
412         internal const int DBPROPFLAGS_SESSION = 0x1000;
413
414         // misc. property values
415         internal const int DBPROPVAL_AO_RANDOM = 2;
416
417         internal const int DBPROPVAL_CL_END   = 2;
418         internal const int DBPROPVAL_CL_START = 1;
419
420         internal const int DBPROPVAL_CS_COMMUNICATIONFAILURE = 2;
421         internal const int DBPROPVAL_CS_INITIALIZED          = 1;
422         internal const int DBPROPVAL_CS_UNINITIALIZED        = 0;
423
424         internal const int DBPROPVAL_GB_COLLATE              = 16;
425         internal const int DBPROPVAL_GB_CONTAINS_SELECT      = 4;
426         internal const int DBPROPVAL_GB_EQUALS_SELECT        = 2;
427         internal const int DBPROPVAL_GB_NO_RELATION          = 8;
428         internal const int DBPROPVAL_GB_NOT_SUPPORTED        = 1;
429
430         internal const int DBPROPVAL_IC_LOWER                = 2;
431         internal const int DBPROPVAL_IC_MIXED                = 8;
432         internal const int DBPROPVAL_IC_SENSITIVE            = 4;
433         internal const int DBPROPVAL_IC_UPPER                = 1;
434
435         internal const int DBPROPVAL_IN_ALLOWNULL     = 0x00000000;
436         /*internal const int DBPROPVAL_IN_DISALLOWNULL  = 0x00000001;
437         internal const int DBPROPVAL_IN_IGNORENULL    = 0x00000002;
438         internal const int DBPROPVAL_IN_IGNOREANYNULL = 0x00000004;*/
439         internal const int DBPROPVAL_MR_NOTSUPPORTED         = 0;
440
441         internal const int DBPROPVAL_RD_RESETALL         = unchecked((int) 0xffffffff);
442
443         internal const int DBPROPVAL_OS_RESOURCEPOOLING  = 0x00000001;
444         internal const int DBPROPVAL_OS_TXNENLISTMENT    = 0x00000002;
445         internal const int DBPROPVAL_OS_CLIENTCURSOR     = 0x00000004;
446         internal const int DBPROPVAL_OS_AGR_AFTERSESSION = 0x00000008;
447         internal const int DBPROPVAL_SQL_ODBC_MINIMUM = 1;
448         internal const int DBPROPVAL_SQL_ESCAPECLAUSES   = 0x00000100;
449
450         // OLE DB providers never return pGuid-style bindings.
451         // They are provided as a convenient shortcut for consumers supplying bindings all covered by the same GUID (for example, when creating bindings to access data).
452         internal const int DBKIND_GUID_NAME = 0;
453         internal const int DBKIND_GUID_PROPID = 1;
454         internal const int DBKIND_NAME = 2;
455         internal const int DBKIND_PGUID_NAME = 3;
456         internal const int DBKIND_PGUID_PROPID = 4;
457         internal const int DBKIND_PROPID = 5;
458         internal const int DBKIND_GUID = 6;
459
460         internal const int DBCOLUMNFLAGS_ISBOOKMARK    = 0x01;
461         internal const int DBCOLUMNFLAGS_ISLONG        = 0x80;
462         internal const int DBCOLUMNFLAGS_ISFIXEDLENGTH = 0x10;
463         internal const int DBCOLUMNFLAGS_ISNULLABLE    = 0x20;
464         internal const int DBCOLUMNFLAGS_ISROWSET      = 0x100000;
465         internal const int DBCOLUMNFLAGS_ISROW         = 0x200000;
466         internal const int DBCOLUMNFLAGS_ISROWSET_DBCOLUMNFLAGS_ISROW = /*DBCOLUMNFLAGS_ISROWSET*/0x100000 | /*DBCOLUMNFLAGS_ISROW*/0x200000;
467         internal const int DBCOLUMNFLAGS_ISLONG_DBCOLUMNFLAGS_ISSTREAM = /*DBCOLUMNFLAGS_ISLONG*/0x80 | /*DBCOLUMNFLAGS_ISSTREAM*/0x80000;
468         internal const int DBCOLUMNFLAGS_ISROWID_DBCOLUMNFLAGS_ISROWVER = /*DBCOLUMNFLAGS_ISROWID*/0x100 | /*DBCOLUMNFLAGS_ISROWVER*/0x200;
469         internal const int DBCOLUMNFLAGS_WRITE_DBCOLUMNFLAGS_WRITEUNKNOWN  = /*DBCOLUMNFLAGS_WRITE*/0x4 | /*DBCOLUMNFLAGS_WRITEUNKNOWN*/0x8;
470         internal const int DBCOLUMNFLAGS_ISNULLABLE_DBCOLUMNFLAGS_MAYBENULL = /*DBCOLUMNFLAGS_ISNULLABLE*/0x20 | /*DBCOLUMNFLAGS_MAYBENULL*/0x40;
471
472         // accessor constants
473         internal const int DBACCESSOR_ROWDATA = 0x2;
474         internal const int DBACCESSOR_PARAMETERDATA = 0x4;
475
476         // commandbuilder constants
477         internal const int DBPARAMTYPE_INPUT = 0x01;
478         internal const int DBPARAMTYPE_INPUTOUTPUT = 0x02;
479         internal const int DBPARAMTYPE_OUTPUT = 0x03;
480         internal const int DBPARAMTYPE_RETURNVALUE = 0x04;
481
482         // parameter constants
483         /*internal const int DBPARAMIO_NOTPARAM = 0;
484         internal const int DBPARAMIO_INPUT = 0x1;
485         internal const int DBPARAMIO_OUTPUT = 0x2;*/
486
487         /*internal const int DBPARAMFLAGS_ISINPUT = 0x1;
488         internal const int DBPARAMFLAGS_ISOUTPUT = 0x2;
489         internal const int DBPARAMFLAGS_ISSIGNED = 0x10;
490         internal const int DBPARAMFLAGS_ISNULLABLE = 0x40;
491         internal const int DBPARAMFLAGS_ISLONG = 0x80;*/
492
493         internal const int ParameterDirectionFlag = 3;
494
495         // values of the searchable column in the provider types schema rowset
496         internal const uint DB_UNSEARCHABLE = 1;
497         internal const uint DB_LIKE_ONLY = 2;
498         internal const uint DB_ALL_EXCEPT_LIKE = 3;
499         internal const uint DB_SEARCHABLE = 4;
500
501         static internal readonly IntPtr DB_INVALID_HACCESSOR = ADP.PtrZero;
502         static internal readonly IntPtr DB_NULL_HCHAPTER = ADP.PtrZero;
503         static internal readonly IntPtr DB_NULL_HROW = ADP.PtrZero;
504
505         /*static internal readonly int SizeOf_tagDBPARAMINFO = Marshal.SizeOf(typeof(tagDBPARAMINFO));*/
506         static internal readonly int SizeOf_tagDBBINDING = Marshal.SizeOf(typeof(tagDBBINDING));
507         static internal readonly int SizeOf_tagDBCOLUMNINFO = Marshal.SizeOf(typeof(tagDBCOLUMNINFO));
508         static internal readonly int SizeOf_tagDBLITERALINFO = Marshal.SizeOf(typeof(tagDBLITERALINFO));
509         static internal readonly int SizeOf_tagDBPROPSET = Marshal.SizeOf(typeof(tagDBPROPSET));
510         static internal readonly int SizeOf_tagDBPROP = Marshal.SizeOf(typeof(tagDBPROP));
511         static internal readonly int SizeOf_tagDBPROPINFOSET = Marshal.SizeOf(typeof(tagDBPROPINFOSET));
512         static internal readonly int SizeOf_tagDBPROPINFO = Marshal.SizeOf(typeof(tagDBPROPINFO));
513         static internal readonly int SizeOf_tagDBPROPIDSET = Marshal.SizeOf(typeof(tagDBPROPIDSET));
514         static internal readonly int SizeOf_Guid = Marshal.SizeOf(typeof(Guid));
515         static internal readonly int SizeOf_Variant = 8 + (2 * ADP.PtrSize); // 16 on 32bit, 24 on 64bit
516
517         static internal readonly int OffsetOf_tagDBPROP_Status = Marshal.OffsetOf(typeof(tagDBPROP), "dwStatus").ToInt32();
518         static internal readonly int OffsetOf_tagDBPROP_Value = Marshal.OffsetOf(typeof(tagDBPROP), "vValue").ToInt32();
519         static internal readonly int OffsetOf_tagDBPROPSET_Properties = Marshal.OffsetOf(typeof(tagDBPROPSET), "rgProperties").ToInt32();
520         static internal readonly int OffsetOf_tagDBPROPINFO_Value = Marshal.OffsetOf(typeof(tagDBPROPINFO), "vValue").ToInt32();
521         static internal readonly int OffsetOf_tagDBPROPIDSET_PropertySet = Marshal.OffsetOf(typeof(tagDBPROPIDSET), "guidPropertySet").ToInt32();
522         static internal readonly int OffsetOf_tagDBLITERALINFO_it = Marshal.OffsetOf(typeof(tagDBLITERALINFO), "it").ToInt32();
523         static internal readonly int OffsetOf_tagDBBINDING_obValue = Marshal.OffsetOf(typeof(tagDBBINDING), "obValue").ToInt32();
524         static internal readonly int OffsetOf_tagDBBINDING_wType = Marshal.OffsetOf(typeof(tagDBBINDING), "wType").ToInt32();
525
526         static internal Guid IID_NULL               = Guid.Empty;
527         static internal Guid IID_IUnknown           = new Guid(0x00000000,0x0000,0x0000,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x46);
528         static internal Guid IID_IDBInitialize      = new Guid(0x0C733A8B,0x2A1C,0x11CE,0xAD,0xE5,0x00,0xAA,0x00,0x44,0x77,0x3D);
529         static internal Guid IID_IDBCreateSession   = new Guid(0x0C733A5D,0x2A1C,0x11CE,0xAD,0xE5,0x00,0xAA,0x00,0x44,0x77,0x3D);
530         static internal Guid IID_IDBCreateCommand   = new Guid(0x0C733A1D,0x2A1C,0x11CE,0xAD,0xE5,0x00,0xAA,0x00,0x44,0x77,0x3D);
531         static internal Guid IID_ICommandText       = new Guid(0x0C733A27,0x2A1C,0x11CE,0xAD,0xE5,0x00,0xAA,0x00,0x44,0x77,0x3D);
532         static internal Guid IID_IMultipleResults   = new Guid(0x0C733A90,0x2A1C,0x11CE,0xAD,0xE5,0x00,0xAA,0x00,0x44,0x77,0x3D);
533         static internal Guid IID_IRow               = new Guid(0x0C733AB4,0x2A1C,0x11CE,0xAD,0xE5,0x00,0xAA,0x00,0x44,0x77,0x3D);
534         static internal Guid IID_IRowset            = new Guid(0x0C733A7C,0x2A1C,0x11CE,0xAD,0xE5,0x00,0xAA,0x00,0x44,0x77,0x3D);
535         static internal Guid IID_ISQLErrorInfo      = new Guid(0x0C733A74,0x2A1C,0x11CE,0xAD,0xE5,0x00,0xAA,0x00,0x44,0x77,0x3D);
536
537         static internal Guid CLSID_DataLinks        = new Guid(0x2206CDB2,0x19C1,0x11D1,0x89,0xE0,0x00,0xC0,0x4F,0xD7,0xA8,0x29);
538
539         static internal Guid DBGUID_DEFAULT = new Guid(0xc8b521fb,0x5cf3,0x11ce,0xad,0xe5,0x00,0xaa,0x00,0x44,0x77,0x3d);
540         static internal Guid DBGUID_ROWSET  = new Guid(0xc8b522f6,0x5cf3,0x11ce,0xad,0xe5,0x00,0xaa,0x00,0x44,0x77,0x3d);
541         static internal Guid DBGUID_ROW     = new Guid(0xc8b522f7,0x5cf3,0x11ce,0xad,0xe5,0x00,0xaa,0x00,0x44,0x77,0x3d);
542
543         static internal Guid DBGUID_ROWDEFAULTSTREAM = new Guid(0x0C733AB7,0x2A1C,0x11CE,0xAD,0xE5,0x00,0xAA,0x00,0x44,0x77,0x3D);
544
545         static internal readonly Guid CLSID_MSDASQL  = new Guid(0xc8b522cb,0x5cf3,0x11ce,0xad,0xe5,0x00,0xaa,0x00,0x44,0x77,0x3d);
546
547         static internal readonly object DBCOL_SPECIALCOL = new Guid(0xc8b52232,0x5cf3,0x11ce,0xad,0xe5,0x00,0xaa,0x00,0x44,0x77,0x3d);
548
549         static internal readonly char[] ErrorTrimCharacters = new char[] { '\r', '\n', '\0' }; // MDAC 73707
550
551         // used by ConnectionString hashtable, must be all lowercase
552         internal const string Asynchronous_Processing = "asynchronous processing";
553         internal const string AttachDBFileName = "attachdbfilename";
554         internal const string Connect_Timeout = "connect timeout";
555         internal const string Data_Source = "data source";
556         internal const string File_Name = "file name";
557         internal const string Initial_Catalog = "initial catalog";
558         internal const string Password = "password";
559         internal const string Persist_Security_Info = "persist security info";
560         internal const string Provider = "provider";
561         internal const string Pwd = "pwd";
562         internal const string User_ID = "user id";
563
564         // used by OleDbConnection as property names
565         internal const string Current_Catalog = "current catalog";
566         internal const string DBMS_Version = "dbms version";
567         internal const string Properties = "Properties";
568
569         // used by OleDbConnection to create and verify OLE DB Services
570         internal const string DataLinks_CLSID = "CLSID\\{2206CDB2-19C1-11D1-89E0-00C04FD7A829}\\InprocServer32";
571         internal const string OLEDB_SERVICES = "OLEDB_SERVICES";
572
573         // used by OleDbConnection to eliminate post-open detection of 'Microsoft OLE DB Provider for ODBC Drivers'
574         internal const string DefaultDescription_MSDASQL = "microsoft ole db provider for odbc drivers";
575         internal const string MSDASQL = "msdasql";
576         internal const string MSDASQLdot = "msdasql.";
577
578         // used by OleDbPermission
579         internal const string _Add = "add";
580         internal const string _Keyword = "keyword";
581         internal const string _Name = "name";
582         internal const string _Value = "value";
583
584         // IColumnsRowset column names
585         internal const string DBCOLUMN_BASECATALOGNAME = "DBCOLUMN_BASECATALOGNAME";
586         internal const string DBCOLUMN_BASECOLUMNNAME  = "DBCOLUMN_BASECOLUMNNAME";
587         internal const string DBCOLUMN_BASESCHEMANAME  = "DBCOLUMN_BASESCHEMANAME";
588         internal const string DBCOLUMN_BASETABLENAME   = "DBCOLUMN_BASETABLENAME";
589         internal const string DBCOLUMN_COLUMNSIZE      = "DBCOLUMN_COLUMNSIZE";
590         internal const string DBCOLUMN_FLAGS           = "DBCOLUMN_FLAGS";
591         internal const string DBCOLUMN_GUID            = "DBCOLUMN_GUID";
592         internal const string DBCOLUMN_IDNAME          = "DBCOLUMN_IDNAME";
593         internal const string DBCOLUMN_ISAUTOINCREMENT = "DBCOLUMN_ISAUTOINCREMENT";
594         internal const string DBCOLUMN_ISUNIQUE        = "DBCOLUMN_ISUNIQUE";
595         internal const string DBCOLUMN_KEYCOLUMN       = "DBCOLUMN_KEYCOLUMN";
596         internal const string DBCOLUMN_NAME            = "DBCOLUMN_NAME";
597         internal const string DBCOLUMN_NUMBER          = "DBCOLUMN_NUMBER";
598         internal const string DBCOLUMN_PRECISION       = "DBCOLUMN_PRECISION";
599         internal const string DBCOLUMN_PROPID          = "DBCOLUMN_PROPID";
600         internal const string DBCOLUMN_SCALE           = "DBCOLUMN_SCALE";
601         internal const string DBCOLUMN_TYPE            = "DBCOLUMN_TYPE";
602         internal const string DBCOLUMN_TYPEINFO        = "DBCOLUMN_TYPEINFO";
603
604         // ISchemaRowset.GetRowset(OleDbSchemaGuid.Indexes) column names
605         internal const string PRIMARY_KEY  = "PRIMARY_KEY";
606         internal const string UNIQUE       = "UNIQUE";
607         internal const string COLUMN_NAME  = "COLUMN_NAME";
608         internal const string NULLS        = "NULLS";
609         internal const string INDEX_NAME   = "INDEX_NAME";
610
611         // ISchemaRowset.GetSchemaRowset(OleDbSchemaGuid.Procedure_Parameters) column names
612         internal const string PARAMETER_NAME           = "PARAMETER_NAME";
613         internal const string ORDINAL_POSITION         = "ORDINAL_POSITION";
614         internal const string PARAMETER_TYPE           = "PARAMETER_TYPE";
615         internal const string IS_NULLABLE              = "IS_NULLABLE";
616         internal const string DATA_TYPE                = "DATA_TYPE";
617         internal const string CHARACTER_MAXIMUM_LENGTH = "CHARACTER_MAXIMUM_LENGTH";
618         internal const string NUMERIC_PRECISION        = "NUMERIC_PRECISION";
619         internal const string NUMERIC_SCALE            = "NUMERIC_SCALE";
620         internal const string TYPE_NAME                = "TYPE_NAME";
621
622         // DataTable.Select to sort on ordinal position for OleDbSchemaGuid.Procedure_Parameters
623         internal const string ORDINAL_POSITION_ASC     = "ORDINAL_POSITION ASC";
624
625         // OleDbConnection.GetOleDbSchemmaTable(OleDbSchemaGuid.SchemaGuids) table and column names
626         internal const string SchemaGuids = "SchemaGuids";
627         internal const string Schema = "Schema";
628         internal const string RestrictionSupport = "RestrictionSupport";
629
630         // OleDbConnection.GetOleDbSchemmaTable(OleDbSchemaGuid.DbInfoKeywords) table and column names
631         internal const string DbInfoKeywords = "DbInfoKeywords";
632         internal const string Keyword = "Keyword";
633
634         // Debug error string writeline
635         static internal string ELookup(OleDbHResult hr) {
636             StringBuilder builder = new StringBuilder();
637             builder.Append(hr.ToString());
638             if ((0 < builder.Length) && Char.IsDigit(builder[0])) {
639                 builder.Length = 0;
640             }
641             builder.Append("(0x");
642             builder.Append(((int)hr).ToString("X8", CultureInfo.InvariantCulture));
643             builder.Append(")");
644             return builder.ToString();
645         }       
646
647 #if DEBUG
648         static readonly private Hashtable g_wlookpup = new Hashtable();
649         static internal string WLookup(short id) {
650             string value = (string)g_wlookpup[id];
651             if (null == value) {
652                 value = "0x" + ((short) id).ToString("X2", CultureInfo.InvariantCulture) + " " + ((short) id);
653                 value += " " + ((DBTypeEnum) id).ToString();
654                 g_wlookpup[id] = value;
655             }
656             return value;
657         }
658
659         private enum DBTypeEnum {
660             EMPTY       = 0,       //
661             NULL        = 1,       //
662             I2          = 2,       //
663             I4          = 3,       //
664             R4          = 4,       //
665             R8          = 5,       //
666             CY          = 6,       //
667             DATE        = 7,       //
668             BSTR        = 8,       //
669             IDISPATCH   = 9,       //
670             ERROR       = 10,      //
671             BOOL        = 11,      //
672             VARIANT     = 12,      //
673             IUNKNOWN    = 13,      //
674             DECIMAL     = 14,      //
675             I1          = 16,      //
676             UI1         = 17,      //
677             UI2         = 18,      //
678             UI4         = 19,      //
679             I8          = 20,      //
680             UI8         = 21,      //
681             FILETIME    = 64,      // 2.0
682             GUID        = 72,      //
683             BYTES       = 128,     //
684             STR         = 129,     //
685             WSTR        = 130,     //
686             NUMERIC     = 131,     // with potential overflow
687             UDT         = 132,     // should never be encountered
688             DBDATE      = 133,     //
689             DBTIME      = 134,     //
690             DBTIMESTAMP = 135,     // granularity reduced from 1ns to 100ns (sql is 3.33 milli seconds)
691             HCHAPTER    = 136,     // 1.5
692             PROPVARIANT = 138,     // 2.0 - as variant
693             VARNUMERIC  = 139,     // 2.0 - as string else ConversionException
694
695             BYREF_I2          = 0x4002,
696             BYREF_I4          = 0x4003,
697             BYREF_R4          = 0x4004,
698             BYREF_R8          = 0x4005,
699             BYREF_CY          = 0x4006,
700             BYREF_DATE        = 0x4007,
701             BYREF_BSTR        = 0x4008,
702             BYREF_IDISPATCH   = 0x4009,
703             BYREF_ERROR       = 0x400a,
704             BYREF_BOOL        = 0x400b,
705             BYREF_VARIANT     = 0x400c,
706             BYREF_IUNKNOWN    = 0x400d,
707             BYREF_DECIMAL     = 0x400e,
708             BYREF_I1          = 0x4010,
709             BYREF_UI1         = 0x4011,
710             BYREF_UI2         = 0x4012,
711             BYREF_UI4         = 0x4013,
712             BYREF_I8          = 0x4014,
713             BYREF_UI8         = 0x4015,
714             BYREF_FILETIME    = 0x4040,
715             BYREF_GUID        = 0x4048,
716             BYREF_BYTES       = 0x4080,
717             BYREF_STR         = 0x4081,
718             BYREF_WSTR        = 0x4082,
719             BYREF_NUMERIC     = 0x4083,
720             BYREF_UDT         = 0x4084,
721             BYREF_DBDATE      = 0x4085,
722             BYREF_DBTIME      = 0x4086,
723             BYREF_DBTIMESTAMP = 0x4087,
724             BYREF_HCHAPTER    = 0x4088,
725             BYREF_PROPVARIANT = 0x408a,
726             BYREF_VARNUMERIC  = 0x408b,
727
728             VECTOR      = 0x1000,
729             ARRAY       = 0x2000,
730             BYREF       = 0x4000,  //
731             RESERVED    = 0x8000,  // SystemException
732         }
733 #endif
734     }
735 }