2025-11-28 00:35:46 +09:00

231 lines
7.3 KiB
C

//--------------------------------------------------------------------
// Microsoft OLE DB Sample Provider
// (C) Copyright 1991 - 1999 Microsoft Corporation. All Rights Reserved.
//
// @doc
//
// @module SAMPPROV.H | Main include file
//
//
#ifndef _SAMPPROV_H_
#define _SAMPPROV_H_
// Defines -------------------------------------------------------------------
#ifdef DBINITCONSTANTS
#define GLOBAL_(type, name, val) extern type name = val
#else
#define GLOBAL_(type, name, val) extern type name
#endif
#define OBJECT_CONSTRUCTED() InterlockedIncrement(&g_cObj);
#define OBJECT_DESTRUCTED() InterlockedDecrement(&g_cObj);
#ifndef MAX
# define MIN(a,b) ( (a) < (b) ? (a) : (b) )
# define MAX(a,b) ( (a) > (b) ? (a) : (b) )
#endif
#define SAMPPROV_URL_PREFIX L"sampprov"
////////////////////////////////////////////////////////
// Defines
//
////////////////////////////////////////////////////////
//IMalloc Wrappers
#define CHECK_MEMORY(pv) if(!(pv)) { hr = E_OUTOFMEMORY; goto CLEANUP; }
#define PROVIDER_ALLOC(cb) CoTaskMemAlloc((ULONG)(cb));
#define PROVIDER_REALLOC(pv, cb) CoTaskMemRealloc(pv, (ULONG)(cb));
#define SAFE_ALLOC(pv, type, cb) { pv = (type*)CoTaskMemAlloc((ULONG)(cb)*sizeof(type)); CHECK_MEMORY(pv); }
#define SAFE_REALLOC(pv, type, cb) { pv = (type*)CoTaskMemRealloc(pv, (ULONG)(cb)*sizeof(type)); CHECK_MEMORY(pv);}
#define SAFE_SYSALLOC(pv, bstr) { pv = SysAllocString(bstr); CHECK_MEMORY(pv); }
#define SAFE_FREE(pv) { CoTaskMemFree(pv); pv = NULL; }
#define SAFE_SYSFREE(bstr) { SysFreeString(bstr); bstr = NULL;}
#define SAFE_DELETE(pv) { if(pv) delete (pv); pv = NULL; }
#define SAFE_DELETE_ARRAY(pv) { if(pv) delete [] (pv); pv = NULL; }
//IUnknown->Release Wrapper
#define SAFE_RELEASE(pv) if((pv)) { ((IUnknown*)pv)->Release(); (pv) = NULL; }
#define SAFE_ADDREF(pv) if((pv)) { ((IUnknown*)pv)->AddRef(); }
//Test macros
#define TEST(exp) { if(FAILED(exp)) { ASSERT(!#exp); } }
#define TESTC(exp) { if(FAILED(exp)) { goto CLEANUP; } }
#define NUMELEM(x) (sizeof(x)/sizeof(*x))
#define MAX_HEAP_SIZE 128000
#define MAX_TOTAL_ROWBUFF_SIZE (10*1024*1024) // Max for all row buffers.
#define MAX_IBUFFER_SIZE 2000000
#define MAX_BIND_LEN (MAX_IBUFFER_SIZE/10)
#define MAX_QUERY_LEN 4096
#define EOL '\0'
#define wEOL L'\0'
#define INT_DISPLAY_SIZE 80
#define STAT_ENDOFCURSOR 0x00000100 // for forward-only means fully materialized
//-----------------------------------------------------------------------------
// Memory alignment
//-----------------------------------------------------------------------------
//++
// Useful rounding macros.
// Rounding amount is always a power of two.
//--
#define ROUND_DOWN( Size, Amount ) ((DBLENGTH)(Size) & ~((DBLENGTH)(Amount) - 1))
#define ROUND_UP( Size, Amount ) (((DBLENGTH)(Size) + ((DBLENGTH)(Amount) - 1)) & ~((DBLENGTH)(Amount) - 1))
//++
// These macros are for aligment of ColumnData within the internal row buffer.
// COLUMN_ALIGN takes a ptr where you think data ought to go,
// and rounds up to the next appropriate address boundary.
//
// Rule of thumb is "natural" boundary, i.e. 4-byte member should be
// aligned on address that is multiple of 4.
//
// Most everything should be aligned to 32-bit boundary.
// But doubles should be aligned to 64-bit boundary, so let's play it safe.
// Also have __int64.
//--
# define COLUMN_ALIGNVAL 8 // venerable 80x86
// Typedefs ------------------------------------------------------------------
typedef VOID** LPLPVOID;
typedef long int SDWORD;
typedef short int SWORD;
typedef unsigned long int UDWORD;
typedef unsigned short int UWORD;
typedef signed long SLONG;
typedef unsigned long ULONG;
typedef unsigned short USHORT;
// Accessor Structure
typedef struct tagACCESSOR
{
DBACCESSORFLAGS dwAccessorFlags;
DBREFCOUNT cRef;
DBCOUNTITEM cBindings;
DBBINDING rgBindings[1];
} ACCESSOR, *PACCESSOR;
//-----------------------------------------------------------------------------
// Macros for interface classes -- IUnknown methods and constructor\destructor
// Use these in the class definition for an interface.
// The code is defined in the header (definition) part because
// it is easier to do so here, and easier to use.
//
//
// @func void | DEFINE_DEFAULT_IUNKNOWN_MEMBER_DATA |
// Macro to define default IUnknown member data.
//
// @parm BaseClass | BaseClass | . | Class that is the OLE object.
//
// @ex Example usage|
//
// class CImpISomething : public ISomething {
// private:
// DEFINE_DEFAULT_IUNKNOWN_MEMBER_DATA(CSomethingBase)
// public:
// DEFINE_DEFAULT_IUNKNOWN_CTOR_DTOR(CSomethingBase, CImpISomething)
// DEFINE_DEFAULT_IUNKNOWN_ADDREF_RELEASE
// ... implementation-specific methods ...
// };
//
#define DEFINE_DEFAULT_IUNKNOWN_MEMBER_DATA(BaseClass) \
DEBUGCODE(ULONG m_cRef); \
BaseClass *m_pObj; \
LPUNKNOWN m_pUnkOuter;
// @func void | DEFINE_DEFAULT_IUNKNOWN_CTOR_DTOR |
// Macro to define default IUnknown Ctor/Dtor.
//
// @parm BaseClass | BaseClass | . | Class that is the OLE object.
//
// @parm Any class | InterfaceClass | . | OLE interface class that this is part of.
#define DEFINE_DEFAULT_IUNKNOWN_CTOR_DTOR(BaseClass, InterfaceClass) \
InterfaceClass( BaseClass *pObj, IUnknown *pUnkOuter ) \
{ \
DEBUGCODE(m_cRef = 0L); \
m_pObj = pObj; \
m_pUnkOuter = pUnkOuter; \
} \
~InterfaceClass() \
{ \
}
// @func void | DEFINE_DEFAULT_IUNKNOWN_ADDREF_RELEASE |
// Macro to define default IUnknown AddRef/Release.
#define DEFINE_DEFAULT_IUNKNOWN_ADDREF_RELEASE \
STDMETHODIMP_(ULONG) AddRef(void) \
{ \
DEBUGCODE( ++m_cRef ); \
return m_pUnkOuter->AddRef(); \
} \
STDMETHODIMP_(ULONG) Release(void) \
{ \
ASSERT( m_cRef > 0 ); \
DEBUGCODE( --m_cRef ); \
return m_pUnkOuter->Release(); \
} \
STDMETHODIMP QueryInterface(REFIID riid, LPVOID *ppv) \
{ \
return m_pUnkOuter->QueryInterface(riid, ppv); \
}
// @func void | DEFINE_ADDREF_RELEASE |
// Macro to define default IUnknown AddRef/Release.
#define DEFINE_ADDREF_RELEASE \
STDMETHODIMP_(ULONG) AddRef(void) \
{ \
InterlockedIncrement((LONG*)&m_cRef); \
return m_cRef; \
} \
STDMETHODIMP_(ULONG) Release(void) \
{ \
if(InterlockedDecrement((LONG*)&m_cRef)) \
return m_cRef; \
\
delete this; \
return 0; \
}
// Globals -------------------------------------------------------------------
GLOBAL_(LONG, g_cObj, 0L); // # of outstanding objects
GLOBAL_(LONG, g_cLock, 0L); // # of explicit locks set
GLOBAL_(DWORD, g_cAttachedProcesses, 0L); // # of attached processes
GLOBAL_(DWORD, g_dwPageSize, 0L); // System page size
GLOBAL_(HINSTANCE, g_hInstance, 0L); // Instance Handle
GLOBAL_(IDataConvert *, g_pIDataConvert, NULL); // IDataConvert pointer
extern WCHAR g_wszDataSourceKeyword[];
extern WCHAR g_wszFileKeyword[];
extern WCHAR g_wszRowKeyword[];
#endif