Database.cpp 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. //
  2. // Created by Иван_Архипов on 17.11.2017.
  3. //
  4. #define UNICODE
  5. #define _UNICODE
  6. #include "Database.h"
  7. #include "Common/DatException.h"
  8. #include "BinaryData.h"
  9. #include "Common/CommonFunctions.h"
  10. #include <cstring>
  11. namespace LOTRO_DAT {
  12. Database::Database() {
  13. db_ = nullptr;
  14. }
  15. Database::Database(const std::string &filename) {
  16. InitDatabase(filename.c_str());
  17. }
  18. Database::~Database() {
  19. if (db_ != nullptr) {
  20. ExecSql("COMMIT TRANSACTION");
  21. sqlite3_finalize(insert_request_);
  22. sqlite3_close(db_);
  23. }
  24. }
  25. void Database::InitDatabase(const std::string &filename) {
  26. if (sqlite3_open(filename.c_str(), &db_) != SQLITE_OK) {
  27. sqlite3_close(db_);
  28. throw DatException("Bad Database::InitDatabase() - sqlite3_open returned an error..."
  29. , DATABASE_EXCEPTION);
  30. }
  31. ExecSql("PRAGMA synchronous = OFF");
  32. ExecSql("PRAGMA count_changes = OFF");
  33. ExecSql("PRAGMA journal_mode = MEMORY");
  34. ExecSql("PRAGMA temp_store = MEMORY");
  35. ExecSql("PRAGMA encoding = \"UTF-8\";");
  36. ExecSql(CreateTableCommand_);
  37. sqlite3_prepare_v2(db_, InsertFileCommand_.c_str(), InsertFileCommand_.length(), &insert_request_, nullptr);
  38. sqlite3_prepare_v2(db_, FetchOneCommand.c_str(), FetchOneCommand.length(), &fetch_one_request_, nullptr);
  39. ExecSql("BEGIN TRANSACTION");
  40. }
  41. void Database::ExecSql(const std::string &sql) {
  42. if (db_ == nullptr)
  43. throw DatException("Bad Database::ExecSql() - database hasn't been opened!", DATABASE_EXCEPTION);
  44. char *error;
  45. if (sqlite3_exec(db_, sql.c_str(), nullptr, nullptr, &error) != SQLITE_OK) {
  46. fprintf(stderr, "SQLite3 error: %s\n", sqlite3_errmsg(db_));
  47. throw DatException((std::string("Bad Database::ExecSql() - unable to perform request")
  48. + std::string(sql)).c_str(), DATABASE_EXCEPTION);
  49. }
  50. }
  51. void Database::PushFile(const BinaryData &binary_data, const std::u16string &text_data, const std::string &options) {
  52. if (db_ == nullptr)
  53. throw DatException("Bad Database::PushFile() - database hasn't been opened!", DATABASE_EXCEPTION);
  54. sqlite3_bind_blob(insert_request_, 1, binary_data.data(), binary_data.size(), SQLITE_TRANSIENT);
  55. sqlite3_bind_text16(insert_request_, 2, text_data.c_str(), -1, SQLITE_TRANSIENT);
  56. sqlite3_bind_text(insert_request_, 3, options.c_str(), -1, SQLITE_TRANSIENT);
  57. if (sqlite3_step(insert_request_) != SQLITE_DONE) {
  58. fprintf(stderr, "SQLite3 error: %s\n", sqlite3_errmsg(db_));
  59. throw DatException((std::string("Bad Database::PushTextFile() - unable to perform push operation")).c_str(),
  60. DATABASE_EXCEPTION);
  61. }
  62. sqlite3_reset(insert_request_);
  63. }
  64. bool Database::GetNextFile(BinaryData &binary_data, std::u16string &text_data, YAML::Node &options) {
  65. if (db_ == nullptr)
  66. throw DatException("Bad Database::GetNexFile() - database hasn't been opened!", DATABASE_EXCEPTION);
  67. int result = sqlite3_step(fetch_one_request_);
  68. if (result == SQLITE_ROW) {
  69. binary_data = BinaryData((char *) sqlite3_column_blob(fetch_one_request_, 0),
  70. unsigned(sqlite3_column_bytes(fetch_one_request_, 0)));
  71. text_data = std::u16string((char16_t *)sqlite3_column_text16(fetch_one_request_, 1));
  72. std::string _options = std::string((char *)sqlite3_column_text(fetch_one_request_, 2),
  73. unsigned(sqlite3_column_bytes(fetch_one_request_, 2)));
  74. options = YAML::Load(_options);
  75. return true;
  76. }
  77. if (result == SQLITE_DONE) {
  78. return false;
  79. }
  80. fprintf(stderr, "SQLite3 fetch_one request returned %d code. SQLite message is: %s", result, sqlite3_errmsg(db_));
  81. throw DatException("Bad Database::GetNextFile() - sqlite3 - error", DATABASE_EXCEPTION);
  82. }
  83. void Database::RemoveDatabase() {
  84. if (db_ == nullptr)
  85. throw DatException("Bad Database::RemoveDatabase() - database hasn't been opened!", DATABASE_EXCEPTION);
  86. throw DatException("Database::RemoveDatabase() haven't been implemented yet...", DATABASE_EXCEPTION);
  87. // TODO: Implement function
  88. }
  89. void Database::ClearDatabase() {
  90. if (db_ == nullptr)
  91. throw DatException("Bad Database::ClearDatabase() - database hasn't been opened!", DATABASE_EXCEPTION);
  92. ExecSql(ClearTableCommand_);
  93. }
  94. }