/*-------------------------------------------------------------------------- dbsqlcon.h Connection management class. Copyright (C) 1995 Microsoft Corporation All rights reserved. Authors: Keith Birney (keithbi) History: 10/13/95 keithbi Created --------------------------------------------------------------------------*/ #if !defined(__DBSQLCON_H__) #define __DBSQLCON_H__ #define DBNTWIN32 #pragma warning (disable:4121) #include #pragma warning (default:4121) #include // ThIS_FILE is defined in source files // #if defined(DEBUG) && defined(INLINE) // #undef THIS_FILE // static char BASED_CODE DBSQLCON_H[] = "dbsqlcon.h"; // #define THIS_FILE DBSQLCON_H // #endif #include #include #define MAX_CONNECT_SEMAPHORES 4096 // partition basis types #define ACPB_NOT_PARTITIONED 0 #define ACPB_HACCT 1 #define ACPB_LOGIN_NAME 2 #define MAX_SERVER_NAME_LENGTH 45 #define MAX_DB_NAME_LENGTH 64 #define AC_MAX_DB_NAME_LENGTH MAX_DB_NAME_LENGTH #define AC_MAX_DB_LOGIN_NAME_LENGTH 64 #define AC_MAX_DB_PASSWORD_LENGTH 16 #define AC_MAX_NUMBER_DATABASE_TYPES 4096 class CDBConnection; extern "C" { CDBConnection DbSqlDLL *PdbconnectionNew(CDBQuery *pdbquery); CDBConnection DbSqlDLL *PdbconnectionNewObsolete(CDBQuery *pdbquery, LONG lDatabaseType, DWORD dwPartitionType, PVOID pvPartitionBasis); VOID DbSqlDLL ReleaseSystemRef(DBPROCESS *dbproc); VOID DbSqlDLL ReleaseAllConnections(); VOID DbSqlDLL PerformDatabaseQueryThread(CDBConnection *pdbconnection); BOOL DbSqlDLL FSetMaxConnectionNum(long lMaxNum); BOOL DbSqlDLL FSetDBConfigServer(LPTSTR lpszDBMapServer); BOOL DbSqlDLL FRegisterDBSource(const LONG lType, const WORD wLocatorId, const LPSTR lpszServerName, const LPSTR lpszDBName, const LPSTR lpszLoginName, const LPSTR lpszPassWord); //BOOL DbSqlDLL FRegisterDBSourceEx(LPSTR lpszDBSource); } class CDBConnection { friend CDBConnection DbSqlDLL *PdbconnectionNew(CDBQuery *pdbquery); friend CDBConnection DbSqlDLL *PdbconnectionNewObsolete(CDBQuery *pdbquery, LONG lDatabaseType, DWORD dwPartitionType, PVOID pvPartitionBasis); friend VOID DbSqlDLL ReleaseSystemRef(DBPROCESS *dbproc); friend VOID DbSqlDLL ReleaseAllConnections(); // friend VOID DbSqlDLL PerformDatabaseQueryThread(CDBConnection *pdbconnection); public: void * operator new(size_t size); void operator delete(void *); static BOOL FInit(); static VOID Terminate(); //private: static VOID LockList(); static VOID UnlockList(); static CDBConnection *PdbconnectionFindType(LONG lDatabaseType, WORD wLocatorId); static CDBConnection *PdbconnectionFindDBPROC(DBPROCESS *dbproc); static UINT UiGetLocatorId(WORD wLocatorTypeId, DWORD dwPartitionType, PVOID pvPartitionBasis, WORD *pwLocatorId); static UINT UiGetCachedLocator(HACCT hacct, WORD *pwLocatorId); static VOID StoreLocatorInCache(HACCT hacct, WORD wLocatorId); static VOID LockLocatorCache(); static VOID UnlockLocatorCache(); static UINT UiLocateSqlServer (WORD wType, WORD wLocatorId, CHAR *szServerName, CHAR *szDBName, CHAR *szUserName, CHAR *szPassword); //public: static UINT UiOpenSqlConnection(DBPROCESS **dbproc, CHAR *szServerName, CHAR *szUser, CHAR *szApp, CHAR *szPwd, CHAR *szDB); static UINT UiIsValidServer(WORD wDatabaseType, WORD wLocatorId, CHAR *szServerName, BOOL *pfValid); static int __cdecl err_handler(DBPROCESS * dbproc, int severity, int dberr, int oserr, const char * dberrstr, const char * oserrstr); static int __cdecl msg_handler(DBPROCESS *dbproc, DBINT msgno, int msgstate, int severity, const char *msgtext, const char *srvname, const char *procname, DBUSMALLINT line); static LPTHREAD_START_ROUTINE _stdcall DBConnectionValidationThread(UINT i); static VOID ValidateDBConnections(); VOID AddRef(); VOID Release(); DWORD DwGetTimeEnteredInList() { return m_dwTimeEnteredInList; } BOOL FCreated() { return m_fCreated; } VOID AddToConnectionsList(); VOID RemoveFromConnectionsList(); VOID Create(); // UINT PerformDatabaseQuery(); VOID ReleaseClientRef(); DBPROCESS *DbprocGetDBPROC() { return m_dbproc; } BOOL FPingExistingDBConnection(); //private: DBPROCESS *m_dbproc; // HANDLE m_hThread; // HANDLE m_hSemaphore; BOOL m_fInUse; LONG m_lDatabaseType; PVOID m_pvNext; ULONG m_cRefCount; DWORD m_dwTimeEnteredInList; CDBQuery *m_pdbquery; BOOL m_fExitNow; BOOL m_fCreated; BOOL m_fSystemRefReleased; WORD m_wLocatorId; CHAR m_szServer[MAX_SERVER_NAME_LENGTH + 1]; static CPool *ppoolConnection; static WORD wLocatorTypeId[MAX_CONNECT_SEMAPHORES]; static HANDLE hDBConnectionValidationThread; static DWORD dwDBConnectionValidationThreadID; static long lMaxInUseDBConnections; static BOOL fTerminateCalled; static HANDLE hDBConnectSemaphore[MAX_CONNECT_SEMAPHORES]; static CRITICAL_SECTION csConnectionsList; static CRITICAL_SECTION csLocatorCache; static CDBConnection *pdbconnectionHead; static BOOL fReportPerformance; static DWORD dwNumWaitingThreads; static DWORD dwSecondsSinceStartup; static CHAR szDBMapSetByComannd[MAX_SERVER_NAME_LENGTH + 1]; CDBConnection(CDBQuery *pdbquery, LONG lDatabaseType, WORD wLocatorId); ~CDBConnection(); protected: private: }; class DBMapEntry { public: LONG m_lType; WORD m_wLocatorId; CHAR m_szServerName[MAX_SERVER_NAME_LENGTH + 1]; CHAR m_szDBName[MAX_DB_NAME_LENGTH + 1]; CHAR m_szLoginName[AC_MAX_DB_LOGIN_NAME_LENGTH + 1]; CHAR m_szPassWord[AC_MAX_DB_PASSWORD_LENGTH +1]; //void* operator new(size_t size); //void operator delete(void *pvMem); DBMapEntry(){} DBMapEntry(const LONG, const WORD, const LPSTR, const LPSTR, const LPSTR, const LPSTR); ~DBMapEntry(){} INT NGetEntry(LPSTR lpszServerName, LPSTR lpszDBName, LPSTR lpszLoginName, LPSTR lpszPassWord); }; #endif // #if !defined(__DBSQLCON_H__)