Warrior_EA/Database/DatabaseManager.mqh

177 lines
6 KiB
MQL5
Raw Permalink Normal View History

2025-05-30 16:35:54 +02:00
//+------------------------------------------------------------------+
//| Warrior_EA |
//| AnimateDread |
//| |
//+------------------------------------------------------------------+
#include "DatabaseConnectionManager.mqh"
#include "DatabaseOperationsManager.mqh"
#include "DatabaseFileSystemManager.mqh"
#include "DatabaseVersionManager.mqh"
class CDatabaseManager
{
private:
string m_dbPath;
int m_databaseHandle;
bool m_isDatabaseOpen; // Tracks if the database is currently open
CDatabaseConnectionManager m_dbConnectionManager;
CDatabaseVersionManager m_dbVersionManager;
CDatabaseFileSystemManager m_dbFileSystemManager;
CDatabaseOperationsManager m_dbOperationsManager;
public:
CDatabaseManager()
{
m_isDatabaseOpen = false;
}
~CDatabaseManager()
{
CloseDatabase();
}
bool Init(const string& dbVersion, string& dirStructureArray[], const string& dbName)
{
string currentPath;
// Build the database folder path
for(int i = 0; i < ArraySize(dirStructureArray); ++i)
{
currentPath += (i == 0) ? dirStructureArray[i] : "\\" + dirStructureArray[i];
}
string dbFolderPath = currentPath;
string versionFilePath = dbFolderPath + "\\" + "DatabaseVersion";
m_dbPath = dbFolderPath + "\\" + dbName;
string storedDbVersion = m_dbVersionManager.ReadStoredDbVersion(versionFilePath);
// Handling when the stored database version is "NA"
if(storedDbVersion == "NA")
{
if(!m_dbFileSystemManager.CreateDirectory(dbFolderPath))
{
return false;
}
m_dbFileSystemManager.CleanDirectory(dbFolderPath);
m_dbVersionManager.UpdateStoredDbVersion(versionFilePath, dbVersion);
}
else
if(storedDbVersion == "ERROR")
{
// Retry mechanism for "ERROR" case
int attempts = 0;
while(attempts < 5 && storedDbVersion == "ERROR")
{
Sleep(1000); // Sleep for a second
storedDbVersion = m_dbVersionManager.ReadStoredDbVersion(versionFilePath);
attempts++;
}
if(storedDbVersion == "ERROR")
{
return false; // Give up after 5 attempts
}
}
// If current version doesn't match the stored version (and it's not "NA" or "ERROR")
if(storedDbVersion != dbVersion && storedDbVersion != "")
{
m_dbFileSystemManager.CleanDirectory(dbFolderPath);
m_dbVersionManager.UpdateStoredDbVersion(versionFilePath, dbVersion);
}
// Special handling for training mode
if(trainingMode == true)
{
m_dbFileSystemManager.DeleteFile(m_dbPath);
}
// Attempt to initialize the database connection
if(!m_dbConnectionManager.Init(m_dbPath))
{
return false;
}
return true;
}
bool Deinit()
{
m_dbConnectionManager.TransactionCommit();
m_dbConnectionManager.CloseDatabase();
return(true);
}
bool OpenDatabase()
{
// Check if the database is already open
if(m_isDatabaseOpen)
{
// Database is already open, no need to open it again
PrintVerbose("Database already open.");
return true;
}
if(m_dbConnectionManager.OpenDatabase())
{
m_databaseHandle = m_dbConnectionManager.GetDatabaseHandle();
m_dbOperationsManager.SetDatabaseHandle(m_databaseHandle);
m_isDatabaseOpen = true; // Update the state to reflect that the database is now open
return true;
}
else
return false;
}
bool CloseDatabase()
{
if(m_dbConnectionManager.CloseDatabase())
{
m_databaseHandle = 0; // Reset database handle
m_dbOperationsManager.SetDatabaseHandle(m_databaseHandle);
m_isDatabaseOpen = false; // Update the state to reflect that the database is now closed
return true;
}
else
return false;
}
bool BeginTransaction()
{
if(!m_isDatabaseOpen)
{
if(!OpenDatabase())
return false;
}
return m_dbConnectionManager.TransactionBegin();
}
bool CommitTransaction()
{
return m_dbConnectionManager.TransactionCommit();
}
bool CreateTable(string tableName, string tableSchema)
{
return m_dbOperationsManager.CreateTable(tableName, tableSchema);
}
bool DeleteTable(string tableName)
{
return m_dbOperationsManager.DeleteTable(tableName);
}
bool InsertTradeRecord(string tableName, const string &columns[], const string &values[])
{
return m_dbOperationsManager.InsertTradeRecord(tableName, columns, values);
}
template <typename T>
bool FetchTradeRecords(string tableName, T &tradeRecordStructure, T &tradeRecords[])
{
return m_dbOperationsManager.FetchTradeRecords(tableName, tradeRecordStructure, tradeRecords);
}
bool UpdateTradeRecord(string tableName, const string &columns[], const string &values[], const string &condition)
{
return m_dbOperationsManager.UpdateTradeRecord(tableName, columns, values, condition);
}
bool DeleteOldestEntry(string tableName)
{
return m_dbOperationsManager.DeleteOldestEntry(tableName);
}
};
//+------------------------------------------------------------------+