SAMPPROV.H
//-------------------------------------------------------------------- 
// Microsoft OLE DB Sample Provider 
// (C) Copyright 1994 - 1996 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) 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 
 
 
#ifndef NUMELEM 
# define NUMELEM(x) (sizeof(x)/sizeof(*x)) 
#endif 
 
#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 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 )  ((DWORD)(Size) & ~((Amount) - 1)) 
#define ROUND_UP(   Size, Amount ) (((DWORD)(Size) +  ((Amount) - 1)) & ~((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. 
//-- 
 
 
 
// make these symbols a little easier to type\read 
#if   defined(_M_IX86) 
#     define X86 
#elif defined(_M_MRX000) 
#     define MIPS 
#elif defined(_M_ALPHA) 
#     define ALPHA 
#elif defined(_M_PPC) 
#     define PPC 
#else 
#     error: Unknown machine type: Not one of {X86,MIPS,ALPHA,PPC}. 
#endif 
 
#ifdef MIPS 
# define COLUMN_ALIGNVAL 8 
#elif  defined(ALPHA) 
# define COLUMN_ALIGNVAL 8 
#else 
# define COLUMN_ALIGNVAL 8// venerable 80x86 
#endif 
 
 
// 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 longULONG; 
typedef unsigned shortUSHORT; 
 
 
 
// Accessor Structure 
typedef struct tagACCESSOR 
{ 
    DBACCESSORFLAGS dwAccessorFlags; 
LONGcRef; 
ULONGcBindings; 
DBBINDINGrgBindings[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;\ 
LPUNKNOWNm_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();\ 
}\ 
STDMETHODIMPQueryInterface(REFIID riid, LPVOID *ppv)\ 
{\ 
return m_pUnkOuter->QueryInterface(riid, ppv);\ 
} 
 
 
 
 
 
// 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_(IMalloc *, g_pIMalloc, NULL);// OLE2 task memory allocator 
GLOBAL_(HINSTANCE, g_hInstance, 0L);// Instance Handle 
GLOBAL_(IDataConvert *, g_pIDataConvert, NULL);// IDataConvert pointer 
 
#endif