//------------------------------------------------------------------------------ // // Microsoft Sidewalk // Copyright (C) Microsoft Corporation, 1997. // // File: oledbhelp.h // // Contents: OLE DB helper methods // // Owner: BassamT // // History: 11/30/97 BassamT Created. // //------------------------------------------------------------------------------ #if (!defined(BUILD_FOR_NT40)) #pragma once // // typedefs // // Column Number (cn). This number starts at 1. typedef ULONG CNUM; // Row number (rn). These numbers start at 0. typedef ULONG RNUM; // Offset (in bytes) into a structure or buffer (ob) typedef DWORD OFFSET; // Bookmark data type (bmk) typedef ULONG BOOKMARK; // // constants that can be tuned for performance // // The maximum number of bytes to store inline for variable size data types. const UINT k_cbInlineMax = 100; // the number of rows to fetch at once. const ULONG k_RowFetchCount = 20; // Column alignment within a row. // TODO : Should this be sizeof(DWORD) instead ? const DWORD k_ColumnAlign = 8; // // constants // // invalid row number const CNUM CNUM_INVALID = 0xFFFFFFFF; // invalid row number const RNUM RNUM_INVALID = 0xFFFFFFFF; // // conversion helpers // const UINT k_cchUCHARAsDecimalString = sizeof("255") - 1; const UINT k_cchUSHORTAsDecimalString = sizeof("32767") - 1; const UINT k_cchUINTAsDecimalString = sizeof("4294967294") - 1; const UINT k_cchUINTAsHexString = sizeof("FFFFFFFF") - 1; const UINT k_cchINTAsDecimalString = sizeof("-2147483648") - 1; const UINT k_cchBOOLAsDecimalString = sizeof("1") - 1; const UINT k_cchDOUBLEAsDecimalString = sizeof("2.2250738585072014 E + 308") - 1; // // macros // #define static_wcslen(pwsz) ((sizeof(pwsz) / sizeof(WCHAR)) - 1) #define inrange(z,zmin,zmax) ( (zmin) <= (z) && (z) <= (zmax) ) #define DBID_USE_GUID_OR_PGUID(e) \ ((1<<(e)) & \ ( 1<(this);\ NonDelegatingAddRef();\ return NOERROR;\ }\ }\ STDMETHOD_(ULONG,NonDelegatingAddRef)() \ {\ return InterlockedIncrement(&_cRefs);\ }\ STDMETHOD_(ULONG,NonDelegatingRelease)()\ {\ if (InterlockedDecrement(&_cRefs) == 0)\ {\ delete this;\ return 0;\ }\ return _cRefs;\ }\ STDMETHOD(QueryInterface)(REFIID riid, void ** ppv)\ {\ return _punkOuter->QueryInterface(riid, ppv);\ }\ STDMETHOD_(ULONG,AddRef)() \ {\ return _punkOuter->AddRef();\ }\ STDMETHOD_(ULONG,Release)()\ {\ return _punkOuter->Release();\ } #define INIT_AGGREGATE_IUNKNOWN \ _punkOuter = reinterpret_cast(static_cast(this)); \ _cRefs = 1; #define SET_OUTER_IUNKNOWN(punk) if (punk != NULL) _punkOuter = punk; #define DEFINE_AGGREGATE_IUNKNOWN_WITH_CALLBACKS(_AddRef, _Release) \ private:\ IUnknown * _punkOuter;\ LONG _cRefs;\ public:\ STDMETHOD(InternalQueryInterface)(REFIID riid, void ** ppv);\ STDMETHOD(NonDelegatingQueryInterface)(REFIID riid, void ** ppv)\ {\ if (ppv == NULL) return E_INVALIDARG;\ if (riid != IID_IUnknown)\ {\ return InternalQueryInterface(riid, ppv);\ }\ else\ {\ *ppv = static_cast(this);\ NonDelegatingAddRef();\ return NOERROR;\ }\ }\ STDMETHOD_(ULONG,NonDelegatingAddRef)() \ {\ _AddRef();\ return InterlockedIncrement(&_cRefs);\ }\ STDMETHOD_(ULONG,NonDelegatingRelease)()\ {\ _Release();\ if (InterlockedDecrement(&_cRefs) == 0)\ {\ delete this;\ return 0;\ }\ return _cRefs;\ }\ STDMETHOD(QueryInterface)(REFIID riid, void ** ppv)\ {\ return _punkOuter->QueryInterface(riid, ppv);\ }\ STDMETHOD_(ULONG,AddRef)() \ {\ return _punkOuter->AddRef();\ }\ STDMETHOD_(ULONG,Release)()\ {\ return _punkOuter->Release();\ } #endif