Предположения:
Предположим, у меня есть две таблицы в моей базе данных
- Проект
- Документы
Документы
И в настоящее время я поддерживаю только следующие две базы данных:
1) Post Gres
2) Oracle
Реализация:
Я реализую эту логикув следующих трех фазах
1) Адаптер базы данных: только этот класс открыт для внешнего мира, и это содержит указатель на каждый QueryBuilder, эти указатели будут инициализированы в конструкторе этого класса на основе типа БД(который передается в качестве аргумента конструктору)
2) Соединитель БД: этот класс будет отвечать за обработку БД (установить соединение, отключить и т. д.)
3) Построитель запросов: этот разделсодержит класс баса для каждой таблицы в БД, а также содержит конкретные значения для каждой конкретной базы данных
Пример кода (только синопсис)
DBAdapter.h
DBAdapter(enum DBType, string ConnectionString);//constructor
IntializeDBConnectAndQueryBuilder();
Project *pProject;
Docs *pDocs;
//----------------------------------------------------------------------------------------
DBAdapter.cpp
DBAdapter(enum DBType, string ConnectionString)//constructor
{
swithc (DBType)
{
case enPostGres:
pProject = new Project_PostGres();
pDocs = new Docs_PostGres();
break;
};
}
Раздел соединителя БД:
DBConnector.h
virtual Connect()=0; //pure virtual
IsConnected()=0;//pure virtual
Disconnect()=0; //pure virtual
//------------------------------------------------------------------------------------------
DBConnector_PostGres.cpp: DBConnector
Connect()
{ //Implementation specific to postgres goes here}
IsConnected()
{ //Implementation specific to postgres goes here}
Disconnect()
{ //Implementation specific to postgres goes here}
//------------------------------------------------------------------------------------------
DBConnector_OracleGres.cpp: DBConnector
Connect()
{ //Implementation specific to oracle goes here}
IsConnected()
{ //Implementation specific to oracle goes here}
Disconnect()
{ //Implementation specific to oracle goes here}
//------------------------------------------------------------------------------------------
ЗапросСтроитель Раздел:
Project.h
virtual int AddProject();
virtual int DeleteProject();
virtual int IsProjectTableExist();
DBConnector *pDBConnector; // This pointer will be initalized in all concrete classes
//------------------------------------------------------------------------------------------
Project.cpp
int AddProject()
{
//Query for adding Project is same for all databases
}
int DeleteProject()
{
//Query for deleting Project is same for all databases
}
//------------------------------------------------------------------------------------------
Project_PostGres.cpp : Project
Project_PostGres() // Constructor
{
pDBConnector = new DBConnector_PostGres();
}
int IsProjectTableExist()
{
//Query specific to postgres goes here
}
Project
//------------------------------------------------------------------------------------------
Project_Oracle.cpp : Project
{
//Query specific to oracle goes here
}
//. . . and so on for other databases
//------------------------------------------------------------------------------------------
//Same number of files with same logic will also be created for Docs Table
------------------------------------------------------------------------------------------