diff --git a/meson.build b/meson.build index c5dd71a..53763bf 100755 --- a/meson.build +++ b/meson.build @@ -23,7 +23,7 @@ project('SampleHive', license : 'GPL v3', meson_version: '>= 0.58.0', default_options : ['warning_level=1', - 'cpp_std=c++11']) + 'cpp_std=c++14']) meson_src_root = meson.current_source_dir() meson_build_root = meson.current_build_dir() diff --git a/src/Database.cpp b/src/Database.cpp index 726bfc5..d074e51 100644 --- a/src/Database.cpp +++ b/src/Database.cpp @@ -22,6 +22,7 @@ #include #include +#include #include #include @@ -31,153 +32,124 @@ #include #include -Database::Database(wxInfoBar& infoBar) +void throw_on_sqlite3_error(int rc) +{ + if (rc != SQLITE_OK) + { + throw std::runtime_error(sqlite3_errstr(rc)); + } +} + +void debug_log_on_error(int rc) +{ + if (rc != SQLITE_OK) + { + sqlite3_errstr(rc); + } +} + +void show_modal_dialog_and_log(const std::string &message, const std::string &title, const std::string &error_msg) +{ + std::stringstream ss; + ss << message << error_msg; + const auto msg = ss.str(); + wxLogDebug(msg.c_str()); + wxMessageDialog msgDialog(NULL, msg, title, wxOK | wxICON_ERROR); + msgDialog.ShowModal(); +} + +class Sqlite3Statement +{ +public: + Sqlite3Statement(sqlite3 *database, const std::string &query) + { + throw_on_sqlite3_error(sqlite3_prepare_v2(database, query.c_str(), query.size(), &stmt, NULL)); + } + ~Sqlite3Statement() + { + throw_on_sqlite3_error(sqlite3_finalize(stmt)); + } + sqlite3_stmt *stmt = nullptr; +}; + +Database::Database(wxInfoBar &infoBar, const std::string &dbPath) : m_InfoBar(infoBar) { - + open(dbPath); } Database::~Database() { - + close(); } -void Database::CreateTableSamples(const std::string& dbPath) +void Database::CreateTableSamples() { /* Create SQL statement */ - std::string samples = "CREATE TABLE IF NOT EXISTS SAMPLES(" - "FAVORITE INT NOT NULL," - "FILENAME TEXT NOT NULL," - "EXTENSION TEXT NOT NULL," - "SAMPLEPACK TEXT NOT NULL," - "TYPE TEXT NOT NULL," - "CHANNELS INT NOT NULL," - "LENGTH INT NOT NULL," - "SAMPLERATE INT NOT NULL," - "BITRATE INT NOT NULL," - "PATH TEXT NOT NULL," - "TRASHED INT NOT NULL," - "HIVE TEXT NOT NULL);"; + const auto samples = "CREATE TABLE IF NOT EXISTS SAMPLES(" + "FAVORITE INT NOT NULL," + "FILENAME TEXT NOT NULL," + "EXTENSION TEXT NOT NULL," + "SAMPLEPACK TEXT NOT NULL," + "TYPE TEXT NOT NULL," + "CHANNELS INT NOT NULL," + "LENGTH INT NOT NULL," + "SAMPLERATE INT NOT NULL," + "BITRATE INT NOT NULL," + "PATH TEXT NOT NULL," + "TRASHED INT NOT NULL," + "HIVE TEXT NOT NULL);"; try { - if (sqlite3_open(dbPath.c_str(), &m_Database) != SQLITE_OK) - { - wxLogDebug("Error opening DB"); - throw sqlite3_errmsg(m_Database); - } - else - { - wxLogDebug("Opening DB.."); - } - - rc = sqlite3_exec(m_Database, samples.c_str(), NULL, 0, &m_ErrMsg); - - if (rc != SQLITE_OK) - { - wxMessageDialog msgDialog(NULL, "Error! Cannot create table samples.", - "Error", wxOK | wxICON_ERROR); - msgDialog.ShowModal(); - sqlite3_free(m_ErrMsg); - } - else - { - wxLogDebug("Samples table created successfully."); - } - - rc = sqlite3_close(m_Database); - - if (rc == SQLITE_OK) - wxLogDebug("DB Closed.."); - else - wxLogDebug("Error! Cannot close DB, Error code: %d, Error message: %s", rc, m_ErrMsg); + throw_on_sqlite3_error(sqlite3_exec(m_Database, samples, NULL, 0, &m_ErrMsg)); + wxLogDebug("Samples table created successfully."); } - catch (const std::exception &exception) + catch (const std::exception &e) { - wxLogDebug(exception.what()); + show_modal_dialog_and_log("Error! Cannot create table samples: ", "Error", e.what()); } } -void Database::CreateTableHives(const std::string& dbPath) +void Database::CreateTableHives() { /* Create SQL statement */ - std::string hives = "CREATE TABLE IF NOT EXISTS HIVES(HIVE TEXT NOT NULL);"; + const auto hives = "CREATE TABLE IF NOT EXISTS HIVES(HIVE TEXT NOT NULL);"; try { - if (sqlite3_open(dbPath.c_str(), &m_Database) != SQLITE_OK) - { - wxLogDebug("Error opening DB"); - throw sqlite3_errmsg(m_Database); - } - else - { - wxLogDebug("Opening DB.."); - } - - rc = sqlite3_exec(m_Database, hives.c_str(), NULL, 0, &m_ErrMsg); - - if (rc != SQLITE_OK) - { - wxMessageDialog msgDialog(NULL, "Error! Cannot create table hives.", - "Error", wxOK | wxICON_ERROR); - msgDialog.ShowModal(); - sqlite3_free(m_ErrMsg); - } - else - { - wxLogDebug("Hives table created successfully."); - } - - rc = sqlite3_close(m_Database); - - if (rc == SQLITE_OK) - wxLogDebug("DB Closed.."); - else - wxLogDebug("Error! Cannot close DB, Error code: %d, Error message: %s", rc, m_ErrMsg); + throw_on_sqlite3_error(sqlite3_exec(m_Database, hives, NULL, 0, &m_ErrMsg)); + wxLogDebug("Hives table created successfully."); } - catch (const std::exception &exception) + catch (const std::exception &e) { - wxLogDebug(exception.what()); + show_modal_dialog_and_log("Error! Cannot create table hives: ", "Error", e.what()); } } //Loops through a Sample array and adds them to the database -void Database::InsertIntoSamples(const std::string& dbPath, std::vector samples) +void Database::InsertIntoSamples(const std::vector &samples) { try { - if (sqlite3_open(dbPath.c_str(), &m_Database) != SQLITE_OK) - { - wxLogDebug("Error opening DB"); - throw sqlite3_errmsg(m_Database); - } - else - { - wxLogDebug("Opening DB.."); - } + const auto sql = "INSERT INTO SAMPLES (FAVORITE, FILENAME, \ + EXTENSION, SAMPLEPACK, TYPE, CHANNELS, LENGTH, \ + SAMPLERATE, BITRATE, PATH, TRASHED, HIVE) \ + VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);"; - std::string insert = "INSERT INTO SAMPLES (FAVORITE, FILENAME, \ - EXTENSION, SAMPLEPACK, TYPE, CHANNELS, LENGTH, \ - SAMPLERATE, BITRATE, PATH, TRASHED, HIVE) \ - VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);"; + Sqlite3Statement statement(m_Database, sql); + + throw_on_sqlite3_error(sqlite3_exec(m_Database, "BEGIN TRANSACTION", NULL, NULL, &m_ErrMsg)); - rc = sqlite3_prepare_v2(m_Database, insert.c_str(), insert.size(), &m_Stmt, NULL); - - rc = sqlite3_exec(m_Database, "BEGIN TRANSACTION", NULL, NULL, &m_ErrMsg); - - if (rc != SQLITE_OK) - wxLogDebug("Cannot prepare sql statement.."); - Sample sample; - + std::string filename; std::string file_extension; std::string sample_pack; std::string type; std::string path; - - for(unsigned int i = 0; i < samples.size(); i++) + + for (unsigned int i = 0; i < samples.size(); i++) { sample = samples[i]; @@ -189,64 +161,27 @@ void Database::InsertIntoSamples(const std::string& dbPath, std::vector std::string hive = "Favorites"; - rc = sqlite3_bind_int(m_Stmt, 1, sample.GetFavorite()); - rc = sqlite3_bind_text(m_Stmt, 2, filename.c_str(), filename.size(), SQLITE_STATIC); - rc = sqlite3_bind_text(m_Stmt, 3, file_extension.c_str(), file_extension.size(), SQLITE_STATIC); - rc = sqlite3_bind_text(m_Stmt, 4, sample_pack.c_str(), sample_pack.size(), SQLITE_STATIC); - rc = sqlite3_bind_text(m_Stmt, 5, type.c_str(), type.size(), SQLITE_STATIC); - rc = sqlite3_bind_int(m_Stmt, 6, sample.GetChannels()); - rc = sqlite3_bind_int(m_Stmt, 7, sample.GetLength()); - rc = sqlite3_bind_int(m_Stmt, 8, sample.GetSampleRate()); - rc = sqlite3_bind_int(m_Stmt, 9, sample.GetBitrate()); - rc = sqlite3_bind_text(m_Stmt, 10, path.c_str(), path.size(), SQLITE_STATIC); - rc = sqlite3_bind_int(m_Stmt, 11, sample.GetTrashed()); - rc = sqlite3_bind_text(m_Stmt, 12, hive.c_str(), hive.size(), SQLITE_STATIC); - - rc = sqlite3_step(m_Stmt); - rc = sqlite3_clear_bindings(m_Stmt); - rc = sqlite3_reset(m_Stmt); + throw_on_sqlite3_error(sqlite3_bind_int(statement.stmt, 1, sample.GetFavorite())); + throw_on_sqlite3_error(sqlite3_bind_text(statement.stmt, 2, filename.c_str(), filename.size(), SQLITE_STATIC)); + throw_on_sqlite3_error(sqlite3_bind_text(statement.stmt, 3, file_extension.c_str(), file_extension.size(), SQLITE_STATIC)); + throw_on_sqlite3_error(sqlite3_bind_text(statement.stmt, 4, sample_pack.c_str(), sample_pack.size(), SQLITE_STATIC)); + throw_on_sqlite3_error(sqlite3_bind_text(statement.stmt, 5, type.c_str(), type.size(), SQLITE_STATIC)); + throw_on_sqlite3_error(sqlite3_bind_int(statement.stmt, 6, sample.GetChannels())); + throw_on_sqlite3_error(sqlite3_bind_int(statement.stmt, 7, sample.GetLength())); + throw_on_sqlite3_error(sqlite3_bind_int(statement.stmt, 8, sample.GetSampleRate())); + throw_on_sqlite3_error(sqlite3_bind_int(statement.stmt, 9, sample.GetBitrate())); + throw_on_sqlite3_error(sqlite3_bind_text(statement.stmt, 10, path.c_str(), path.size(), SQLITE_STATIC)); + throw_on_sqlite3_error(sqlite3_bind_int(statement.stmt, 11, sample.GetTrashed())); + throw_on_sqlite3_error(sqlite3_bind_text(statement.stmt, 12, hive.c_str(), hive.size(), SQLITE_STATIC)); + + sqlite3_step(statement.stmt); + throw_on_sqlite3_error(sqlite3_clear_bindings(statement.stmt)); + throw_on_sqlite3_error(sqlite3_reset(statement.stmt)); } - rc = sqlite3_exec(m_Database, "END TRANSACTION", NULL, NULL, &m_ErrMsg); + throw_on_sqlite3_error(sqlite3_exec(m_Database, "END TRANSACTION", NULL, NULL, &m_ErrMsg)); - rc = sqlite3_finalize(m_Stmt); - - if (rc != SQLITE_OK) - { - wxLogDebug("Error! Cannot insert data into table. Error code: %d: Msg: %s", rc , sqlite3_errmsg(m_Database)); - } - else - { - wxLogDebug("Data inserted successfully."); - } - - if (rc == SQLITE_BUSY) - wxLogDebug("SQLITE_BUSY"); - if (rc == SQLITE_ABORT) - wxLogDebug("SQLITE_ABORT"); - if (rc == SQLITE_NOMEM) - wxLogDebug("SQLITE_NOMEM"); - if (rc == SQLITE_LOCKED) - wxLogDebug("SQLITE_LOCKED"); - if (rc == SQLITE_IOERR) - wxLogDebug("SQLITE_IOERR"); - if (rc == SQLITE_CORRUPT) - wxLogDebug("SQLITE_CORRUPT"); - if (rc == SQLITE_READONLY) - wxLogDebug("SQLITE_READONLY"); - if (rc == SQLITE_ERROR) - wxLogDebug("SQLITE_ERROR"); - if (rc == SQLITE_PERM) - wxLogDebug("SQLITE_PERM"); - if (rc == SQLITE_INTERNAL) - wxLogDebug("SQLITE_INTERNAL"); - - rc = sqlite3_close(m_Database); - - if (rc == SQLITE_OK) - wxLogDebug("DB Closed.."); - else - wxLogDebug("Error! Cannot close DB, Error code: %d, Error message: %s", rc, m_ErrMsg); + wxLogDebug("Data inserted successfully."); } catch (const std::exception &exception) { @@ -254,29 +189,15 @@ void Database::InsertIntoSamples(const std::string& dbPath, std::vector } } -void Database::InsertIntoHives(const std::string& dbPath, const std::string& hiveName) +void Database::InsertIntoHives(const std::string &hiveName) { try { - if (sqlite3_open(dbPath.c_str(), &m_Database) != SQLITE_OK) - { - wxLogDebug("Error opening DB"); - throw sqlite3_errmsg(m_Database); - } - else - { - wxLogDebug("Opening DB.."); - } - - std::string insert = "INSERT INTO HIVES(HIVE) VALUES(?);"; - - rc = sqlite3_prepare_v2(m_Database, insert.c_str(), insert.size(), &m_Stmt, NULL); + const auto sql = "INSERT INTO HIVES(HIVE) VALUES(?);"; + Sqlite3Statement statement(m_Database, sql); // rc = sqlite3_exec(m_Database, "BEGIN TRANSACTION", NULL, NULL, &m_ErrMsg); - if (rc != SQLITE_OK) - wxLogDebug("Cannot prepare sql statement.."); - // Sample sample; // std::string filename; @@ -297,54 +218,17 @@ void Database::InsertIntoHives(const std::string& dbPath, const std::string& hiv // std::string hive = "Favourites"; - // rc = sqlite3_bind_int(m_Stmt, 1, sample.GetFavorite()); - rc = sqlite3_bind_text(m_Stmt, 1, hiveName.c_str(), hiveName.size(), SQLITE_STATIC); + // rc = sqlite3_bind_int(statement.stmt, 1, sample.GetFavorite()); + throw_on_sqlite3_error(sqlite3_bind_text(statement.stmt, 1, hiveName.c_str(), hiveName.size(), SQLITE_STATIC)); - rc = sqlite3_step(m_Stmt); - // rc = sqlite3_clear_bindings(m_Stmt); - // rc = sqlite3_reset(m_Stmt); + throw_on_sqlite3_error(sqlite3_step(statement.stmt)); + // rc = sqlite3_clear_bindings(statement.stmt); + // rc = sqlite3_reset(statement.stmt); // } // rc = sqlite3_exec(m_Database, "END TRANSACTION", NULL, NULL, &m_ErrMsg); - rc = sqlite3_finalize(m_Stmt); - - if (rc != SQLITE_OK) - { - wxLogDebug("Error! Cannot insert data into table. Error code: %d: Msg: %s", rc , sqlite3_errmsg(m_Database)); - } - else - { - wxLogDebug("Data inserted successfully."); - } - - if (rc == SQLITE_BUSY) - wxLogDebug("SQLITE_BUSY"); - if (rc == SQLITE_ABORT) - wxLogDebug("SQLITE_ABORT"); - if (rc == SQLITE_NOMEM) - wxLogDebug("SQLITE_NOMEM"); - if (rc == SQLITE_LOCKED) - wxLogDebug("SQLITE_LOCKED"); - if (rc == SQLITE_IOERR) - wxLogDebug("SQLITE_IOERR"); - if (rc == SQLITE_CORRUPT) - wxLogDebug("SQLITE_CORRUPT"); - if (rc == SQLITE_READONLY) - wxLogDebug("SQLITE_READONLY"); - if (rc == SQLITE_ERROR) - wxLogDebug("SQLITE_ERROR"); - if (rc == SQLITE_PERM) - wxLogDebug("SQLITE_PERM"); - if (rc == SQLITE_INTERNAL) - wxLogDebug("SQLITE_INTERNAL"); - - rc = sqlite3_close(m_Database); - - if (rc == SQLITE_OK) - wxLogDebug("DB Closed.."); - else - wxLogDebug("Error! Cannot close DB, Error code: %d, Error message: %s", rc, m_ErrMsg); + wxLogDebug("Data inserted successfully."); } catch (const std::exception &exception) { @@ -352,40 +236,24 @@ void Database::InsertIntoHives(const std::string& dbPath, const std::string& hiv } } -void Database::UpdateHive(const std::string& dbPath, const std::string& hiveOldName, const std::string& hiveNewName) +void Database::UpdateHive(const std::string &hiveOldName, const std::string &hiveNewName) { try { - rc = sqlite3_open(dbPath.c_str(), &m_Database); + const auto sql = "UPDATE HIVES SET HIVE = ? WHERE HIVE = ?;"; + Sqlite3Statement statement(m_Database, sql); - std::string update = "UPDATE HIVES SET HIVE = ? WHERE HIVE = ?;"; + throw_on_sqlite3_error(sqlite3_bind_text(statement.stmt, 1, hiveNewName.c_str(), hiveNewName.size(), SQLITE_STATIC)); + throw_on_sqlite3_error(sqlite3_bind_text(statement.stmt, 2, hiveOldName.c_str(), hiveOldName.size(), SQLITE_STATIC)); - rc = sqlite3_prepare_v2(m_Database, update.c_str(), update.size(), &m_Stmt, NULL); - - rc = sqlite3_bind_text(m_Stmt, 1, hiveNewName.c_str(), hiveNewName.size(), SQLITE_STATIC); - rc = sqlite3_bind_text(m_Stmt, 2, hiveOldName.c_str(), hiveOldName.size(), SQLITE_STATIC); - - if (sqlite3_step(m_Stmt) != SQLITE_DONE) + if (sqlite3_step(statement.stmt) != SQLITE_DONE) { wxLogWarning("No data inserted."); } - - rc = sqlite3_finalize(m_Stmt); - - if (rc != SQLITE_OK) - { - wxMessageDialog msgDialog(NULL, - "Error! Cannot update hive name.", - "Error", wxOK | wxICON_ERROR); - msgDialog.ShowModal(); - sqlite3_free(m_ErrMsg); - } else { wxLogDebug("Hive updated successfully. %s", m_ErrMsg); } - - sqlite3_close(m_Database); } catch (const std::exception &exception) { @@ -393,872 +261,603 @@ void Database::UpdateHive(const std::string& dbPath, const std::string& hiveOldN } } -void Database::UpdateHiveName(const std::string& dbPath, const std::string& filename, const std::string& hiveName) +void Database::UpdateHiveName(const std::string &filename, const std::string &hiveName) { try { - rc = sqlite3_open(dbPath.c_str(), &m_Database); + const auto sql = "UPDATE SAMPLES SET HIVE = ? WHERE FILENAME = ?;"; + Sqlite3Statement statement(m_Database, sql); - std::string update = "UPDATE SAMPLES SET HIVE = ? WHERE FILENAME = ?;"; + throw_on_sqlite3_error(sqlite3_bind_text(statement.stmt, 1, hiveName.c_str(), hiveName.size(), SQLITE_STATIC)); + throw_on_sqlite3_error(sqlite3_bind_text(statement.stmt, 2, filename.c_str(), filename.size(), SQLITE_STATIC)); - rc = sqlite3_prepare_v2(m_Database, update.c_str(), update.size(), &m_Stmt, NULL); - - rc = sqlite3_bind_text(m_Stmt, 1, hiveName.c_str(), hiveName.size(), SQLITE_STATIC); - rc = sqlite3_bind_text(m_Stmt, 2, filename.c_str(), filename.size(), SQLITE_STATIC); - - if (sqlite3_step(m_Stmt) == SQLITE_ROW) + if (sqlite3_step(statement.stmt) == SQLITE_ROW) { wxLogDebug("Record found, updating.."); } - rc = sqlite3_finalize(m_Stmt); - - if (rc != SQLITE_OK) - { - wxMessageDialog msgDialog(NULL, "Error! Cannot update record.", "Error", wxOK | wxICON_ERROR); - msgDialog.ShowModal(); - sqlite3_free(m_ErrMsg); - } - else - { - wxLogDebug("Updated record successfully."); - } - - sqlite3_close(m_Database); + wxLogDebug("Updated record successfully."); } - catch (const std::exception &exception) + catch (const std::exception &e) { - wxLogDebug(exception.what()); + show_modal_dialog_and_log("Error! Cannot update record: ", "Error", e.what()); } } -void Database::UpdateFavoriteColumn(const std::string& dbPath, const std::string& filename, int value) +void Database::UpdateFavoriteColumn(const std::string &filename, int value) { try { - rc = sqlite3_open(dbPath.c_str(), &m_Database); + const auto sql = "UPDATE SAMPLES SET FAVORITE = ? WHERE FILENAME = ?;"; + Sqlite3Statement statement(m_Database, sql); - std::string update = "UPDATE SAMPLES SET FAVORITE = ? WHERE FILENAME = ?;"; + throw_on_sqlite3_error(sqlite3_bind_int(statement.stmt, 1, value)); + throw_on_sqlite3_error(sqlite3_bind_text(statement.stmt, 2, filename.c_str(), filename.size(), SQLITE_STATIC)); - rc = sqlite3_prepare_v2(m_Database, update.c_str(), update.size(), &m_Stmt, NULL); - - rc = sqlite3_bind_int(m_Stmt, 1, value); - rc = sqlite3_bind_text(m_Stmt, 2, filename.c_str(), filename.size(), SQLITE_STATIC); - - if (sqlite3_step(m_Stmt) == SQLITE_ROW) + if (sqlite3_step(statement.stmt) == SQLITE_ROW) { wxLogDebug("Record found, updating.."); } - rc = sqlite3_finalize(m_Stmt); - - if (rc != SQLITE_OK) - { - wxMessageDialog msgDialog(NULL, "Error! Cannot update record.", "Error", wxOK | wxICON_ERROR); - msgDialog.ShowModal(); - sqlite3_free(m_ErrMsg); - } - else - { - wxLogDebug("Updated record successfully."); - } - - sqlite3_close(m_Database); + wxLogDebug("Updated record successfully."); } - catch (const std::exception &exception) + catch (const std::exception &e) { - wxLogDebug(exception.what()); + show_modal_dialog_and_log("Error! Cannot update record: ", "Error", e.what()); } } -void Database::UpdateSamplePack(const std::string& dbPath, const std::string& filename, const std::string& samplePack) +void Database::UpdateSamplePack(const std::string &filename, const std::string &samplePack) { try { - rc = sqlite3_open(dbPath.c_str(), &m_Database); + const auto sql = "UPDATE SAMPLES SET SAMPLEPACK = ? WHERE FILENAME = ?;"; + Sqlite3Statement statement(m_Database, sql); - std::string update = "UPDATE SAMPLES SET SAMPLEPACK = ? WHERE FILENAME = ?;"; + throw_on_sqlite3_error(sqlite3_bind_text(statement.stmt, 1, samplePack.c_str(), samplePack.size(), SQLITE_STATIC)); + throw_on_sqlite3_error(sqlite3_bind_text(statement.stmt, 2, filename.c_str(), filename.size(), SQLITE_STATIC)); - rc = sqlite3_prepare_v2(m_Database, update.c_str(), update.size(), &m_Stmt, NULL); - - rc = sqlite3_bind_text(m_Stmt, 1, samplePack.c_str(), samplePack.size(), SQLITE_STATIC); - rc = sqlite3_bind_text(m_Stmt, 2, filename.c_str(), filename.size(), SQLITE_STATIC); - - if (sqlite3_step(m_Stmt) == SQLITE_ROW) + if (sqlite3_step(statement.stmt) == SQLITE_ROW) { wxLogDebug("Record found, updating.."); } - rc = sqlite3_finalize(m_Stmt); - - if (rc != SQLITE_OK) - { - wxMessageDialog msgDialog(NULL, "Error! Cannot update record.", "Error", wxOK | wxICON_ERROR); - msgDialog.ShowModal(); - sqlite3_free(m_ErrMsg); - } - else - { - wxLogDebug("Updated record successfully."); - } - - sqlite3_close(m_Database); + wxLogDebug("Updated record successfully."); } - catch (const std::exception &exception) + catch (const std::exception &e) { - wxLogDebug(exception.what()); + show_modal_dialog_and_log("Error! Cannot update record: ", "Error", e.what()); } } -void Database::UpdateSampleType(const std::string& dbPath, const std::string& filename, const std::string& type) +void Database::UpdateSampleType(const std::string &filename, const std::string &type) { try { - rc = sqlite3_open(dbPath.c_str(), &m_Database); + const auto sql = "UPDATE SAMPLES SET TYPE = ? WHERE FILENAME = ?;"; + Sqlite3Statement statement(m_Database, sql); - std::string update = "UPDATE SAMPLES SET TYPE = ? WHERE FILENAME = ?;"; + throw_on_sqlite3_error(sqlite3_bind_text(statement.stmt, 1, type.c_str(), type.size(), SQLITE_STATIC)); + throw_on_sqlite3_error(sqlite3_bind_text(statement.stmt, 2, filename.c_str(), filename.size(), SQLITE_STATIC)); - rc = sqlite3_prepare_v2(m_Database, update.c_str(), update.size(), &m_Stmt, NULL); - - rc = sqlite3_bind_text(m_Stmt, 1, type.c_str(), type.size(), SQLITE_STATIC); - rc = sqlite3_bind_text(m_Stmt, 2, filename.c_str(), filename.size(), SQLITE_STATIC); - - if (sqlite3_step(m_Stmt) == SQLITE_ROW) + if (sqlite3_step(statement.stmt) == SQLITE_ROW) { wxLogDebug("Record found, updating.."); } - - rc = sqlite3_finalize(m_Stmt); - - if (rc != SQLITE_OK) - { - wxMessageDialog msgDialog(NULL, "Error! Cannot update record.", "Error", wxOK | wxICON_ERROR); - msgDialog.ShowModal(); - sqlite3_free(m_ErrMsg); - } - else - { - wxLogDebug("Updated record successfully."); - } - - sqlite3_close(m_Database); + wxLogDebug("Updated record successfully."); } - catch (const std::exception &exception) + catch (const std::exception &e) { - wxLogDebug(exception.what()); + show_modal_dialog_and_log("Error! Cannot update record: ", "Error", e.what()); } } -std::string Database::GetSampleType(const std::string& dbPath, const std::string& filename) +std::string Database::GetSampleType(const std::string &filename) { std::string type; try { - rc = sqlite3_open(dbPath.c_str(), &m_Database); + const auto sql = "SELECT TYPE FROM SAMPLES WHERE FILENAME = ?;"; + Sqlite3Statement statement(m_Database, sql); - std::string select = "SELECT TYPE FROM SAMPLES WHERE FILENAME = ?;"; + throw_on_sqlite3_error(sqlite3_bind_text(statement.stmt, 1, filename.c_str(), filename.size(), SQLITE_STATIC)); - rc = sqlite3_prepare_v2(m_Database, select.c_str(), select.size(), &m_Stmt, NULL); - - rc = sqlite3_bind_text(m_Stmt, 1, filename.c_str(), filename.size(), SQLITE_STATIC); - - if (sqlite3_step(m_Stmt) == SQLITE_ROW) + if (sqlite3_step(statement.stmt) == SQLITE_ROW) { wxLogDebug("Record found, fetching.."); - type = std::string(reinterpret_cast(sqlite3_column_text(m_Stmt, 0))); + type = std::string(reinterpret_cast(sqlite3_column_text(statement.stmt, 0))); } - - rc = sqlite3_finalize(m_Stmt); - - if (rc != SQLITE_OK) - { - wxMessageDialog msgDialog(NULL, "Error! Cannot get sample type column value from table.", - "Error", wxOK | wxICON_ERROR); - msgDialog.ShowModal(); - sqlite3_free(m_ErrMsg); - } - else - { - wxLogDebug("Selected data from table successfully."); - } - - sqlite3_close(m_Database); + wxLogDebug("Selected data from table successfully."); } - catch (const std::exception &exception) + catch (const std::exception &e) { - wxLogDebug(exception.what()); + show_modal_dialog_and_log("Error! Cannot get sample type column value from table: ", "Error", e.what()); } return type; } -int Database::GetFavoriteColumnValueByFilename(const std::string& dbPath, const std::string& filename) +int Database::GetFavoriteColumnValueByFilename(const std::string &filename) { int value = 0; try { - rc = sqlite3_open(dbPath.c_str(), &m_Database); + const auto sql = "SELECT FAVORITE FROM SAMPLES WHERE FILENAME = ?;"; + Sqlite3Statement statement(m_Database, sql); - std::string select = "SELECT FAVORITE FROM SAMPLES WHERE FILENAME = ?;"; + throw_on_sqlite3_error(sqlite3_bind_text(statement.stmt, 1, filename.c_str(), filename.size(), SQLITE_STATIC)); - rc = sqlite3_prepare_v2(m_Database, select.c_str(), select.size(), &m_Stmt, NULL); - - rc = sqlite3_bind_text(m_Stmt, 1, filename.c_str(), filename.size(), SQLITE_STATIC); - - if (sqlite3_step(m_Stmt) == SQLITE_ROW) + if (sqlite3_step(statement.stmt) == SQLITE_ROW) { wxLogDebug("Record found, fetching.."); - value = sqlite3_column_int(m_Stmt, 0); + value = sqlite3_column_int(statement.stmt, 0); } - rc = sqlite3_finalize(m_Stmt); - - if (rc != SQLITE_OK) - { - wxMessageDialog msgDialog(NULL, "Error! Cannot get favorite column value from table.", - "Error", wxOK | wxICON_ERROR); - msgDialog.ShowModal(); - sqlite3_free(m_ErrMsg); - } - else - { - wxLogDebug("Selected data from table successfully."); - } - - sqlite3_close(m_Database); + wxLogDebug("Selected data from table successfully."); } - catch (const std::exception &exception) + catch (const std::exception &e) { - wxLogDebug(exception.what()); + show_modal_dialog_and_log("Error! Cannot get favorite column value from table: ", "Error", e.what()); } return value; } -std::string Database::GetHiveByFilename(const std::string& dbPath, const std::string& filename) +std::string Database::GetHiveByFilename(const std::string &filename) { std::string hive; try { - rc = sqlite3_open(dbPath.c_str(), &m_Database); + const auto sql = "SELECT HIVE FROM SAMPLES WHERE FILENAME = ?;"; + Sqlite3Statement statement(m_Database, sql); - std::string select = "SELECT HIVE FROM SAMPLES WHERE FILENAME = ?;"; + throw_on_sqlite3_error(sqlite3_bind_text(statement.stmt, 1, filename.c_str(), filename.size(), SQLITE_STATIC)); - rc = sqlite3_prepare_v2(m_Database, select.c_str(), select.size(), &m_Stmt, NULL); - - rc = sqlite3_bind_text(m_Stmt, 1, filename.c_str(), filename.size(), SQLITE_STATIC); - - if (sqlite3_step(m_Stmt) == SQLITE_ROW) + if (sqlite3_step(statement.stmt) == SQLITE_ROW) { wxLogDebug("Record found, fetching.."); - - hive = std::string(reinterpret_cast(sqlite3_column_text(m_Stmt, 0))); + hive = std::string(reinterpret_cast(sqlite3_column_text(statement.stmt, 0))); } - rc = sqlite3_finalize(m_Stmt); - - if (rc != SQLITE_OK) - { - wxMessageDialog msgDialog(NULL, "Error! Cannot get hive value from table.", - "Error", wxOK | wxICON_ERROR); - msgDialog.ShowModal(); - sqlite3_free(m_ErrMsg); - } - else - { - wxLogDebug("Selected data from table successfully."); - } - - sqlite3_close(m_Database); + wxLogDebug("Selected data from table successfully."); } - catch (const std::exception &exception) + catch (const std::exception &e) { - wxLogDebug(exception.what()); + show_modal_dialog_and_log("Error! Cannot get hive value from table: ", "Error", e.what()); } return hive; } -void Database::RemoveSampleFromDatabase(const std::string& dbPath, const std::string& filename) +void Database::RemoveSampleFromDatabase(const std::string &filename) { try { - rc = sqlite3_open(dbPath.c_str(), &m_Database); + const auto sql = "DELETE FROM SAMPLES WHERE FILENAME = ?;"; + Sqlite3Statement statement(m_Database, sql); - std::string remove = "DELETE FROM SAMPLES WHERE FILENAME = ?;"; + throw_on_sqlite3_error(sqlite3_bind_text(statement.stmt, 1, filename.c_str(), filename.size(), SQLITE_STATIC)); - rc = sqlite3_prepare_v2(m_Database, remove.c_str(), remove.size(), &m_Stmt, NULL); - - rc = sqlite3_bind_text(m_Stmt, 1, filename.c_str(), filename.size(), SQLITE_STATIC); - - if (sqlite3_step(m_Stmt) == SQLITE_DONE) + if (sqlite3_step(statement.stmt) == SQLITE_DONE) { wxLogDebug("Record found, Deleting.."); } - rc = sqlite3_finalize(m_Stmt); - - if (rc != SQLITE_OK) - { - wxMessageDialog msgDialog(NULL, "Error! Cannot delete data from table.", - "Error", wxOK | wxICON_ERROR); - msgDialog.ShowModal(); - sqlite3_free(m_ErrMsg); - } - else - { - wxLogDebug("Deleted data from table successfully."); - } - - sqlite3_close(m_Database); + wxLogDebug("Deleted data from table successfully."); } - catch (const std::exception &exception) + catch (const std::exception &e) { - wxLogDebug(exception.what()); + show_modal_dialog_and_log("Error! Cannot get hive value from table: ", "Error", e.what()); } } -void Database::RemoveHiveFromDatabase(const std::string& dbPath, const std::string& hiveName) +void Database::RemoveHiveFromDatabase(const std::string &hiveName) { try { - rc = sqlite3_open(dbPath.c_str(), &m_Database); + const auto sql = "DELETE FROM HIVES WHERE HIVE = ?;"; + Sqlite3Statement statement(m_Database, sql); - std::string remove = "DELETE FROM HIVES WHERE HIVE = ?;"; + throw_on_sqlite3_error(sqlite3_bind_text(statement.stmt, 1, hiveName.c_str(), hiveName.size(), SQLITE_STATIC)); - rc = sqlite3_prepare_v2(m_Database, remove.c_str(), remove.size(), &m_Stmt, NULL); - - rc = sqlite3_bind_text(m_Stmt, 1, hiveName.c_str(), hiveName.size(), SQLITE_STATIC); - - if (sqlite3_step(m_Stmt) == SQLITE_DONE) + if (sqlite3_step(statement.stmt) == SQLITE_DONE) { wxLogDebug("Record found, Deleting.."); } - rc = sqlite3_finalize(m_Stmt); - - if (rc != SQLITE_OK) - { - wxMessageDialog msgDialog(NULL, "Error! Cannot delete data from table.", - "Error", wxOK | wxICON_ERROR); - msgDialog.ShowModal(); - sqlite3_free(m_ErrMsg); - } - else - { - wxLogDebug("Deleted data from table successfully."); - } - - sqlite3_close(m_Database); + wxLogDebug("Deleted data from table successfully."); } - catch (const std::exception &exception) + catch (const std::exception &e) { - wxLogDebug(exception.what()); + show_modal_dialog_and_log("Error! Cannot get hive value from table: ", "Error", e.what()); } } -std::string Database::GetSamplePathByFilename(const std::string& dbPath, const std::string& filename) +std::string Database::GetSamplePathByFilename(const std::string &filename) { std::string path; try { - rc = sqlite3_open(dbPath.c_str(), &m_Database); + const auto sql = "SELECT PATH FROM SAMPLES WHERE FILENAME = ?;"; + Sqlite3Statement statement(m_Database, sql); - std::string select = "SELECT PATH FROM SAMPLES WHERE FILENAME = ?;"; + throw_on_sqlite3_error(sqlite3_bind_text(statement.stmt, 1, filename.c_str(), filename.size(), SQLITE_STATIC)); - rc = sqlite3_prepare_v2(m_Database, select.c_str(), select.size(), &m_Stmt, NULL); - - rc = sqlite3_bind_text(m_Stmt, 1, filename.c_str(), filename.size(), SQLITE_STATIC); - - if (sqlite3_step(m_Stmt) == SQLITE_ROW) + if (sqlite3_step(statement.stmt) == SQLITE_ROW) { wxLogDebug("Record found, fetching.."); - path = std::string(reinterpret_cast(sqlite3_column_text(m_Stmt, 0))); + path = std::string(reinterpret_cast(sqlite3_column_text(statement.stmt, 0))); } - rc = sqlite3_finalize(m_Stmt); - - if (rc != SQLITE_OK) - { - wxMessageDialog msgDialog(NULL, "Error! Cannot select sample path from table.", - "Error", wxOK | wxICON_ERROR); - msgDialog.ShowModal(); - sqlite3_free(m_ErrMsg); - } - else - { - wxLogDebug("Selected data from table successfully."); - } - - sqlite3_close(m_Database); + wxLogDebug("Selected data from table successfully."); } - catch (const std::exception &exception) + catch (const std::exception &e) { - wxLogDebug(exception.what()); + show_modal_dialog_and_log("Error! Cannot select sample path from table: ", "Error", e.what()); } return path; } -std::string Database::GetSampleFileExtension(const std::string& dbPath, const std::string& filename) +std::string Database::GetSampleFileExtension(const std::string &filename) { std::string extension; try { - rc = sqlite3_open(dbPath.c_str(), &m_Database); + const auto sql = "SELECT EXTENSION FROM SAMPLES WHERE FILENAME = ?;"; + Sqlite3Statement statement(m_Database, sql); - std::string select = "SELECT EXTENSION FROM SAMPLES WHERE FILENAME = ?;"; + throw_on_sqlite3_error(sqlite3_bind_text(statement.stmt, 1, filename.c_str(), filename.size(), SQLITE_STATIC)); - rc = sqlite3_prepare_v2(m_Database, select.c_str(), select.size(), &m_Stmt, NULL); - - rc = sqlite3_bind_text(m_Stmt, 1, filename.c_str(), filename.size(), SQLITE_STATIC); - - if (sqlite3_step(m_Stmt) == SQLITE_ROW) + if (sqlite3_step(statement.stmt) == SQLITE_ROW) { - wxLogDebug("Record found, fetching.."); - extension = std::string(reinterpret_cast(sqlite3_column_text(m_Stmt, 0))); + wxLogInfo("Record found, fetching.."); + extension = std::string(reinterpret_cast(sqlite3_column_text(statement.stmt, 0))); } - rc = sqlite3_finalize(m_Stmt); - - if (rc != SQLITE_OK) - { - wxMessageDialog msgDialog(NULL, "Error! Cannot select sample path from table.", - "Error", wxOK | wxICON_ERROR); - msgDialog.ShowModal(); - sqlite3_free(m_ErrMsg); - } - else - { - wxLogDebug("Selected data from table successfully."); - } - - sqlite3_close(m_Database); + wxLogDebug("Selected data from table successfully."); } - catch (const std::exception &exception) + catch (const std::exception &e) { - wxLogDebug(exception.what()); + show_modal_dialog_and_log("Error! Cannot select sample extension from table: ", "Error", e.what()); } return extension; } -wxVector> -Database::LoadSamplesDatabase(const std::string& dbPath, wxVector>& vecSet, - // wxTreeCtrl& favorite_tree, wxTreeItemId& favorite_item, - wxDataViewTreeCtrl& favorite_tree, wxDataViewItem& favorite_item, - wxTreeCtrl& trash_tree, wxTreeItemId& trash_item, bool show_extension, - const std::string& icon_star_filled, const std::string& icon_star_empty) +wxVector> Database::LoadSamplesDatabase( + // wxTreeCtrl& favorite_tree, wxTreeItemId& favorite_item, + wxDataViewTreeCtrl &favorite_tree, wxDataViewItem &favorite_item, + wxTreeCtrl &trash_tree, wxTreeItemId &trash_item, bool show_extension, + const std::string &icon_star_filled, const std::string &icon_star_empty) { + wxVector> vecSet; + wxVariant icon_filled, icon_empty; + icon_filled = wxVariant(wxBitmap(icon_star_filled)); + icon_empty = wxVariant(wxBitmap(icon_star_empty)); try { - if (sqlite3_open(dbPath.c_str(), &m_Database) != SQLITE_OK) + + int numRows = 0; + Sqlite3Statement statement1(m_Database, "SELECT Count(*) FROM SAMPLES;"); + if (SQLITE_ROW == sqlite3_step(statement1.stmt)) { - wxLogDebug("Error opening DB"); - throw sqlite3_errmsg(m_Database); + numRows = sqlite3_column_int(statement1.stmt, 0); + wxLogDebug("rows %d", numRows); + vecSet.reserve(numRows); } - std::string load = "SELECT FAVORITE, FILENAME, EXTENSION, SAMPLEPACK, \ + Sqlite3Statement statement(m_Database, "SELECT FAVORITE, FILENAME, EXTENSION, SAMPLEPACK, \ TYPE, CHANNELS, LENGTH, SAMPLERATE, BITRATE, PATH, \ - TRASHED, HIVE FROM SAMPLES;"; + TRASHED, HIVE FROM SAMPLES;"); - rc = sqlite3_prepare_v2(m_Database, load.c_str(), load.size(), &m_Stmt, NULL); + int row = 0; - if (rc == SQLITE_OK) + while (SQLITE_ROW == sqlite3_step(statement.stmt)) { - int row = 0; + int favorite = sqlite3_column_int(statement.stmt, 0); + wxString filename = std::string(reinterpret_cast(sqlite3_column_text(statement.stmt, 1))); + wxString file_extension = std::string(reinterpret_cast(sqlite3_column_text(statement.stmt, 2))); + wxString sample_pack = std::string(reinterpret_cast(sqlite3_column_text(statement.stmt, 3))); + wxString sample_type = std::string(reinterpret_cast(sqlite3_column_text(statement.stmt, 4))); + int channels = sqlite3_column_int(statement.stmt, 5); + int length = sqlite3_column_int(statement.stmt, 6); + int sample_rate = sqlite3_column_int(statement.stmt, 7); + int bitrate = sqlite3_column_int(statement.stmt, 8); + wxString path = std::string(reinterpret_cast(sqlite3_column_text(statement.stmt, 9))); + int trashed = sqlite3_column_int(statement.stmt, 10); + wxString hive_name = std::string(reinterpret_cast(sqlite3_column_text(statement.stmt, 11))); - while (SQLITE_ROW == sqlite3_step(m_Stmt)) + wxLongLong llLength = length; + int total_min = static_cast((llLength / 60000).GetValue()); + int total_sec = static_cast(((llLength % 60000) / 1000).GetValue()); + + wxVector vec; + vec.reserve(12); + if (trashed == 1) { - int favorite = sqlite3_column_int(m_Stmt, 0); - wxString filename = std::string(reinterpret_cast(sqlite3_column_text(m_Stmt, 1))); - wxString file_extension = std::string(reinterpret_cast(sqlite3_column_text(m_Stmt, 2))); - wxString sample_pack = std::string(reinterpret_cast(sqlite3_column_text(m_Stmt, 3))); - wxString sample_type = std::string(reinterpret_cast(sqlite3_column_text(m_Stmt, 4))); - int channels = sqlite3_column_int(m_Stmt, 5); - int length = sqlite3_column_int(m_Stmt, 6); - int sample_rate = sqlite3_column_int(m_Stmt, 7); - int bitrate = sqlite3_column_int(m_Stmt, 8); - wxString path = std::string(reinterpret_cast(sqlite3_column_text(m_Stmt, 9))); - int trashed = sqlite3_column_int(m_Stmt, 10); - wxString hive_name = std::string(reinterpret_cast(sqlite3_column_text(m_Stmt, 11))); - - wxLongLong llLength = length; - int total_min = static_cast((llLength / 60000).GetValue()); - int total_sec = static_cast(((llLength % 60000) / 1000).GetValue()); - - wxVector vec; - - if (trashed == 1) + if (show_extension) + trash_tree.AppendItem(trash_item, wxString::Format("%s.%s", filename, file_extension)); + else + trash_tree.AppendItem(trash_item, filename); + } + else + { + if (favorite == 1) { - if (show_extension) - trash_tree.AppendItem(trash_item, wxString::Format("%s.%s", filename, file_extension)); - else - trash_tree.AppendItem(trash_item, filename); + // vec.push_back(true); + vec.push_back(icon_filled); + + wxLogDebug("Loading hives.."); + + std::deque nodes; + nodes.push_back(favorite_tree.GetNthChild(wxDataViewItem(wxNullPtr), 0)); + + wxDataViewItem current_item, found_item; + + int row = 0; + int hive_count = favorite_tree.GetChildCount(wxDataViewItem(wxNullPtr)); + + while (!nodes.empty()) + { + current_item = nodes.front(); + nodes.pop_front(); + + if (favorite_tree.GetItemText(current_item) == hive_name) + { + found_item = current_item; + wxLogDebug("Loading, hive name: %s", hive_name); + break; + } + + wxDataViewItem child = favorite_tree.GetNthChild(wxDataViewItem(wxNullPtr), 0); + + while (row < (hive_count - 1)) + { + row++; + + child = favorite_tree.GetNthChild(wxDataViewItem(wxNullPtr), row); + nodes.push_back(child); + } + } + + nodes.clear(); + + if (found_item.IsOk()) + { + // wxLogDebug("Another hive by the name %s already exist. Please try with a different name.", + // hive_name); + if (show_extension) + favorite_tree.AppendItem(found_item, + wxString::Format("%s.%s", filename, file_extension)); + else + favorite_tree.AppendItem(found_item, filename); + } + // else + // { + // favorite_tree.AppendItem(wxDataViewItem(wxNullPtr), hive_name); + // } + } + else + // vec.push_back(false); + vec.push_back(icon_empty); + + if (show_extension) + { + vec.push_back(path.AfterLast('/')); } else { - wxVariant icon_filled, icon_empty; - icon_filled = wxVariant(wxBitmap(icon_star_filled)); - icon_empty = wxVariant(wxBitmap(icon_star_empty)); - - if (favorite == 1) - { - // vec.push_back(true); - vec.push_back(icon_filled); - - wxLogDebug("Loading hives.."); - - std::deque nodes; - nodes.push_back(favorite_tree.GetNthChild(wxDataViewItem(wxNullPtr), 0)); - - wxDataViewItem current_item, found_item; - - int row = 0; - int hive_count = favorite_tree.GetChildCount(wxDataViewItem(wxNullPtr)); - - while(!nodes.empty()) - { - current_item = nodes.front(); - nodes.pop_front(); - - if (favorite_tree.GetItemText(current_item) == hive_name) - { - found_item = current_item; - wxLogDebug("Loading, hive name: %s", hive_name); - break; - } - - wxDataViewItem child = favorite_tree.GetNthChild(wxDataViewItem(wxNullPtr), 0); - - while (row < (hive_count - 1)) - { - row ++; - - child = favorite_tree.GetNthChild(wxDataViewItem(wxNullPtr), row); - nodes.push_back(child); - } - } - - nodes.clear(); - - if (found_item.IsOk()) - { - // wxLogDebug("Another hive by the name %s already exist. Please try with a different name.", - // hive_name); - if (show_extension) - favorite_tree.AppendItem(found_item, - wxString::Format("%s.%s", filename, file_extension)); - else - favorite_tree.AppendItem(found_item, filename); - } - // else - // { - // favorite_tree.AppendItem(wxDataViewItem(wxNullPtr), hive_name); - // } - - } - else - // vec.push_back(false); - vec.push_back(icon_empty); - - if (show_extension) - { - vec.push_back(path.AfterLast('/')); - } - else - { - vec.push_back(path.AfterLast('/').BeforeLast('.')); - } - - vec.push_back(sample_pack); - vec.push_back(sample_type); - vec.push_back(wxString::Format("%d", channels)); - vec.push_back(wxString::Format("%2i:%02i", total_min, total_sec)); - vec.push_back(wxString::Format("%d", sample_rate)); - vec.push_back(wxString::Format("%d", bitrate)); - vec.push_back(path); - - vecSet.push_back(vec); + vec.push_back(path.AfterLast('/').BeforeLast('.')); } + vec.push_back(sample_pack); + vec.push_back(sample_type); + vec.push_back(wxString::Format("%d", channels)); + vec.push_back(wxString::Format("%2i:%02i", total_min, total_sec)); + vec.push_back(wxString::Format("%d", sample_rate)); + vec.push_back(wxString::Format("%d", bitrate)); + vec.push_back(path); - row++; + vecSet.push_back(vec); } - } - else - { - wxMessageDialog msgDialog(NULL, "Error! Cannot load data from table.", - "Error", wxOK | wxICON_ERROR); - msgDialog.ShowModal(); - sqlite3_free(m_ErrMsg); - } - rc = sqlite3_finalize(m_Stmt); - - sqlite3_close(m_Database); + row++; + } } - catch (const std::exception &exception) + catch (const std::exception &e) { - wxLogDebug(exception.what()); + show_modal_dialog_and_log("Error! Cannot load data from table: ", "Error", e.what()); } return vecSet; } wxVector> -Database::FilterDatabaseBySampleName(const std::string& dbPath, wxVector>& sampleVec, - const std::string& sampleName, bool show_extension, - const std::string& icon_star_filled, const std::string& icon_star_empty) +Database::FilterDatabaseBySampleName(const std::string &sampleName, bool show_extension, + const std::string &icon_star_filled, const std::string &icon_star_empty) { + wxVector> sampleVec; + wxVariant icon_filled, icon_empty; + icon_filled = wxVariant(wxBitmap(icon_star_filled)); + icon_empty = wxVariant(wxBitmap(icon_star_empty)); try { - if (sqlite3_open(dbPath.c_str(), &m_Database) != SQLITE_OK) - { - wxLogDebug("Error opening DB"); - throw sqlite3_errmsg(m_Database); - } - - std::string filter = "SELECT FAVORITE, FILENAME, SAMPLEPACK, TYPE, \ + Sqlite3Statement statement(m_Database, "SELECT FAVORITE, FILENAME, SAMPLEPACK, TYPE, \ CHANNELS, LENGTH, SAMPLERATE, BITRATE, PATH \ - FROM SAMPLES WHERE FILENAME LIKE '%' || ? || '%';"; + FROM SAMPLES WHERE FILENAME LIKE '%' || ? || '%' ;"); + throw_on_sqlite3_error(sqlite3_bind_text(statement.stmt, 1, sampleName.c_str(), sampleName.size(), SQLITE_STATIC)); - rc = sqlite3_prepare_v2(m_Database, filter.c_str(), filter.size(), &m_Stmt, NULL); + int row = 0; - rc = sqlite3_bind_text(m_Stmt, 1, sampleName.c_str(), sampleName.size(), SQLITE_STATIC); - - if (rc == SQLITE_OK) + while (SQLITE_ROW == sqlite3_step(statement.stmt)) { - int row = 0; + wxLogDebug("Record found, fetching.."); + int favorite = sqlite3_column_int(statement.stmt, 0); + wxString filename = wxString(std::string(reinterpret_cast(sqlite3_column_text(statement.stmt, 1)))); + wxString sample_pack = wxString(std::string(reinterpret_cast(sqlite3_column_text(statement.stmt, 2)))); + wxString sample_type = std::string(reinterpret_cast(sqlite3_column_text(statement.stmt, 3))); + int channels = sqlite3_column_int(statement.stmt, 4); + int length = sqlite3_column_int(statement.stmt, 5); + int sample_rate = sqlite3_column_int(statement.stmt, 6); + int bitrate = sqlite3_column_int(statement.stmt, 7); + wxString path = wxString(std::string(reinterpret_cast(sqlite3_column_text(statement.stmt, 8)))); - while (SQLITE_ROW == sqlite3_step(m_Stmt)) + wxLongLong llLength = length; + int total_min = static_cast((llLength / 60000).GetValue()); + int total_sec = static_cast(((llLength % 60000) / 1000).GetValue()); + + wxVector vec; + + if (favorite == 1) + vec.push_back(icon_filled); + else + vec.push_back(icon_empty); + + // if (favorite == 1) + // vec.push_back(true); + // else + // vec.push_back(false); + + // vec.push_back(filename); + + if (show_extension) { - wxLogDebug("Record found, fetching.."); - int favorite = sqlite3_column_int(m_Stmt, 0); - wxString filename = wxString(std::string(reinterpret_cast(sqlite3_column_text(m_Stmt, 1)))); - wxString sample_pack = wxString(std::string(reinterpret_cast(sqlite3_column_text(m_Stmt, 2)))); - wxString sample_type = std::string(reinterpret_cast(sqlite3_column_text(m_Stmt, 3))); - int channels = sqlite3_column_int(m_Stmt, 4); - int length = sqlite3_column_int(m_Stmt, 5); - int sample_rate = sqlite3_column_int(m_Stmt, 6); - int bitrate = sqlite3_column_int(m_Stmt, 7); - wxString path = wxString(std::string(reinterpret_cast(sqlite3_column_text(m_Stmt, 8)))); - - wxLongLong llLength = length; - int total_min = static_cast((llLength / 60000).GetValue()); - int total_sec = static_cast(((llLength % 60000) / 1000).GetValue()); - - wxVector vec; - - wxVariant icon_filled, icon_empty; - icon_filled = wxVariant(wxBitmap(icon_star_filled)); - icon_empty = wxVariant(wxBitmap(icon_star_empty)); - - if (favorite == 1) - vec.push_back(icon_filled); - else - vec.push_back(icon_empty); - - // if (favorite == 1) - // vec.push_back(true); - // else - // vec.push_back(false); - - // vec.push_back(filename); - - if (show_extension) - { - vec.push_back(path.AfterLast('/')); - } - else - { - vec.push_back(path.AfterLast('/').BeforeLast('.')); - } - - vec.push_back(sample_pack); - vec.push_back(sample_type); - vec.push_back(wxString::Format("%d", channels)); - vec.push_back(wxString::Format("%2i:%02i", total_min, total_sec)); - vec.push_back(wxString::Format("%d", sample_rate)); - vec.push_back(wxString::Format("%d", bitrate)); - vec.push_back(path); - - sampleVec.push_back(vec); - - row++; + vec.push_back(path.AfterLast('/')); + } + else + { + vec.push_back(path.AfterLast('/').BeforeLast('.')); } - } - else - { - wxMessageDialog msgDialog(NULL, "Error! Cannot filter data from table.", - "Error", wxOK | wxICON_ERROR); - msgDialog.ShowModal(); - sqlite3_free(m_ErrMsg); - } - rc = sqlite3_finalize(m_Stmt); + vec.push_back(sample_pack); + vec.push_back(sample_type); + vec.push_back(wxString::Format("%d", channels)); + vec.push_back(wxString::Format("%2i:%02i", total_min, total_sec)); + vec.push_back(wxString::Format("%d", sample_rate)); + vec.push_back(wxString::Format("%d", bitrate)); + vec.push_back(path); - sqlite3_close(m_Database); + sampleVec.push_back(vec); + + row++; + } } - catch (const std::exception &exception) + catch (const std::exception &e) { - wxLogDebug(exception.what()); + show_modal_dialog_and_log("Error! Cannot filter data from table: ", "Error", e.what()); } return sampleVec; } wxVector> -Database::FilterDatabaseByHiveName(const std::string& dbPath, wxVector>& sampleVec, - const std::string& hiveName, bool show_extension, - const std::string& icon_star_filled, const std::string& icon_star_empty) +Database::FilterDatabaseByHiveName(const std::string &hiveName, bool show_extension, + const std::string &icon_star_filled, const std::string &icon_star_empty) { + wxVector> sampleVec; + wxVariant icon_filled, icon_empty; + icon_filled = wxVariant(wxBitmap(icon_star_filled)); + icon_empty = wxVariant(wxBitmap(icon_star_empty)); try { - if (sqlite3_open(dbPath.c_str(), &m_Database) != SQLITE_OK) - { - wxLogDebug("Error opening DB"); - throw sqlite3_errmsg(m_Database); - } - - std::string filter = "SELECT FAVORITE, FILENAME, SAMPLEPACK, TYPE, \ + Sqlite3Statement statement(m_Database, "SELECT FAVORITE, FILENAME, SAMPLEPACK, TYPE, \ CHANNELS, LENGTH, SAMPLERATE, BITRATE, PATH \ - FROM SAMPLES WHERE HIVE = ? AND FAVORITE = 1;"; + FROM SAMPLES WHERE HIVE = ? AND FAVORITE = 1;"); - rc = sqlite3_prepare_v2(m_Database, filter.c_str(), filter.size(), &m_Stmt, NULL); + throw_on_sqlite3_error(sqlite3_bind_text(statement.stmt, 1, hiveName.c_str(), hiveName.size(), SQLITE_STATIC)); - rc = sqlite3_bind_text(m_Stmt, 1, hiveName.c_str(), hiveName.size(), SQLITE_STATIC); + int row = 0; - if (rc == SQLITE_OK) + while (SQLITE_ROW == sqlite3_step(statement.stmt)) { - int row = 0; + wxLogDebug("Record found, fetching.."); + int favorite = sqlite3_column_int(statement.stmt, 0); + wxString filename = wxString(std::string(reinterpret_cast(sqlite3_column_text(statement.stmt, 1)))); + wxString sample_pack = wxString(std::string(reinterpret_cast(sqlite3_column_text(statement.stmt, 2)))); + wxString sample_type = std::string(reinterpret_cast(sqlite3_column_text(statement.stmt, 3))); + int channels = sqlite3_column_int(statement.stmt, 4); + int length = sqlite3_column_int(statement.stmt, 5); + int sample_rate = sqlite3_column_int(statement.stmt, 6); + int bitrate = sqlite3_column_int(statement.stmt, 7); + wxString path = wxString(std::string(reinterpret_cast(sqlite3_column_text(statement.stmt, 8)))); - while (SQLITE_ROW == sqlite3_step(m_Stmt)) + wxLongLong llLength = length; + int total_min = static_cast((llLength / 60000).GetValue()); + int total_sec = static_cast(((llLength % 60000) / 1000).GetValue()); + + wxVector vec; + + if (favorite == 1) + vec.push_back(icon_filled); + else + vec.push_back(icon_empty); + + // if (favorite == 1) + // vec.push_back(true); + // else + // vec.push_back(false); + + // vec.push_back(filename); + + if (show_extension) { - wxLogDebug("Record found, fetching.."); - int favorite = sqlite3_column_int(m_Stmt, 0); - wxString filename = wxString(std::string(reinterpret_cast(sqlite3_column_text(m_Stmt, 1)))); - wxString sample_pack = wxString(std::string(reinterpret_cast(sqlite3_column_text(m_Stmt, 2)))); - wxString sample_type = std::string(reinterpret_cast(sqlite3_column_text(m_Stmt, 3))); - int channels = sqlite3_column_int(m_Stmt, 4); - int length = sqlite3_column_int(m_Stmt, 5); - int sample_rate = sqlite3_column_int(m_Stmt, 6); - int bitrate = sqlite3_column_int(m_Stmt, 7); - wxString path = wxString(std::string(reinterpret_cast(sqlite3_column_text(m_Stmt, 8)))); - - wxLongLong llLength = length; - int total_min = static_cast((llLength / 60000).GetValue()); - int total_sec = static_cast(((llLength % 60000) / 1000).GetValue()); - - wxVector vec; - - wxVariant icon_filled, icon_empty; - icon_filled = wxVariant(wxBitmap(icon_star_filled)); - icon_empty = wxVariant(wxBitmap(icon_star_empty)); - - if (favorite == 1) - vec.push_back(icon_filled); - else - vec.push_back(icon_empty); - - // if (favorite == 1) - // vec.push_back(true); - // else - // vec.push_back(false); - - // vec.push_back(filename); - - if (show_extension) - { - vec.push_back(path.AfterLast('/')); - } - else - { - vec.push_back(path.AfterLast('/').BeforeLast('.')); - } - - vec.push_back(sample_pack); - vec.push_back(sample_type); - vec.push_back(wxString::Format("%d", channels)); - vec.push_back(wxString::Format("%2i:%02i", total_min, total_sec)); - vec.push_back(wxString::Format("%d", sample_rate)); - vec.push_back(wxString::Format("%d", bitrate)); - vec.push_back(path); - - sampleVec.push_back(vec); - - row++; + vec.push_back(path.AfterLast('/')); + } + else + { + vec.push_back(path.AfterLast('/').BeforeLast('.')); } - } - else - { - wxMessageDialog msgDialog(NULL, "Error! Cannot filter data from table.", - "Error", wxOK | wxICON_ERROR); - msgDialog.ShowModal(); - sqlite3_free(m_ErrMsg); - } - rc = sqlite3_finalize(m_Stmt); + vec.push_back(sample_pack); + vec.push_back(sample_type); + vec.push_back(wxString::Format("%d", channels)); + vec.push_back(wxString::Format("%2i:%02i", total_min, total_sec)); + vec.push_back(wxString::Format("%d", sample_rate)); + vec.push_back(wxString::Format("%d", bitrate)); + vec.push_back(path); - sqlite3_close(m_Database); + sampleVec.push_back(vec); + + row++; + } } - catch (const std::exception &exception) + catch (const std::exception &e) { - wxLogDebug(exception.what()); + show_modal_dialog_and_log("Error! Cannot filter data from table: ", "Error", e.what()); } return sampleVec; } -void Database::LoadHivesDatabase(const std::string& dbPath, wxDataViewTreeCtrl& treeCtrl) +void Database::LoadHivesDatabase(wxDataViewTreeCtrl &treeCtrl) { try { - if (sqlite3_open(dbPath.c_str(), &m_Database) != SQLITE_OK) + const auto sql = "SELECT HIVE FROM HIVES;"; + Sqlite3Statement statement(m_Database, sql); + + while (SQLITE_ROW == sqlite3_step(statement.stmt)) { - wxLogDebug("Error opening DB"); - throw sqlite3_errmsg(m_Database); + wxLogDebug("Record found, fetching.."); + const auto hive = wxString(std::string(reinterpret_cast(sqlite3_column_text(statement.stmt, 0)))); + + treeCtrl.AppendContainer(wxDataViewItem(wxNullPtr), hive); } - - std::string select = "SELECT HIVE FROM HIVES;"; - - rc = sqlite3_prepare_v2(m_Database, select.c_str(), select.size(), &m_Stmt, NULL); - - if (rc == SQLITE_OK) - { - while (SQLITE_ROW == sqlite3_step(m_Stmt)) - { - wxLogDebug("Record found, fetching.."); - wxString hive = wxString(std::string(reinterpret_cast(sqlite3_column_text(m_Stmt, 0)))); - - treeCtrl.AppendContainer(wxDataViewItem(wxNullPtr), hive); - } - } - else - { - wxMessageDialog msgDialog(NULL, "Error! Cannot load hive from hives table.", - "Error", wxOK | wxICON_ERROR); - msgDialog.ShowModal(); - sqlite3_free(m_ErrMsg); - } - - rc = sqlite3_finalize(m_Stmt); - - sqlite3_close(m_Database); } - catch (const std::exception &exception) + catch (const std::exception &e) { - wxLogDebug(exception.what()); + show_modal_dialog_and_log("Error! Cannot load hive from hives table: ", "Error", e.what()); } } //Compares the input array with the database and removes duplicates. -wxArrayString Database::CheckDuplicates(const std::string& dbPath, const wxArrayString& files) +wxArrayString Database::CheckDuplicates(const wxArrayString &files) { wxArrayString sorted_files; @@ -1267,210 +866,158 @@ wxArrayString Database::CheckDuplicates(const std::string& dbPath, const wxArray try { - rc = sqlite3_open(dbPath.c_str(), &m_Database); + const auto sql = "SELECT * FROM SAMPLES WHERE FILENAME = ?;"; + Sqlite3Statement statement(m_Database, sql); - std::string select = "SELECT * FROM SAMPLES WHERE FILENAME = ?;"; - - rc = sqlite3_prepare_v2(m_Database, select.c_str(), select.size(), &m_Stmt, NULL); - - for(unsigned int i = 0; i < files.size(); i++) + for (unsigned int i = 0; i < files.size(); i++) { filename = files[i].AfterLast('/').BeforeLast('.').ToStdString(); - rc = sqlite3_bind_text(m_Stmt, 1, filename.c_str(), filename.size(), SQLITE_STATIC); - - if (sqlite3_step(m_Stmt) != SQLITE_ROW) + throw_on_sqlite3_error(sqlite3_bind_text(statement.stmt, 1, filename.c_str(), filename.size(), SQLITE_STATIC)); + + if (sqlite3_step(statement.stmt) != SQLITE_ROW) sorted_files.push_back(files[i]); else wxLogDebug("Already added: %s. Skipping..", files[i]); - rc = sqlite3_clear_bindings(m_Stmt); - rc = sqlite3_reset(m_Stmt); + rc = sqlite3_clear_bindings(statement.stmt); + rc = sqlite3_reset(statement.stmt); } - - sqlite3_finalize(m_Stmt); - sqlite3_close(m_Database); } catch (const std::exception &exception) { wxLogDebug(exception.what()); } - return sorted_files; + return sorted_files; } -bool Database::IsTrashed(const std::string& dbPath, const std::string& filename) +bool Database::IsTrashed(const std::string &filename) { try { - rc = sqlite3_open(dbPath.c_str(), &m_Database); + const auto sql = "SELECT TRASHED FROM SAMPLES WHERE FILENAME = ?;"; + Sqlite3Statement statement(m_Database, sql); - std::string select = "SELECT TRASHED FROM SAMPLES WHERE FILENAME = ?;"; + throw_on_sqlite3_error(sqlite3_bind_text(statement.stmt, 1, filename.c_str(), filename.size(), SQLITE_STATIC)); - rc = sqlite3_prepare_v2(m_Database, select.c_str(), select.size(), &m_Stmt, NULL); - - rc = sqlite3_bind_text(m_Stmt, 1, filename.c_str(), filename.size(), SQLITE_STATIC); - - if (sqlite3_step(m_Stmt) == SQLITE_ROW) + if (sqlite3_step(statement.stmt) == SQLITE_ROW) { wxLogDebug("Record found, fetching.."); - if (sqlite3_column_int(m_Stmt, 0) == 1) + if (sqlite3_column_int(statement.stmt, 0) == 1) return true; } - rc = sqlite3_finalize(m_Stmt); - - if (rc != SQLITE_OK) - { - wxMessageDialog msgDialog(NULL, "Error! Cannot select sample path from table.", - "Error", wxOK | wxICON_ERROR); - msgDialog.ShowModal(); - sqlite3_free(m_ErrMsg); - } - else - { - wxLogDebug("Selected data from table successfully."); - } - - sqlite3_close(m_Database); + wxLogDebug("Selected data from table successfully."); } - catch (const std::exception &exception) + catch (const std::exception &e) { - wxLogDebug(exception.what()); + show_modal_dialog_and_log("Error! Cannot select sample path from table: ", "Error", e.what()); } return false; } -void Database::UpdateTrashColumn(const std::string& dbPath, const std::string& filename, int value) +void Database::UpdateTrashColumn(const std::string &filename, int value) { try { - rc = sqlite3_open(dbPath.c_str(), &m_Database); + const auto sql = "UPDATE SAMPLES SET TRASHED = ? WHERE FILENAME = ?;"; + Sqlite3Statement statement(m_Database, sql); - std::string update = "UPDATE SAMPLES SET TRASHED = ? WHERE FILENAME = ?;"; + throw_on_sqlite3_error(sqlite3_bind_int(statement.stmt, 1, value)); + throw_on_sqlite3_error(sqlite3_bind_text(statement.stmt, 2, filename.c_str(), filename.size(), SQLITE_STATIC)); - rc = sqlite3_prepare_v2(m_Database, update.c_str(), update.size(), &m_Stmt, NULL); - - rc = sqlite3_bind_int(m_Stmt, 1, value); - rc = sqlite3_bind_text(m_Stmt, 2, filename.c_str(), filename.size(), SQLITE_STATIC); - - if (sqlite3_step(m_Stmt) == SQLITE_ROW) + if (sqlite3_step(statement.stmt) == SQLITE_ROW) { wxLogDebug("Record found, updating.."); } - rc = sqlite3_finalize(m_Stmt); - - if (rc != SQLITE_OK) - { - wxMessageDialog msgDialog(NULL, "Error! Cannot update record.", - "Error", wxOK | wxICON_ERROR); - msgDialog.ShowModal(); - sqlite3_free(m_ErrMsg); - } - else - { - wxLogDebug("Updated record successfully."); - } - - sqlite3_close(m_Database); + wxLogDebug("Updated record successfully."); } - catch (const std::exception &exception) + catch (const std::exception &e) { - wxLogDebug(exception.what()); + show_modal_dialog_and_log("Error! Cannot update record: ", "Error", e.what()); } } wxVector> -Database::RestoreFromTrashByFilename(const std::string& dbPath, const std::string& filename, - wxVector>& vecSet, bool show_extension, - const std::string& icon_star_filled, const std::string& icon_star_empty) +Database::RestoreFromTrashByFilename(const std::string &filename, + wxVector> &vecSet, bool show_extension, + const std::string &icon_star_filled, const std::string &icon_star_empty) { + wxVariant icon_filled, icon_empty; + icon_filled = wxVariant(wxBitmap(icon_star_filled)); + icon_empty = wxVariant(wxBitmap(icon_star_empty)); try { - if (sqlite3_open(dbPath.c_str(), &m_Database) != SQLITE_OK) - { - wxLogDebug("Error opening DB"); - throw sqlite3_errmsg(m_Database); - } - - std::string restore = "SELECT FAVORITE, FILENAME, EXTENSION, SAMPLEPACK, \ + const auto sql = "SELECT FAVORITE, FILENAME, EXTENSION, SAMPLEPACK, \ TYPE, CHANNELS, LENGTH, SAMPLERATE, BITRATE, PATH, \ TRASHED, HIVE FROM SAMPLES WHERE FILENAME = ?;"; + Sqlite3Statement statement(m_Database, sql); - rc = sqlite3_prepare_v2(m_Database, restore.c_str(), restore.size(), &m_Stmt, NULL); + throw_on_sqlite3_error(sqlite3_bind_text(statement.stmt, 1, filename.c_str(), filename.size(), SQLITE_STATIC)); - rc = sqlite3_bind_text(m_Stmt, 1, filename.c_str(), filename.size(), SQLITE_STATIC); - - if (rc == SQLITE_OK) + while (SQLITE_ROW == sqlite3_step(statement.stmt)) { - while (SQLITE_ROW == sqlite3_step(m_Stmt)) + int favorite = sqlite3_column_int(statement.stmt, 0); + wxString filename = std::string(reinterpret_cast(sqlite3_column_text(statement.stmt, 1))); + wxString file_extension = std::string(reinterpret_cast(sqlite3_column_text(statement.stmt, 2))); + wxString sample_pack = std::string(reinterpret_cast(sqlite3_column_text(statement.stmt, 3))); + wxString sample_type = std::string(reinterpret_cast(sqlite3_column_text(statement.stmt, 4))); + int channels = sqlite3_column_int(statement.stmt, 5); + int length = sqlite3_column_int(statement.stmt, 6); + int sample_rate = sqlite3_column_int(statement.stmt, 7); + int bitrate = sqlite3_column_int(statement.stmt, 8); + wxString path = std::string(reinterpret_cast(sqlite3_column_text(statement.stmt, 9))); + int trashed = sqlite3_column_int(statement.stmt, 10); + wxString hive_name = std::string(reinterpret_cast(sqlite3_column_text(statement.stmt, 11))); + + wxLongLong llLength = length; + int total_min = static_cast((llLength / 60000).GetValue()); + int total_sec = static_cast(((llLength % 60000) / 1000).GetValue()); + + wxVector vec; + + if (trashed == 0) { - int favorite = sqlite3_column_int(m_Stmt, 0); - wxString filename = std::string(reinterpret_cast(sqlite3_column_text(m_Stmt, 1))); - wxString file_extension = std::string(reinterpret_cast(sqlite3_column_text(m_Stmt, 2))); - wxString sample_pack = std::string(reinterpret_cast(sqlite3_column_text(m_Stmt, 3))); - wxString sample_type = std::string(reinterpret_cast(sqlite3_column_text(m_Stmt, 4))); - int channels = sqlite3_column_int(m_Stmt, 5); - int length = sqlite3_column_int(m_Stmt, 6); - int sample_rate = sqlite3_column_int(m_Stmt, 7); - int bitrate = sqlite3_column_int(m_Stmt, 8); - wxString path = std::string(reinterpret_cast(sqlite3_column_text(m_Stmt, 9))); - int trashed = sqlite3_column_int(m_Stmt, 10); - wxString hive_name = std::string(reinterpret_cast(sqlite3_column_text(m_Stmt, 11))); + if (favorite == 1) + vec.push_back(icon_filled); + else + vec.push_back(icon_empty); - wxLongLong llLength = length; - int total_min = static_cast((llLength / 60000).GetValue()); - int total_sec = static_cast(((llLength % 60000) / 1000).GetValue()); + if (show_extension) + vec.push_back(path.AfterLast('/')); + else + vec.push_back(path.AfterLast('/').BeforeLast('.')); - wxVector vec; + vec.push_back(sample_pack); + vec.push_back(sample_type); + vec.push_back(wxString::Format("%d", channels)); + vec.push_back(wxString::Format("%2i:%02i", total_min, total_sec)); + vec.push_back(wxString::Format("%d", sample_rate)); + vec.push_back(wxString::Format("%d", bitrate)); + vec.push_back(path); - wxVariant icon_filled, icon_empty; - icon_filled = wxVariant(wxBitmap(icon_star_filled)); - icon_empty = wxVariant(wxBitmap(icon_star_empty)); - - if (trashed == 0) - { - if (favorite == 1) - vec.push_back(icon_filled); - else - vec.push_back(icon_empty); - - if (show_extension) - vec.push_back(path.AfterLast('/')); - else - vec.push_back(path.AfterLast('/').BeforeLast('.')); - - vec.push_back(sample_pack); - vec.push_back(sample_type); - vec.push_back(wxString::Format("%d", channels)); - vec.push_back(wxString::Format("%2i:%02i", total_min, total_sec)); - vec.push_back(wxString::Format("%d", sample_rate)); - vec.push_back(wxString::Format("%d", bitrate)); - vec.push_back(path); - - vecSet.push_back(vec); - } + vecSet.push_back(vec); } } - else - { - wxMessageDialog msgDialog(NULL, "Error! Cannot load data from table.", - "Error", wxOK | wxICON_ERROR); - msgDialog.ShowModal(); - sqlite3_free(m_ErrMsg); - } - - rc = sqlite3_finalize(m_Stmt); - - sqlite3_close(m_Database); } - catch (const std::exception &exception) + catch (const std::exception &e) { - wxLogDebug(exception.what()); + show_modal_dialog_and_log("Error! Cannot load data from table: ", "Error", e.what()); } return vecSet; } + +void Database::open(const std::string &dbPath) +{ + throw_on_sqlite3_error(sqlite3_open(dbPath.c_str(), &m_Database)); +} + +void Database::close() +{ + throw_on_sqlite3_error(sqlite3_close(m_Database)); +} diff --git a/src/Database.hpp b/src/Database.hpp index 0736db8..0eeb247 100644 --- a/src/Database.hpp +++ b/src/Database.hpp @@ -17,6 +17,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ +#pragma once #include "Sample.hpp" @@ -36,7 +37,7 @@ class Database { public: - Database(wxInfoBar& infoBar); + Database(wxInfoBar& infoBar, const std::string& dbPath); ~Database(); private: @@ -44,69 +45,68 @@ class Database sqlite3* m_Database; int rc; char* m_ErrMsg; - sqlite3_stmt* m_Stmt; private: // ------------------------------------------------------------------- wxInfoBar& m_InfoBar; + void open(const std::string& dbPath); + void close(); + public: // ------------------------------------------------------------------- // Create the table - void CreateTableSamples(const std::string& dbPath); - void CreateTableHives(const std::string& dbPath); + void CreateTableSamples(); + void CreateTableHives(); // ------------------------------------------------------------------- // Insert into database - void InsertIntoSamples(const std::string& dbPath, std::vector); - void InsertIntoHives(const std::string& dbPath, const std::string& hiveName); + void InsertIntoSamples(const std::vector&); + void InsertIntoHives(const std::string& hiveName); // ------------------------------------------------------------------- // Update database - void UpdateFavoriteColumn(const std::string& dbPath, const std::string& filename, int value); - void UpdateHive(const std::string& dbPath, const std::string& hiveOldName, const std::string& hiveNewName); - void UpdateHiveName(const std::string& dbPath, const std::string& filename, const std::string& hiveName); - void UpdateTrashColumn(const std::string& dbPath, const std::string& filename, int value); - void UpdateSamplePack(const std::string& dbPath, const std::string& filename, const std::string& samplePack); - void UpdateSampleType(const std::string& dbPath, const std::string& filename, const std::string& type); + void UpdateFavoriteColumn(const std::string& filename, int value); + void UpdateHive(const std::string& hiveOldName, const std::string& hiveNewName); + void UpdateHiveName(const std::string& filename, const std::string& hiveName); + void UpdateTrashColumn(const std::string& filename, int value); + void UpdateSamplePack(const std::string& filename, const std::string& samplePack); + void UpdateSampleType(const std::string& filename, const std::string& type); // ------------------------------------------------------------------- // Get from database - int GetFavoriteColumnValueByFilename(const std::string& dbPath, const std::string& filename); - std::string GetHiveByFilename(const std::string& dbPath, const std::string& filename); - std::string GetSamplePathByFilename(const std::string& dbPath, const std::string& filename); - std::string GetSampleFileExtension(const std::string& dbPath, const std::string& filename); - std::string GetSampleType(const std::string& dbPath, const std::string& filename); + int GetFavoriteColumnValueByFilename(const std::string& filename); + std::string GetHiveByFilename(const std::string& filename); + std::string GetSamplePathByFilename(const std::string& filename); + std::string GetSampleFileExtension(const std::string& filename); + std::string GetSampleType(const std::string& filename); // ------------------------------------------------------------------- // Check database - bool IsTrashed(const std::string& dbPath, const std::string& filename); - wxArrayString CheckDuplicates(const std::string& dbPath, const wxArrayString& files); + bool IsTrashed(const std::string& filename); + wxArrayString CheckDuplicates(const wxArrayString& files); // ------------------------------------------------------------------- // Remove from database - void RemoveSampleFromDatabase(const std::string& dbPath, const std::string& filename); - void RemoveHiveFromDatabase(const std::string& dbPath, const std::string& hiveName); + void RemoveSampleFromDatabase(const std::string& filename); + void RemoveHiveFromDatabase(const std::string& hiveName); // ------------------------------------------------------------------- - wxVector> // LoadDatabase(wxVector> &vecSet, // wxTreeCtrl& favorite_tree, wxTreeItemId& favorite_item, // wxTreeCtrl& trash_tree, wxTreeItemId& trash_item, bool show_extension); - LoadSamplesDatabase(const std::string& dbPath, wxVector>& vecSet, - wxDataViewTreeCtrl& favorite_tree, wxDataViewItem& favorite_item, + wxVector> + LoadSamplesDatabase(wxDataViewTreeCtrl& favorite_tree, wxDataViewItem& favorite_item, wxTreeCtrl& trash_tree, wxTreeItemId& trash_item, bool show_extension, const std::string& icon_star_filled, const std::string& icon_star_emtpy); - void LoadHivesDatabase(const std::string& dbPath, wxDataViewTreeCtrl& favorite_tree); + void LoadHivesDatabase(wxDataViewTreeCtrl& favorite_tree); wxVector> - RestoreFromTrashByFilename(const std::string& dbPath, const std::string& filename, + RestoreFromTrashByFilename(const std::string& filename, wxVector>& vecSet, bool show_extension, const std::string& icon_star_filled, const std::string& icon_star_empty); wxVector> - FilterDatabaseBySampleName(const std::string& dbPath, wxVector>& sampleVec, - const std::string& sampleName, bool show_extension, + FilterDatabaseBySampleName(const std::string& sampleName, bool show_extension, const std::string& icon_star_filled, const std::string& icon_star_empty); wxVector> - FilterDatabaseByHiveName(const std::string& dbPath, wxVector>& sampleVec, - const std::string& hiveName, bool show_extension, + FilterDatabaseByHiveName(const std::string& hiveName, bool show_extension, const std::string& icon_star_filled, const std::string& icon_star_empty); }; diff --git a/src/MainFrame.cpp b/src/MainFrame.cpp index 292ded2..26630d5 100644 --- a/src/MainFrame.cpp +++ b/src/MainFrame.cpp @@ -398,7 +398,12 @@ MainFrame::MainFrame() // Intializing wxTimer m_Timer = new wxTimer(this); - m_TopWaveformPanel = new WaveformViewer(this, m_TopPanel, *m_Library, *m_MediaCtrl, *m_InfoBar, + // Initialize the database + m_database = std::make_unique(*m_InfoBar, m_DatabaseFilepath); + m_database->CreateTableSamples(); + m_database->CreateTableHives(); + + m_TopWaveformPanel = new WaveformViewer(this, m_TopPanel, *m_Library, *m_MediaCtrl, *m_database, m_ConfigFilepath, m_DatabaseFilepath); // Binding events. @@ -543,11 +548,6 @@ MainFrame::MainFrame() m_BottomRightPanelMainSizer->SetSizeHints(m_BottomRightPanel); m_BottomRightPanelMainSizer->Layout(); - // Initialize the database - Database db(*m_InfoBar); - db.CreateTableSamples(static_cast(DATABASE_FILEPATH)); - db.CreateTableHives(static_cast(DATABASE_FILEPATH)); - // Restore the data previously added to Library LoadDatabase(); @@ -582,7 +582,6 @@ void MainFrame::OnClickSettings(wxCommandEvent& event) void MainFrame::AddSamples(wxArrayString& files) { Settings settings(this, m_ConfigFilepath, m_DatabaseFilepath); - Database db(*m_InfoBar); wxBusyCursor busy_cursor; wxWindowDisabler window_disabler; @@ -605,7 +604,7 @@ void MainFrame::AddSamples(wxArrayString& files) //Check All Files At Once wxArrayString sorted_files; - sorted_files = db.CheckDuplicates(static_cast(DATABASE_FILEPATH), files); + sorted_files = m_database->CheckDuplicates(files); files = sorted_files; if(files.size() < 1) @@ -686,7 +685,7 @@ void MainFrame::AddSamples(wxArrayString& files) progressDialog->Pulse(_("Updating Database.."), NULL); - db.InsertIntoSamples(static_cast(DATABASE_FILEPATH), sample_array); + m_database->InsertIntoSamples(sample_array); progressDialog->Destroy(); } @@ -750,7 +749,6 @@ void MainFrame::OnDragAndDropToLibrary(wxDropFilesEvent& event) void MainFrame::OnDragAndDropToHives(wxDropFilesEvent& event) { - Database db(*m_InfoBar); Settings settings(this, m_ConfigFilepath, m_DatabaseFilepath); if (event.GetNumberOfFiles() > 0) @@ -787,27 +785,23 @@ void MainFrame::OnDragAndDropToHives(wxDropFilesEvent& event) rows - i, files[i], m_Hives->GetItemText(drop_target)); if (drop_target.IsOk() && m_Hives->IsContainer(drop_target) && - db.GetFavoriteColumnValueByFilename(static_cast(DATABASE_FILEPATH), - file_name.ToStdString()) == 0) + m_database->GetFavoriteColumnValueByFilename(file_name.ToStdString()) == 0) { m_Hives->AppendItem(drop_target, files[i]); m_Library->SetValue(wxVariant(wxBitmap(ICON_STAR_FILLED_16px)), row, 0); - db.UpdateFavoriteColumn(static_cast(DATABASE_FILEPATH), file_name.ToStdString(), 1); - db.UpdateHiveName(static_cast(DATABASE_FILEPATH), - file_name.ToStdString(), hive_name.ToStdString()); + m_database->UpdateFavoriteColumn(file_name.ToStdString(), 1); + m_database->UpdateHiveName( file_name.ToStdString(), hive_name.ToStdString()); msg = wxString::Format(_("%s added to %s."), files[i], hive_name); } else { - if (db.GetFavoriteColumnValueByFilename(static_cast(DATABASE_FILEPATH), - file_name.ToStdString()) == 1) + if (m_database->GetFavoriteColumnValueByFilename(file_name.ToStdString()) == 1) { wxMessageBox(wxString::Format(_("%s is already added to %s hive"), files[i], - db.GetHiveByFilename(static_cast(DATABASE_FILEPATH), - file_name.ToStdString())), + m_database->GetHiveByFilename(file_name.ToStdString())), _("Error!"), wxOK | wxICON_ERROR | wxCENTRE, this); } else @@ -901,20 +895,19 @@ void MainFrame::OnDragFromDirCtrl(wxTreeEvent& event) void MainFrame::OnDragFromLibrary(wxDataViewEvent& event) { // Settings settings(m_ConfigFilepath, m_DatabaseFilepath); - // Database db(*m_InfoBar); - + // int selected_row = m_Library->ItemToRow(event.GetItem()); if (selected_row < 0) return; wxString selection = m_Library->GetTextValue(selected_row, 1); - // wxString sample_with_extension = db.GetSamplePathByFilename(selection.BeforeLast('.').ToStdString()); - // wxString sample_without_extension = db.GetSamplePathByFilename(selection.ToStdString()); + // wxString sample_with_extension = m_database->GetSamplePathByFilename(selection.BeforeLast('.').ToStdString()); + // wxString sample_without_extension = m_database->GetSamplePathByFilename(selection.ToStdString()); // std::string extension = settings.ShouldShowFileExtension() ? - // db.GetSampleFileExtension(selection.ToStdString()) : - // db.GetSampleFileExtension(selection.BeforeLast('.').ToStdString()); + // m_database->GetSampleFileExtension(selection.ToStdString()) : + // m_database->GetSampleFileExtension(selection.BeforeLast('.').ToStdString()); // wxString sample = selection.Contains(wxString::Format(".%s", extension)) ? // sample_with_extension : sample_without_extension; @@ -934,8 +927,7 @@ void MainFrame::OnClickPlay(wxCommandEvent& event) bStopped = false; // Settings settings(m_ConfigFilepath, m_DatabaseFilepath); - // Database db(*m_InfoBar); - + // int selected_row = m_Library->GetSelectedRow(); if (selected_row < 0) @@ -943,12 +935,12 @@ void MainFrame::OnClickPlay(wxCommandEvent& event) wxString selection = m_Library->GetTextValue(selected_row, 1); - // wxString sample_with_extension = db.GetSamplePathByFilename(selection.BeforeLast('.').ToStdString()); - // wxString sample_without_extension = db.GetSamplePathByFilename(selection.ToStdString()); + // wxString sample_with_extension = m_database->GetSamplePathByFilename(selection.BeforeLast('.').ToStdString()); + // wxString sample_without_extension = m_database->GetSamplePathByFilename(selection.ToStdString()); // std::string extension = settings.ShouldShowFileExtension() ? - // db.GetSampleFileExtension(selection.ToStdString()) : - // db.GetSampleFileExtension(selection.BeforeLast('.').ToStdString()); + // m_database->GetSampleFileExtension(selection.ToStdString()) : + // m_database->GetSampleFileExtension(selection.BeforeLast('.').ToStdString()); // wxString sample = selection.Contains(wxString::Format(".%s", extension)) ? // sample_with_extension : sample_without_extension; @@ -1091,9 +1083,7 @@ void MainFrame::OnReleaseVolumeSlider(wxScrollEvent& event) void MainFrame::OnClickLibrary(wxDataViewEvent& event) { Settings settings(m_ConfigFilepath, m_DatabaseFilepath); - Database db(*m_InfoBar); - - int selected_row = m_Library->ItemToRow(event.GetItem()); + int selected_row = m_Library->ItemToRow(event.GetItem()); int current_row = m_Library->ItemToRow(m_Library->GetCurrentItem()); @@ -1139,12 +1129,12 @@ void MainFrame::OnClickLibrary(wxDataViewEvent& event) // else // selection = m_Library->GetTextValue(selected_row, 1); - // wxString sample_with_extension = db.GetSamplePathByFilename(selection.BeforeLast('.').ToStdString()); - // wxString sample_without_extension = db.GetSamplePathByFilename(selection.ToStdString()); + // wxString sample_with_extension = m_database->GetSamplePathByFilename(selection.BeforeLast('.').ToStdString()); + // wxString sample_without_extension = m_database->GetSamplePathByFilename(selection.ToStdString()); // std::string extension = settings.ShouldShowFileExtension() ? - // db.GetSampleFileExtension(selection.ToStdString()) : - // db.GetSampleFileExtension(selection.BeforeLast('.').ToStdString()); + // m_database->GetSampleFileExtension(selection.ToStdString()) : + // m_database->GetSampleFileExtension(selection.BeforeLast('.').ToStdString()); // wxString sample = selection.Contains(wxString::Format(".%s", extension)) ? // sample_with_extension : sample_without_extension; @@ -1187,12 +1177,12 @@ void MainFrame::OnClickLibrary(wxDataViewEvent& event) wxDataViewItem container; wxDataViewItem child; - if (db.GetFavoriteColumnValueByFilename(static_cast(DATABASE_FILEPATH), filename) == 0) + if (m_database->GetFavoriteColumnValueByFilename(filename) == 0) { m_Library->SetValue(wxVariant(wxBitmap(ICON_STAR_FILLED_16px)), selected_row, 0); - db.UpdateFavoriteColumn(static_cast(DATABASE_FILEPATH), filename, 1); - db.UpdateHiveName(static_cast(DATABASE_FILEPATH), filename, hive_name); + m_database->UpdateFavoriteColumn(filename, 1); + m_database->UpdateHiveName(filename, hive_name); for (int i = 0; i < m_Hives->GetChildCount(root); i++) { @@ -1211,9 +1201,8 @@ void MainFrame::OnClickLibrary(wxDataViewEvent& event) { m_Library->SetValue(wxVariant(wxBitmap(ICON_STAR_EMPTY_16px)), selected_row, 0); - db.UpdateFavoriteColumn(static_cast(DATABASE_FILEPATH), filename, 0); - db.UpdateHiveName(static_cast(DATABASE_FILEPATH), - filename, m_Hives->GetItemText(favorites_hive).ToStdString()); + m_database->UpdateFavoriteColumn(filename, 0); + m_database->UpdateHiveName(filename, m_Hives->GetItemText(favorites_hive).ToStdString()); for (int i = 0; i < m_Hives->GetChildCount(root); i++) { @@ -1242,9 +1231,7 @@ void MainFrame::OnClickLibrary(wxDataViewEvent& event) void MainFrame::OnShowHivesContextMenu(wxDataViewEvent& event) { Settings settings(this, m_ConfigFilepath, m_DatabaseFilepath); - Database db(*m_InfoBar); - - wxDataViewItem selected_hive = event.GetItem(); + wxDataViewItem selected_hive = event.GetItem(); wxString hive_name = m_Hives->GetItemText(selected_hive); @@ -1342,8 +1329,7 @@ void MainFrame::OnShowHivesContextMenu(wxDataViewEvent& event) wxLogDebug("Sample count: %d", sample_count); m_Hives->SetItemText(selected_hive, hive_name); - db.UpdateHive(static_cast(DATABASE_FILEPATH), - selected_hive_name.ToStdString(), hive_name.ToStdString()); + m_database->UpdateHive(selected_hive_name.ToStdString(), hive_name.ToStdString()); } else { @@ -1357,10 +1343,8 @@ void MainFrame::OnShowHivesContextMenu(wxDataViewEvent& event) wxLogDebug("Sample count: %d :: Sample name: %s", sample_count, sample_name); - db.UpdateHiveName(static_cast(DATABASE_FILEPATH), - sample_name.ToStdString(), hive_name.ToStdString()); - db.UpdateHive(static_cast(DATABASE_FILEPATH), - selected_hive_name.ToStdString(), hive_name.ToStdString()); + m_database->UpdateHiveName(sample_name.ToStdString(), hive_name.ToStdString()); + m_database->UpdateHive(selected_hive_name.ToStdString(), hive_name.ToStdString()); m_Hives->SetItemText(selected_hive, hive_name); } @@ -1429,8 +1413,7 @@ void MainFrame::OnShowHivesContextMenu(wxDataViewEvent& event) { m_Hives->DeleteItem(selected_hive); - db.RemoveHiveFromDatabase(static_cast(DATABASE_FILEPATH), - hive_name.ToStdString()); + m_database->RemoveHiveFromDatabase(hive_name.ToStdString()); msg = wxString::Format(_("%s deleted from hives successfully."), hive_name); } @@ -1471,11 +1454,8 @@ void MainFrame::OnShowHivesContextMenu(wxDataViewEvent& event) m_Library->SetValue(wxVariant(wxBitmap(ICON_STAR_EMPTY_16px)), i, 0); - db.UpdateFavoriteColumn(static_cast(DATABASE_FILEPATH), - matched_sample.ToStdString(), 0); - db.UpdateHiveName(static_cast(DATABASE_FILEPATH), - matched_sample.ToStdString(), - m_Hives->GetItemText(favorites_hive).ToStdString()); + m_database->UpdateFavoriteColumn(matched_sample.ToStdString(), 0); + m_database->UpdateHiveName(matched_sample.ToStdString(), m_Hives->GetItemText(favorites_hive).ToStdString()); break; } @@ -1487,8 +1467,7 @@ void MainFrame::OnShowHivesContextMenu(wxDataViewEvent& event) m_Hives->DeleteChildren(selected_hive); m_Hives->DeleteItem(selected_hive); - db.RemoveHiveFromDatabase(static_cast(DATABASE_FILEPATH), - hive_name.ToStdString()); + m_database->RemoveHiveFromDatabase(hive_name.ToStdString()); msg = wxString::Format( _("%s and all samples inside %s have been deleted from hives successfully."), @@ -1512,12 +1491,11 @@ void MainFrame::OnShowHivesContextMenu(wxDataViewEvent& event) { try { - wxVector> dataset; - - if (db.FilterDatabaseByHiveName(static_cast(DATABASE_FILEPATH), - dataset, hive_name.ToStdString(), + const auto dataset = m_database->FilterDatabaseByHiveName(hive_name.ToStdString(), settings.ShouldShowFileExtension(), - ICON_STAR_FILLED_16px, ICON_STAR_EMPTY_16px).empty()) + ICON_STAR_FILLED_16px, ICON_STAR_EMPTY_16px); + + if (dataset.empty()) { wxMessageBox(_("Error! Database is empty."), _("Error!"), wxOK | wxICON_ERROR | wxCENTRE, this); @@ -1547,11 +1525,10 @@ void MainFrame::OnShowHivesContextMenu(wxDataViewEvent& event) { try { - wxVector> dataset; + const auto dataset = m_database->FilterDatabaseBySampleName("", settings.ShouldShowFileExtension(), + ICON_STAR_FILLED_16px, ICON_STAR_EMPTY_16px); - if (db.FilterDatabaseBySampleName(static_cast(DATABASE_FILEPATH), - dataset, "", settings.ShouldShowFileExtension(), - ICON_STAR_FILLED_16px, ICON_STAR_EMPTY_16px).empty()) + if (dataset.empty()) { wxMessageBox(_("Error! Database is empty."), _("Error!"), wxOK | wxICON_ERROR | wxCENTRE, this); @@ -1601,8 +1578,8 @@ void MainFrame::OnShowHivesContextMenu(wxDataViewEvent& event) m_Library->SetValue(wxVariant(wxBitmap(ICON_STAR_EMPTY_16px)), i, 0); - db.UpdateFavoriteColumn(static_cast(DATABASE_FILEPATH), matched_sample.ToStdString(), 0); - db.UpdateHiveName(static_cast(DATABASE_FILEPATH), matched_sample.ToStdString(), + m_database->UpdateFavoriteColumn(matched_sample.ToStdString(), 0); + m_database->UpdateHiveName(matched_sample.ToStdString(), m_Hives->GetItemText(favorites_hive).ToStdString()); m_Hives->DeleteItem(selected_hive); @@ -1612,8 +1589,7 @@ void MainFrame::OnShowHivesContextMenu(wxDataViewEvent& event) m_InfoBar->ShowMessage(wxString::Format(_("Removed %s from %s"), m_Hives->GetItemText(event.GetItem()), - db.GetHiveByFilename(static_cast(DATABASE_FILEPATH), - matched_sample.ToStdString())), + m_database->GetHiveByFilename(matched_sample.ToStdString())), wxICON_INFORMATION); } break; @@ -1652,9 +1628,7 @@ void MainFrame::OnShowLibraryContextMenu(wxDataViewEvent& event) { TagEditor* tagEditor; Settings settings(this, m_ConfigFilepath, m_DatabaseFilepath); - Database db(*m_InfoBar); - - wxString msg; + wxString msg; wxDataViewItem item = event.GetItem(); int selected_row; @@ -1675,7 +1649,7 @@ void MainFrame::OnShowLibraryContextMenu(wxDataViewEvent& event) //true = add false = remove bool favorite_add = false; - if (db.GetFavoriteColumnValueByFilename(static_cast(DATABASE_FILEPATH), filename) == 1) + if (m_database->GetFavoriteColumnValueByFilename(filename) == 1) menu.Append(MN_FavoriteSample, _("Remove from hive"), _("Remove the selected sample(s) from hive")); else { @@ -1729,7 +1703,7 @@ void MainFrame::OnShowLibraryContextMenu(wxDataViewEvent& event) filename = settings.ShouldShowFileExtension() ? name.BeforeLast('.').ToStdString() : name.ToStdString(); - db_status = db.GetFavoriteColumnValueByFilename(static_cast(DATABASE_FILEPATH), filename); + db_status = m_database->GetFavoriteColumnValueByFilename(filename); // Aleady Added, Do Nothing if (favorite_add && db_status == 1) @@ -1744,8 +1718,8 @@ void MainFrame::OnShowLibraryContextMenu(wxDataViewEvent& event) { m_Library->SetValue(wxVariant(wxBitmap(ICON_STAR_FILLED_16px)), selected_row, 0); - db.UpdateFavoriteColumn(static_cast(DATABASE_FILEPATH), filename, 1); - db.UpdateHiveName(static_cast(DATABASE_FILEPATH), filename, hive_name); + m_database->UpdateFavoriteColumn(filename, 1); + m_database->UpdateHiveName(filename, hive_name); for (int i = 0; i < m_Hives->GetChildCount(root); i++) { @@ -1765,8 +1739,8 @@ void MainFrame::OnShowLibraryContextMenu(wxDataViewEvent& event) //Remove From Favorites m_Library->SetValue(wxVariant(wxBitmap(ICON_STAR_EMPTY_16px)), selected_row, 0); - db.UpdateFavoriteColumn(static_cast(DATABASE_FILEPATH), filename, 0); - db.UpdateHiveName(static_cast(DATABASE_FILEPATH), filename, + m_database->UpdateFavoriteColumn(filename, 0); + m_database->UpdateHiveName(filename, m_Hives->GetItemText(favorites_hive).ToStdString()); for (int i = 0; i < m_Hives->GetChildCount(root); i++) @@ -1829,7 +1803,7 @@ void MainFrame::OnShowLibraryContextMenu(wxDataViewEvent& event) { wxLogDebug("Selected row: %d :: Sample: %s", selected_row, filename); - db.RemoveSampleFromDatabase(static_cast(DATABASE_FILEPATH), filename); + m_database->RemoveSampleFromDatabase(filename); m_Library->DeleteItem(selected_row); for (int j = 0; j < m_Hives->GetChildCount(root); j++) @@ -1879,7 +1853,7 @@ void MainFrame::OnShowLibraryContextMenu(wxDataViewEvent& event) std::string multi_selection = settings.ShouldShowFileExtension() ? text_value.BeforeLast('.').ToStdString() : text_value.ToStdString() ; - db.RemoveSampleFromDatabase(static_cast(DATABASE_FILEPATH), multi_selection); + m_database->RemoveSampleFromDatabase(multi_selection); m_Library->DeleteItem(row); for (int j = 0; j < m_Hives->GetChildCount(root); j++) @@ -1921,7 +1895,7 @@ void MainFrame::OnShowLibraryContextMenu(wxDataViewEvent& event) wxDataViewItem root = wxDataViewItem(wxNullPtr); wxDataViewItem container, child; - if (db.IsTrashed(static_cast(DATABASE_FILEPATH), filename)) + if (m_database->IsTrashed(filename)) wxLogDebug(_("Already trashed..")); else { @@ -1946,11 +1920,11 @@ void MainFrame::OnShowLibraryContextMenu(wxDataViewEvent& event) files = file_data.GetFilenames(); - if (db.GetFavoriteColumnValueByFilename(static_cast(DATABASE_FILEPATH), files[i].ToStdString())) + if (m_database->GetFavoriteColumnValueByFilename(files[i].ToStdString())) { m_Library->SetValue(wxVariant(wxBitmap(ICON_STAR_EMPTY_16px)), item_row, 0); - db.UpdateFavoriteColumn(static_cast(DATABASE_FILEPATH), files[i].ToStdString(), 0); + m_database->UpdateFavoriteColumn(files[i].ToStdString(), 0); for (int j = 0; j < m_Hives->GetChildCount(root); j++) { @@ -1973,8 +1947,8 @@ void MainFrame::OnShowLibraryContextMenu(wxDataViewEvent& event) } } - db.UpdateTrashColumn(static_cast(DATABASE_FILEPATH), files[i].ToStdString(), 1); - db.UpdateHiveName(static_cast(DATABASE_FILEPATH), files[i].ToStdString(), + m_database->UpdateTrashColumn(files[i].ToStdString(), 1); + m_database->UpdateHiveName(files[i].ToStdString(), m_Hives->GetItemText(favorites_hive).ToStdString()); m_Trash->AppendItem(trash_root, text_value); @@ -2081,17 +2055,15 @@ void MainFrame::OnShowLibraryColumnHeaderContextMenu(wxDataViewEvent& event) void MainFrame::LoadDatabase() { Settings settings(this, m_ConfigFilepath, m_DatabaseFilepath); - Database db(*m_InfoBar); - - try + try { - db.LoadHivesDatabase(static_cast(DATABASE_FILEPATH), *m_Hives); + m_database->LoadHivesDatabase(*m_Hives); - wxVector> dataset; - - if (db.LoadSamplesDatabase(static_cast(DATABASE_FILEPATH), dataset, *m_Hives, favorites_hive, + const auto dataset = m_database->LoadSamplesDatabase(*m_Hives, favorites_hive, *m_Trash, trash_root, settings.ShouldShowFileExtension(), - ICON_STAR_FILLED_16px, ICON_STAR_EMPTY_16px).empty()) + ICON_STAR_FILLED_16px, ICON_STAR_EMPTY_16px); + + if (dataset.empty()) { wxLogInfo(_("Error! Database is empty.")); } @@ -2112,9 +2084,7 @@ void MainFrame::LoadDatabase() void MainFrame::OnShowTrashContextMenu(wxTreeEvent& event) { Settings settings(this, m_ConfigFilepath, m_DatabaseFilepath); - Database db(*m_InfoBar); - - wxTreeItemId selected_trashed_item = event.GetItem(); + wxTreeItemId selected_trashed_item = event.GetItem(); wxMenu menu; @@ -2133,7 +2103,7 @@ void MainFrame::OnShowTrashContextMenu(wxTreeEvent& event) m_Trash->GetItemText(selected_trashed_item).BeforeLast('.') : m_Trash->GetItemText(selected_trashed_item); - db.RemoveSampleFromDatabase(static_cast(DATABASE_FILEPATH), trashed_item_name.ToStdString()); + m_database->RemoveSampleFromDatabase(trashed_item_name.ToStdString()); m_Trash->Delete(selected_trashed_item); } @@ -2142,9 +2112,7 @@ void MainFrame::OnShowTrashContextMenu(wxTreeEvent& event) { wxLogDebug(_("Restore sample")); - Database db(*m_InfoBar); - - wxArrayTreeItemIds selected_item_ids; + wxArrayTreeItemIds selected_item_ids; m_Trash->GetSelections(selected_item_ids); wxFileDataObject file_data; @@ -2166,13 +2134,13 @@ void MainFrame::OnShowTrashContextMenu(wxTreeEvent& event) files = file_data.GetFilenames(); - db.UpdateTrashColumn(static_cast(DATABASE_FILEPATH), files[i].ToStdString(), 0); + m_database->UpdateTrashColumn(files[i].ToStdString(), 0); try { wxVector> dataset; - if (db.RestoreFromTrashByFilename(static_cast(DATABASE_FILEPATH), files[i].ToStdString(), + if (m_database->RestoreFromTrashByFilename(files[i].ToStdString(), dataset, settings.ShouldShowFileExtension(), ICON_STAR_FILLED_16px, ICON_STAR_EMPTY_16px).empty()) { @@ -2203,7 +2171,6 @@ void MainFrame::OnShowTrashContextMenu(wxTreeEvent& event) void MainFrame::OnDragAndDropToTrash(wxDropFilesEvent& event) { - Database db(*m_InfoBar); Settings settings(this, m_ConfigFilepath, m_DatabaseFilepath); if (event.GetNumberOfFiles() > 0) @@ -2233,11 +2200,11 @@ void MainFrame::OnDragAndDropToTrash(wxDropFilesEvent& event) files = file_data.GetFilenames(); - if (db.GetFavoriteColumnValueByFilename(static_cast(DATABASE_FILEPATH), files[i].ToStdString())) + if (m_database->GetFavoriteColumnValueByFilename(files[i].ToStdString())) { m_Library->SetValue(wxVariant(wxBitmap(ICON_STAR_EMPTY_16px)), item_row, 0); - db.UpdateFavoriteColumn(static_cast(DATABASE_FILEPATH), files[i].ToStdString(), 0); + m_database->UpdateFavoriteColumn(files[i].ToStdString(), 0); for (int j = 0; j < m_Hives->GetChildCount(root); j++) { @@ -2260,8 +2227,8 @@ void MainFrame::OnDragAndDropToTrash(wxDropFilesEvent& event) } } - db.UpdateTrashColumn(static_cast(DATABASE_FILEPATH), files[i].ToStdString(), 1); - db.UpdateHiveName(static_cast(DATABASE_FILEPATH), files[i].ToStdString(), + m_database->UpdateTrashColumn(files[i].ToStdString(), 1); + m_database->UpdateHiveName(files[i].ToStdString(), m_Hives->GetItemText(favorites_hive).ToStdString()); m_Trash->AppendItem(trash_root, text_value); @@ -2278,9 +2245,7 @@ void MainFrame::OnDragAndDropToTrash(wxDropFilesEvent& event) void MainFrame::OnClickAddHive(wxCommandEvent& event) { - Database db(*m_InfoBar); - - std::deque nodes; + std::deque nodes; nodes.push_back(m_Hives->GetNthChild(wxDataViewItem(wxNullPtr), 0)); wxDataViewItem current_item, found_item; @@ -2341,7 +2306,7 @@ void MainFrame::OnClickAddHive(wxCommandEvent& event) else { m_Hives->AppendContainer(wxDataViewItem(wxNullPtr), hive_name); - db.InsertIntoHives(static_cast(DATABASE_FILEPATH), hive_name.ToStdString()); + m_database->InsertIntoHives(hive_name.ToStdString()); msg = wxString::Format(_("%s added to Hives."), hive_name); } @@ -2360,9 +2325,7 @@ void MainFrame::OnClickAddHive(wxCommandEvent& event) void MainFrame::OnClickRemoveHive(wxCommandEvent& event) { Settings settings(this, m_ConfigFilepath, m_DatabaseFilepath); - Database db(*m_InfoBar); - - wxDataViewItem selected_item = m_Hives->GetSelection(); + wxDataViewItem selected_item = m_Hives->GetSelection(); wxString hive_name = m_Hives->GetItemText(selected_item); wxString msg; @@ -2411,7 +2374,7 @@ void MainFrame::OnClickRemoveHive(wxCommandEvent& event) { m_Hives->DeleteItem(selected_item); - db.RemoveHiveFromDatabase(static_cast(DATABASE_FILEPATH), hive_name.ToStdString()); + m_database->RemoveHiveFromDatabase(hive_name.ToStdString()); msg = wxString::Format(_("%s deleted from hives successfully."), hive_name); } break; @@ -2451,8 +2414,8 @@ void MainFrame::OnClickRemoveHive(wxCommandEvent& event) m_Library->SetValue(wxVariant(wxBitmap(ICON_STAR_EMPTY_16px)), i, 0); - db.UpdateFavoriteColumn(static_cast(DATABASE_FILEPATH), matched_sample.ToStdString(), 0); - db.UpdateHiveName(static_cast(DATABASE_FILEPATH), matched_sample.ToStdString(), + m_database->UpdateFavoriteColumn(matched_sample.ToStdString(), 0); + m_database->UpdateHiveName(matched_sample.ToStdString(), m_Hives->GetItemText(favorites_hive).ToStdString()); break; @@ -2465,7 +2428,7 @@ void MainFrame::OnClickRemoveHive(wxCommandEvent& event) m_Hives->DeleteChildren(selected_item); m_Hives->DeleteItem(selected_item); - db.RemoveHiveFromDatabase(static_cast(DATABASE_FILEPATH), hive_name.ToStdString()); + m_database->RemoveHiveFromDatabase(hive_name.ToStdString()); msg = wxString::Format(_("%s and all samples inside %s have been deleted from hives successfully."), hive_name, hive_name); @@ -2484,7 +2447,6 @@ void MainFrame::OnClickRemoveHive(wxCommandEvent& event) void MainFrame::OnClickRestoreTrashItem(wxCommandEvent& event) { - Database db(*m_InfoBar); Settings settings(this, m_ConfigFilepath, m_DatabaseFilepath); wxArrayTreeItemIds selected_item_ids; @@ -2521,13 +2483,13 @@ void MainFrame::OnClickRestoreTrashItem(wxCommandEvent& event) files = file_data.GetFilenames(); - db.UpdateTrashColumn(static_cast(DATABASE_FILEPATH), files[i].ToStdString(), 0); + m_database->UpdateTrashColumn(files[i].ToStdString(), 0); try { wxVector> dataset; - if (db.RestoreFromTrashByFilename(static_cast(DATABASE_FILEPATH), files[i].ToStdString(), dataset, + if (m_database->RestoreFromTrashByFilename(files[i].ToStdString(), dataset, settings.ShouldShowFileExtension(), ICON_STAR_FILLED_16px, ICON_STAR_EMPTY_16px).empty()) { @@ -2552,17 +2514,16 @@ void MainFrame::OnClickRestoreTrashItem(wxCommandEvent& event) void MainFrame::OnDoSearch(wxCommandEvent& event) { - Database db(*m_InfoBar); Settings settings(this, m_ConfigFilepath, m_DatabaseFilepath); - std::string search = m_SearchBox->GetValue().ToStdString(); + const auto search = m_SearchBox->GetValue().ToStdString(); try { - wxVector> dataset; + const auto dataset = m_database->FilterDatabaseBySampleName(search, settings.ShouldShowFileExtension(), + ICON_STAR_FILLED_16px, ICON_STAR_EMPTY_16px); - if (db.FilterDatabaseBySampleName(static_cast(DATABASE_FILEPATH), dataset, search, settings.ShouldShowFileExtension(), - ICON_STAR_FILLED_16px, ICON_STAR_EMPTY_16px).empty()) + if (dataset.empty()) { wxLogDebug(_("Error! Database is empty.")); } @@ -2572,7 +2533,7 @@ void MainFrame::OnDoSearch(wxCommandEvent& event) std::cout << search << std::endl; - for (auto data : dataset) + for (const auto& data : dataset) { m_Library->AppendItem(data); } @@ -2685,21 +2646,19 @@ void MainFrame::RefreshDatabase() FileInfo MainFrame::GetFilenamePathAndExtension(const wxString& selected, bool checkExtension, bool doGetFilename) const { - Database db(*m_InfoBar); Settings settings(m_ConfigFilepath, m_DatabaseFilepath); wxString path; std::string extension, filename; - wxString filename_with_extension = db.GetSamplePathByFilename(static_cast(DATABASE_FILEPATH), - selected.BeforeLast('.').ToStdString()); - wxString filename_without_extension = db.GetSamplePathByFilename(static_cast(DATABASE_FILEPATH), selected.ToStdString()); + wxString filename_with_extension = m_database->GetSamplePathByFilename(selected.BeforeLast('.').ToStdString()); + wxString filename_without_extension = m_database->GetSamplePathByFilename(selected.ToStdString()); if (checkExtension) { extension = settings.ShouldShowFileExtension() ? - db.GetSampleFileExtension(static_cast(DATABASE_FILEPATH), selected.ToStdString()) : - db.GetSampleFileExtension(static_cast(DATABASE_FILEPATH), selected.BeforeLast('.').ToStdString()); + m_database->GetSampleFileExtension(selected.ToStdString()) : + m_database->GetSampleFileExtension(selected.BeforeLast('.').ToStdString()); } path = selected.Contains(wxString::Format(".%s", extension)) ? diff --git a/src/MainFrame.hpp b/src/MainFrame.hpp index 509318a..7438ca5 100644 --- a/src/MainFrame.hpp +++ b/src/MainFrame.hpp @@ -24,6 +24,7 @@ #include "SampleHiveConfig.hpp" #include "SH_Event.hpp" +#include #include #include @@ -65,6 +66,8 @@ #include #endif +#include "Database.hpp" + struct FileInfo { wxString Path; @@ -180,6 +183,7 @@ class MainFrame : public wxFrame // ------------------------------------------------------------------- wxSystemAppearance m_Theme = wxSystemSettings::GetAppearance(); + std::unique_ptr m_database; private: // ------------------------------------------------------------------- bool bAutoplay = false; diff --git a/src/TagEditorDialog.cpp b/src/TagEditorDialog.cpp index 8145e1f..b9b6fd5 100644 --- a/src/TagEditorDialog.cpp +++ b/src/TagEditorDialog.cpp @@ -226,7 +226,7 @@ void TagEditor::OnClickCustomTagButton(wxCommandEvent& event) void TagEditor::OnClickApply(wxCommandEvent& event) { - Database db(m_InfoBar); + Database db(m_InfoBar, m_DatabaseFilepath); wxString title = m_TitleText->GetValue(); wxString artist = m_ArtistText->GetValue(); @@ -235,7 +235,7 @@ void TagEditor::OnClickApply(wxCommandEvent& event) wxString comment = m_CommentText->GetValue(); wxString type = m_SampleTypeChoice->GetStringSelection(); - std::string sampleType = db.GetSampleType(m_DatabaseFilepath, m_Filename); + std::string sampleType = db.GetSampleType(m_Filename); std::string filename = wxString(m_Filename).AfterLast('/').BeforeLast('.').ToStdString(); @@ -265,7 +265,7 @@ void TagEditor::OnClickApply(wxCommandEvent& event) wxLogDebug("Changing artist tag.."); tags.SetArtist(artist.ToStdString()); - db.UpdateSamplePack(m_DatabaseFilepath, m_Filename, artist.ToStdString()); + db.UpdateSamplePack(m_Filename, artist.ToStdString()); wxLogDebug("SAMPLE FILENAME HERE: %s", m_Filename); @@ -299,7 +299,7 @@ void TagEditor::OnClickApply(wxCommandEvent& event) if (m_SampleTypeCheck->GetValue() && m_SampleTypeChoice->GetStringSelection() != sampleType) { wxLogDebug("Changing type tag.."); - db.UpdateSampleType(m_DatabaseFilepath, filename, type.ToStdString()); + db.UpdateSampleType(filename, type.ToStdString()); info_msg = wxString::Format("Successfully changed type tag to %s", type); } diff --git a/src/WaveformViewer.cpp b/src/WaveformViewer.cpp index d69ed10..64a6739 100644 --- a/src/WaveformViewer.cpp +++ b/src/WaveformViewer.cpp @@ -39,10 +39,10 @@ #include WaveformViewer::WaveformViewer(wxWindow* parentFrame, wxWindow* window, wxDataViewListCtrl& library, - wxMediaCtrl& mediaCtrl, wxInfoBar& infoBar, + wxMediaCtrl& mediaCtrl, Database& database, const std::string& configFilepath, const std::string& databaseFilepath) : wxPanel(window, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL | wxNO_BORDER | wxFULL_REPAINT_ON_RESIZE), - m_ParentFrame(parentFrame), m_Window(window), m_Library(library), m_InfoBar(infoBar), m_MediaCtrl(mediaCtrl), + m_ParentFrame(parentFrame), m_Window(window), m_Library(library), m_database(database), m_MediaCtrl(mediaCtrl), m_ConfigFilepath(configFilepath), m_DatabaseFilepath(databaseFilepath) { this->SetDoubleBuffered(true); @@ -110,15 +110,13 @@ void WaveformViewer::OnPaint(wxPaintEvent& event) void WaveformViewer::RenderPlayhead(wxDC& dc) { - Database db(m_InfoBar); - int selected_row = m_Library.GetSelectedRow(); if (selected_row < 0) return; wxString selected = m_Library.GetTextValue(selected_row, 1); - std::string path = db.GetSamplePathByFilename(m_DatabaseFilepath, selected.BeforeLast('.').ToStdString()); + std::string path = m_database.GetSamplePathByFilename(selected.BeforeLast('.').ToStdString()); Tags tags(path); @@ -150,7 +148,6 @@ void WaveformViewer::RenderPlayhead(wxDC& dc) void WaveformViewer::UpdateWaveformBitmap() { - Database db(m_InfoBar); Settings settings(m_ParentFrame, m_ConfigFilepath, m_DatabaseFilepath); Serializer serializer(m_ConfigFilepath); @@ -161,12 +158,12 @@ void WaveformViewer::UpdateWaveformBitmap() wxString selection = m_Library.GetTextValue(selected_row, 1); - wxString filepath_with_extension = db.GetSamplePathByFilename(m_DatabaseFilepath, selection.BeforeLast('.').ToStdString()); - wxString filepath_without_extension = db.GetSamplePathByFilename(m_DatabaseFilepath, selection.ToStdString()); + wxString filepath_with_extension = m_database.GetSamplePathByFilename(selection.BeforeLast('.').ToStdString()); + wxString filepath_without_extension = m_database.GetSamplePathByFilename(selection.ToStdString()); std::string extension = settings.ShouldShowFileExtension() ? - db.GetSampleFileExtension(m_DatabaseFilepath, selection.ToStdString()) : - db.GetSampleFileExtension(m_DatabaseFilepath, selection.BeforeLast('.').ToStdString()); + m_database.GetSampleFileExtension(selection.ToStdString()) : + m_database.GetSampleFileExtension(selection.BeforeLast('.').ToStdString()); wxString path = selection.Contains(wxString::Format(".%s", extension)) ? filepath_with_extension : filepath_without_extension; @@ -293,15 +290,13 @@ void WaveformViewer::OnControlKeyUp(wxKeyEvent &event) void WaveformViewer::OnMouseMotion(wxMouseEvent& event) { - Database db(m_InfoBar); - int selected_row = m_Library.GetSelectedRow(); if (selected_row < 0) return; wxString selected = m_Library.GetTextValue(selected_row, 1); - std::string path = db.GetSamplePathByFilename(m_DatabaseFilepath, selected.BeforeLast('.').ToStdString()); + std::string path = m_database.GetSamplePathByFilename(selected.BeforeLast('.').ToStdString()); Tags tags(path); @@ -335,14 +330,13 @@ void WaveformViewer::OnMouseMotion(wxMouseEvent& event) void WaveformViewer::OnMouseLeftButtonDown(wxMouseEvent& event) { - Database db(m_InfoBar); int selected_row = m_Library.GetSelectedRow(); if (selected_row < 0) return; wxString selected = m_Library.GetTextValue(selected_row, 1); - std::string path = db.GetSamplePathByFilename(m_DatabaseFilepath, selected.BeforeLast('.').ToStdString()); + std::string path = m_database.GetSamplePathByFilename(selected.BeforeLast('.').ToStdString()); Tags tags(path); @@ -385,15 +379,13 @@ void WaveformViewer::OnMouseLeftButtonDown(wxMouseEvent& event) void WaveformViewer::OnMouseLeftButtonUp(wxMouseEvent& event) { - Database db(m_InfoBar); - int selected_row = m_Library.GetSelectedRow(); if (selected_row < 0) return; wxString selected = m_Library.GetTextValue(selected_row, 1); - std::string path = db.GetSamplePathByFilename(m_DatabaseFilepath, selected.BeforeLast('.').ToStdString()); + std::string path = m_database.GetSamplePathByFilename(selected.BeforeLast('.').ToStdString()); Tags tags(path); @@ -457,15 +449,13 @@ void WaveformViewer::SendLoopPoints() SampleHive::SH_LoopPointsEvent event(SampleHive::SH_EVT_LOOP_POINTS_UPDATED, this->GetId()); event.SetEventObject(this); - Database db(m_InfoBar); - int selected_row = m_Library.GetSelectedRow(); if (selected_row < 0) return; wxString selected = m_Library.GetTextValue(selected_row, 1); - std::string path = db.GetSamplePathByFilename(m_DatabaseFilepath, selected.BeforeLast('.').ToStdString()); + std::string path = m_database.GetSamplePathByFilename(selected.BeforeLast('.').ToStdString()); Tags tags(path); diff --git a/src/WaveformViewer.hpp b/src/WaveformViewer.hpp index a1f6a67..f16b5a0 100644 --- a/src/WaveformViewer.hpp +++ b/src/WaveformViewer.hpp @@ -20,6 +20,8 @@ #pragma once +#include "Database.hpp" + #include #include #include @@ -37,7 +39,7 @@ class WaveformViewer : public wxPanel { public: WaveformViewer(wxWindow* parentFrame, wxWindow* window, wxDataViewListCtrl& library, - wxMediaCtrl& mediaCtrl, wxInfoBar& infoBar, + wxMediaCtrl& mediaCtrl, Database& database, const std::string& configFilepath, const std::string& databaseFilepath); ~WaveformViewer(); @@ -47,7 +49,7 @@ class WaveformViewer : public wxPanel wxWindow* m_Window; wxDataViewListCtrl& m_Library; - wxInfoBar& m_InfoBar; + Database& m_database; wxMediaCtrl& m_MediaCtrl; const std::string& m_ConfigFilepath; diff --git a/subprojects/wxwidgets.wrap b/subprojects/wxwidgets.wrap index 301cf22..dbe112d 100644 --- a/subprojects/wxwidgets.wrap +++ b/subprojects/wxwidgets.wrap @@ -1,3 +1,4 @@ [wrap-git] url = https://github.com/wxWidgets/wxWidgets revision = master +clone-recursive = true \ No newline at end of file