/*
 * Copyright 2019 Hans Leidekker for CodeWeavers
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
 */

import "oaidl.idl";

interface _ADO;
interface _Collection;
interface _Command;
interface _Connection;
interface _DynaCollection;
interface _Parameter;
interface _Record;
interface _Recordset;
interface _Stream;
interface ADODebugging;
interface ADOConnectionConstruction;
interface ADOCommandConstruction;
interface ADORecordsetConstruction;
interface Command15;
interface Command25;
interface Error;
interface Errors;
interface Field;
interface Field15;
interface Field20;
interface Fields;
interface Fields15;
interface Fields20;
interface Parameters;
interface Properties;
interface Property;
interface Recordset15;
interface Recordset20;
interface Recordset21;
interface ConnectionEventsVt;
dispinterface ConnectionEvents;
dispinterface RecordsetEvents;

typedef [uuid(0000052A-0000-0010-8000-00AA006D2EA4)] enum ErrorValueEnum
{
    adErrInvalidArgument            = 3001,
    adErrOpeningFile                = 3002,
    adErrReadFile                   = 3003,
    adErrWriteFile                  = 3004,
    adErrNoCurrentRecord            = 3021,
    adErrIllegalOperation           = 3219,
    adErrCantChangeProvider         = 3220,
    adErrInTransaction              = 3246,
    adErrFeatureNotAvailable        = 3251,
    adErrItemNotFound               = 3265,
    adErrObjectInCollection         = 3367,
    adErrObjectNotSet               = 3420,
    adErrDataConversion             = 3421,
    adErrObjectClosed               = 3704,
    adErrObjectOpen                 = 3705,
    adErrProviderNotFound           = 3706,
    adErrBoundToCommand             = 3707,
    adErrInvalidParamInfo           = 3708,
    adErrInvalidConnection          = 3709,
    adErrNotReentrant               = 3710,
    adErrStillExecuting             = 3711,
    adErrOperationCancelled         = 3712,
    adErrStillConnecting            = 3713,
    adErrInvalidTransaction         = 3714,
    adErrNotExecuting               = 3715,
    adErrUnsafeOperation            = 3716,
    adWrnSecurityDialog             = 3717,
    adWrnSecurityDialogHeader       = 3718,
    adErrIntegrityViolation         = 3719,
    adErrPermissionDenied           = 3720,
    adErrDataOverflow               = 3721,
    adErrSchemaViolation            = 3722,
    adErrSignMismatch               = 3723,
    adErrCantConvertvalue           = 3724,
    adErrCantCreate                 = 3725,
    adErrColumnNotOnThisRow         = 3726,
    adErrURLDoesNotExist            = 3727,
    adErrTreePermissionDenied       = 3728,
    adErrInvalidURL                 = 3729,
    adErrResourceLocked             = 3730,
    adErrResourceExists             = 3731,
    adErrCannotComplete             = 3732,
    adErrVolumeNotFound             = 3733,
    adErrOutOfSpace                 = 3734,
    adErrResourceOutOfScope         = 3735,
    adErrUnavailable                = 3736,
    adErrURLNamedRowDoesNotExist    = 3737,
    adErrDelResOutOfScope           = 3738,
    adErrPropInvalidColumn          = 3739,
    adErrPropInvalidOption          = 3740,
    adErrPropInvalidValue           = 3741,
    adErrPropConflicting            = 3742,
    adErrPropNotAllSettable         = 3743,
    adErrPropNotSet                 = 3744,
    adErrPropNotSettable            = 3745,
    adErrPropNotSupported           = 3746,
    adErrCatalogNotSet              = 3747,
    adErrCantChangeConnection       = 3748,
    adErrFieldsUpdateFailed         = 3749,
    adErrDenyNotSupported           = 3750,
    adErrDenyTypeNotSupported       = 3751,
    adErrProviderNotSpecified       = 3753,
    adErrConnectionStringTooLong    = 3754
} ErrorValueEnum;

typedef [uuid(00000528-0000-0010-8000-00aa006d2ea4)] enum PositionEnum
{
    adPosUnknown = -1,
    adPosBOF = -2,
    adPosEOF = -3
} PositionEnum;

typedef [uuid(a56187c5-d690-4037-ae32-a00edc376ac3), public] PositionEnum PositionEnum_Param;

typedef [uuid(0000051f-0000-0010-8000-00aa006d2ea4)] enum DataTypeEnum
{
    adEmpty = 0,
    adTinyInt = 16,
    adSmallInt = 2,
    adInteger = 3,
    adBigInt = 20,
    adUnsignedTinyInt = 17,
    adUnsignedSmallInt = 18,
    adUnsignedInt = 19,
    adUnsignedBigInt = 21,
    adSingle = 4,
    adDouble = 5,
    adCurrency = 6,
    adDecimal = 14,
    adNumeric = 131,
    adBoolean = 11,
    adError = 10,
    adUserDefined = 132,
    adVariant = 12,
    adIDispatch = 9,
    adIUnknown = 13,
    adGUID = 72,
    adDate = 7,
    adDBDate = 133,
    adDBTime = 134,
    adDBTimeStamp = 135,
    adBSTR = 8,
    adChar = 129,
    adVarChar = 200,
    adLongVarChar = 201,
    adWChar = 130,
    adVarWChar = 202,
    adLongVarWChar = 203,
    adBinary = 128,
    adVarBinary = 204,
    adLongVarBinary = 205,
    adChapter = 136,
    adFileTime = 64,
    adPropVariant = 138,
    adVarNumeric = 139,
    adArray = 0x2000
} DataTypeEnum;

typedef [uuid(00000548-0000-0010-8000-00aa006d2ea4)] enum PersistFormatEnum
{
    adPersistADTG = 0,
    adPersistXML = 1
} PersistFormatEnum;

typedef [uuid(00000552-0000-0010-8000-00aa006d2ea4)] enum SeekEnum
{
    adSeekFirstEQ = 1,
    adSeekLastEQ = 2,
    adSeekAfterEQ = 4,
    adSeekAfter = 8,
    adSeekBeforeEQ = 16,
    adSeekBefore = 32
} SeekEnum;

typedef [uuid(0000051b-0000-0010-8000-00aa006d2ea4)] enum CursorTypeEnum
{
    adOpenUnspecified = -1,
    adOpenForwardOnly = 0,
    adOpenKeyset = 1,
    adOpenDynamic = 2,
    adOpenStatic = 3
} CursorTypeEnum;

typedef [uuid(00000525-0000-0010-8000-00aa006d2ea4)] enum FieldAttributeEnum
{
    adFldUnspecified = -1,
    adFldMayDefer = 0x00000002,
    adFldUpdatable = 0x00000004,
    adFldUnknownUpdatable = 0x00000008,
    adFldFixed = 0x00000010,
    adFldIsNullable = 0x00000020,
    adFldMayBeNull = 0x00000040,
    adFldLong = 0x00000080,
    adFldRowID = 0x00000100,
    adFldRowVersion = 0x00000200,
    adFldCacheDeferred = 0x00001000,
    adFldIsChapter = 0x00002000,
    adFldNegativeScale = 0x00004000,
    adFldKeyColumn = 0x00008000,
    adFldIsRowURL = 0x00010000,
    adFldIsDefaultStream = 0x00020000,
    adFldIsCollection = 0x00040000
} FieldAttributeEnum;

typedef [uuid(00000544-0000-0010-8000-00aa006d2ea4)] enum ResyncEnum
{
    adResyncUnderlyingValues = 1,
    adResyncAllValues = 2
} ResyncEnum;

typedef [uuid(0000051d-0000-0010-8000-00aa006d2ea4)] enum LockTypeEnum
{
    adLockUnspecified = -1,
    adLockReadOnly = 1,
    adLockPessimistic = 2,
    adLockOptimistic = 3,
    adLockBatchOptimistic = 4
} LockTypeEnum;

typedef [uuid(00000543-0000-0010-8000-00aa006d2ea4)] enum AffectEnum
{
    adAffectCurrent = 1,
    adAffectGroup = 2,
    adAffectAll = 3,
    adAffectAllChapters = 4
} AffectEnum;

typedef [uuid(00000526-0000-0010-8000-00aa006d2ea4)] enum EditModeEnum
{
    adEditNone = 0,
    adEditInProgress = 1,
    adEditAdd = 2,
    adEditDelete = 4
} EditModeEnum;

typedef [uuid(0000052f-0000-0010-8000-00aa006d2ea4)] enum CursorLocationEnum
{
    adUseNone = 1,
    adUseServer = 2,
    adUseClient = 3,
    adUseClientBatch = 3
} CursorLocationEnum;

typedef [uuid(0000051c-0000-0010-8000-00aa006d2ea4)] enum CursorOptionEnum
{
    adHoldRecords = 256,
    adMovePrevious = 512,
    adBookmark = 8192,
    adApproxPosition = 16384,
    adUpdateBatch = 65536,
    adResync = 131072,
    adNotify = 262144,
    adFind = 524288,
    adSeek = 4194304,
    adIndex = 8388608,
    adAddNew = 16778240,
    adDelete = 16779264,
    adUpdate = 16809984
} CursorOptionEnum;

typedef [uuid(00000540-0000-0010-8000-00aa006d2ea4)] enum MarshalOptionsEnum
{
    adMarshalAll = 0,
    adMarshalModifiedOnly = 1
} MarshalOptionsEnum;

typedef [uuid(00000547-0000-0010-8000-00aa006d2ea4)] enum SearchDirectionEnum
{
    adSearchForward = 1,
    adSearchBackward = -1
} SearchDirectionEnum;

typedef [uuid(00000549-0000-0010-8000-00aa006d2ea4)] enum StringFormatEnum
{
    adClipString = 2
} StringFormatEnum;

typedef [uuid(00000545-0000-0010-8000-00aa006d2ea4)] enum CompareEnum
{
    adCompareLessThan = 0,
    adCompareEqual = 1,
    adCompareGreaterThan = 2,
    adCompareNotEqual = 3,
    adCompareNotComparable = 4
} CompareEnum;

typedef [uuid(00000523-0000-0010-8000-00aa006d2ea4)] enum IsolationLevelEnum
{
    adXactUnspecified = -1,
    adXactChaos = 16,
    adXactReadUncommitted = 256,
    adXactBrowse = 256,
    adXactCursorStability = 4096,
    adXactReadCommitted = 4096,
    adXactRepeatableRead = 65536,
    adXactSerializable = 1048576,
    adXactIsolated = 1048576
} IsolationLevelEnum;

typedef [uuid(00000521-0000-0010-8000-00aa006d2ea4)] enum ConnectModeEnum
{
    adModeUnknown = 0,
    adModeRead = 1,
    adModeWrite = 2,
    adModeReadWrite = 3,
    adModeShareDenyRead = 4,
    adModeShareDenyWrite = 8,
    adModeShareExclusive = 12,
    adModeShareDenyNone = 16,
    adModeRecursive = 4194304
} ConnectModeEnum;

typedef [uuid(00000533-0000-0010-8000-00aa006d2ea4)] enum SchemaEnum
{
    adSchemaProviderSpecific = -1,
    adSchemaAsserts = 0,
    adSchemaCatalogs = 1,
    adSchemaCharacterSets = 2,
    adSchemaCollations = 3,
    adSchemaColumns = 4,
    adSchemaCheckConstraints = 5,
    adSchemaConstraintColumnUsage = 6,
    adSchemaConstraintTableUsage = 7,
    adSchemaKeyColumnUsage = 8,
    adSchemaReferentialContraints = 9,
    adSchemaReferentialConstraints = 9,
    adSchemaTableConstraints = 10,
    adSchemaColumnsDomainUsage = 11,
    adSchemaIndexes = 12,
    adSchemaColumnPrivileges = 13,
    adSchemaTablePrivileges = 14,
    adSchemaUsagePrivileges = 15,
    adSchemaProcedures = 16,
    adSchemaSchemata = 17,
    adSchemaSQLLanguages = 18,
    adSchemaStatistics = 19,
    adSchemaTables = 20,
    adSchemaTranslations = 21,
    adSchemaProviderTypes = 22,
    adSchemaViews = 23,
    adSchemaViewColumnUsage = 24,
    adSchemaViewTableUsage = 25,
    adSchemaProcedureParameters = 26,
    adSchemaForeignKeys = 27,
    adSchemaPrimaryKeys = 28,
    adSchemaProcedureColumns = 29,
    adSchemaDBInfoKeywords = 30,
    adSchemaDBInfoLiterals = 31,
    adSchemaCubes = 32,
    adSchemaDimensions = 33,
    adSchemaHierarchies = 34,
    adSchemaLevels = 35,
    adSchemaMeasures = 36,
    adSchemaProperties = 37,
    adSchemaMembers = 38,
    adSchemaTrustees = 39,
    adSchemaFunctions = 40,
    adSchemaActions = 41,
    adSchemaCommands = 42,
    adSchemaSets = 43
} SchemaEnum;

typedef [uuid(00000530-0000-0010-8000-00aa006d2ea4)] enum EventStatusEnum
{
    adStatusOK = 1,
    adStatusErrorsOccurred = 2,
    adStatusCantDeny = 3,
    adStatusCancel = 4,
    adStatusUnwantedEvent = 5
} EventStatusEnum;

typedef [uuid(0000052c-0000-0010-8000-00aa006d2ea4)] enum ParameterDirectionEnum
{
    adParamUnknown = 0,
    adParamInput = 1,
    adParamOutput = 2,
    adParamInputOutput = 3,
    adParamReturnValue = 4
} ParameterDirectionEnum;

typedef [uuid(0000052e-0000-0010-8000-00aa006d2ea4)] enum CommandTypeEnum
{
    adCmdUnspecified = -1,
    adCmdUnknown = 8,
    adCmdText = 1,
    adCmdTable = 2,
    adCmdStoredProc = 4,
    adCmdFile = 256,
    adCmdTableDirect = 512
} CommandTypeEnum;

typedef [uuid(00000532-0000-0010-8000-00aa006d2ea4)] enum ObjectStateEnum
{
    adStateClosed = 0,
    adStateOpen = 1,
    adStateConnecting = 2,
    adStateExecuting = 4,
    adStateFetching = 8
} ObjectStateEnum;

typedef [uuid(00000573-0000-0010-8000-00aa006d2ea4)] enum MoveRecordOptionsEnum
{
    adMoveUnspecified = -1,
    adMoveOverWrite = 1,
    adMoveDontUpdateLinks = 2,
    adMoveAllowEmulation = 4
} MoveRecordOptionsEnum;

typedef [uuid(00000574-0000-0010-8000-00aa006d2ea4)] enum CopyRecordOptionsEnum
{
    adCopyUnspecified = -1,
    adCopyOverWrite = 1,
    adCopyAllowEmulation = 4,
    adCopyNonRecursive = 2
} CopyRecordOptionsEnum;

typedef [uuid(00000570-0000-0010-8000-00aa006d2ea4)] enum RecordCreateOptionsEnum
{
    adCreateCollection = (int) 0x00002000,
    adCreateStructDoc = (int) 0x80000000,
    adCreateNonCollection = (int) 0x00000000,
    adOpenIfExists = (int) 0x02000000,
    adCreateOverwrite = (int) 0x04000000,
    adFailIfNotExists = (int) -1
} RecordCreateOptionsEnum;

typedef [uuid(00000571-0000-0010-8000-00aa006d2ea4)] enum RecordOpenOptionsEnum
{
    adOpenRecordUnspecified = -1,
    adOpenOutput = 0x00800000,
    adOpenAsync = 0x00001000,
    adDelayFetchStream = 0x00004000,
    adDelayFetchFields = 0x00008000,
    adOpenExecuteCommand = 0x00010000
} RecordOpenOptionsEnum;

typedef [uuid(0000057d-0000-0010-8000-00aa006d2ea4)] enum RecordTypeEnum
{
    adSimpleRecord = 0,
    adCollectionRecord = 1,
    adStructDoc = 2
} RecordTypeEnum;

typedef [uuid(00000576-0000-0010-8000-00aa006d2ea4)] enum StreamTypeEnum
{
    adTypeBinary = 1,
    adTypeText = 2
} StreamTypeEnum;

typedef [uuid(00000577-0000-0010-8000-00aa006d2ea4)] enum LineSeparatorEnum
{
    adLF = 10,
    adCR = 13,
    adCRLF = -1
} LineSeparatorEnum;

typedef enum
{
    adReadAll = -1,
    adReadLine = -2
} StreamReadEnum;

typedef [uuid(0000057c-0000-0010-8000-00aa006d2ea4)] enum SaveOptionsEnum
{
    adSaveCreateNotExist = 1,
    adSaveCreateOverWrite = 2
} SaveOptionsEnum;

typedef [uuid(0000057a-0000-0010-8000-00aa006d2ea4)] enum StreamOpenOptionsEnum
{
    adOpenStreamUnspecified = -1,
    adOpenStreamAsync = 1,
    adOpenStreamFromRecord = 4
} StreamOpenOptionsEnum;

typedef [uuid(0000057b-0000-0010-8000-00aa006d2ea4)] enum StreamWriteEnum
{
    adWriteChar = 0,
    adWriteLine = 1
} StreamWriteEnum;

typedef [uuid(00000531-0000-0010-8000-00aa006d2ea4)] enum EventReasonEnum
{
    adRsnAddNew = 1,
    adRsnDelete = 2,
    adRsnUpdate = 3,
    adRsnUndoUpdate = 4,
    adRsnUndoAddNew = 5,
    adRsnUndoDelete = 6,
    adRsnRequery = 7,
    adRsnResynch = 8,
    adRsnClose = 9,
    adRsnMove = 10,
    adRsnFirstChange = 11,
    adRsnMoveFirst = 12,
    adRsnMoveNext = 13,
    adRsnMovePrevious = 14,
    adRsnMoveLast = 15
} EventReasonEnum;

typedef [uuid(00000541-0000-0010-8000-00aa006d2ea4)] enum ConnectOptionEnum
{
    adConnectUnspecified = -1,
    adAsyncConnect = 0x10
} ConnectOptionEnum;

[
    uuid(00000503-0000-0010-8000-00aa006d2ea4),
    odl,
    dual,
    nonextensible,
    oleautomation
]
interface Property : IDispatch
{
    [id(00000000), propget]
    HRESULT Value(
        [out, retval] VARIANT *val);

    [id(00000000), propput]
    HRESULT Value(
        [in] VARIANT val);

    [id(0x60020002), propget]
    HRESULT Name(
        [out, retval] BSTR *str);

    [id(0x60020003), propget]
    HRESULT Type(
        [out, retval] DataTypeEnum *type);

    [id(0x60020004), propget]
    HRESULT Attributes(
        [out, retval] LONG *attributes);

    [id(0x60020004), propput]
    HRESULT Attributes(
        [in] LONG attributes);
};

[
    uuid(00000512-0000-0010-8000-00aa006d2ea4),
    odl,
    dual,
    nonextensible,
    oleautomation
]
interface _Collection : IDispatch
{
    [id(0x60020000), propget]
    HRESULT Count(
        [out, retval] LONG *count);

    [id(0xfffffffc), restricted]
    HRESULT _NewEnum(
        [out, retval] IUnknown **object);

    [id(0x60020002)]
    HRESULT Refresh();
};

[
    uuid(00000504-0000-0010-8000-00aa006d2ea4),
    odl,
    dual,
    nonextensible,
    oleautomation
]
interface Properties : _Collection
{
    [id(00000000), propget]
    HRESULT Item(
        [in] VARIANT index,
        [out, retval] Property **object);
};

[
    uuid(00000534-0000-0010-8000-00aa006d2ea4),
    odl,
    dual,
    nonextensible,
    oleautomation
]
interface _ADO : IDispatch
{
    [id(0x000001f4), propget]
    HRESULT Properties(
        [out, retval] Properties **object);
};

[
    uuid(0000054c-0000-0010-8000-00aa006d2ea4),
    odl,
    dual,
    nonextensible,
    oleautomation,
    hidden
]
interface Field20 : _ADO
{
    [id(0x00000455), propget]
    HRESULT ActualSize(
        [out, retval] LONG *size);

    [id(0x0000040c), propget]
    HRESULT Attributes(
        [out, retval] LONG *attrs);

    [id(0x0000044f), propget]
    HRESULT DefinedSize(
        [out, retval] LONG *size);

    [id(0x0000044c), propget]
    HRESULT Name(
        [out, retval] BSTR *str);

    [id(0x0000044e), propget]
    HRESULT Type(
        [out, retval] DataTypeEnum *type);

    [id(00000000), propget]
    HRESULT Value(
        [out, retval] VARIANT *val);

    [id(00000000), propput]
    HRESULT Value(
        [in] VARIANT val);

    [id(0x60030007), propget]
    HRESULT Precision(
        [out, retval] unsigned char *precision);

    [id(0x60030008), propget]
    HRESULT NumericScale(
        [out, retval] unsigned char *scale);

    [id(0x00000453)]
    HRESULT AppendChunk(
        [in] VARIANT data);

    [id(0x00000454)]
    HRESULT GetChunk(
        [in] LONG length,
        [out, retval] VARIANT *var);

    [id(0x00000450), propget]
    HRESULT OriginalValue(
        [out, retval] VARIANT *val);

    [id(0x00000451), propget]
    HRESULT UnderlyingValue(
        [out, retval] VARIANT *val);

    [id(0x6003000d), propget]
    HRESULT DataFormat(
        [out, retval] IUnknown **format);

    [id(0x6003000d), propputref]
    HRESULT DataFormat(
        [in] IUnknown *format);

    [id(0x60030007), propput]
    HRESULT Precision(
        [in] unsigned char precision);

    [id(0x60030008), propput]
    HRESULT NumericScale(
        [in] unsigned char scale);

    [id(0x0000044e), propput]
    HRESULT Type(
        [in] DataTypeEnum type);

    [id(0x0000044f), propput]
    HRESULT DefinedSize(
        [in] LONG size);

    [id(0x0000040c), propput]
    HRESULT Attributes(
        [in] LONG attrs);
};

[
    uuid(00000569-0000-0010-8000-00aa006d2ea4),
    odl,
    dual,
    nonextensible,
    oleautomation
]
interface Field : Field20
{
    [id(0x0000045c), propget]
    HRESULT Status(
        [out, retval] LONG *status);
};

[
    uuid(00000506-0000-0010-8000-00aa006d2ea4),
    odl,
    dual,
    nonextensible,
    oleautomation
]
interface Fields15 : _Collection
{
    [id(00000000), propget]
    HRESULT Item(
        [in] VARIANT index,
        [out, retval] Field **object);
};

[
    uuid(0000054d-0000-0010-8000-00aa006d2ea4),
    odl,
    dual,
    nonextensible,
    oleautomation
]
interface Fields20 : Fields15
{
    [id(0x60030001)]
    HRESULT _Append(
        [in] BSTR name,
        [in] DataTypeEnum type,
        [in, defaultvalue(0)] LONG size,
        [in, defaultvalue(adFldUnspecified)] FieldAttributeEnum attr);

    [id(0x60030002)]
    HRESULT Delete(
        [in] VARIANT index);
};

[
    uuid(00000564-0000-0010-8000-00aa006d2ea4),
    odl,
    dual,
    nonextensible,
    oleautomation
]
interface Fields : Fields20
{
    [id(0x60040001)]
    HRESULT Append(
        [in] BSTR name,
        [in] DataTypeEnum type,
        [in, defaultvalue(0)] LONG size,
        [in, defaultvalue(adFldUnspecified)] FieldAttributeEnum attr,
        [in, optional] VARIANT value);

    [id(0x60040002)]
    HRESULT Update();

    [id(0x60040003)]
    HRESULT Resync(
        [in, defaultvalue(adResyncAllValues)] ResyncEnum resync_values);

    [id(0x60040004)]
    HRESULT CancelUpdate();
};

[
    uuid(0000050e-0000-0010-8000-00aa006d2ea4),
    odl,
    dual,
    nonextensible,
    oleautomation
]
interface Recordset15 : _ADO
{
    [id(0x000003e8), propget]
    HRESULT AbsolutePosition(
        [out, retval] PositionEnum_Param *position);

    [id(0x000003e8), propput]
    HRESULT AbsolutePosition(
        [in] PositionEnum_Param position);

    [id(0x000003e9), propputref]
    HRESULT ActiveConnection(
        [in] IDispatch *connection);

    [id(0x000003e9), propput]
    HRESULT ActiveConnection(
        [in] VARIANT connection);

    [id(0x000003e9), propget]
    HRESULT ActiveConnection(
        [out, retval] VARIANT *connection);

    [id(0x000003ea), propget]
    HRESULT BOF(
        [out, retval] VARIANT_BOOL *bof);

    [id(0x000003eb), propget]
    HRESULT Bookmark(
        [out, retval] VARIANT *bookmark);

    [id(0x000003eb), propput]
    HRESULT Bookmark(
        [in] VARIANT bookmark);

    [id(0x000003ec), propget]
    HRESULT CacheSize(
        [out, retval] LONG *size);

    [id(0x000003ec), propput]
    HRESULT CacheSize(
        [in] LONG size);

    [id(0x000003ed), propget]
    HRESULT CursorType(
        [out, retval] CursorTypeEnum *cursor_type);

    [id(0x000003ed), propput]
    HRESULT CursorType(
        [in] CursorTypeEnum cursor_type);

    [id(0x000003ee), propget]
    HRESULT EOF(
        [out, retval] VARIANT_BOOL *eof);

    [id(00000000), propget]
    HRESULT Fields(
        [out, retval] Fields **object);

    [id(0x000003f0), propget]
    HRESULT LockType(
        [out, retval] LockTypeEnum *lock_type);

    [id(0x000003f0), propput]
    HRESULT LockType(
        [in] LockTypeEnum lock_type);

    [id(0x000003f1), propget]
    HRESULT MaxRecords(
        [out, retval] LONG *max_records);

    [id(0x000003f1), propput]
    HRESULT MaxRecords(
        [in] LONG max_records);

    [id(0x000003f2), propget]
    HRESULT RecordCount(
        [out, retval] LONG *count);

    [id(0x000003f3), propputref]
    HRESULT Source(
        [in] IDispatch *source);

    [id(0x000003f3), propput]
    HRESULT Source(
        [in] BSTR source);

    [id(0x000003f3), propget]
    HRESULT Source(
        [out, retval] VARIANT *source);

    [id(0x000003f4)]
    HRESULT AddNew(
        [in, optional] VARIANT field_list,
        [in, optional] VARIANT values);

    [id(0x000003f5)]
    HRESULT CancelUpdate();

    [id(0x000003f6)]
    HRESULT Close();

    [id(0x000003f7)]
    HRESULT Delete(
        [in, defaultvalue(adAffectCurrent)] AffectEnum affect_records);

    [id(0x000003f8)]
    HRESULT GetRows(
        [in, defaultvalue(-1)] LONG rows,
        [in, optional] VARIANT start,
        [in, optional] VARIANT fields,
        [out, retval] VARIANT *var);

    [id(0x000003f9)]
    HRESULT Move(
        [in] LONG num_records,
        [in, optional] VARIANT start);

    [id(0x000003fa)]
    HRESULT MoveNext();

    [id(0x000003fb)]
    HRESULT MovePrevious();

    [id(0x000003fc)]
    HRESULT MoveFirst();

    [id(0x000003fd)]
    HRESULT MoveLast();

    [id(0x000003fe)]
    HRESULT Open(
        [in, optional] VARIANT source,
        [in, optional] VARIANT active_connection,
        [in, defaultvalue(adOpenUnspecified)] CursorTypeEnum cursor_type,
        [in, defaultvalue(adLockUnspecified)] LockTypeEnum lock_type,
        [in, defaultvalue(-1)] LONG options);

    [id(0x000003ff)]
    HRESULT Requery(
        [in, defaultvalue(-1)] LONG options);

    [id(0x60030022), hidden]
    HRESULT _xResync(
        [in, defaultvalue(adAffectAll)] AffectEnum affect_records);

    [id(0x00000401)]
    HRESULT Update(
        [in, optional] VARIANT fields,
        [in, optional] VARIANT values);

    [id(0x00000417), propget]
    HRESULT AbsolutePage(
        [out, retval] PositionEnum_Param *position);

    [id(0x00000417), propput]
    HRESULT AbsolutePage(
        [in] PositionEnum_Param position);

    [id(0x00000402), propget]
    HRESULT EditMode(
        [out, retval] EditModeEnum *mode);

    [id(0x00000406), propget]
    HRESULT Filter(
        [out, retval] VARIANT *criteria);

    [id(0x00000406), propput]
    HRESULT Filter(
        [in] VARIANT criteria);

    [id(0x0000041a), propget]
    HRESULT PageCount(
        [out, retval] LONG *count);

    [id(0x00000418), propget]
    HRESULT PageSize(
        [out, retval] LONG *size);

    [id(0x00000418), propput]
    HRESULT PageSize(
        [in] LONG size);

    [id(0x00000407), propget]
    HRESULT Sort(
        [out, retval] BSTR *criteria);

    [id(0x00000407), propput]
    HRESULT Sort(
        [in] BSTR criteria);

    [id(0x00000405), propget]
    HRESULT Status(
        [out, retval] LONG *status);

    [id(0x0000041e), propget]
    HRESULT State(
        [out, retval] LONG *state);

    [id(0x60030030), hidden]
    HRESULT _xClone(
        [out, retval] _Recordset **object);

    [id(0x0000040b)]
    HRESULT UpdateBatch(
        [in, defaultvalue(adAffectAll)] AffectEnum affect_records);

    [id(0x00000419)]
    HRESULT CancelBatch(
        [in, defaultvalue(adAffectAll)] AffectEnum affect_records);

    [id(0x0000041b), propget]
    HRESULT CursorLocation(
        [out, retval] CursorLocationEnum *cursor_loc);

    [id(0x0000041b), propput]
    HRESULT CursorLocation(
        [in] CursorLocationEnum cursor_loc);

    [id(0x0000041c)]
    HRESULT NextRecordset(
        [out, optional] VARIANT *records_affected,
        [out, retval] _Recordset **record_set);

    [id(0x0000040c)]
    HRESULT Supports(
        [in] CursorOptionEnum cursor_options,
        [out, retval] VARIANT_BOOL *ret);

    [id(0xfffffff8), propget, hidden]
    HRESULT Collect(
        [in] VARIANT index,
        [out, retval] VARIANT *var);

    [id(0xfffffff8), propput, hidden]
    HRESULT Collect(
        [in] VARIANT index,
        [in] VARIANT var);

    [id(0x0000041d), propget]
    HRESULT MarshalOptions(
        [out, retval] MarshalOptionsEnum *options);

    [id(0x0000041d), propput]
    HRESULT MarshalOptions(
        [in] MarshalOptionsEnum options);

    [id(0x00000422)]
    HRESULT Find(
        [in] BSTR criteria,
        [in, defaultvalue(0)] LONG skip_records,
        [in, defaultvalue(adSearchForward)] SearchDirectionEnum search_direction,
        [in, optional] VARIANT start);
};

[
    uuid(0000054f-0000-0010-8000-00aa006d2ea4),
    odl,
    dual,
    nonextensible,
    oleautomation
]
interface Recordset20 : Recordset15
{
    [id(0x0000041f)]
    HRESULT Cancel();

    [id(0x00000420), propget]
    HRESULT DataSource(
        [out, retval] IUnknown **data_source);

    [id(0x00000420), propputref]
    HRESULT DataSource(
        [in] IUnknown *data_source);

    [hidden]
    HRESULT _xSave(
        [in, optional] BSTR filename,
        [in, defaultvalue(adPersistADTG)] PersistFormatEnum persist_format);

    [id(0x00000425), propget]
    HRESULT ActiveCommand(
        [out, retval] IDispatch **cmd);

    [id(0x00000427), propput]
    HRESULT StayInSync(
        [in] VARIANT_BOOL stay_in_sync);

    [id(0x00000427), propget]
    HRESULT StayInSync(
        [out, retval] VARIANT_BOOL *stay_in_sync);

    [id(0x00000426)]
    HRESULT GetString(
        [in, defaultvalue(adClipString)] StringFormatEnum string_format,
        [in, defaultvalue(-1)] LONG num_rows,
        [in, optional] BSTR column_delimiter,
        [in, optional] BSTR row_delimiter,
        [in, optional] BSTR null_expr,
        [out, retval] BSTR *ret_string);

    [id(0x00000428), propget]
    HRESULT DataMember(
        [out, retval] BSTR *data_member);

    [id(0x00000428), propput]
    HRESULT DataMember(
        [in] BSTR data_member);

    [id(0x00000429)]
    HRESULT CompareBookmarks(
        [in] VARIANT bookmark1,
        [in] VARIANT bookmark2,
        [out, retval] CompareEnum *compare);

    [id(0x0000040a)]
    HRESULT Clone(
        [in, defaultvalue(adLockUnspecified)] LockTypeEnum lock_type,
        [out, retval] _Recordset **object);

    [id(0x00000400)]
    HRESULT Resync(
        [in, defaultvalue(adAffectAll)] AffectEnum affect_records,
        [in, defaultvalue(adResyncAllValues)] ResyncEnum resync_values);
};

[
    uuid(00000555-0000-0010-8000-00aa006d2ea4),
    odl,
    dual,
    nonextensible,
    oleautomation
]
interface Recordset21 : Recordset20
{
    [id(0x0000042a)]
    HRESULT Seek(
        [in] VARIANT key_values,
        [in, defaultvalue(adSeekFirstEQ)] SeekEnum seek_option);

    [id(0x0000042b), propput]
    HRESULT Index(
        [in] BSTR index);

    [id(0x0000042b), propget]
    HRESULT Index(
        [out, retval] BSTR *index);
};

[
    uuid(00000556-0000-0010-8000-00aa006d2ea4),
    odl,
    dual,
    nonextensible,
    oleautomation
]
interface _Recordset : Recordset21
{
    [id(0x00000421)]
    HRESULT Save(
        [in, optional] VARIANT destination,
        [in, defaultvalue(adPersistADTG)] PersistFormatEnum persist_format);
};

[
    uuid(00000500-0000-0010-8000-00aa006d2ea4),
    odl,
    dual,
    nonextensible,
    oleautomation
]
interface Error : IDispatch
{
    [id(0x60020000), propget]
    HRESULT Number(
        [out, retval] LONG *number);

    [id(0x60020001), propget]
    HRESULT Source(
        [out, retval] BSTR *str);

    [id(00000000), propget]
    HRESULT Description(
        [out, retval] BSTR *str);

    [id(0x60020003), propget]
    HRESULT HelpFile(
        [out, retval] BSTR *str);

    [id(0x60020004), propget]
    HRESULT HelpContext(
        [out, retval] LONG *ctx);

    [id(0x60020005), propget]
    HRESULT SQLState(
        [out, retval] BSTR *str);

    [id(0x60020006), propget]
    HRESULT NativeError(
        [out, retval] LONG *error);
};

[
    uuid(00000501-0000-0010-8000-00aa006d2ea4),
    odl,
    dual,
    nonextensible,
    oleautomation
]
interface Errors : _Collection
{
    [id(00000000), propget]
    HRESULT Item(
        [in] VARIANT index,
        [out, retval] Error **object);

    [id(0x60030001)]
    HRESULT Clear();
};

[
    uuid(00000515-0000-0010-8000-00aa006d2ea4),
    odl,
    dual,
    oleautomation
]
interface Connection15 : _ADO
{
    [id(00000000), propget]
    HRESULT ConnectionString(
        [out, retval] BSTR *str);

    [id(00000000), propput]
    HRESULT ConnectionString(
        [in] BSTR str);

    [id(0x00000002), propget]
    HRESULT CommandTimeout(
        [out, retval] LONG *timeout);

    [id(0x00000002), propput]
    HRESULT CommandTimeout(
        [in] LONG timeout);

    [id(0x00000003), propget]
    HRESULT ConnectionTimeout(
        [out, retval] LONG *timeout);

    [id(0x00000003), propput]
    HRESULT ConnectionTimeout(
        [in] LONG timeout);

    [id(0x00000004), propget]
    HRESULT Version(
        [out, retval] BSTR *str);

    [id(0x00000005)]
    HRESULT Close();

    [id(0x00000006)]
    HRESULT Execute(
        [in] BSTR command,
        [out, optional] VARIANT *records_affected,
        [in, defaultvalue(-1)] LONG options,
        [out, retval] _Recordset **record_set);

    [id(0x00000007)]
    HRESULT BeginTrans(
        [out, retval] LONG *transaction_level);

    [id(0x00000008)]
    HRESULT CommitTrans();

    [id(0x00000009)]
    HRESULT RollbackTrans();

    [id(0x0000000a)]
    HRESULT Open(
        [in, defaultvalue("")] BSTR connection_str,
        [in, defaultvalue("")] BSTR user_id,
        [in, defaultvalue("")] BSTR password,
        [in, defaultvalue(-1)] LONG options);

    [id(0x0000000b), propget]
    HRESULT Errors(
        [out, retval] Errors **object);

    [id(0x0000000c), propget]
    HRESULT DefaultDatabase(
        [out, retval] BSTR *str);

    [id(0x0000000c), propput]
    HRESULT DefaultDatabase(
        [in] BSTR str);

    [id(0x0000000d), propget]
    HRESULT IsolationLevel(
        [out, retval] IsolationLevelEnum *level);

    [id(0x0000000d), propput]
    HRESULT IsolationLevel(
        [in] IsolationLevelEnum level);

    [id(0x0000000e), propget]
    HRESULT Attributes(
        [out, retval] LONG *attr);

    [id(0x0000000e), propput]
    HRESULT Attributes(
        [in] LONG attr);

    [id(0x0000000f), propget]
    HRESULT CursorLocation(
        [out, retval] CursorLocationEnum *cursor_loc);

    [id(0x0000000f), propput]
    HRESULT CursorLocation(
        [in] CursorLocationEnum cursor_loc);

    [id(0x00000010), propget]
    HRESULT Mode(
        [out, retval] ConnectModeEnum *mode);

    [id(0x00000010), propput]
    HRESULT Mode(
        [in] ConnectModeEnum mode);

    [id(0x00000011), propget]
    HRESULT Provider(
        [out, retval] BSTR *str);

    [id(0x00000011), propput]
    HRESULT Provider(
        [in] BSTR str);

    [id(0x00000012), propget]
    HRESULT State(
        [out, retval] LONG *state);

    [id(0x00000013)]
    HRESULT OpenSchema(
        [in] SchemaEnum schema,
        [in, optional] VARIANT restrictions,
        [in, optional] VARIANT schema_id,
        [out, retval] _Recordset **record_set);
};

[
    uuid(00000550-0000-0010-8000-00aa006d2ea4),
    odl,
    dual,
    oleautomation
]
interface _Connection : Connection15
{
    [id(0x00000015)]
    HRESULT Cancel();
};

[
    uuid(0000050c-0000-0010-8000-00aa006d2ea4),
    odl,
    dual,
    nonextensible,
    oleautomation
]
interface _Parameter : _ADO
{
    [id(0x60030000), propget]
    HRESULT Name(
        [out, retval] BSTR *str);

    [id(0x60030000), propput]
    HRESULT Name(
        [in] BSTR str);

    [id(00000000), propget]
    HRESULT Value(
        [out, retval] VARIANT *val);

    [id(00000000), propput]
    HRESULT Value(
        [in] VARIANT val);

    [id(0x60030004), propget]
    HRESULT Type(
        [out, retval] DataTypeEnum *data_type);

    [id(0x60030004), propput]
    HRESULT Type(
        [in] DataTypeEnum data_type);

    [id(0x60030006), propput]
    HRESULT Direction(
        [in] ParameterDirectionEnum direction);

    [id(0x60030006), propget]
    HRESULT Direction(
        [out, retval] ParameterDirectionEnum *direction);

    [id(0x60030008), propput]
    HRESULT Precision(
        [in] unsigned char precision);

    [id(0x60030008), propget]
    HRESULT Precision(
        [out, retval] unsigned char *precision);

    [id(0x6003000a), propput]
    HRESULT NumericScale(
        [in] unsigned char scale);

    [id(0x6003000a), propget]
    HRESULT NumericScale(
        [out, retval] unsigned char *scale);

    [id(0x6003000c), propput]
    HRESULT Size(
        [in] LONG size);

    [id(0x6003000c), propget]
    HRESULT Size(
        [out, retval] LONG *size);

    [id(0x6003000e)]
    HRESULT AppendChunk(
        [in] VARIANT val);

    [id(0x6003000f), propget]
    HRESULT Attributes(
        [out, retval] LONG *attrs);

    [id(0x6003000f), propput]
    HRESULT Attributes(
        [in] LONG attrs);
};

[
    uuid(00000513-0000-0010-8000-00aa006d2ea4),
    odl,
    dual,
    nonextensible,
    oleautomation
]
interface _DynaCollection : _Collection
{
    [id(0x60030000)]
    HRESULT Append(
        [in] IDispatch *object);

    [id(0x60030001)]
    HRESULT Delete(
        [in] VARIANT index);
};

[
    uuid(0000050d-0000-0010-8000-00aa006d2ea4),
    odl,
    dual,
    nonextensible,
    oleautomation
]
interface Parameters : _DynaCollection
{
    [id(00000000), propget]
    HRESULT Item(
        [in] VARIANT index,
        [out, retval] _Parameter **object);
};

[
    uuid(00000508-0000-0010-8000-00aa006d2ea4),
    odl,
    dual,
    nonextensible,
    oleautomation
]
interface Command15 : _ADO
{
    [id(0x60030000), propget]
    HRESULT ActiveConnection(
        [out, retval] _Connection **object);

    [id(0x60030000), propputref]
    HRESULT ActiveConnection(
        [in] _Connection *object);

    [id(0x60030000), propput]
    HRESULT ActiveConnection(
        [in] VARIANT object);

    [id(0x60030003), propget]
    HRESULT CommandText(
        [out, retval] BSTR *str);

    [id(0x60030003), propput]
    HRESULT CommandText(
        [in] BSTR str);

    [id(0x60030005), propget]
    HRESULT CommandTimeout(
        [out, retval] LONG *timeout);

    [id(0x60030005), propput]
    HRESULT CommandTimeout(
        [in] LONG timeout);

    [id(0x60030007), propget]
    HRESULT Prepared(
        [out, retval] VARIANT_BOOL *prepared);

    [id(0x60030007), propput]
    HRESULT Prepared(
        [in] VARIANT_BOOL prepared);

    [id(0x60030009)]
    HRESULT Execute(
        [out, optional] VARIANT *records_affected,
        [in, optional] VARIANT *parameters,
        [in, defaultvalue(-1)] LONG options,
        [out, retval] _Recordset **record_set);

    [id(0x6003000a)]
    HRESULT CreateParameter(
        [in,  defaultvalue("")] BSTR name,
        [in, defaultvalue(adEmpty)] DataTypeEnum type,
        [in, defaultvalue(adParamInput)] ParameterDirectionEnum direction,
        [in, defaultvalue(0)] LONG size,
        [in, optional] VARIANT value,
        [out, retval] _Parameter **parameter);

    [id(00000000), propget]
    HRESULT Parameters(
        [out, retval] Parameters **object);

    [id(0x6003000c), propput]
    HRESULT CommandType(
        [in] CommandTypeEnum cmd_type);

    [id(0x6003000c), propget]
    HRESULT CommandType(
        [out, retval] CommandTypeEnum *cmd_type);

    [id(0x6003000e), propget]
    HRESULT Name(
        [out, retval] BSTR *name);

    [id(0x6003000e), propput]
    HRESULT Name(
        [in] BSTR name);
};

[
    uuid(0000054e-0000-0010-8000-00aa006d2ea4),
    odl,
    dual,
    nonextensible,
    oleautomation
]
interface Command25 : Command15
{
    [id(0x60030010), propget]
    HRESULT State(
        [out, retval] LONG *state);

    [id(0x60030011)]
    HRESULT Cancel();
};

[
    uuid(b08400bd-f9d1-4d02-b856-71d5dba123e9),
    odl,
    dual,
    nonextensible,
    oleautomation
]
interface _Command : Command25
{
    [id(0x60030012), propputref]
    HRESULT CommandStream(
        [in] IUnknown *stream);

    [id(0x60030012), propget]
    HRESULT CommandStream(
        [out, retval] VARIANT *stream);

    [id(0x60030013), propput]
    HRESULT Dialect(
        [in] BSTR dialect);

    [id(0x60030013), propget]
    HRESULT Dialect(
        [out, retval] BSTR *dialect);

    [id(0x60030014), propput]
    HRESULT NamedParameters(
        [in] VARIANT_BOOL named_parameters);

    [id(0x60030014), propget]
    HRESULT NamedParameters(
        [out, retval] VARIANT_BOOL *named_parameters);
};

[
    uuid(00000402-0000-0010-8000-00aa006d2ea4),
    odl,
    hidden
]
interface ConnectionEventsVt : IUnknown
{
    HRESULT InfoMessage(
        [in] Error *error,
        [in, out] EventStatusEnum *status,
        [in] _Connection *connection);

    HRESULT BeginTransComplete(
        [in] LONG TransactionLevel,
        [in] Error *error,
        [in, out] EventStatusEnum *status,
        [in] _Connection *connection);

    HRESULT CommitTransComplete(
        [in] Error *error,
        [in, out] EventStatusEnum *status,
        [in] _Connection *connection);

    HRESULT RollbackTransComplete(
        [in] Error *error,
        [in, out] EventStatusEnum *status,
        [in] _Connection *connection);

    HRESULT WillExecute(
        [in, out] BSTR *source,
        [in, out] CursorTypeEnum *cursor_type,
        [in, out] LockTypeEnum *lock_type,
        [in, out] LONG *options,
        [in, out] EventStatusEnum *status,
        [in] _Command *command,
        [in] _Recordset *record_set,
        [in] _Connection *connection);

    HRESULT ExecuteComplete(
        [in] LONG records_affected,
        [in] Error *error,
        [in, out] EventStatusEnum *status,
        [in] _Command *command,
        [in] _Recordset *record_set,
        [in] _Connection *connection);

    HRESULT WillConnect(
        [in, out] BSTR *string,
        [in, out] BSTR *userid,
        [in, out] BSTR *password,
        [in, out] LONG *options,
        [in, out] EventStatusEnum *status,
        [in] _Connection *connection);

    HRESULT ConnectComplete(
        [in] Error *error,
        [in, out] EventStatusEnum *status,
        [in] _Connection *connection);

    HRESULT Disconnect(
        [in, out] EventStatusEnum *status,
        [in] _Connection *connection);
};

[
    uuid(00000400-0000-0010-8000-00aa006d2ea4)
]
dispinterface ConnectionEvents
{
    properties:
    methods:
    [id(00000000)]
    HRESULT InfoMessage(
        [in] Error *error,
        [in, out] EventStatusEnum *status,
        [in] _Connection *Connection);

    [id(0x00000001)]
    HRESULT BeginTransComplete(
        [in] LONG TransactionLevel,
        [in] Error *error,
        [in, out] EventStatusEnum *status,
        [in] _Connection *connection);

    [id(0x00000003)]
    HRESULT CommitTransComplete(
        [in] Error *error,
        [in, out] EventStatusEnum *status,
        [in] _Connection *connection);

    [id(0x00000002)]
    HRESULT RollbackTransComplete(
        [in] Error *error,
        [in, out] EventStatusEnum *status,
        [in] _Connection *connection);

    [id(0x00000004)]
    HRESULT WillExecute(
        [in, out] BSTR *source,
        [in, out] CursorTypeEnum *cursor_type,
        [in, out] LockTypeEnum *lock_type,
        [in, out] LONG *options,
        [in, out] EventStatusEnum *status,
        [in] _Command *command,
        [in] _Recordset *record_set,
        [in] _Connection *connection);

    [id(0x00000005)]
    HRESULT ExecuteComplete(
        [in] LONG records_affected,
        [in] Error *error,
        [in, out] EventStatusEnum *status,
        [in] _Command *command,
        [in] _Recordset *record_set,
        [in] _Connection *connection);

    [id(0x00000006)]
    HRESULT WillConnect(
        [in, out] BSTR *string,
        [in, out] BSTR *userid,
        [in, out] BSTR *password,
        [in, out] LONG *options,
        [in, out] EventStatusEnum *status,
        [in] _Connection *connection);

    [id(0x00000007)]
    HRESULT ConnectComplete(
        [in] Error *error,
        [in, out] EventStatusEnum *status,
        [in] _Connection *connection);

    [id(0x00000008)]
    HRESULT Disconnect(
        [in, out] EventStatusEnum *status,
        [in] _Connection *connection);
};

[
    uuid(00000562-0000-0010-8000-00aa006d2ea4),
    odl,
    dual,
    nonextensible,
    oleautomation
]
interface _Record : _ADO
{
    [id(1), propget]
    HRESULT ActiveConnection(
        [out, retval] VARIANT *connection);

    [id(1), propput]
    HRESULT ActiveConnection(
        [in] BSTR connection);

    [id(1), propputref]
    HRESULT ActiveConnection(
        [in] _Connection *connection);

    [id(2), propget]
    HRESULT State(
        [out, retval] ObjectStateEnum *state);

    [id(3), propget]
    HRESULT Source(
        [out, retval] VARIANT *source);

    [id(3), propput]
    HRESULT Source(
        [in] BSTR source);

    [id(3), propputref]
    HRESULT Source(
        [in] IDispatch *source);

    [id(4), propget]
    HRESULT Mode(
        [out, retval] ConnectModeEnum *mode);

    [id(4), propput]
    HRESULT Mode(
        [in] ConnectModeEnum mode);

    [id(5), propget]
    HRESULT ParentURL(
        [out, retval] BSTR *parent_URL);

    [id(6)]
    HRESULT MoveRecord(
        [in, defaultvalue("")] BSTR source,
        [in, defaultvalue("")] BSTR Destination,
        [in, optional] BSTR UserName,
        [in, optional] BSTR Password,
        [in, defaultvalue(adMoveUnspecified)] MoveRecordOptionsEnum Options,
        [in, optional] VARIANT_BOOL Async,
        [out, retval] BSTR *pbstrNewURL);

    [id(7)]
    HRESULT CopyRecord(
        [in, defaultvalue("")] BSTR source,
        [in, defaultvalue("")] BSTR destination,
        [in, optional] BSTR username,
        [in, optional] BSTR password,
        [in, defaultvalue(adCopyUnspecified)] CopyRecordOptionsEnum options,
        [in, optional] VARIANT_BOOL async,
        [out, retval] BSTR *new_URL);

    [id(8)]
    HRESULT DeleteRecord(
        [in] BSTR source,
        [in, optional] VARIANT_BOOL async);

    [id(9)]
    HRESULT Open(
        [in, optional] VARIANT source,
        [in, optional] VARIANT active_connection,
        [in, optional] ConnectModeEnum mode,
        [in, defaultvalue(adFailIfNotExists)] RecordCreateOptionsEnum create_options,
        [in, defaultvalue(adOpenRecordUnspecified)] RecordOpenOptionsEnum options,
        [in, optional] BSTR username,
        [in, optional] BSTR password);

    [id(10)]
    HRESULT Close();

    [id(0), propget]
    HRESULT Fields(
        [out, retval] Fields **fields);

    [id(11), propget]
    HRESULT RecordType(
        [out, retval] RecordTypeEnum *type);

    [id(12)]
    HRESULT GetChildren(
        [out, retval] _Recordset **record_set);

    [id(13)]
    HRESULT Cancel();
};

[
    uuid(00000565-0000-0010-8000-00aa006d2ea4),
    odl,
    dual,
    nonextensible,
    oleautomation
]
interface _Stream : IDispatch
{
    [id(1), propget]
    HRESULT Size(
        [out, retval] LONG *size);

    [id(2), propget]
    HRESULT EOS(
        [out, retval] VARIANT_BOOL *eos);

    [id(3), propget]
    HRESULT Position(
        [out, retval] LONG *position);

    [id(3), propput]
    HRESULT Position(
        [in] LONG position);

    [id(4), propget]
    HRESULT Type(
        [out, retval] StreamTypeEnum *type);

    [id(4), propput]
    HRESULT Type(
        [in] StreamTypeEnum type);

    [id(5), propget]
    HRESULT LineSeparator(
        [out, retval] LineSeparatorEnum *separator);

    [id(5), propput]
    HRESULT LineSeparator(
        [in] LineSeparatorEnum separator);

    [id(6), propget]
    HRESULT State(
        [out, retval] ObjectStateEnum *state);

    [id(7), propget]
    HRESULT Mode(
        [out, retval] ConnectModeEnum *mode);

    [id(7), propput]
    HRESULT Mode(
        [in] ConnectModeEnum mode);

    [id(8), propget]
    HRESULT Charset(
        [out, retval] BSTR *charset);

    [id(8), propput]
    HRESULT Charset(
        [in] BSTR charset);

    [id(9)]
    HRESULT Read(
        [in, defaultvalue(adReadAll)] LONG num_bytes,
        [out, retval] VARIANT *val);

    [id(10)]
    HRESULT Open(
        [in, optional] VARIANT source,
        [in, defaultvalue(adModeUnknown)] ConnectModeEnum mode,
        [in, defaultvalue(adOpenStreamUnspecified)] StreamOpenOptionsEnum options,
        [in, optional] BSTR username,
        [in, optional] BSTR password);

    [id(11)]
    HRESULT Close(void);

    [id(12)]
    HRESULT SkipLine(void);

    [id(13)]
    HRESULT Write(
        [in] VARIANT buffer);

    [id(14)]
    HRESULT SetEOS(void);

    [id(15)]
    HRESULT CopyTo(
        [in] _Stream *dest,
        [in, defaultvalue(-1)] LONG size);

    [id(16)]
    HRESULT Flush(void);

    [id(17)]
    HRESULT SaveToFile(
        [in] BSTR FileName,
        [in, defaultvalue(adSaveCreateNotExist)] SaveOptionsEnum options);

    [id(18)]
    HRESULT LoadFromFile(
        [in] BSTR filename);

    [id(19)]
    HRESULT ReadText(
        [in, defaultvalue(adReadAll)] LONG size,
        [out, retval] BSTR *str);

    [id(20)]
    HRESULT WriteText(
        [in] BSTR data,
        [in, defaultvalue(adWriteChar)] StreamWriteEnum options);

    [id(21)]
    HRESULT Cancel(void);
};

[
    uuid(00000266-0000-0010-8000-00aa006d2ea4)
]
dispinterface RecordsetEvents
{
    properties:
    methods:
    [id(0x00000009)]
    HRESULT WillChangeField(
        [in] LONG count,
        [in] VARIANT fields,
        [in, out] EventStatusEnum *status,
        [in] _Recordset *record_set);

    [id(0x0000000a)]
    HRESULT FieldChangeComplete(
        [in] LONG count,
        [in] VARIANT fields,
        [in] Error *error,
        [in, out] EventStatusEnum *status,
        [in] _Recordset *record_set);

    [id(0x0000000b)]
    HRESULT WillChangeRecord(
        [in] EventReasonEnum reason,
        [in] LONG count,
        [in, out] EventStatusEnum *status,
        [in] _Recordset *record_set);

    [id(0x0000000c)]
    HRESULT RecordChangeComplete(
        [in] EventReasonEnum reason,
        [in] LONG count,
        [in] Error *error,
        [in, out] EventStatusEnum *status,
        [in] _Recordset *record_set);

    [id(0x0000000d)]
    HRESULT WillChangeRecordset(
        [in] EventReasonEnum reason,
        [in, out] EventStatusEnum *status,
        [in] _Recordset *record_set);

    [id(0x0000000e)]
    HRESULT RecordsetChangeComplete(
        [in] EventReasonEnum reason,
        [in] Error *error,
        [in, out] EventStatusEnum *status,
        [in] _Recordset *record_set);

    [id(0x0000000f)]
    HRESULT WillMove(
        [in] EventReasonEnum reason,
        [in, out] EventStatusEnum *status,
        [in] _Recordset *record_set);

    [id(0x00000010)]
    HRESULT MoveComplete(
        [in] EventReasonEnum reason,
        [in] Error *error,
        [in, out] EventStatusEnum *status,
        [in] _Recordset *record_set);

    [id(0x00000011)]
    HRESULT EndOfRecordset(
        [in, out] VARIANT_BOOL *more_data,
        [in, out] EventStatusEnum *status,
        [in] _Recordset *record_set);

    [id(0x00000012)]
    HRESULT FetchProgress(
        [in] LONG progress,
        [in] LONG max_progress,
        [in, out] EventStatusEnum *status,
        [in] _Recordset *record_set);

    [id(0x00000013)]
    HRESULT FetchComplete(
        [in] Error *error,
        [in, out] EventStatusEnum *status,
        [in] _Recordset *record_set);
};

[
    uuid(00000538-0000-0010-8000-00aa006d2ea4),
    odl,
    hidden
]
interface ADODebugging : IUnknown
{
    HRESULT IsGlobalDebugMode(
        VARIANT_BOOL *debugging_on);

    HRESULT SetGlobalDebugMode(
        IUnknown *debugger,
        VARIANT_BOOL debugging_on);
};

[
    uuid(00000516-0000-0010-8000-00aa006d2ea4),
    odl,
    restricted
]
interface ADOConnectionConstruction15 : IUnknown
{
    [propget]
    HRESULT DSO(
        [out, retval] IUnknown **dso);

    [propget]
    HRESULT Session(
        [out, retval] IUnknown **session);

    HRESULT WrapDSOandSession(
        [in] IUnknown *dso,
        [in] IUnknown *session);
};

[
    uuid(00000551-0000-0010-8000-00aa006d2ea4),
    odl,
    restricted
]
interface ADOConnectionConstruction : ADOConnectionConstruction15
{
};

[
    uuid(00000517-0000-0010-8000-00aa006d2ea4),
    odl,
    restricted
]
interface ADOCommandConstruction : IUnknown
{
    [propget]
    HRESULT OLEDBCommand(
        [out, retval] IUnknown **command);

    [propput]
    HRESULT OLEDBCommand(
        [in] IUnknown *command);
};

[
    uuid(00000283-0000-0010-8000-00aa006d2ea4),
    odl,
    restricted
]
interface ADORecordsetConstruction : IDispatch
{
    [propget]
    HRESULT Rowset(
        [out, retval] IUnknown **row_set);

    [propput]
    HRESULT Rowset(
        [in] IUnknown *row_set);

    [propget]
    HRESULT Chapter(
        [out, retval] LONG *chapter);

    [propput]
    HRESULT Chapter(
        [in] LONG chapter);

    [propget]
    HRESULT RowPosition(
        [out, retval] IUnknown **row_pos);

    [propput]
    HRESULT RowPosition(
        [in] IUnknown *row_pos);
};

[
    uuid(2a75196c-d9eb-4129-b803-931327f72d5c),
    version(2.8)
]
library ADODB
{
    importlib("stdole2.tlb");

    [
        uuid(00000514-0000-0010-8000-00aa006d2ea4),
    ]
    coclass Connection
    {
        [default] interface _Connection;
        [default, source] dispinterface ConnectionEvents;
    };

    [
        uuid(00000507-0000-0010-8000-00aa006d2ea4),
    ]
    coclass Command
    {
        [default] interface _Command;
    };

    [
        uuid(00000535-0000-0010-8000-00aa006d2ea4),
    ]
    coclass Recordset
    {
        [default] interface _Recordset;
        [default, source] dispinterface RecordsetEvents;
    };

    [
        uuid(0000050b-0000-0010-8000-00aa006d2ea4),
    ]
    coclass Parameter
    {
        [default] interface _Parameter;
    };

    [
        uuid(00000560-0000-0010-8000-00aa006d2ea4),
    ]
    coclass Record
    {
        [default] interface _Record;
    };

    [
        uuid(00000566-0000-0010-8000-00aa006d2ea4),
    ]
    coclass Stream
    {
        [default] interface _Stream;
    };
}
