Program Listing for File dbRoot.cpp

Return to documentation for file (include/db/dbRoot.cpp)

#include <stdexcept>
#include "dbRoot.hpp"

#include "PDJE_LOG_SETTER.hpp"
litedb::litedb(){}

bool
litedb::openDB(const fs::path& dbPath)
{
    // std::u8string u8str = dbPath.generic_u8string();
    if(!fs::is_directory(dbPath)){

        infolog("directory not found. making new one. from litedb openDB. path: ", dbPath.generic_string());
        // infolog(dbPath.generic_string());
        fs::create_directories(dbPath);
    }
    sqldbPath = dbPath / fs::path("sqlite.db");
    kvdbPath = dbPath / fs::path("rocksdb.db");
    vectordbPath = dbPath / fs::path("annoy.db");

    RDB::Options rdbops;
    rdbops.create_if_missing = true;
    rdbops.OptimizeForPointLookup(512 * 1024 * 1024);
    rdbops.OptimizeLevelStyleCompaction();
    RDB::BlockBasedTableOptions table_options;
    table_options.filter_policy.reset(RDB::NewBloomFilterPolicy(10, true));
    rdbops.table_factory.reset(NewBlockBasedTableFactory(table_options));
    rdbops.compression = RDB::kNoCompression;

    wops.sync = true;
    wops.disableWAL = false;

    rops.verify_checksums = true;
    rops.fill_cache = false;

    auto sqlRes = sqlite3_open(sqldbPath.generic_string().c_str(), &sdb);

    sqlite3_exec(sdb, "PRAGMA synchronous   = FULL;",   NULL, NULL, NULL);
    auto kvdbRes = RDB::DB::Open(rdbops, kvdbPath.generic_string(), &kvdb);

    if (sqlRes != SQLITE_OK){
        critlog("failed to open sqlite. from litedb openDB. sqliteErrmsg: ");
        critlog(sqlite3_errmsg(sdb));
        return false;
    }
    if (!kvdbRes.ok()){
        critlog("failed to open rocksDB. from litedb openDB. rocksdbErrmsg: ");
        critlog(kvdbRes.ToString());
        return false;
    }
    if(!CheckTables()){
        critlog("failed to check tables. from litedb openDB.");
        return false;
    }
    ROOT_PATH = dbPath;
    return true;
}

litedb::~litedb()
{
    if(sdb != nullptr){
        sqlite3_close(sdb);
    }
    if(kvdb != nullptr){
        delete kvdb;
    }
}

bool
litedb::CheckTables()
{
    sqlite3_stmt* chk_mus;
    sqlite3_stmt* chk_trk;
    std::string msql = "PRAGMA table_info('MUSIC')";
    std::string tsql = "PRAGMA table_info('TRACK')";
    if (sqlite3_prepare_v2(sdb, msql.c_str(), -1, &chk_mus, nullptr) != SQLITE_OK) {
        critlog("failed to prepare music sql. from litedb CheckTables. sqliteErrmsg: ");
        std::string sqlLog = sqlite3_errmsg(sdb);
        critlog(sqlLog);
        return false;
    }
    if (sqlite3_prepare_v2(sdb, tsql.c_str(), -1, &chk_trk, nullptr) != SQLITE_OK) {
        critlog("failed to prepare track sql. from litedb CheckTables. sqliteErrmsg: ");
        std::string sqlLog = sqlite3_errmsg(sdb);
        critlog(sqlLog);
        return false;
    }
    if(sqlite3_step(chk_mus) != SQLITE_ROW){
        std::string musmake =
        "CREATE TABLE MUSIC ( "
        "Title TEXT NOT NULL, "
        "Composer TEXT NOT NULL, "
        "MusicPath TEXT NOT NULL, "
        "Bpm DOUBLE NOT NULL, "
        "BpmBinary BLOB NOT NULL, "
        "FirstBar TEXT NOT NULL "
        ");";
        if(sqlite3_exec(sdb, musmake.c_str(), nullptr, nullptr, nullptr) != SQLITE_OK){
            critlog("failed to create music sqlite exec. from litedb CheckTables. sqliteErrmsg: ");
            std::string sqlLog = sqlite3_errmsg(sdb);
            critlog(sqlLog);
            return false;
        }
    }
    if(sqlite3_step(chk_trk) != SQLITE_ROW){
        std::string trackmake =
        "CREATE TABLE TRACK ( "
        "TrackTitle TEXT NOT NULL, "
        "MixBinary BLOB NOT NULL, "
        "NoteBinary BLOB NOT NULL, "
        "CachedMixList TEXT NOT NULL "
        ");";
        if(sqlite3_exec(sdb, trackmake.c_str(), nullptr, nullptr, nullptr) != SQLITE_OK){
            critlog("failed to create track sqlite exec. from litedb CheckTables. sqliteErrmsg: ");
            std::string sqlLog = sqlite3_errmsg(sdb);
            critlog(sqlLog);
            return false;
        }
    }
    sqlite3_finalize(chk_mus);
    sqlite3_finalize(chk_trk);
    return true;
}



bool
litedb::KVGet(const SANITIZED& K, DONT_SANITIZE& V)
{

    auto getRes = kvdb->Get(rops, K, &V);
    if(getRes.IsNotFound()){
        warnlog("cannot find music from database. from litedb KVGet. Keydata: ");
        warnlog(K);
        return false;
    }
    if(!getRes.ok()){
        critlog("failed to get music from database. from litedb KVGet. rocksdbErr: ");
        std::string resErr = getRes.ToString();
        critlog(resErr);
        return false;
    }
    return true;
}

bool
litedb::KVPut(const SANITIZED& K, const DONT_SANITIZE& V)
{
    auto putRes = kvdb->Put(wops, K, V);
    if(!putRes.ok()){
        critlog("failed to put new datas to database. from litedb KVPut. rocksdbErr: ");
        std::string resErr = putRes.ToString();
        critlog(resErr);
        return false;
    }
    return true;
}