#ifndef __ODBC_POOL__
#define __ODBC_POOL__

#pragma once

#include "SafeList.h"
#include <afxdb.h>

class CODBCPool
{
	ThreadSection m_critSection;
	// �������ݿ����ӳ�;
	ODBCConnectList m_listIdleConnections;
	// ��ʹ�õ����ݿ����ӳ�;
	ODBCConnectList m_listBusyConnections;

	// ���õ�ָ�꣺�����С;
	INT m_nMaxCount;
	INT m_nMinCount;

	// �����ָ�����;
	DWORD m_dwDBPort;
	CString m_strDBSource;
	CString m_strDBAccount;
	CString m_strPassWord;
	CString m_strDBName;

	BOOL m_bNeedExit;	// �˳����ݳ�;
	BOOL m_bNeedStop;
	BOOL m_bNeedConnection;
public:
	CODBCPool(void) ;
	~CODBCPool(void);

	// ��ȡʵ��ָ��;
	static CODBCPool* GetInstance()
	{
		static CODBCPool* pInstance = NULL;
		if ( pInstance == NULL )
			pInstance = new CODBCPool;

		return pInstance;
	}

	// ��ʼ����������;
	DWORD InitializePool( 
		IN LPCTSTR lpDBSource, 
		IN CONST DWORD &dwDBPort, 
		IN LPCTSTR lpDBAccount, 
		IN LPCTSTR lpPassWord, 
		IN LPCTSTR lpDBName, 
		IN CONST INT &nMinConn = 1, 
		IN CONST INT &nMaxConn = 5
		);

	// �ر���������;
	void ReleasePool();

	// �������ݿ���Ϣ;
	void SetDBConnectionInfo(IN LPCTSTR lpDBSource, IN CONST DWORD &dwDBPort, IN LPCTSTR lpDBAccount, IN LPCTSTR lpPassWord, IN LPCTSTR lpDBName);
	// ��ʼ����������;
	INT IntiAllConnections();
	// �Ͽ���������;
	void DestroyAllDBConnections();

	// ��ȡһ����������;
	CDatabase* GetAConnection( IN CONST DWORD &dwTimeOut = 1000 );
	// �������Ӹ����ж���;
	void RestoreAConnection(IN CDatabase *pDBEngine);
	// �ر�һ������;
	void CloseAConnection(CDatabase *&pDBEngine);
	// �ر�ʹ�õ�����;
	void CloseBusyConnection(IN CDatabase *&pDataBase);
private:
	volatile LONG m_nRef;
	volatile LONG m_nObjRef;
	// ����һ������;
	CDatabase* InitAConnection();
	// ����������Ԫ��;
	friend class ODBCConnGuard;
};

// ODBC������Ƭ��;
class ODBCConnGuard
{
	CDatabase *m_pODBCConn;
public:
	ODBCConnGuard( CDatabase *&pDBConn, CONST DWORD &dwTimeOut = 30000 ):m_pODBCConn(NULL)
	{
		pDBConn = CODBCPool::GetInstance()->GetAConnection( dwTimeOut );
		m_pODBCConn = pDBConn;
	}

	virtual ~ODBCConnGuard()
	{
		CODBCPool::GetInstance()->RestoreAConnection(m_pODBCConn);
	}
};



#endif // __SAFE_LIST__