Clone of PhatAC @ https://github.com/floaterxk/PhatAC

Database.cpp 3.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. #include "StdAfx.h"
  2. //Database access.
  3. #include "Database.h"
  4. #include "AccountDatabase.h"
  5. #include "CharacterDatabase.h"
  6. void CDatabase::FatalError(SQLSMALLINT type, SQLHANDLE *handle)
  7. {
  8. Kill(__FILE__, __LINE__);
  9. MsgBox(MB_ICONHAND, "Fatal database error.\r\n");
  10. }
  11. CDatabase::CDatabase()
  12. {
  13. LOG(Temp, Normal, "Initializing Database..\n");
  14. m_database = "main.mdb";
  15. m_pAccountDB = NULL;
  16. m_pCharDB = NULL;
  17. m_hSearchHandle = INVALID_HANDLE_VALUE;
  18. Initialize();
  19. if (!IsAlive())
  20. LOG(Temp, Normal, "Database failure!\n");
  21. }
  22. CDatabase::~CDatabase()
  23. {
  24. Shutdown();
  25. if (m_hSearchHandle != INVALID_HANDLE_VALUE)
  26. {
  27. FindClose(m_hSearchHandle);
  28. m_hSearchHandle = INVALID_HANDLE_VALUE;
  29. }
  30. }
  31. void CDatabase::Initialize()
  32. {
  33. HWND hSQLWnd = g_pGlobals->GetWindowHandle();
  34. char* ci = csprintf("Driver={Microsoft Access Driver (*.mdb)};DBQ=%s\\Data\\%s;", g_pGlobals->GetGameDirectory(), m_database.c_str());
  35. char co[MAX_PATH + 120];
  36. short colen;
  37. short retcode;
  38. StartSQL();
  39. retcode = SQLAllocHandle(SQL_HANDLE_DBC, m_hENV, (SQLHDBC FAR *)&m_hDBC);
  40. if (!(retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO || retcode == SQL_NO_DATA))
  41. {
  42. FatalError(SQL_HANDLE_DBC, &m_hDBC); return;
  43. }
  44. retcode = SQLDriverConnect(m_hDBC, hSQLWnd, (SQLCHAR *)ci, SQL_NTS, (SQLCHAR *)co, MAX_PATH + 120, &colen, SQL_DRIVER_COMPLETE_REQUIRED);
  45. if (!(retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO || retcode == SQL_NO_DATA))
  46. {
  47. FatalError(SQL_HANDLE_DBC, &m_hDBC); return;
  48. }
  49. retcode = SQLAllocHandle(SQL_HANDLE_STMT, m_hDBC, &m_hSTMT);
  50. if (!(retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO || retcode == SQL_NO_DATA))
  51. {
  52. FatalError(SQL_HANDLE_STMT, &m_hSTMT); return;
  53. }
  54. m_pAccountDB = new CAccountDatabase(this);
  55. m_pCharDB = new CCharacterDatabase(this);
  56. if (!CreateDirectory("Data", NULL))
  57. {
  58. int dwError = GetLastError();
  59. if (dwError != ERROR_ALREADY_EXISTS)
  60. {
  61. MsgBoxError(dwError, "creating data folder");
  62. }
  63. }
  64. }
  65. void CDatabase::Shutdown()
  66. {
  67. SafeDelete(m_pCharDB);
  68. SafeDelete(m_pAccountDB);
  69. SQLFreeHandle(SQL_HANDLE_STMT, m_hSTMT);
  70. SQLDisconnect(m_hDBC);
  71. SQLFreeHandle(SQL_HANDLE_DBC, m_hDBC);
  72. EndSQL();
  73. }
  74. void CDatabase::StartSQL()
  75. {
  76. SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &m_hENV);
  77. SQLSetEnvAttr(m_hENV, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, SQL_IS_INTEGER);
  78. }
  79. void CDatabase::EndSQL()
  80. {
  81. SQLFreeHandle(SQL_HANDLE_ENV, m_hENV);
  82. }
  83. FILE* CDatabase::DataFileOpen(const char* filename, const char* mode)
  84. {
  85. std::string filepath = "Data\\";
  86. filepath += filename;
  87. FILE *fp = fopen(filepath.c_str(), mode);
  88. return fp;
  89. }
  90. FILE* CDatabase::DataFileCreate(const char* filename, const char* mode)
  91. {
  92. std::string filepath = "Data\\";
  93. filepath += filename;
  94. FILE *fp = fopen(filepath.c_str(), mode);
  95. return fp;
  96. }
  97. BOOL CDatabase::DataFileFindFirst(const char* filemask, WIN32_FIND_DATA* data)
  98. {
  99. std::string filepath = "Data\\";
  100. filepath += filemask;
  101. m_hSearchHandle = FindFirstFile(filepath.c_str(), data);
  102. return (m_hSearchHandle != INVALID_HANDLE_VALUE) ? TRUE : FALSE;
  103. }
  104. BOOL CDatabase::DataFileFindNext(WIN32_FIND_DATA* data)
  105. {
  106. if (m_hSearchHandle == INVALID_HANDLE_VALUE)
  107. return FALSE;
  108. return FindNextFile(m_hSearchHandle, data);
  109. }
  110. void CDatabase::DataFileFindClose()
  111. {
  112. if (m_hSearchHandle != INVALID_HANDLE_VALUE)
  113. {
  114. FindClose(m_hSearchHandle);
  115. m_hSearchHandle = INVALID_HANDLE_VALUE;
  116. }
  117. }
  118. CAccountDatabase* CDatabase::AccountDB()
  119. {
  120. return m_pAccountDB;
  121. }
  122. CCharacterDatabase* CDatabase::CharDB()
  123. {
  124. return m_pCharDB;
  125. }