From 6711e02bad8f1925968e7018c808d9d681b5c6ee Mon Sep 17 00:00:00 2001 From: jimmorrisson Date: Sat, 5 Dec 2020 10:40:27 +0100 Subject: [PATCH] [EGD-4446] Change: new filesystem handling implementation in module db. (#1052) Due to vfs deprecation there is need to remove all vfs calls from code. This PR covers module database. It also contains minor fixes in module-db. --- module-db/Database/Database.cpp | 7 +- module-db/Database/Database.hpp | 1 - module-db/Database/DatabaseInitializer.cpp | 86 ++++++++++++------- module-db/Database/DatabaseInitializer.hpp | 18 ++-- module-db/Database/sqlite3vfs.cpp | 51 +++++------ module-db/Databases/AlarmsDB.cpp | 5 +- module-db/Databases/AlarmsDB.hpp | 10 +-- module-db/Databases/CalllogDB.cpp | 5 +- module-db/Databases/CalllogDB.hpp | 10 +-- module-db/Databases/ContactsDB.cpp | 7 +- module-db/Databases/ContactsDB.hpp | 8 +- module-db/Databases/CountryCodesDB.cpp | 4 +- module-db/Databases/CountryCodesDB.hpp | 10 +-- module-db/Databases/EventsDB.cpp | 6 +- module-db/Databases/EventsDB.hpp | 10 +-- module-db/Databases/NotesDB.cpp | 5 +- module-db/Databases/NotesDB.hpp | 10 +-- module-db/Databases/NotificationsDB.cpp | 6 +- module-db/Databases/NotificationsDB.hpp | 10 +-- module-db/Databases/SmsDB.cpp | 5 +- module-db/Databases/SmsDB.hpp | 10 +-- module-db/Interface/NotificationsRecord.cpp | 7 +- module-db/Interface/NotificationsRecord.hpp | 4 +- module-db/Tables/NotificationsTable.hpp | 2 +- module-db/tests/AlarmsRecord_tests.cpp | 6 +- module-db/tests/AlarmsTable_tests.cpp | 9 +- module-db/tests/CMakeLists.txt | 1 + module-db/tests/CalllogRecord_tests.cpp | 11 ++- module-db/tests/CalllogTable_tests.cpp | 7 +- module-db/tests/ContactGroups_tests.cpp | 7 +- .../tests/ContactsAddressTable_tests.cpp | 9 +- module-db/tests/ContactsNameTable_tests.cpp | 7 +- module-db/tests/ContactsNumberTable_tests.cpp | 9 +- module-db/tests/ContactsRecord_tests.cpp | 11 ++- .../tests/ContactsRingtonesTable_tests.cpp | 9 +- module-db/tests/ContactsTable_tests.cpp | 9 +- module-db/tests/EventsRecord_tests.cpp | 6 +- module-db/tests/EventsTable_tests.cpp | 6 +- module-db/tests/NotesRecord_tests.cpp | 3 +- module-db/tests/NotesTable_tests.cpp | 3 +- module-db/tests/NotificationsRecord_tests.cpp | 7 +- module-db/tests/NotificationsTable_tests.cpp | 7 +- module-db/tests/QueryInterface.cpp | 6 +- module-db/tests/SMSRecord_tests.cpp | 13 +-- module-db/tests/SMSTable_tests.cpp | 9 +- module-db/tests/SMSTemplateRecord_tests.cpp | 9 +- module-db/tests/SMSTemplateTable_tests.cpp | 7 +- module-db/tests/ThreadRecord_tests.cpp | 13 +-- module-db/tests/ThreadsTable_tests.cpp | 9 +- module-db/tests/unittest.cpp | 66 +++++++------- module-services/service-db/ServiceDB.cpp | 17 ++-- module-utils/Utils.hpp | 11 +++ module-utils/i18n/i18n.hpp | 8 +- module-utils/test/unittest_utils.cpp | 43 ++++++++++ 54 files changed, 349 insertions(+), 286 deletions(-) diff --git a/module-db/Database/Database.cpp b/module-db/Database/Database.cpp index 418c34b154690b5237cfaa855c1b5755ecb6ea32..e560866d4169f65415b22448e2f1021d63ed4de7 100644 --- a/module-db/Database/Database.cpp +++ b/module-db/Database/Database.cpp @@ -5,9 +5,9 @@ #include "DatabaseInitializer.hpp" #include "log/log.hpp" -#include "vfs.hpp" #include #include +#include /* Declarations *********************/ extern sqlite3_vfs *sqlite3_ecophonevfs(void); @@ -76,8 +76,9 @@ Database::Database(const char *name) pragmaQuery("PRAGMA integrity_check;"); pragmaQuery("PRAGMA locking_mode=EXCLUSIVE"); - LOG_INFO("running scripts: %s", USER_PATH("db")); - isInitialized_ = initializer->run(USER_PATH("db"), INIT_SCRIPTS_EXT); + const auto filePath = (purefs::dir::getUserDiskPath() / "db"); + LOG_INFO("running scripts: %s", filePath.c_str()); + isInitialized_ = initializer->run(filePath.c_str(), INIT_SCRIPTS_EXT); } Database::~Database() diff --git a/module-db/Database/Database.hpp b/module-db/Database/Database.hpp index b796760cf723403c8d5a87f844046b271c716023..8d2f0d8c5a9632ab81c8577b531918a04abaf1d5 100644 --- a/module-db/Database/Database.hpp +++ b/module-db/Database/Database.hpp @@ -7,7 +7,6 @@ #include "QueryResult.hpp" -#include #include #include diff --git a/module-db/Database/DatabaseInitializer.cpp b/module-db/Database/DatabaseInitializer.cpp index e3ffdd44db6d8d970dc7bdbc421b1fa7681a389c..90e7d3bcc0c3279cb3df13329c2eea043c1d12e3 100644 --- a/module-db/Database/DatabaseInitializer.cpp +++ b/module-db/Database/DatabaseInitializer.cpp @@ -3,18 +3,21 @@ #include "DatabaseInitializer.hpp" -#include +#include +#include #include #include +#include +#include DatabaseInitializer::DatabaseInitializer(Database *db) : db(db) {} -bool DatabaseInitializer::run(fs::path path, std::string ext) +bool DatabaseInitializer::run(std::filesystem::path path, std::string ext) { // Database name is database file path, need to strip off all filesystem related stuff(path, extension) - fs::path dbpath = db->getName(); - std::string dbname = dbpath.filename().replace_extension(); + std::filesystem::path dbpath = db->getName(); + std::string dbname = dbpath.filename().replace_extension(); auto files = listFiles(path, dbname, ext); for (auto file : files) { @@ -28,30 +31,54 @@ bool DatabaseInitializer::run(fs::path path, std::string ext) return true; } -std::vector DatabaseInitializer::readCommands(fs::path filePath) +std::string DatabaseInitializer::readContent(const char *filename) const noexcept { - ScopedFile file(filePath, "r"); + std::unique_ptr fcontent; + long fsize = 0; - std::string line; - std::string currentStatement; - std::vector statements; + auto fp = std::fopen(filename, "r"); + if (fp) { + std::fseek(fp, 0, SEEK_END); + fsize = std::ftell(fp); + std::rewind(fp); - while (!vfs.eof(file.get())) { - line = vfs.getline(file.get()); + fcontent = std::make_unique(fsize + 1); - if (line.empty() || starts_with(line, std::string("--"))) { - continue; - } + std::fread(fcontent.get(), 1, fsize, fp); + + std::fclose(fp); + } + + return std::string(fcontent.get()); +} - if (ends_with(line, std::string(";"))) { - statements.push_back(currentStatement + line); - currentStatement.clear(); - continue; +std::vector DatabaseInitializer::readCommands(std::filesystem::path filePath) +{ + auto fileContent = readContent(filePath.c_str()); + std::string currentStatement{}; + std::vector statements{}; + + std::string line{}; + for (auto &c : fileContent) { + if (c != '\n') { + line += c; } + else { + if (line.empty() || starts_with(line, std::string("--"))) { + line.clear(); + continue; + } + if (ends_with(line, std::string(";"))) { + statements.push_back(currentStatement + line); + currentStatement.clear(); + line.clear(); + continue; + } + currentStatement += line; - currentStatement += line; + line.clear(); + } } - return statements; } @@ -64,27 +91,28 @@ std::array DatabaseInitializer::splitFilename(std::string filena return {name, prefix, postfix}; } -std::vector DatabaseInitializer::listFiles(fs::path path, std::string prefix, std::string ext) +std::vector DatabaseInitializer::listFiles(std::filesystem::path path, + std::string prefix, + std::string ext) { - std::set> orderedFiles; - auto dirList = vfs.listdir(path.c_str(), ext); - for (vfs::DirectoryEntry ent : dirList) { - if (ent.attributes != vfs::FileAttributes::Directory) { + std::set> orderedFiles; + for (const auto &entry : std::filesystem::directory_iterator(path)) { + if (!entry.is_directory() && entry.path().has_filename()) { try { - auto parts = splitFilename(ent.fileName); + auto parts = splitFilename(entry.path().filename().string()); auto filePrefix = parts[1]; if (filePrefix == prefix) { auto num = std::stoi(parts[2]); - orderedFiles.insert({num, path / ent.fileName}); + orderedFiles.insert({num, entry.path()}); } } catch (std::invalid_argument &e) { - LOG_INFO("Ignoring file: %s", ent.fileName.c_str()); + LOG_INFO("Ignoring file: %s", entry.path().c_str()); } } } - std::vector files; + std::vector files; std::for_each(orderedFiles.begin(), orderedFiles.end(), [&](auto item) { files.push_back(item.second); }); return files; } diff --git a/module-db/Database/DatabaseInitializer.hpp b/module-db/Database/DatabaseInitializer.hpp index 8d86c0c58d5ac64b4ff3db006dd7286a498df546..c8831e7e220b32cfc9992ffa17f90b21f8eadef5 100644 --- a/module-db/Database/DatabaseInitializer.hpp +++ b/module-db/Database/DatabaseInitializer.hpp @@ -4,6 +4,8 @@ #pragma once #include "Database.hpp" +#include +#include namespace { @@ -28,32 +30,33 @@ class DatabaseInitializer public: ScopedFile(std::string path, std::string mode) { - file = vfs.fopen(path.c_str(), mode.c_str()); + file = std::fopen(path.c_str(), mode.c_str()); } ~ScopedFile() { - vfs.fclose(file); + std::fclose(file); } - [[nodiscard]] vfs::FILE *get() const + [[nodiscard]] std::FILE *get() const { return file; } private: - vfs::FILE *file = nullptr; + std::FILE *file = nullptr; }; public: DatabaseInitializer(Database *db); ~DatabaseInitializer() = default; - auto run(fs::path path, std::string ext = "sql") -> bool; + auto run(std::filesystem::path path, std::string ext = "sql") -> bool; - auto readCommands(fs::path filePath) -> std::vector; + auto readCommands(std::filesystem::path filePath) -> std::vector; - auto listFiles(fs::path path, std::string prefix, std::string ext) -> std::vector; + auto listFiles(std::filesystem::path path, std::string prefix, std::string ext) + -> std::vector; auto executeOnDb(const std::vector statements) -> bool; @@ -65,6 +68,7 @@ class DatabaseInitializer * [2] - num */ auto splitFilename(std::string filename) -> std::array; + std::string readContent(const char *filename) const noexcept; Database *db = nullptr; }; diff --git a/module-db/Database/sqlite3vfs.cpp b/module-db/Database/sqlite3vfs.cpp index fcdfd5bc1ee9d567491bd050a559f6b7d0c7a085..ccbf35c3f006bfbc3968cfed06e2ab7f8d3a4437 100644 --- a/module-db/Database/sqlite3vfs.cpp +++ b/module-db/Database/sqlite3vfs.cpp @@ -122,9 +122,11 @@ #include "FreeRTOS.h" #include "task.h" -#include "vfs.hpp" #include "config.h" +#include +#include + //#include //left for future debug /* @@ -149,7 +151,7 @@ typedef struct EcophoneFile EcophoneFile; struct EcophoneFile { sqlite3_file base; /* Base class. Must be first. */ - vfs::FILE *fd; /* File descriptor */ + std::FILE *fd; /* File descriptor */ char *aBuffer; /* Pointer to malloc'd buffer */ int nBuffer; /* Valid bytes of data in zBuffer */ @@ -167,15 +169,15 @@ static int ecophoneDirectWrite(EcophoneFile *p, /* File handle */ ) { size_t nWrite; /* Return value from write() */ - const auto fileSize = vfs.filelength(p->fd); + const auto fileSize = utils::filesystem::filelength(p->fd); // vfs_fseek doesn't like offset to be > file size if (iOfst < fileSize) { - if (vfs.fseek(p->fd, iOfst, SEEK_SET) != 0) { + if (std::fseek(p->fd, iOfst, SEEK_SET) != 0) { return SQLITE_IOERR_WRITE; } } else { - if (vfs.fseek(p->fd, fileSize, SEEK_SET) != 0) { + if (std::fseek(p->fd, fileSize, SEEK_SET) != 0) { return SQLITE_IOERR_WRITE; } // Zero fill if outside the buffer @@ -198,7 +200,7 @@ static int ecophoneDirectWrite(EcophoneFile *p, /* File handle */ bytesToWrite = zerobuf_size; } } - auto ret = vfs.fwrite(zero_buf.get(), sizeof(char), bytesToWrite, p->fd); + auto ret = std::fwrite(zero_buf.get(), sizeof(char), bytesToWrite, p->fd); if (ret != bytesToWrite) { return SQLITE_IOERR_WRITE; } @@ -206,11 +208,11 @@ static int ecophoneDirectWrite(EcophoneFile *p, /* File handle */ } } - nWrite = vfs.fwrite(zBuf, 1, iAmt, p->fd); + nWrite = std::fwrite(zBuf, 1, iAmt, p->fd); if ((int)nWrite != iAmt) { return SQLITE_IOERR_WRITE; } - if (ff_fflush(p->fd) != 0) { + if (std::fflush(p->fd) != 0) { return SQLITE_IOERR_WRITE; } return SQLITE_OK; @@ -241,7 +243,7 @@ static int ecophoneClose(sqlite3_file *pFile) rc = ecophoneFlushBuffer(p); sqlite3_free(p->aBuffer); - vfs.fclose(p->fd); + std::fclose(p->fd); return rc; } @@ -265,7 +267,7 @@ static int ecophoneRead(sqlite3_file *pFile, void *zBuf, int iAmt, sqlite_int64 return rc; } - auto fileSize = vfs.filelength(p->fd); + auto fileSize = utils::filesystem::filelength(p->fd); if (p->fd != nullptr) { if (iOfst >= fileSize) { @@ -273,11 +275,11 @@ static int ecophoneRead(sqlite3_file *pFile, void *zBuf, int iAmt, sqlite_int64 } } - if (vfs.fseek(p->fd, iOfst, SEEK_SET) != 0) { + if (std::fseek(p->fd, iOfst, SEEK_SET) != 0) { return SQLITE_IOERR_READ; } - nRead = vfs.fread(zBuf, 1, iAmt, p->fd); + nRead = std::fread(zBuf, 1, iAmt, p->fd); if (nRead == iAmt) { return SQLITE_OK; @@ -390,7 +392,7 @@ static int ecophoneFileSize(sqlite3_file *pFile, sqlite_int64 *pSize) return rc; } - *pSize = vfs.filelength(p->fd); + *pSize = utils::filesystem::filelength(p->fd); return SQLITE_OK; } @@ -456,7 +458,7 @@ static int ecophoneDeviceCharacteristics(sqlite3_file *pFile) */ static int ecophoneAccess(sqlite3_vfs *pVfs, const char *zPath, int flags, int *pResOut) { - vfs::FILE *fd; + std::FILE *fd; UNUSED(pVfs); assert(flags == SQLITE_ACCESS_EXISTS /* access(zPath, F_OK) */ @@ -464,11 +466,11 @@ static int ecophoneAccess(sqlite3_vfs *pVfs, const char *zPath, int flags, int * || flags == SQLITE_ACCESS_READWRITE /* access(zPath, R_OK|W_OK) */ ); - fd = vfs.fopen(zPath, (const char *)"r"); + fd = std::fopen(zPath, "r"); if (fd != NULL) { if (pResOut) *pResOut = flags; - vfs.fclose(fd); + std::fclose(fd); } else if (pResOut) *pResOut = 0; @@ -528,14 +530,14 @@ static int ecophoneOpen(sqlite3_vfs *pVfs, /* VFS */ else if ((flags & SQLITE_OPEN_READWRITE) && (flags & SQLITE_OPEN_CREATE)) { // check if database specified exists - p->fd = vfs.fopen(zName, "r"); + p->fd = std::fopen(zName, "r"); if (p->fd == nullptr) { // database doesn't exist, create new one with read&write permissions oflags = "w+"; } else { // database exists, open it with read&write permissions - vfs.fclose(p->fd); + std::fclose(p->fd); oflags = "r+"; } } @@ -543,7 +545,7 @@ static int ecophoneOpen(sqlite3_vfs *pVfs, /* VFS */ oflags = "r+"; } - p->fd = vfs.fopen(zName, oflags.c_str()); + p->fd = std::fopen(zName, oflags.c_str()); if (p->fd == nullptr) { sqlite3_free(aBuf); return SQLITE_CANTOPEN; @@ -565,14 +567,13 @@ static int ecophoneOpen(sqlite3_vfs *pVfs, /* VFS */ static int ecophoneDelete(sqlite3_vfs *pVfs, const char *zPath, int dirSync) { UNUSED(pVfs); - int rc; /* Return code */ + int rc = std::filesystem::remove_all(zPath); /* Return code */ - rc = vfs.remove(zPath); - if (rc != 0 /*&& errno==ENOENT*/) + if (rc != 0) return SQLITE_OK; if (rc == 0 && dirSync) { - vfs::FILE *dfd; /* File descriptor open on directory */ + DIR *dfd; /* File descriptor open on directory */ int i; /* Iterator variable */ char zDir[MAXPATHNAME + 1]; /* Name of directory containing file zPath */ @@ -584,13 +585,13 @@ static int ecophoneDelete(sqlite3_vfs *pVfs, const char *zPath, int dirSync) zDir[i] = '\0'; /* Open a file-descriptor on the directory. Sync. Close. */ - dfd = vfs.fopen(zDir, "D"); + dfd = opendir(zDir); if (dfd == NULL) { rc = -1; } else { rc = SQLITE_OK; - vfs.fclose(dfd); + closedir(dfd); } } return (rc == 0 ? SQLITE_OK : SQLITE_IOERR_DELETE); diff --git a/module-db/Databases/AlarmsDB.cpp b/module-db/Databases/AlarmsDB.cpp index b2c841077d13a5bd12d71182ce6c2575872539f3..d8742fbb50f7f23a84f3f86897f97c80b4956a1a 100644 --- a/module-db/Databases/AlarmsDB.cpp +++ b/module-db/Databases/AlarmsDB.cpp @@ -1,10 +1,7 @@ // Copyright (c) 2017-2020, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md -#include #include "AlarmsDB.hpp" -const char *AlarmsDB::dbName = USER_PATH("alarms.db"); - -AlarmsDB::AlarmsDB() : Database(dbName), alarms(this), alarmStatuses(this) +AlarmsDB::AlarmsDB(const char *name) : Database(name), alarms(this), alarmStatuses(this) {} diff --git a/module-db/Databases/AlarmsDB.hpp b/module-db/Databases/AlarmsDB.hpp index fc932081cde39435146063b651dc9fb5c40e8517..2be8c75d36a784d85fab2f881a2ab873bf3f6355 100644 --- a/module-db/Databases/AlarmsDB.hpp +++ b/module-db/Databases/AlarmsDB.hpp @@ -9,17 +9,9 @@ class AlarmsDB : public Database { public: - AlarmsDB(); + AlarmsDB(const char *name); ~AlarmsDB() = default; AlarmsTable alarms; AlarmsStatusTable alarmStatuses; - - static const char *GetDBName() - { - return dbName; - } - - private: - static const char *dbName; }; diff --git a/module-db/Databases/CalllogDB.cpp b/module-db/Databases/CalllogDB.cpp index 387d3f3edc06c347f2d6a305f066f46994306b15..c0fbb9c43f4e9f4cce0f6ca49b92560aab7be255 100644 --- a/module-db/Databases/CalllogDB.cpp +++ b/module-db/Databases/CalllogDB.cpp @@ -1,10 +1,7 @@ // Copyright (c) 2017-2020, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md -#include #include "CalllogDB.hpp" -const char *CalllogDB::dbName = USER_PATH("calllog.db"); - -CalllogDB::CalllogDB() : Database(dbName), calls(this) +CalllogDB::CalllogDB(const char *name) : Database(name), calls(this) {} diff --git a/module-db/Databases/CalllogDB.hpp b/module-db/Databases/CalllogDB.hpp index 55abf95791848a6a0e56238cae21eb3903790178..b99ef9abca792dc10a218456d5beaf6a01ab04d4 100644 --- a/module-db/Databases/CalllogDB.hpp +++ b/module-db/Databases/CalllogDB.hpp @@ -9,16 +9,8 @@ class CalllogDB : public Database { public: - CalllogDB(); + CalllogDB(const char *name); ~CalllogDB() = default; CalllogTable calls; - - static const char *GetDBName() - { - return dbName; - } - - private: - static const char *dbName; }; diff --git a/module-db/Databases/ContactsDB.cpp b/module-db/Databases/ContactsDB.cpp index f415bed2ea77a9f5d5b899e670128ecdacc61127..be1d77b7c273713e2141c994488a71bef410a74d 100644 --- a/module-db/Databases/ContactsDB.cpp +++ b/module-db/Databases/ContactsDB.cpp @@ -1,18 +1,15 @@ // Copyright (c) 2017-2020, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md -#include #include "ContactsDB.hpp" -const char *ContactsDB::dbName = USER_PATH("contacts.db"); - uint32_t ContactsDB::favouritesId = 0; uint32_t ContactsDB::iceId = 0; uint32_t ContactsDB::blockedId = 0; uint32_t ContactsDB::temporaryId = 0; -ContactsDB::ContactsDB() - : Database(dbName), contacts(this), name(this), number(this), ringtones(this), address(this), groups(this) +ContactsDB::ContactsDB(const char *name) + : Database(name), contacts(this), name(this), number(this), ringtones(this), address(this), groups(this) { if (favouritesId == 0) { diff --git a/module-db/Databases/ContactsDB.hpp b/module-db/Databases/ContactsDB.hpp index 1a5ffdd1ac168b42ae9db20451ee523b8edbb22e..f9dfce41373ed70604f0f164efa798c9d22c0e83 100644 --- a/module-db/Databases/ContactsDB.hpp +++ b/module-db/Databases/ContactsDB.hpp @@ -14,14 +14,9 @@ class ContactsDB : public Database { public: - ContactsDB(); + ContactsDB(const char *name); ~ContactsDB() = default; - static const char *GetDBName() - { - return dbName; - } - ContactsTable contacts; ContactsNameTable name; ContactsNumberTable number; @@ -47,7 +42,6 @@ class ContactsDB : public Database } private: - static const char *dbName; static uint32_t favouritesId; static uint32_t iceId; static uint32_t blockedId; diff --git a/module-db/Databases/CountryCodesDB.cpp b/module-db/Databases/CountryCodesDB.cpp index 7ad7a3b06e9ad36893c99a15c347fa46586d10b2..9eb706a40e59958bab066d3f1b18fd7e1d1803e7 100644 --- a/module-db/Databases/CountryCodesDB.cpp +++ b/module-db/Databases/CountryCodesDB.cpp @@ -3,9 +3,7 @@ #include "CountryCodesDB.hpp" -const char *CountryCodesDB::dbName = "country-codes.db"; - -CountryCodesDB::CountryCodesDB() : Database(dbName), countryCodes(this) +CountryCodesDB::CountryCodesDB(const char *name) : Database(name), countryCodes(this) { if (countryCodes.create() == false) return; diff --git a/module-db/Databases/CountryCodesDB.hpp b/module-db/Databases/CountryCodesDB.hpp index e0ccf6ee81b66451dbf415f396dd514a9175900f..703689996bfcd41f518713382c1d41c8c6dcf3a8 100644 --- a/module-db/Databases/CountryCodesDB.hpp +++ b/module-db/Databases/CountryCodesDB.hpp @@ -8,16 +8,8 @@ class CountryCodesDB : public Database { public: - CountryCodesDB(); + CountryCodesDB(const char *name); ~CountryCodesDB(); - static const char *GetDBName() - { - return dbName; - } - CountryCodesTable countryCodes; - - private: - static const char *dbName; }; diff --git a/module-db/Databases/EventsDB.cpp b/module-db/Databases/EventsDB.cpp index ba7dfa29f5481c7fb58eac0e01c59c54dcd891a6..733553f82ccf2a8a18a84f742f9fbb3c5beb6c0a 100644 --- a/module-db/Databases/EventsDB.cpp +++ b/module-db/Databases/EventsDB.cpp @@ -3,11 +3,7 @@ #include "EventsDB.hpp" -#include - -const char *EventsDB::dbName = USER_PATH("events.db"); - -EventsDB::EventsDB() : Database(dbName), events(this) +EventsDB::EventsDB(const char *name) : Database(name), events(this) { if (events.create() == false) { return; diff --git a/module-db/Databases/EventsDB.hpp b/module-db/Databases/EventsDB.hpp index ebf3374f0b501a3843dbd047badd19e5dfb6b859..8511c433eab2610d56e05016f498bbe962dc2a47 100644 --- a/module-db/Databases/EventsDB.hpp +++ b/module-db/Databases/EventsDB.hpp @@ -9,16 +9,8 @@ class EventsDB : public Database { public: - EventsDB(); + EventsDB(const char *name); ~EventsDB() override = default; EventsTable events; - - static const char *GetDBName() - { - return dbName; - } - - private: - static const char *dbName; }; diff --git a/module-db/Databases/NotesDB.cpp b/module-db/Databases/NotesDB.cpp index 7392d4577af5712086ad7d66ed5d42a614603d27..7695e73d5c793ebce8bb1d31eb120c57f7901588 100644 --- a/module-db/Databases/NotesDB.cpp +++ b/module-db/Databases/NotesDB.cpp @@ -1,10 +1,7 @@ // Copyright (c) 2017-2020, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md -#include #include "NotesDB.hpp" -const char *NotesDB::dbName = USER_PATH("notes.db"); - -NotesDB::NotesDB() : Database(dbName), notes(this) +NotesDB::NotesDB(const char *name) : Database(name), notes(this) {} diff --git a/module-db/Databases/NotesDB.hpp b/module-db/Databases/NotesDB.hpp index 65f95deb99db96010c1031d0df2fcd8d34c36f75..315a004e8da4735654e00542083e605f0fa88102 100644 --- a/module-db/Databases/NotesDB.hpp +++ b/module-db/Databases/NotesDB.hpp @@ -9,16 +9,8 @@ class NotesDB : public Database { public: - NotesDB(); + NotesDB(const char *name); ~NotesDB() = default; NotesTable notes; - - static const char *GetDBName() - { - return dbName; - } - - private: - static const char *dbName; }; diff --git a/module-db/Databases/NotificationsDB.cpp b/module-db/Databases/NotificationsDB.cpp index 133354f8dbb1c8a74086c435f02473c7cf0e25a2..229cd31ea5c7c3ec002c6a8a21e28477be59927e 100644 --- a/module-db/Databases/NotificationsDB.cpp +++ b/module-db/Databases/NotificationsDB.cpp @@ -3,9 +3,5 @@ #include "NotificationsDB.hpp" -#include - -const char *NotificationsDB::dbName = USER_PATH("notifications.db"); - -NotificationsDB::NotificationsDB() : Database(dbName), notifications(this) +NotificationsDB::NotificationsDB(const char *name) : Database(name), notifications(this) {} diff --git a/module-db/Databases/NotificationsDB.hpp b/module-db/Databases/NotificationsDB.hpp index 91144111da15a2735c7f7ef55ba094287baca189..8270375f038c285d0dbe3ceeb5a53dd851244b7f 100644 --- a/module-db/Databases/NotificationsDB.hpp +++ b/module-db/Databases/NotificationsDB.hpp @@ -9,16 +9,8 @@ class NotificationsDB : public Database { public: - NotificationsDB(); + NotificationsDB(const char *name); virtual ~NotificationsDB() = default; NotificationsTable notifications; - - static const char *GetDBName() - { - return dbName; - } - - private: - static const char *dbName; }; diff --git a/module-db/Databases/SmsDB.cpp b/module-db/Databases/SmsDB.cpp index e19a48cec60b0806572fbfa5ba452749f78c97a3..7e5723db74a625d48bacb5dbfdf6cf675b47d7ba 100644 --- a/module-db/Databases/SmsDB.cpp +++ b/module-db/Databases/SmsDB.cpp @@ -1,10 +1,7 @@ // Copyright (c) 2017-2020, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md -#include #include "SmsDB.hpp" -const char *SmsDB::dbName = USER_PATH("sms.db"); - -SmsDB::SmsDB() : Database(dbName), sms(this), threads(this), templates(this) +SmsDB::SmsDB(const char *name) : Database(name), sms(this), threads(this), templates(this) {} diff --git a/module-db/Databases/SmsDB.hpp b/module-db/Databases/SmsDB.hpp index 05c72eaa6c5d7ae8f16e1abe0746c2f888c8b230..c27339a81f503250c6fde700bce077731087ad6d 100644 --- a/module-db/Databases/SmsDB.hpp +++ b/module-db/Databases/SmsDB.hpp @@ -11,18 +11,10 @@ class SmsDB : public Database { public: - SmsDB(); + SmsDB(const char *name); ~SmsDB() = default; SMSTable sms; ThreadsTable threads; SMSTemplateTable templates; - - static const char *GetDBName() - { - return dbName; - } - - private: - static const char *dbName; }; diff --git a/module-db/Interface/NotificationsRecord.cpp b/module-db/Interface/NotificationsRecord.cpp index d0b451ab99abc2714caccba680e1ae889c6e0bba..6d55bd7276721c91f1a127e1e43e425e9b0a0881 100644 --- a/module-db/Interface/NotificationsRecord.cpp +++ b/module-db/Interface/NotificationsRecord.cpp @@ -79,7 +79,7 @@ std::unique_ptr> NotificationsRecordInterface:: auto records = std::make_unique>(); for (auto &r : rows) { - records->push_back(r); + records->push_back(NotificationsRecord{r}); } return records; @@ -112,7 +112,7 @@ bool NotificationsRecordInterface::RemoveByField(NotificationsRecordField field, NotificationsRecord NotificationsRecordInterface::GetByID(uint32_t id) { - return notificationsDb->notifications.getById(id); + return NotificationsRecord{notificationsDb->notifications.getById(id)}; } uint32_t NotificationsRecordInterface::GetCount() @@ -126,7 +126,8 @@ NotificationsRecord NotificationsRecordInterface::GetByKey(NotificationsRecord:: return NotificationsRecord(); } - return notificationsDb->notifications.GetByKey(static_cast(key)); + NotificationsTableRow notificationsTableRow = notificationsDb->notifications.GetByKey(static_cast(key)); + return NotificationsRecord{notificationsTableRow}; } std::unique_ptr NotificationsRecordInterface::runQuery(std::shared_ptr query) diff --git a/module-db/Interface/NotificationsRecord.hpp b/module-db/Interface/NotificationsRecord.hpp index aa531346bf56860d651a4cbb4d1f5b7b3d5de071..0deb8bd3e4b9418f351ef0174c83d05406445328 100644 --- a/module-db/Interface/NotificationsRecord.hpp +++ b/module-db/Interface/NotificationsRecord.hpp @@ -42,7 +42,7 @@ struct NotificationsRecord : public Record NotificationsRecord() = default; ~NotificationsRecord() = default; - NotificationsRecord(const NotificationsTableRow &tableRow); + explicit NotificationsRecord(const NotificationsTableRow &tableRow); bool isValidRecord() const; bool gotValidKey() const; @@ -58,7 +58,7 @@ enum class NotificationsRecordField class NotificationsRecordInterface : public RecordInterface { public: - NotificationsRecordInterface(NotificationsDB *notificationsDb); + explicit NotificationsRecordInterface(NotificationsDB *notificationsDb); virtual ~NotificationsRecordInterface() = default; bool Add(const NotificationsRecord &rec) override final; diff --git a/module-db/Tables/NotificationsTable.hpp b/module-db/Tables/NotificationsTable.hpp index b2f4c00300f267476817301cb0313852ede4b5cc..a86140cb08e6accd1be4cd5afda2b05f4475b78d 100644 --- a/module-db/Tables/NotificationsTable.hpp +++ b/module-db/Tables/NotificationsTable.hpp @@ -23,7 +23,7 @@ enum class NotificationsTableFields class NotificationsTable : public Table { public: - NotificationsTable(Database *db); + explicit NotificationsTable(Database *db); virtual ~NotificationsTable() = default; bool create() override final; diff --git a/module-db/tests/AlarmsRecord_tests.cpp b/module-db/tests/AlarmsRecord_tests.cpp index d865ccd6d6e32458b5ac946ea4b7cffc485fccfd..12b721714c27757bfe4884a48634edde216b0db7 100644 --- a/module-db/tests/AlarmsRecord_tests.cpp +++ b/module-db/tests/AlarmsRecord_tests.cpp @@ -20,14 +20,16 @@ #include #include #include +#include TEST_CASE("Alarms Record tests") { Database::initialize(); - vfs.remove(AlarmsDB::GetDBName()); + const auto alarmsPath = (purefs::dir::getUserDiskPath() / "alarms.db").c_str(); + std::filesystem::remove(alarmsPath); - auto alarmsDB = AlarmsDB(); + auto alarmsDB = AlarmsDB(alarmsPath); REQUIRE(alarmsDB.isInitialized()); SECTION("Default Constructor") diff --git a/module-db/tests/AlarmsTable_tests.cpp b/module-db/tests/AlarmsTable_tests.cpp index 27e8abcb6f64dc0eafc3a3c46f331daff66bc0c1..3cbfb9da2e247ea1fedcccbc137d3eb174a728c9 100644 --- a/module-db/tests/AlarmsTable_tests.cpp +++ b/module-db/tests/AlarmsTable_tests.cpp @@ -1,7 +1,8 @@ // Copyright (c) 2017-2020, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md -#include "vfs.hpp" +#include +#include #include @@ -14,14 +15,16 @@ #include #include #include +#include TEST_CASE("Alarms Table tests") { Database::initialize(); - vfs.remove(AlarmsDB::GetDBName()); + const auto alarmsPath = (purefs::dir::getUserDiskPath() / "alarms.db").c_str(); + std::filesystem::remove(alarmsPath); - AlarmsDB alarmsDb; + AlarmsDB alarmsDb(alarmsPath); REQUIRE(alarmsDb.isInitialized()); auto &alarmsTbl = alarmsDb.alarms; diff --git a/module-db/tests/CMakeLists.txt b/module-db/tests/CMakeLists.txt index be2f38cf06e5fd1dd9cb044f0c8f6a4e487039b2..a955458430930426b0e22353fa40ee306746c9e7 100644 --- a/module-db/tests/CMakeLists.txt +++ b/module-db/tests/CMakeLists.txt @@ -35,4 +35,5 @@ add_catch2_executable( LIBS module-db + module-vfs ) diff --git a/module-db/tests/CalllogRecord_tests.cpp b/module-db/tests/CalllogRecord_tests.cpp index 1e4cd5f7186dc86765a373659805f0f9192b02a3..d9b0e3b80816936dc59cb6bb8b38a6924a8eb6ce 100644 --- a/module-db/tests/CalllogRecord_tests.cpp +++ b/module-db/tests/CalllogRecord_tests.cpp @@ -14,16 +14,19 @@ #include #include #include +#include TEST_CASE("Calllog Record tests") { Database::initialize(); - vfs.remove(CalllogDB::GetDBName()); - vfs.remove(ContactsDB::GetDBName()); + const auto callogPath = (purefs::dir::getUserDiskPath() / "callog.db").c_str(); + const auto contactsPath = (purefs::dir::getUserDiskPath() / "contacts.db").c_str(); + std::filesystem::remove(callogPath); + std::filesystem::remove(contactsPath); - CalllogDB calllogDb; - ContactsDB contactsDb; + CalllogDB calllogDb(callogPath); + ContactsDB contactsDb(contactsPath); REQUIRE(calllogDb.isInitialized()); REQUIRE(contactsDb.isInitialized()); diff --git a/module-db/tests/CalllogTable_tests.cpp b/module-db/tests/CalllogTable_tests.cpp index dff0a3b5bca1c0d1b7ad1889ffec6b780f862910..5d3ae9b47df0733f1e8187a7eeb937c908ee5ced 100644 --- a/module-db/tests/CalllogTable_tests.cpp +++ b/module-db/tests/CalllogTable_tests.cpp @@ -12,15 +12,18 @@ #include #include #include +#include #include +#include TEST_CASE("Calllog Table tests") { Database::initialize(); - vfs.remove(CalllogDB::GetDBName()); + const auto callogPath = (purefs::dir::getUserDiskPath() / "callog.db").c_str(); + std::filesystem::remove(callogPath); - CalllogDB calllogDb; + CalllogDB calllogDb{callogPath}; REQUIRE(calllogDb.isInitialized()); auto &callsTbl = calllogDb.calls; diff --git a/module-db/tests/ContactGroups_tests.cpp b/module-db/tests/ContactGroups_tests.cpp index 1175b04a016deb6f72b515b26f1533b632ab78cc..c4974791dc2a9d21cce56812b7a2b44c37082018 100644 --- a/module-db/tests/ContactGroups_tests.cpp +++ b/module-db/tests/ContactGroups_tests.cpp @@ -8,9 +8,11 @@ #include #include +#include #include #include +#include namespace consts { @@ -26,8 +28,9 @@ TEST_CASE("Contact Groups tests", "[Groups]") { INFO("sqlite Init"); Database::initialize(); - vfs.remove(ContactsDB::GetDBName()); - ContactsDB contactDb; + const auto callogPath = (purefs::dir::getUserDiskPath() / "contacts.db").c_str(); + std::filesystem::remove(callogPath); + ContactsDB contactDb{callogPath}; INFO("contactDB init"); REQUIRE(contactDb.isInitialized()); ContactsGroupsTable contactGroupsTable = ContactsGroupsTable(&contactDb); diff --git a/module-db/tests/ContactsAddressTable_tests.cpp b/module-db/tests/ContactsAddressTable_tests.cpp index 0228d24bc6dbba68bd30bfde1d8e19b1c4efb1f6..8cfb153f5195f845af54a4acbf7b7b66069e2292 100644 --- a/module-db/tests/ContactsAddressTable_tests.cpp +++ b/module-db/tests/ContactsAddressTable_tests.cpp @@ -4,15 +4,18 @@ #include #include "Databases/ContactsDB.hpp" -#include "vfs.hpp" +#include +#include +#include TEST_CASE("Contacts address Table tests") { Database::initialize(); - vfs.remove(ContactsDB::GetDBName()); + const auto callogPath = (purefs::dir::getUserDiskPath() / "contacts.db").c_str(); + std::filesystem::remove(callogPath); - ContactsDB contactsdb; + ContactsDB contactsdb{callogPath}; REQUIRE(contactsdb.isInitialized()); ContactsAddressTableRow testRow1 = {{.ID = DB_ID_NONE}, diff --git a/module-db/tests/ContactsNameTable_tests.cpp b/module-db/tests/ContactsNameTable_tests.cpp index d66f1409126a396a67d090d1d2eff73505d9a403..17bcac504d761325835636a8ad3068a4f4b58988 100644 --- a/module-db/tests/ContactsNameTable_tests.cpp +++ b/module-db/tests/ContactsNameTable_tests.cpp @@ -1,7 +1,6 @@ // Copyright (c) 2017-2020, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md -#include "vfs.hpp" #include @@ -13,14 +12,16 @@ #include #include #include +#include TEST_CASE("Contacts Name Table tests") { Database::initialize(); - vfs.remove(ContactsDB::GetDBName()); + const auto contactsPath = (purefs::dir::getUserDiskPath() / "contacts.db").c_str(); + std::remove(contactsPath); - ContactsDB contactsdb; + ContactsDB contactsdb(contactsPath); REQUIRE(contactsdb.isInitialized()); ContactsNameTableRow testRow1 = { diff --git a/module-db/tests/ContactsNumberTable_tests.cpp b/module-db/tests/ContactsNumberTable_tests.cpp index 4aac24b038fa7ff27a868329c91736871310583a..5ff5c9bf50228c207454e138e481367c5bc2e376 100644 --- a/module-db/tests/ContactsNumberTable_tests.cpp +++ b/module-db/tests/ContactsNumberTable_tests.cpp @@ -1,9 +1,10 @@ // Copyright (c) 2017-2020, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md -#include "vfs.hpp" +#include #include +#include #include "Database/Database.hpp" #include "Databases/ContactsDB.hpp" @@ -13,14 +14,16 @@ #include #include #include +#include TEST_CASE("Contacts Number Table tests") { Database::initialize(); - vfs.remove(ContactsDB::GetDBName()); + const auto contactsPath = (purefs::dir::getUserDiskPath() / "contacts.db").c_str(); + std::filesystem::remove(contactsPath); - ContactsDB contactsdb; + ContactsDB contactsdb{contactsPath}; REQUIRE(contactsdb.isInitialized()); ContactsNumberTableRow testRow1 = { diff --git a/module-db/tests/ContactsRecord_tests.cpp b/module-db/tests/ContactsRecord_tests.cpp index 4aae2cb5c63b84454f2a88576f384dc807c58193..2efe98aee9391bef901bf7c658f09fe6d9a4f9ef 100644 --- a/module-db/tests/ContactsRecord_tests.cpp +++ b/module-db/tests/ContactsRecord_tests.cpp @@ -6,14 +6,16 @@ #include "Interface/ContactRecord.hpp" #include "module-utils/i18n/i18n.hpp" #include "vfs.hpp" +#include TEST_CASE("Contact Record db tests") { Database::initialize(); - vfs.remove(ContactsDB::GetDBName()); + const auto contactsPath = (purefs::dir::getUserDiskPath() / "contacts.db").c_str(); + std::filesystem::remove(contactsPath); - auto contactDB = std::make_unique(); + auto contactDB = std::make_unique(contactsPath); REQUIRE(contactDB->isInitialized()); const char *primaryNameTest = "PrimaryNameTest"; @@ -259,9 +261,10 @@ TEST_CASE("Test converting contact data to string") TEST_CASE("Contact record numbers update") { Database::initialize(); - vfs.remove(ContactsDB::GetDBName()); + const auto contactsPath = (purefs::dir::getUserDiskPath() / "contacts.db").c_str(); + std::filesystem::remove(contactsPath); - auto contactDB = std::make_unique(); + auto contactDB = std::make_unique(contactsPath); REQUIRE(contactDB->isInitialized()); auto records = ContactRecordInterface(contactDB.get()); diff --git a/module-db/tests/ContactsRingtonesTable_tests.cpp b/module-db/tests/ContactsRingtonesTable_tests.cpp index e392f54a1cd7503c4696468eafc295895adc813e..07e255de7ebc50b0a696dfe2e424a925322235be 100644 --- a/module-db/tests/ContactsRingtonesTable_tests.cpp +++ b/module-db/tests/ContactsRingtonesTable_tests.cpp @@ -1,7 +1,7 @@ // Copyright (c) 2017-2020, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md -#include "vfs.hpp" +#include #include @@ -9,18 +9,21 @@ #include "Databases/ContactsDB.hpp" #include +#include #include #include #include +#include TEST_CASE("Contacts Ringtones Table tests") { Database::initialize(); - vfs.remove(ContactsDB::GetDBName()); + const auto contactsPath = (purefs::dir::getUserDiskPath() / "contacts.db").c_str(); + std::filesystem::remove(contactsPath); - ContactsDB contactsdb; + ContactsDB contactsdb{contactsPath}; REQUIRE(contactsdb.isInitialized()); ContactsRingtonesTableRow testRow1(DB_ID_NONE, DB_ID_NONE, "/test/assets/path/ringtone.wr"); diff --git a/module-db/tests/ContactsTable_tests.cpp b/module-db/tests/ContactsTable_tests.cpp index 50efb62ac4afb9861c49c7e4d304cf06423d4ed6..d5fd37c908a1546b458959b6ff7cb99570fe6652 100644 --- a/module-db/tests/ContactsTable_tests.cpp +++ b/module-db/tests/ContactsTable_tests.cpp @@ -2,19 +2,22 @@ // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #include +#include #include "Databases/ContactsDB.hpp" #include "Tables/ContactsTable.hpp" -#include "vfs.hpp" +#include +#include TEST_CASE("Contacts Table tests") { Database::initialize(); - vfs.remove(ContactsDB::GetDBName()); + const auto contactsPath = (purefs::dir::getUserDiskPath() / "contacts.db").c_str(); + std::filesystem::remove(contactsPath); - ContactsDB contactsdb; + ContactsDB contactsdb{contactsPath}; REQUIRE(contactsdb.isInitialized()); ContactsTableRow testRow1 = {{.ID = DB_ID_NONE}, diff --git a/module-db/tests/EventsRecord_tests.cpp b/module-db/tests/EventsRecord_tests.cpp index 989d8dc6bdb612c869da0d4fb6fe9207a158b72d..10f45499d71fddaa114df0ef2f1e542d8f97e1be 100644 --- a/module-db/tests/EventsRecord_tests.cpp +++ b/module-db/tests/EventsRecord_tests.cpp @@ -16,6 +16,7 @@ #include "module-db/queries/calendar/QueryEventsSelectFirstUpcoming.hpp" #include +#include #include #include @@ -27,9 +28,10 @@ TEST_CASE("Events Record tests") { Database::initialize(); - vfs.remove(EventsDB::GetDBName()); + const auto eventsPath = (purefs::dir::getUserDiskPath() / "events.db").c_str(); + std::filesystem::remove(eventsPath); - EventsDB eventsDb; + EventsDB eventsDb{eventsPath}; REQUIRE(eventsDb.isInitialized()); diff --git a/module-db/tests/EventsTable_tests.cpp b/module-db/tests/EventsTable_tests.cpp index d3803297183bb7f547f189f10ea2f62a61906692..69d505eb798a4014a22f334f8d9363e56511fc16 100644 --- a/module-db/tests/EventsTable_tests.cpp +++ b/module-db/tests/EventsTable_tests.cpp @@ -13,14 +13,16 @@ #include #include #include +#include TEST_CASE("Events Table tests") { Database::initialize(); - vfs.remove(EventsDB::GetDBName()); + const auto eventsPath = (purefs::dir::getUserDiskPath() / "events.db").c_str(); + std::filesystem::remove(eventsPath); - EventsDB eventsDb; + EventsDB eventsDb{eventsPath}; REQUIRE(eventsDb.isInitialized()); auto &eventsTbl = eventsDb.events; diff --git a/module-db/tests/NotesRecord_tests.cpp b/module-db/tests/NotesRecord_tests.cpp index 0b19faaaa519a8a4e7cfae53b5c3fe0b8f87575b..e9be01aa8830bbfd4ac22aafede496a6b7461c70 100644 --- a/module-db/tests/NotesRecord_tests.cpp +++ b/module-db/tests/NotesRecord_tests.cpp @@ -8,6 +8,7 @@ #include #include #include +#include #include "Database/Database.hpp" #include "Databases/NotesDB.hpp" @@ -16,7 +17,7 @@ TEST_CASE("Notes Record tests") { Database::initialize(); - auto notesDb = std::make_unique(); + auto notesDb = std::make_unique((purefs::dir::getUserDiskPath() / "notes.db").c_str()); REQUIRE(notesDb->isInitialized()); NotesRecordInterface notesRecordInterface{notesDb.get()}; diff --git a/module-db/tests/NotesTable_tests.cpp b/module-db/tests/NotesTable_tests.cpp index 6b13ef6b97b16c78a44eba56a2d713450ebf87ae..2487b10856e095ee5175e49b7cbc3316479a7fb8 100644 --- a/module-db/tests/NotesTable_tests.cpp +++ b/module-db/tests/NotesTable_tests.cpp @@ -6,12 +6,13 @@ #include #include "Database/Database.hpp" #include "Databases/NotesDB.hpp" +#include TEST_CASE("Notes Table tests") { Database::initialize(); - auto notesDb = std::make_unique(); + auto notesDb = std::make_unique((purefs::dir::getUserDiskPath() / "notes.db").c_str()); REQUIRE(notesDb->isInitialized()); NotesTable table{notesDb.get()}; diff --git a/module-db/tests/NotificationsRecord_tests.cpp b/module-db/tests/NotificationsRecord_tests.cpp index ea3d87e05800f439f7fe488f7d4431a06e9f5f80..9486e1ae4a5fea90c302ec823f5ce3e24c4b36b5 100644 --- a/module-db/tests/NotificationsRecord_tests.cpp +++ b/module-db/tests/NotificationsRecord_tests.cpp @@ -12,20 +12,23 @@ #include "module-db/queries/notifications/QueryNotificationsGetAll.hpp" #include +#include #include #include #include #include #include +#include TEST_CASE("Notifications Record tests") { Database::initialize(); - vfs.remove(NotificationsDB::GetDBName()); + const auto notificationsPath = (purefs::dir::getUserDiskPath() / "notifications.db").c_str(); + std::filesystem::remove(notificationsPath); - NotificationsDB notificationsDb; + NotificationsDB notificationsDb{notificationsPath}; REQUIRE(notificationsDb.isInitialized()); diff --git a/module-db/tests/NotificationsTable_tests.cpp b/module-db/tests/NotificationsTable_tests.cpp index 6502975ef837b6d1b23660f107fa7033fe621ab1..a9b6210d900063a85d0472fbd6de03433b5a47fa 100644 --- a/module-db/tests/NotificationsTable_tests.cpp +++ b/module-db/tests/NotificationsTable_tests.cpp @@ -13,14 +13,17 @@ #include #include #include +#include +#include TEST_CASE("Notifications Table tests") { Database::initialize(); - vfs.remove(NotificationsDB::GetDBName()); + const auto notificationsPath = (purefs::dir::getUserDiskPath() / "notifications.db").c_str(); + std::filesystem::remove(notificationsPath); - NotificationsDB notificationsDb; + NotificationsDB notificationsDb{notificationsPath}; REQUIRE(notificationsDb.isInitialized()); auto ¬ificationsTbl = notificationsDb.notifications; diff --git a/module-db/tests/QueryInterface.cpp b/module-db/tests/QueryInterface.cpp index 335ea4b1af7e23dc1ca932e4a50d692a45193486..8c2c1bc144a264a4457bde7b00ef44a9b5f4f40c 100644 --- a/module-db/tests/QueryInterface.cpp +++ b/module-db/tests/QueryInterface.cpp @@ -17,6 +17,7 @@ #include #include #include +#include namespace db { @@ -37,8 +38,9 @@ namespace db TEST_CASE("Query interface") { Database::initialize(); - auto contactsDB = std::make_unique(); - auto smsDB = std::make_unique(); + + auto contactsDB = std::make_unique((purefs::dir::getUserDiskPath() / "contacts.db").c_str()); + auto smsDB = std::make_unique((purefs::dir::getUserDiskPath() / "sms.db").c_str()); auto smsInterface = std::make_unique(smsDB.get(), contactsDB.get()); auto threadInterface = std::make_unique(smsDB.get(), contactsDB.get()); diff --git a/module-db/tests/SMSRecord_tests.cpp b/module-db/tests/SMSRecord_tests.cpp index ab257e25cc7b4431cd9787cd969c9799435eae59..f1fac9cb81ab624fcebe5ae7ce10ac7e901c68f5 100644 --- a/module-db/tests/SMSRecord_tests.cpp +++ b/module-db/tests/SMSRecord_tests.cpp @@ -15,11 +15,12 @@ #include #include - +#include #include #include #include #include +#include struct test { @@ -31,11 +32,13 @@ TEST_CASE("SMS Record tests") { Database::initialize(); - vfs.remove(ContactsDB::GetDBName()); - vfs.remove(SmsDB::GetDBName()); + const auto contactsPath = (purefs::dir::getUserDiskPath() / "contacts.db").c_str(); + const auto smsPath = (purefs::dir::getUserDiskPath() / "sms.db").c_str(); + std::filesystem::remove(contactsPath); + std::filesystem::remove(smsPath); - auto smsDB = std::make_unique(); - auto contactsDB = std::make_unique(); + auto contactsDB = std::make_unique(contactsPath); + auto smsDB = std::make_unique(smsPath); const uint32_t dateTest = 123456789; const uint32_t dateSentTest = 987654321; diff --git a/module-db/tests/SMSTable_tests.cpp b/module-db/tests/SMSTable_tests.cpp index caad9d2d232c6faaaf09b833cb828b3b1a5fabb1..223d8b1882067bb2f33a6ad8522ea5206eabde65 100644 --- a/module-db/tests/SMSTable_tests.cpp +++ b/module-db/tests/SMSTable_tests.cpp @@ -1,7 +1,7 @@ // Copyright (c) 2017-2020, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md -#include "vfs.hpp" +#include #include @@ -9,15 +9,18 @@ #include "Databases/SmsDB.hpp" #include +#include +#include #include TEST_CASE("SMS Table tests") { Database::initialize(); - vfs.remove(SmsDB::GetDBName()); + const auto smsPath = (purefs::dir::getUserDiskPath() / "sms.db").c_str(); + std::filesystem::remove(smsPath); - SmsDB smsdb; + SmsDB smsdb(smsPath); REQUIRE(smsdb.isInitialized()); SMSTableRow testRow1 = {{.ID = 0}, diff --git a/module-db/tests/SMSTemplateRecord_tests.cpp b/module-db/tests/SMSTemplateRecord_tests.cpp index a9d7253a4b258ee31cfa705ffa61bcf63e2b2b13..0bfdf93bf179e830e21f32e365179d0e7d8419fd 100644 --- a/module-db/tests/SMSTemplateRecord_tests.cpp +++ b/module-db/tests/SMSTemplateRecord_tests.cpp @@ -7,9 +7,11 @@ #include "Database/Database.hpp" #include "Databases/SmsDB.hpp" -#include "vfs.hpp" +#include +#include #include +#include #include #include @@ -19,9 +21,10 @@ TEST_CASE("SMS templates Record tests") { Database::initialize(); - vfs.remove(SmsDB::GetDBName()); + const auto smsPath = (purefs::dir::getUserDiskPath() / "sms.db").c_str(); + std::filesystem::remove(smsPath); - auto smsDB = std::make_unique(); + auto smsDB = std::make_unique(smsPath); REQUIRE(smsDB->isInitialized()); SMSTemplateRecordInterface SMSTemplateRecordInterface(smsDB.get()); diff --git a/module-db/tests/SMSTemplateTable_tests.cpp b/module-db/tests/SMSTemplateTable_tests.cpp index 96fe40e5d7eafc28ca018b145cd22c6ce172e173..1470f8bd4289bb8af8c54451806151f393ec526e 100644 --- a/module-db/tests/SMSTemplateTable_tests.cpp +++ b/module-db/tests/SMSTemplateTable_tests.cpp @@ -9,6 +9,8 @@ #include "Tables/SMSTemplateTable.hpp" #include +#include +#include #include #include @@ -19,9 +21,10 @@ TEST_CASE("SMS Templates Table tests") { Database::initialize(); - vfs.remove(SmsDB::GetDBName()); + const auto smsPath = (purefs::dir::getUserDiskPath() / "sms.db").c_str(); + std::filesystem::remove(smsPath); - SmsDB smsDb; + SmsDB smsDb{smsPath}; REQUIRE(smsDb.isInitialized()); auto &templatesTbl = smsDb.templates; diff --git a/module-db/tests/ThreadRecord_tests.cpp b/module-db/tests/ThreadRecord_tests.cpp index a0bdad97b288a932b184f29ac458e1278801852c..73b06fa5f0cea184f12caeb260de48a8626072fa 100644 --- a/module-db/tests/ThreadRecord_tests.cpp +++ b/module-db/tests/ThreadRecord_tests.cpp @@ -17,7 +17,8 @@ #include "queries/messages/threads/QueryThreadRemove.hpp" #include "queries/messages/threads/QueryThreadsGet.hpp" #include "queries/messages/sms/QuerySMSGetLastByThreadID.hpp" -#include "vfs.hpp" +#include +#include #include @@ -29,12 +30,14 @@ TEST_CASE("Thread Record tests") { Database::initialize(); - vfs.remove(ContactsDB::GetDBName()); - vfs.remove(SmsDB::GetDBName()); + const auto contactsPath = (purefs::dir::getUserDiskPath() / "contacts.db").c_str(); + const auto smsPath = (purefs::dir::getUserDiskPath() / "sms.db").c_str(); + std::filesystem::remove(contactsPath); + std::filesystem::remove(smsPath); - auto smsDB = std::make_unique(); + auto smsDB = std::make_unique(smsPath); REQUIRE(smsDB->isInitialized()); - auto contactsDB = std::make_unique(); + auto contactsDB = std::make_unique(contactsPath); REQUIRE(contactsDB->isInitialized()); const uint32_t dateTest = 123456789; diff --git a/module-db/tests/ThreadsTable_tests.cpp b/module-db/tests/ThreadsTable_tests.cpp index 3ec0a0e3e4c8ed0529177d62a40636284587ebf5..3273febad5bfbcf53dff46e67df9ab8725be1811 100644 --- a/module-db/tests/ThreadsTable_tests.cpp +++ b/module-db/tests/ThreadsTable_tests.cpp @@ -1,7 +1,7 @@ // Copyright (c) 2017-2020, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md -#include "vfs.hpp" +#include #include @@ -10,18 +10,21 @@ #include "Tables/ThreadsTable.hpp" #include +#include #include #include #include +#include TEST_CASE("Threads Table tests") { Database::initialize(); - vfs.remove(SmsDB::GetDBName()); + const auto smsPath = (purefs::dir::getUserDiskPath() / "sms.db").c_str(); + std::filesystem::remove(smsPath); - SmsDB smsdb; + SmsDB smsdb{smsPath}; REQUIRE(smsdb.isInitialized()); ThreadsTableRow testRow1 = {{.ID = 0}, diff --git a/module-db/tests/unittest.cpp b/module-db/tests/unittest.cpp index 60d406a2e9737e8a1a0245ced3d4a791e4471b6c..ebc6a16ae5d1b26605b28cc3e71f8cd7c93843e6 100644 --- a/module-db/tests/unittest.cpp +++ b/module-db/tests/unittest.cpp @@ -1,7 +1,7 @@ // Copyright (c) 2017-2020, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md -#include "vfs.hpp" +#include #include @@ -11,6 +11,7 @@ #include "Tables/SMSTable.hpp" #include +#include #include #include @@ -94,10 +95,11 @@ TEST_CASE("Create and destroy simple database") SECTION("Store database into backup file") { std::string backupPathDB = USER_PATH("testbackup.db"); - vfs.remove(backupPathDB.c_str()); + std::remove(backupPathDB.c_str()); Database testDB("test.db"); REQUIRE(testDB.storeIntoFile(backupPathDB) == true); - REQUIRE(vfs.fileExists(backupPathDB.c_str()) == true); + std::ifstream f(backupPathDB); + REQUIRE(f.good() == true); } Database::deinitialize(); @@ -108,21 +110,21 @@ class ScopedDir public: ScopedDir(std::string p) : path(p) { - vfs.mkdir(path.c_str()); + REQUIRE(std::filesystem::create_directory(path.c_str())); } ~ScopedDir() { - vfs.deltree(path.c_str()); + REQUIRE(std::filesystem::remove(path.c_str())); } - auto operator()(std::string file = "") -> fs::path + auto operator()(std::string file = "") -> std::filesystem::path { return path / file; } private: - fs::path path; + std::filesystem::path path; }; TEST_CASE("Database initialization scripts") @@ -154,20 +156,20 @@ TEST_CASE("Database initialization scripts") { ScopedDir dir(USER_PATH("scripts")); - auto file = vfs.fopen(dir("test_1.sql").c_str(), "w"); - vfs.fclose(file); + auto file = std::fopen(dir("test_1.sql").c_str(), "w"); + std::fclose(file); - file = vfs.fopen(dir("test_021.sql").c_str(), "w"); - vfs.fclose(file); + file = std::fopen(dir("test_021.sql").c_str(), "w"); + std::fclose(file); - file = vfs.fopen(dir("test_011.sql").c_str(), "w"); - vfs.fclose(file); + file = std::fopen(dir("test_011.sql").c_str(), "w"); + std::fclose(file); - file = vfs.fopen(dir("test_003.sql").c_str(), "w"); - vfs.fclose(file); + file = std::fopen(dir("test_003.sql").c_str(), "w"); + std::fclose(file); - file = vfs.fopen(dir("noprefix_003.sql").c_str(), "w"); - vfs.fclose(file); + file = std::fopen(dir("noprefix_003.sql").c_str(), "w"); + std::fclose(file); Database db(dir("test.db").c_str()); DatabaseInitializer initializer(&db); @@ -184,12 +186,12 @@ TEST_CASE("Database initialization scripts") { ScopedDir dir(USER_PATH("scripts")); - auto file = vfs.fopen(dir("test_1.sql").c_str(), "w"); + auto file = std::fopen(dir("test_1.sql").c_str(), "w"); - vfs.fprintf(file, "%s\n", script_create); - vfs.fprintf(file, "%s\n", script_insert); + std::fprintf(file, "%s\n", script_create); + std::fprintf(file, "%s\n", script_insert); - vfs.fclose(file); + std::fclose(file); Database db(dir("test.db").c_str()); DatabaseInitializer initializer(&db); @@ -202,8 +204,8 @@ TEST_CASE("Database initialization scripts") { ScopedDir dir(USER_PATH("scripts")); - auto file = vfs.fopen(dir("test_1.sql").c_str(), "w"); - vfs.fclose(file); + auto file = std::fopen(dir("test_1.sql").c_str(), "w"); + std::fclose(file); Database db(dir("test.db").c_str()); DatabaseInitializer initializer(&db); @@ -216,9 +218,9 @@ TEST_CASE("Database initialization scripts") { ScopedDir dir(USER_PATH("scripts")); - auto file = vfs.fopen(dir("test_1.sql").c_str(), "w"); - vfs.fprintf(file, "%s\n", script_comment); - vfs.fclose(file); + auto file = std::fopen(dir("test_1.sql").c_str(), "w"); + std::fprintf(file, "%s\n", script_comment); + std::fclose(file); Database db(dir("test.db").c_str()); DatabaseInitializer initializer(&db); @@ -231,9 +233,9 @@ TEST_CASE("Database initialization scripts") { ScopedDir dir(USER_PATH("scripts")); - auto file = vfs.fopen(dir("test_1.sql").c_str(), "w"); - vfs.fprintf(file, "%s\n", script_create); - vfs.fclose(file); + auto file = std::fopen(dir("test_1.sql").c_str(), "w"); + std::fprintf(file, "%s\n", script_create); + std::fclose(file); Database db(dir("test.db").c_str()); DatabaseInitializer initializer(&db); @@ -246,9 +248,9 @@ TEST_CASE("Database initialization scripts") { ScopedDir dir(USER_PATH("scripts")); - auto file = vfs.fopen(dir("test_1.sql").c_str(), "w"); - vfs.fprintf(file, "%s\n", script_invalid); - vfs.fclose(file); + auto file = std::fopen(dir("test_1.sql").c_str(), "w"); + std::fprintf(file, "%s\n", script_invalid); + std::fclose(file); Database db(dir("test.db").c_str()); DatabaseInitializer initializer(&db); diff --git a/module-services/service-db/ServiceDB.cpp b/module-services/service-db/ServiceDB.cpp index 8adc092808aa3eabd823cb7db2b6287c9c48a914..7b8767a4acae347502873daafea8931c09661bec 100644 --- a/module-services/service-db/ServiceDB.cpp +++ b/module-services/service-db/ServiceDB.cpp @@ -34,6 +34,7 @@ #include #include #include +#include #include #include #include @@ -534,14 +535,14 @@ sys::ReturnCodes ServiceDB::InitHandler() Database::initialize(); // Create databases - contactsDB = std::make_unique(); - smsDB = std::make_unique(); - alarmsDB = std::make_unique(); - notesDB = std::make_unique(); - calllogDB = std::make_unique(); - countryCodesDB = std::make_unique(); - notificationsDB = std::make_unique(); - eventsDB = std::make_unique(); + contactsDB = std::make_unique((purefs::dir::getUserDiskPath() / "contacts.db").c_str()); + smsDB = std::make_unique((purefs::dir::getUserDiskPath() / "sms.db").c_str()); + alarmsDB = std::make_unique((purefs::dir::getUserDiskPath() / "alarms.db").c_str()); + notesDB = std::make_unique((purefs::dir::getUserDiskPath() / "notes.db").c_str()); + calllogDB = std::make_unique((purefs::dir::getUserDiskPath() / "callog.db").c_str()); + countryCodesDB = std::make_unique("country-codes.db"); + notificationsDB = std::make_unique((purefs::dir::getUserDiskPath() / "notifications.db").c_str()); + eventsDB = std::make_unique((purefs::dir::getUserDiskPath() / "events.db").c_str()); // Create record interfaces contactRecordInterface = std::make_unique(contactsDB.get()); diff --git a/module-utils/Utils.hpp b/module-utils/Utils.hpp index da49a87713f4278110200fa22686a22bc68fd2a4..5610393ae40a36cffc4866ff140309b5ffa1ec8d 100644 --- a/module-utils/Utils.hpp +++ b/module-utils/Utils.hpp @@ -240,4 +240,15 @@ namespace utils #endif } + namespace filesystem + { + static inline long int filelength(std::FILE *file) noexcept + { + if (file == nullptr) { + return 0; + } + std::fseek(file, 0, SEEK_END); + return std::ftell(file); + } + } // namespace filesystem } // namespace utils diff --git a/module-utils/i18n/i18n.hpp b/module-utils/i18n/i18n.hpp index f424b9d5e9b93b7a2590f5efebd5bf771a0006b4..4f1fdfcc2c2c9a5ea15f5690f638378a28dc749d 100644 --- a/module-utils/i18n/i18n.hpp +++ b/module-utils/i18n/i18n.hpp @@ -1,12 +1,10 @@ // Copyright (c) 2017-2020, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md -#ifndef UNTITLED_I18_HPP -#define UNTITLED_I18_HPP - +#pragma once #include "json/json11.hpp" #include -#include "vfs.hpp" +#include #include "log/log.hpp" #include "thread.hpp" @@ -62,5 +60,3 @@ namespace utils return utils::localize.get(text); }; } // namespace utils - -#endif // UNTITLED_I18_HPP diff --git a/module-utils/test/unittest_utils.cpp b/module-utils/test/unittest_utils.cpp index 5ac0fed3a22f7828ba1854285da6e8087a280432..557825ccb284f5bba1d51e3bcaceef215064d802 100644 --- a/module-utils/test/unittest_utils.cpp +++ b/module-utils/test/unittest_utils.cpp @@ -12,6 +12,16 @@ #include "Utils.hpp" +class vfs vfs; + +struct vfs_initializer +{ + vfs_initializer() + { + vfs.Init(); + } +} vfs_initializer; + TEST_CASE("Split tests") { std::string delimiter = "\r\n"; @@ -269,3 +279,36 @@ TEST_CASE("Fill leading digit in string") REQUIRE(utils::addLeadingZeros(test, 3) == "045"); REQUIRE(utils::addLeadingZeros(test, 4) == "0045"); } + +class ScopedDir +{ + public: + ScopedDir(const std::filesystem::path &dirPath) : dirPath{dirPath} + { + REQUIRE(std::filesystem::create_directory(dirPath)); + } + + ~ScopedDir() + { + REQUIRE(std::filesystem::remove(dirPath)); + } + + auto operator()(std::string file = "") -> std::filesystem::path + { + return dirPath.c_str() + file; + } + + private: + std::filesystem::path dirPath; +}; + +TEST_CASE("Read file length") +{ + ScopedDir dir(USER_PATH("test")); + auto *file = std::fopen(dir("test.txt").c_str(), "w"); + REQUIRE(file != nullptr); + std::array v = {42, -1, 7}; + std::fwrite(v.data(), sizeof(v[0]), v.size(), file); + REQUIRE(utils::filesystem::filelength(file) == static_cast(sizeof(v[0]) * v.size())); + REQUIRE(std::fclose(file) == 0); +}