mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
193 lines
5.8 KiB
193 lines
5.8 KiB
//***************************************************************************
|
|
//
|
|
// (c) 1999-2001 by Microsoft Corp. All Rights Reserved.
|
|
//
|
|
// sqlutils.h
|
|
//
|
|
// cvadai 6-May-1999 created.
|
|
//
|
|
//***************************************************************************
|
|
|
|
#ifndef _SQLCACHE_H_
|
|
#define _SQLCACHE_H_
|
|
|
|
// This file defines a class that maintains a cache of
|
|
// SQL connections. Each instance of this class only
|
|
// contains one set of logon credentials.
|
|
// Each controller by default is only entitled to
|
|
// a maximum of 20 connections.
|
|
// ===================================================
|
|
|
|
#define ROOTNAMESPACEID -1411745643584611171
|
|
#define NAMESPACECLASSID 2372429868687864876
|
|
#define MAPPEDNSCLASSID -7061265575274197401
|
|
#define INSTANCESCLASSID 3373910491091605771
|
|
#define CONTAINERASSOCID -7316356768687527881
|
|
#define CLASSSECURITYID -6648033040106090009
|
|
#define CLASSESID 864779262989765648
|
|
#define CLASSINSTSECID 3879906028937869252
|
|
#define THISNAMESPACEID 8909346217325131296
|
|
|
|
#include <std.h>
|
|
#include <seqstream.h>
|
|
#include <comutil.h>
|
|
#include <objcache.h>
|
|
|
|
|
|
typedef struct InsertQualifierValues
|
|
{
|
|
int iPropID; // internal property ID
|
|
wchar_t *pValue; // Value
|
|
wchar_t *pRefKey; // The key string, if a reference property.
|
|
int iPos; // Array position
|
|
int iQfrID; // ID of qualifier or method dependency
|
|
int iFlavor; // Qualifier flavor, if applicable.
|
|
bool bLong; // TRUE if this is too long for this op sys
|
|
int iStorageType; // our internal storage type
|
|
bool bIndexed; // TRUE if indexed
|
|
SQL_ID dClassId; // The actual Class ID of this property
|
|
InsertQualifierValues()
|
|
{
|
|
pValue = NULL, pRefKey = NULL, iPos = 0, iQfrID = 0, iFlavor = 0,
|
|
bLong = FALSE, iStorageType = 0, bIndexed = FALSE, dClassId = 0;
|
|
}
|
|
} InsertQfrValues;
|
|
|
|
typedef InsertQfrValues InsertPropValues;
|
|
|
|
// Structs to facilitate passing OLE DB parameters
|
|
|
|
typedef struct tagBATCHPARAMS
|
|
{
|
|
DB_NUMERIC dObjectId; // @ObjectId
|
|
DB_NUMERIC dScopeId; // @ScopeID
|
|
DB_NUMERIC dClassId; // @ClassID
|
|
int iQfrId[5]; // @QfrId[0-4]
|
|
BSTR sPropValue[5]; // @QfrValue[0-4]
|
|
int iPos[5]; // @QfrPos[0-4]
|
|
int iPropId[5]; // @PropID[0-4]
|
|
int iFlavor[5]; // @Flavor[0-4]
|
|
} BATCHPARAMS;
|
|
|
|
|
|
// SQL procedures
|
|
#define SQL_POS_INSERT_CLASS 0x0
|
|
#define SQL_POS_INSERT_CLASSDATA 0x1
|
|
#define SQL_POS_INSERT_BATCH 0x2
|
|
#define SQL_POS_INSERT_PROPBATCH 0x4
|
|
#define SQL_POS_INSERT_BLOBDATA 0x8
|
|
#define SQL_POS_HAS_INSTANCES 0x10
|
|
#define SQL_POS_OBJECTEXISTS 0x20
|
|
#define SQL_POS_GETCLASSOBJECT 0x40
|
|
|
|
// Jet tables
|
|
#define SQL_POS_OBJECTMAP 0x0
|
|
#define SQL_POS_CLASSMAP 0x1
|
|
#define SQL_POS_PROPERTYMAP 0x2
|
|
#define SQL_POS_CLASSDATA 0x4
|
|
#define SQL_POS_CLASSIMAGES 0x8
|
|
#define SQL_POS_INDEXSTRING 0x10
|
|
#define SQL_POS_INDEXNUMERIC 0x20
|
|
#define SQL_POS_INDEXREAL 0x40
|
|
#define SQL_POS_INDEXREF 0x80
|
|
|
|
#define SQL_POS_ICOMMANDTEXT 0x00010000
|
|
#define SQL_POS_ICOMMANDWITHPARAMS 0x00020000
|
|
#define SQL_POS_IACCESSOR 0x00040000
|
|
#define SQL_POS_HACCESSOR 0x00080000
|
|
#define SQL_POS_IOPENROWSET 0x00100000
|
|
#define SQL_POS_IROWSETCHANGE 0x00200000
|
|
#define SQL_POS_IROWSETINDEX 0x00400000
|
|
#define SQL_POS_IROWSET 0x00800000
|
|
|
|
#define SQL_POS_PKINDEX 0x0
|
|
#define SQL_POS_INDEX2 0x100
|
|
#define SQL_POS_INDEX3 0x200
|
|
|
|
typedef struct
|
|
{
|
|
HACCESSOR hAcc;
|
|
IUnknown *pUnk;
|
|
|
|
} WmiDBObject;
|
|
|
|
class CDBObjectManager
|
|
{
|
|
public:
|
|
CDBObjectManager();
|
|
~CDBObjectManager();
|
|
|
|
void Empty();
|
|
void * GetObject(DWORD type);
|
|
void SetObject(DWORD type, void * pNew);
|
|
void DeleteObject(DWORD type);
|
|
|
|
private:
|
|
CHashCache<WmiDBObject*> m_Objs;
|
|
};
|
|
|
|
|
|
class _declspec( dllexport ) CSQLConnection
|
|
{
|
|
public:
|
|
CSQLConnection() {m_dwThreadId = GetCurrentThreadId(), m_bIsDistributed = FALSE;};
|
|
virtual ~CSQLConnection () {};
|
|
|
|
DWORD m_dwThreadId;
|
|
BOOL m_bIsDistributed;
|
|
|
|
};
|
|
|
|
//***************************************************************************
|
|
//
|
|
// CSQLConnCache
|
|
//
|
|
//***************************************************************************
|
|
|
|
class CSQLConnCache
|
|
{
|
|
typedef std::vector <CSQLConnection *> ConnVector;
|
|
typedef std::vector <HANDLE> HandleVector;
|
|
public:
|
|
CSQLConnCache(DBPROPSET *pPropSet = NULL, DWORD dwMaxConns = 15,
|
|
DWORD dwTimeout = 600);
|
|
~CSQLConnCache();
|
|
|
|
HRESULT SetCredentials(DBPROPSET *pPropSet);
|
|
HRESULT SetMaxConnections (DWORD dwMax);
|
|
HRESULT SetTimeoutSecs(DWORD dwSecs);
|
|
HRESULT SetDatabase(LPCWSTR lpDBName);
|
|
|
|
HRESULT GetConnection(CSQLConnection **ppConn, BOOL bTransacted = FALSE,
|
|
BOOL bDistributed = FALSE,DWORD dwTimeOutSecs = 600);
|
|
HRESULT ReleaseConnection(CSQLConnection *pConn,
|
|
HRESULT retcode = WBEM_S_NO_ERROR, BOOL bDistributed = FALSE);
|
|
HRESULT DeleteUnusedConnections(BOOL bDeadOnly=FALSE);
|
|
// Distrubuted only
|
|
HRESULT FinalRollback(CSQLConnection *pConn);
|
|
HRESULT FinalCommit(CSQLConnection *pConn);
|
|
|
|
HRESULT GetCredentials(DBPROPSET **ppPropSet);
|
|
HRESULT GetMaxConnections (DWORD &dwMax);
|
|
HRESULT GetTimeoutSecs (DWORD &dwSecs);
|
|
HRESULT GetDatabase(_bstr_t &sName);
|
|
|
|
HRESULT ClearConnections();
|
|
HRESULT Shutdown();
|
|
|
|
private:
|
|
HRESULT ExecInitialQueries(IDBInitialize *pDBInit, CSQLConnection *pConn);
|
|
|
|
CRITICAL_SECTION m_cs;
|
|
ConnVector m_Conns;
|
|
DBPROPSET *m_pPropSet;
|
|
DWORD m_dwMaxNumConns;
|
|
DWORD m_dwTimeOutSecs;
|
|
_bstr_t m_sDatabaseName;
|
|
HandleVector m_WaitQueue;
|
|
BOOL m_bInit;
|
|
DWORD m_dwStatus;
|
|
};
|
|
|
|
|
|
#endif // _SQLCACHE_H_
|