Page Menu
Home
Phabricator
Search
Configure Global Search
Log In
Files
F3376103
D10703.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
4 KB
Referenced Files
None
Subscribers
None
D10703.diff
View Options
diff --git a/native/cpp/CommonCpp/DatabaseManagers/SQLiteQueryExecutor.h b/native/cpp/CommonCpp/DatabaseManagers/SQLiteQueryExecutor.h
--- a/native/cpp/CommonCpp/DatabaseManagers/SQLiteQueryExecutor.h
+++ b/native/cpp/CommonCpp/DatabaseManagers/SQLiteQueryExecutor.h
@@ -5,6 +5,7 @@
#include "entities/Draft.h"
#include "entities/KeyserverInfo.h"
#include "entities/UserInfo.h"
+#include "sqlite_orm.h"
#include <mutex>
#include <string>
@@ -14,10 +15,13 @@
class SQLiteQueryExecutor : public DatabaseQueryExecutor {
static void migrate();
static auto &getStorage();
+ static sqlite3 *getConnection();
+ static void closeConnection();
static std::once_flag initialized;
static int sqlcipherEncryptionKeySize;
static std::string secureStoreEncryptionKeyID;
+ static sqlite3 *dbConnection;
#ifndef EMSCRIPTEN
static void assign_encryption_key();
@@ -28,6 +32,7 @@
static std::string encryptionKey;
SQLiteQueryExecutor();
+ ~SQLiteQueryExecutor();
SQLiteQueryExecutor(std::string sqliteFilePath);
std::unique_ptr<Thread> getThread(std::string threadID) const override;
std::string getDraft(std::string key) const override;
diff --git a/native/cpp/CommonCpp/DatabaseManagers/SQLiteQueryExecutor.cpp b/native/cpp/CommonCpp/DatabaseManagers/SQLiteQueryExecutor.cpp
--- a/native/cpp/CommonCpp/DatabaseManagers/SQLiteQueryExecutor.cpp
+++ b/native/cpp/CommonCpp/DatabaseManagers/SQLiteQueryExecutor.cpp
@@ -1,6 +1,5 @@
#include "SQLiteQueryExecutor.h"
#include "Logger.h"
-#include "sqlite_orm.h"
#include "entities/KeyserverInfo.h"
#include "entities/Metadata.h"
@@ -26,6 +25,7 @@
int SQLiteQueryExecutor::sqlcipherEncryptionKeySize = 64;
std::string SQLiteQueryExecutor::secureStoreEncryptionKeyID =
"comm.encryptionKey";
+sqlite3 *SQLiteQueryExecutor::dbConnection = nullptr;
bool create_table(sqlite3 *db, std::string query, std::string tableName) {
char *error;
@@ -477,6 +477,21 @@
return create_table(db, query, "keyservers");
}
+bool enable_rollback_journal_mode(sqlite3 *db) {
+ char *error;
+ sqlite3_exec(db, "PRAGMA journal_mode=DELETE;", nullptr, nullptr, &error);
+
+ if (!error) {
+ return true;
+ }
+
+ std::stringstream error_message;
+ error_message << "Error disabling write-ahead logging mode: " << error;
+ Logger::log(error_message.str());
+ sqlite3_free(error);
+ return false;
+}
+
bool create_schema(sqlite3 *db) {
char *error;
sqlite3_exec(
@@ -826,7 +841,8 @@
{30, {create_persist_storage_table, true}},
{31, {recreate_message_store_threads_table, true}},
{32, {create_users_table, true}},
- {33, {create_keyservers_table, true}}}};
+ {33, {create_keyservers_table, true}},
+ {34, {enable_rollback_journal_mode, false}}}};
enum class MigrationResult { SUCCESS, FAILURE, NOT_APPLIED };
@@ -882,11 +898,6 @@
}
bool set_up_database(sqlite3 *db) {
- auto write_ahead_enabled = enable_write_ahead_logging_mode(db);
- if (!write_ahead_enabled) {
- return false;
- }
-
sqlite3_exec(db, "BEGIN TRANSACTION;", nullptr, nullptr, nullptr);
auto db_version = get_database_version(db);
auto latest_version = migrations.back().first;
@@ -1074,6 +1085,38 @@
SQLiteQueryExecutor::migrate();
}
+sqlite3 *SQLiteQueryExecutor::getConnection() {
+ if (SQLiteQueryExecutor::dbConnection) {
+ return SQLiteQueryExecutor::dbConnection;
+ }
+
+ int connectResult = sqlite3_open(
+ SQLiteQueryExecutor::sqliteFilePath.c_str(),
+ &SQLiteQueryExecutor::dbConnection);
+
+ if (connectResult != SQLITE_OK) {
+ std::stringstream error_message;
+ error_message << "Failed to open database connection. Details: "
+ << sqlite3_errstr(connectResult) << std::endl;
+ throw std::runtime_error(error_message.str());
+ }
+
+ default_on_db_open_callback(SQLiteQueryExecutor::dbConnection);
+ return SQLiteQueryExecutor::dbConnection;
+}
+
+void SQLiteQueryExecutor::closeConnection() {
+ if (!SQLiteQueryExecutor::dbConnection) {
+ return;
+ }
+ sqlite3_close(SQLiteQueryExecutor::dbConnection);
+ SQLiteQueryExecutor::dbConnection = nullptr;
+}
+
+SQLiteQueryExecutor::~SQLiteQueryExecutor() {
+ SQLiteQueryExecutor::closeConnection();
+}
+
std::string SQLiteQueryExecutor::getDraft(std::string key) const {
std::unique_ptr<Draft> draft =
SQLiteQueryExecutor::getStorage().get_pointer<Draft>(key);
@@ -1451,6 +1494,7 @@
};
#else
void SQLiteQueryExecutor::clearSensitiveData() {
+ SQLiteQueryExecutor::closeConnection();
if (file_exists(SQLiteQueryExecutor::sqliteFilePath) &&
std::remove(SQLiteQueryExecutor::sqliteFilePath.c_str())) {
std::ostringstream errorStream;
diff --git a/web/database/_generated/comm_query_executor.wasm b/web/database/_generated/comm_query_executor.wasm
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
literal 0
Hc$@<O00001
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Wed, Nov 27, 10:18 PM (18 h, 29 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
2591866
Default Alt Text
D10703.diff (4 KB)
Attached To
Mode
D10703: Prepare for new connection handling
Attached
Detach File
Event Timeline
Log In to Comment