Program Listing for File musicDB.cpp
↰ Return to documentation for file (include\db\musicDB.cpp
)
#include "musicDB.hpp"
// #include "errorTable.hpp"
#include <source_location>
#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<COL_TYPE::PDJE_TEXT, std::string>(0);
composer = dbstate->colGet<COL_TYPE::PDJE_TEXT, std::string>(1);
musicPath = dbstate->colGet<COL_TYPE::PDJE_TEXT, std::string>(2);
bpm = dbstate->colGet<COL_TYPE::PDJE_DOUBLE, double>(3);
bpmBinary = dbstate->colGet<COL_TYPE::PDJE_BLOB, BIN>(4);
firstBeat = dbstate->colGet<COL_TYPE::PDJE_TEXT, std::string>(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