|
@@ -14,43 +14,57 @@ namespace LOTRO_DAT {
|
|
|
db_ = nullptr;
|
|
|
}
|
|
|
|
|
|
- void Database::CloseDatabase() {
|
|
|
- if (db_ != nullptr) {
|
|
|
- ExecSql("COMMIT TRANSACTION");
|
|
|
- sqlite3_finalize(insert_request_);
|
|
|
- sqlite3_finalize(fetch_one_request_);
|
|
|
- sqlite3_finalize(get_rows_number_request_);
|
|
|
- if (sqlite3_close_v2(db_) != SQLITE_OK)
|
|
|
- fprintf(stderr, "ERROR: Bad Database::CloseDatabase() - Error when closing: %s\n", sqlite3_errmsg(db_));
|
|
|
- db_ = nullptr;
|
|
|
+ bool Database::CloseDatabase() {
|
|
|
+ try {
|
|
|
+ if (db_ != nullptr) {
|
|
|
+ ExecSql("COMMIT TRANSACTION");
|
|
|
+ sqlite3_finalize(insert_request_);
|
|
|
+ sqlite3_finalize(fetch_one_request_);
|
|
|
+ sqlite3_finalize(get_rows_number_request_);
|
|
|
+ if (sqlite3_close_v2(db_) != SQLITE_OK)
|
|
|
+ fprintf(stderr, "ERROR: Bad Database::CloseDatabase() - Error when closing: %s\n",
|
|
|
+ sqlite3_errmsg(db_));
|
|
|
+ db_ = nullptr;
|
|
|
+ }
|
|
|
+ } catch (std::exception &e) {
|
|
|
+ fprintf(stderr, "Bad Database::CloseDatabase() - caught exception %s\n", e.what());
|
|
|
+ return false;
|
|
|
}
|
|
|
+ return true;
|
|
|
}
|
|
|
|
|
|
Database::~Database() {
|
|
|
CloseDatabase();
|
|
|
}
|
|
|
|
|
|
- void Database::InitDatabase(const std::string &filename) {
|
|
|
- CloseDatabase();
|
|
|
- if (sqlite3_open(filename.c_str(), &db_) != SQLITE_OK) {
|
|
|
- sqlite3_close(db_);
|
|
|
- throw DatException("Bad Database::InitDatabase() - sqlite3_open returned an error..."
|
|
|
- , DATABASE_EXCEPTION);
|
|
|
+ bool Database::InitDatabase(const std::string &filename) {
|
|
|
+ try {
|
|
|
+ CloseDatabase();
|
|
|
+ if (sqlite3_open(filename.c_str(), &db_) != SQLITE_OK) {
|
|
|
+ sqlite3_close(db_);
|
|
|
+ throw DatException("Bad Database::InitDatabase() - sqlite3_open returned an error...",
|
|
|
+ DATABASE_EXCEPTION);
|
|
|
+ }
|
|
|
+
|
|
|
+ ExecSql("PRAGMA synchronous = OFF");
|
|
|
+ ExecSql("PRAGMA count_changes = OFF");
|
|
|
+ ExecSql("PRAGMA journal_mode = MEMORY");
|
|
|
+ ExecSql("PRAGMA temp_store = MEMORY");
|
|
|
+ ExecSql("PRAGMA encoding = \"UTF-8\";");
|
|
|
+
|
|
|
+ ExecSql(CreateTableCommand_);
|
|
|
+
|
|
|
+ sqlite3_prepare_v2(db_, InsertFileCommand_.c_str(), InsertFileCommand_.length(), &insert_request_, nullptr);
|
|
|
+ sqlite3_prepare_v2(db_, FetchOneCommand.c_str(), FetchOneCommand.length(), &fetch_one_request_, nullptr);
|
|
|
+ sqlite3_prepare_v2(db_, GetRowsNumberCommand_.c_str(), GetRowsNumberCommand_.length(),
|
|
|
+ &get_rows_number_request_, nullptr);
|
|
|
+
|
|
|
+ ExecSql("BEGIN TRANSACTION");
|
|
|
+ } catch (std::exception &e) {
|
|
|
+ fprintf(stderr, "Bad Database::InitDatabase() - caught exception %s\n", e.what());
|
|
|
+ return false;
|
|
|
}
|
|
|
-
|
|
|
- ExecSql("PRAGMA synchronous = OFF");
|
|
|
- ExecSql("PRAGMA count_changes = OFF");
|
|
|
- ExecSql("PRAGMA journal_mode = MEMORY");
|
|
|
- ExecSql("PRAGMA temp_store = MEMORY");
|
|
|
- ExecSql("PRAGMA encoding = \"UTF-8\";");
|
|
|
-
|
|
|
- ExecSql(CreateTableCommand_);
|
|
|
-
|
|
|
- sqlite3_prepare_v2(db_, InsertFileCommand_.c_str(), InsertFileCommand_.length(), &insert_request_, nullptr);
|
|
|
- sqlite3_prepare_v2(db_, FetchOneCommand.c_str(), FetchOneCommand.length(), &fetch_one_request_, nullptr);
|
|
|
- sqlite3_prepare_v2(db_, GetRowsNumberCommand_.c_str(), GetRowsNumberCommand_.length(), &get_rows_number_request_, nullptr);
|
|
|
-
|
|
|
- ExecSql("BEGIN TRANSACTION");
|
|
|
+ return true;
|
|
|
}
|
|
|
|
|
|
void Database::ExecSql(const std::string &sql) {
|
|
@@ -65,75 +79,105 @@ namespace LOTRO_DAT {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- void Database::PushFile(const SubfileData &data) {
|
|
|
- if (db_ == nullptr)
|
|
|
- throw DatException("Bad Database::PushFile() - database hasn't been opened!", DATABASE_EXCEPTION);
|
|
|
-
|
|
|
- std::stringstream options_;
|
|
|
- options_ << data.options;
|
|
|
-
|
|
|
- sqlite3_bind_blob(insert_request_, 1, data.binary_data.data(), data.binary_data.size(), SQLITE_TRANSIENT);
|
|
|
- sqlite3_bind_text16(insert_request_, 2, data.text_data.c_str(), -1, SQLITE_TRANSIENT);
|
|
|
- sqlite3_bind_text(insert_request_, 3, options_.str().c_str(), -1, SQLITE_TRANSIENT);
|
|
|
-
|
|
|
- if (sqlite3_step(insert_request_) != SQLITE_DONE) {
|
|
|
- fprintf(stderr, "SQLite3 error: %s\n", sqlite3_errmsg(db_));
|
|
|
- throw DatException((std::string("Bad Database::PushTextFile() - unable to perform push operation")).c_str(),
|
|
|
- DATABASE_EXCEPTION);
|
|
|
+ bool Database::PushFile(const SubfileData &data) {
|
|
|
+ try {
|
|
|
+ if (db_ == nullptr)
|
|
|
+ throw DatException("Bad Database::PushFile() - database hasn't been opened!", DATABASE_EXCEPTION);
|
|
|
+
|
|
|
+ std::stringstream options_;
|
|
|
+ options_ << data.options;
|
|
|
+
|
|
|
+ sqlite3_bind_blob(insert_request_, 1, data.binary_data.data(), data.binary_data.size(), SQLITE_TRANSIENT);
|
|
|
+ sqlite3_bind_text16(insert_request_, 2, data.text_data.c_str(), -1, SQLITE_TRANSIENT);
|
|
|
+ sqlite3_bind_text(insert_request_, 3, options_.str().c_str(), -1, SQLITE_TRANSIENT);
|
|
|
+
|
|
|
+ if (sqlite3_step(insert_request_) != SQLITE_DONE) {
|
|
|
+ fprintf(stderr, "SQLite3 error: %s\n", sqlite3_errmsg(db_));
|
|
|
+ throw DatException(
|
|
|
+ (std::string("Bad Database::PushTextFile() - unable to perform push operation")).c_str(),
|
|
|
+ DATABASE_EXCEPTION);
|
|
|
+ }
|
|
|
+
|
|
|
+ sqlite3_reset(insert_request_);
|
|
|
+ } catch (std::exception &e) {
|
|
|
+ fprintf(stderr, "Bad Database::PushFile() - caught exception %s\n", e.what());
|
|
|
+ return false;
|
|
|
}
|
|
|
-
|
|
|
- sqlite3_reset(insert_request_);
|
|
|
+ return true;
|
|
|
}
|
|
|
|
|
|
SubfileData Database::GetNextFile() {
|
|
|
- SubfileData data;
|
|
|
- if (db_ == nullptr)
|
|
|
- throw DatException("Bad Database::GetNexFile() - database hasn't been opened!", DATABASE_EXCEPTION);
|
|
|
-
|
|
|
- int result = sqlite3_step(fetch_one_request_);
|
|
|
-
|
|
|
- if (result == SQLITE_ROW) {
|
|
|
- data.binary_data = BinaryData((char *) sqlite3_column_blob(fetch_one_request_, 0),
|
|
|
- unsigned(sqlite3_column_bytes(fetch_one_request_, 0)));
|
|
|
-
|
|
|
- data.text_data = std::u16string((char16_t *)sqlite3_column_text16(fetch_one_request_, 1));
|
|
|
-
|
|
|
- std::string _options = std::string((char *)sqlite3_column_text(fetch_one_request_, 2),
|
|
|
- unsigned(sqlite3_column_bytes(fetch_one_request_, 2)));
|
|
|
- data.options = YAML::Load(_options);
|
|
|
- return data;
|
|
|
+ try {
|
|
|
+ SubfileData data;
|
|
|
+ if (db_ == nullptr)
|
|
|
+ throw DatException("Bad Database::GetNexFile() - database hasn't been opened!", DATABASE_EXCEPTION);
|
|
|
+
|
|
|
+ int result = sqlite3_step(fetch_one_request_);
|
|
|
+
|
|
|
+ if (result == SQLITE_ROW) {
|
|
|
+ data.binary_data = BinaryData((char *) sqlite3_column_blob(fetch_one_request_, 0),
|
|
|
+ unsigned(sqlite3_column_bytes(fetch_one_request_, 0)));
|
|
|
+
|
|
|
+ data.text_data = std::u16string((char16_t *) sqlite3_column_text16(fetch_one_request_, 1));
|
|
|
+
|
|
|
+ std::string _options = std::string((char *) sqlite3_column_text(fetch_one_request_, 2),
|
|
|
+ unsigned(sqlite3_column_bytes(fetch_one_request_, 2)));
|
|
|
+ data.options = YAML::Load(_options);
|
|
|
+ return data;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (result == SQLITE_DONE) {
|
|
|
+ return data;
|
|
|
+ }
|
|
|
+
|
|
|
+ fprintf(stderr, "SQLite3 fetch_one request returned %d code. SQLite message is: %s", result,
|
|
|
+ sqlite3_errmsg(db_));
|
|
|
+ throw DatException("Bad Database::GetNextFile() - sqlite3 - error", DATABASE_EXCEPTION);
|
|
|
+ } catch (std::exception &e) {
|
|
|
+ fprintf(stderr, "Bad Database::GetNextFile() - caught exception %s\n", e.what());
|
|
|
+ return SubfileData();
|
|
|
}
|
|
|
-
|
|
|
- if (result == SQLITE_DONE) {
|
|
|
- return data;
|
|
|
- }
|
|
|
-
|
|
|
- fprintf(stderr, "SQLite3 fetch_one request returned %d code. SQLite message is: %s", result, sqlite3_errmsg(db_));
|
|
|
- throw DatException("Bad Database::GetNextFile() - sqlite3 - error", DATABASE_EXCEPTION);
|
|
|
}
|
|
|
|
|
|
- void Database::RemoveDatabase() {
|
|
|
- if (db_ == nullptr)
|
|
|
- throw DatException("Bad Database::RemoveDatabase() - database hasn't been opened!", DATABASE_EXCEPTION);
|
|
|
- throw DatException("Database::RemoveDatabase() haven't been implemented yet...", DATABASE_EXCEPTION);
|
|
|
-
|
|
|
+ bool Database::RemoveDatabase() {
|
|
|
+ try {
|
|
|
+ if (db_ == nullptr)
|
|
|
+ throw DatException("Bad Database::RemoveDatabase() - database hasn't been opened!", DATABASE_EXCEPTION);
|
|
|
+ throw DatException("Database::RemoveDatabase() haven't been implemented yet...", DATABASE_EXCEPTION);
|
|
|
+
|
|
|
+ } catch (std::exception &e) {
|
|
|
+ fprintf(stderr, "Bad Database::RemoveDatabase() - caught exception %s\n", e.what());
|
|
|
+ return false;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
- void Database::ClearDatabase() {
|
|
|
- if (db_ == nullptr)
|
|
|
- throw DatException("Bad Database::ClearDatabase() - database hasn't been opened!", DATABASE_EXCEPTION);
|
|
|
- ExecSql(ClearTableCommand_);
|
|
|
+ bool Database::ClearDatabase() {
|
|
|
+ try {
|
|
|
+ if (db_ == nullptr)
|
|
|
+ throw DatException("Bad Database::ClearDatabase() - database hasn't been opened!", DATABASE_EXCEPTION);
|
|
|
+ ExecSql(ClearTableCommand_);
|
|
|
+ return true;
|
|
|
+ } catch (std::exception &e) {
|
|
|
+ fprintf(stderr, "Bad Database::ClearDatabase() - caught exception %s\n", e.what());
|
|
|
+ return false;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
size_t Database::CountRows() {
|
|
|
- int result = sqlite3_step(get_rows_number_request_);
|
|
|
-
|
|
|
- if (result == SQLITE_ERROR) {
|
|
|
- fprintf(stderr, "ERROR: Bad Database::CountRows() - Error when counting rows %s\n", sqlite3_errmsg(db_));
|
|
|
+ try {
|
|
|
+ int result = sqlite3_step(get_rows_number_request_);
|
|
|
+
|
|
|
+ if (result == SQLITE_ERROR) {
|
|
|
+ fprintf(stderr, "ERROR: Bad Database::CountRows() - Error when counting rows %s\n",
|
|
|
+ sqlite3_errmsg(db_));
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ long long res = sqlite3_column_int64(get_rows_number_request_, 0);
|
|
|
+ sqlite3_reset(get_rows_number_request_);
|
|
|
+ return size_t(res);
|
|
|
+ } catch (std::exception &e) {
|
|
|
+ fprintf(stderr, "Bad Database::CountRows() - caught exception %s\n", e.what());
|
|
|
return 0;
|
|
|
}
|
|
|
- long long res = sqlite3_column_int64(get_rows_number_request_, 0);
|
|
|
- sqlite3_reset(get_rows_number_request_);
|
|
|
- return size_t(res);
|
|
|
}
|
|
|
}
|