.. _program_listing_file_include_db_musicDB.cpp: Program Listing for File musicDB.cpp ==================================== |exhale_lsh| :ref:`Return to documentation for file ` (``include/db/musicDB.cpp``) .. |exhale_lsh| unicode:: U+021B0 .. UPWARDS ARROW WITH TIP LEFTWARDS .. code-block:: cpp #include "musicDB.hpp" // #include "errorTable.hpp" #include #include "PDJE_LOG_SETTER.hpp" #define CHK_BIND(res) \ if (res != SQLITE_OK) { \ auto now = std::source_location::current(); \ critlog("failed on sqlite."); \ critlog(now.file_name()); \ std::string lineNumber = std::to_string(now.line()); \ critlog(lineNumber); \ critlog(now.function_name()); \ std::string sqlLog = sqlite3_errmsg(db); \ critlog(sqlLog); \ return false; \ } musdata::musdata(stmt *dbstate) { title = dbstate->colGet(0); composer = dbstate->colGet(1); musicPath = dbstate->colGet(2); bpm = dbstate->colGet(3); bpmBinary = dbstate->colGet(4); firstBeat = dbstate->colGet(5); } musdata::musdata(const UNSANITIZED &title__, const UNSANITIZED &composer__, const SANITIZED_ORNOT &musicPath__, const double bpm__) : musicPath(musicPath__), bpm(bpm__) { auto safeTitle = PDJE_Name_Sanitizer::sanitizeFileName(title__); auto safeComposer = PDJE_Name_Sanitizer::sanitizeFileName(composer__); if (!safeTitle || !safeComposer) { critlog("failed to sanitize filename. from musdata(title, composer, " "muspath, bpm). TileComposer: "); critlog(title__); critlog(composer__); return; } title = safeTitle.value(); composer = safeComposer.value(); } bool musdata::GenSearchSTMT(stmt &dbstate, sqlite3 *db) { dbstate.placeHold = "SELECT * FROM MUSIC" " WHERE (? = -1 OR Title = ?)" " AND (? = -1 OR Composer = ?)" " AND (? = -1 OR MusicPath = ?)" " AND (? = -1 OR Bpm = ?)"; if (!dbstate.activate(db)) { return false; } if (title == "") { CHK_BIND(dbstate.bind_int(1, -1)) } if (composer == "") { CHK_BIND(dbstate.bind_int(3, -1)) } if (musicPath == "") { CHK_BIND(dbstate.bind_int(5, -1)) } if (bpm < 0) { CHK_BIND(dbstate.bind_int(7, -1)) } CHK_BIND(dbstate.bind_text(2, title)) CHK_BIND(dbstate.bind_text(4, composer)) CHK_BIND(dbstate.bind_text(6, musicPath)) CHK_BIND(dbstate.bind_double(8, bpm)) return true; } bool musdata::GenInsertSTMT(stmt &dbstate, sqlite3 *db) { dbstate.placeHold = "INSERT INTO MUSIC " "( Title, Composer, MusicPath, Bpm, BpmBinary, FirstBeat ) " "VALUES " "( ?, ?, ?, ?, ?, ?); "; if (!dbstate.activate(db)) { return false; } CHK_BIND(dbstate.bind_text(1, title)) CHK_BIND(dbstate.bind_text(2, composer)) CHK_BIND(dbstate.bind_text(3, musicPath)) CHK_BIND(dbstate.bind_double(4, bpm)) CHK_BIND(dbstate.bind_blob(5, bpmBinary)) CHK_BIND(dbstate.bind_text(6, firstBeat)) return true; } bool musdata::GenEditSTMT(stmt &dbstate, sqlite3 *db, musdata &toEdit) { dbstate.placeHold = "UPDATE MUSIC " "SET Title = ?, Composer = ?, MusicPath = ?, Bpm = ?, BpmBinary = ?, " "FirstBeat = ? " "WHERE Title = ? AND Composer = ? AND MusicPath = ? AND Bpm = ?; "; if (!dbstate.activate(db)) return false; CHK_BIND(dbstate.bind_text(1, toEdit.title)) CHK_BIND(dbstate.bind_text(2, toEdit.composer)) CHK_BIND(dbstate.bind_text(3, toEdit.musicPath)) CHK_BIND(dbstate.bind_double(4, toEdit.bpm)) CHK_BIND(dbstate.bind_blob(5, toEdit.bpmBinary)) CHK_BIND(dbstate.bind_text(6, toEdit.firstBeat)) CHK_BIND(dbstate.bind_text(7, title)) CHK_BIND(dbstate.bind_text(8, composer)) CHK_BIND(dbstate.bind_text(9, musicPath)) CHK_BIND(dbstate.bind_double(10, bpm)) return true; } bool musdata::GenDeleteSTMT(stmt &dbstate, sqlite3 *db) { dbstate.placeHold = "DELETE FROM MUSIC " "WHERE Title = ? AND Composer = ? AND MusicPath = ? AND Bpm = ?; "; if (!dbstate.activate(db)) return false; CHK_BIND(dbstate.bind_text(1, title)) CHK_BIND(dbstate.bind_text(2, composer)) CHK_BIND(dbstate.bind_text(3, musicPath)) CHK_BIND(dbstate.bind_double(4, bpm)) return true; } #undef CHK_BIND