From ee7d0f0d144d8204020cbe51323b0c7741b76060 Mon Sep 17 00:00:00 2001 From: haslersn Date: Mon, 8 Jul 2019 02:22:13 +0200 Subject: enginelibrary: Use el_transaction_guard_impl --- src/djinterop/enginelibrary.cpp | 5 ++- src/djinterop/enginelibrary/el_crate_impl.cpp | 13 +++--- src/djinterop/enginelibrary/el_database_impl.cpp | 16 ++++--- src/djinterop/enginelibrary/el_track_impl.cpp | 49 +++++++++++----------- src/djinterop/enginelibrary/el_track_impl.hpp | 1 - .../enginelibrary/el_transaction_guard_impl.cpp | 6 +-- 6 files changed, 47 insertions(+), 43 deletions(-) (limited to 'src') diff --git a/src/djinterop/enginelibrary.cpp b/src/djinterop/enginelibrary.cpp index 43c02c6..1d9f70d 100644 --- a/src/djinterop/enginelibrary.cpp +++ b/src/djinterop/enginelibrary.cpp @@ -24,6 +24,7 @@ #include #include +#include #include namespace djinterop @@ -69,7 +70,7 @@ database make_database( // check if they contain zero tables. If so, then we create the schemata. auto storage = std::make_shared(std::move(directory)); - storage->db << "BEGIN"; + el_transaction_guard_impl trans{storage}; int32_t table_count; storage->db << "SELECT SUM(rows) FROM (" "SELECT COUNT(*) AS rows FROM music.sqlite_master WHERE " @@ -86,7 +87,7 @@ database make_database( verify_performance_schema(storage->db); } database db{std::make_shared(storage)}; - storage->db << "COMMIT"; + trans.commit(); return db; } diff --git a/src/djinterop/enginelibrary/el_crate_impl.cpp b/src/djinterop/enginelibrary/el_crate_impl.cpp index 03e5169..ab622c7 100644 --- a/src/djinterop/enginelibrary/el_crate_impl.cpp +++ b/src/djinterop/enginelibrary/el_crate_impl.cpp @@ -22,6 +22,7 @@ #include #include #include +#include namespace djinterop { @@ -55,7 +56,7 @@ el_crate_impl::el_crate_impl(std::shared_ptr storage, int64_t id) void el_crate_impl::add_track(track tr) { - storage_->db << "BEGIN"; + el_transaction_guard_impl trans{storage_}; storage_->db << "DELETE FROM CrateTrackList WHERE crateId = ? AND trackId = ?" @@ -65,7 +66,7 @@ void el_crate_impl::add_track(track tr) << "INSERT INTO CrateTrackList (crateId, trackId) VALUES (?, ?)" << id() << tr.id(); - storage_->db << "COMMIT"; + trans.commit(); } std::vector el_crate_impl::children() @@ -175,7 +176,7 @@ void el_crate_impl::remove_track(track tr) void el_crate_impl::set_name(boost::string_view name) { - storage_->db << "BEGIN"; + el_transaction_guard_impl trans{storage_}; // obtain parent's `path` std::string parent_path; @@ -207,12 +208,12 @@ void el_crate_impl::set_name(boost::string_view name) update_path(storage_->db, cr, path); } - storage_->db << "COMMIT"; + trans.commit(); } void el_crate_impl::set_parent(boost::optional parent) { - storage_->db << "BEGIN"; + el_transaction_guard_impl trans{storage_}; storage_->db << "DELETE FROM CrateParentList WHERE crateOriginId = ?" << id(); @@ -232,7 +233,7 @@ void el_crate_impl::set_parent(boost::optional parent) << id() << parent->id() << parent->id() << id(); } - storage_->db << "COMMIT"; + trans.commit(); } std::vector el_crate_impl::tracks() diff --git a/src/djinterop/enginelibrary/el_database_impl.cpp b/src/djinterop/enginelibrary/el_database_impl.cpp index f6efc87..f2bde71 100644 --- a/src/djinterop/enginelibrary/el_database_impl.cpp +++ b/src/djinterop/enginelibrary/el_database_impl.cpp @@ -92,7 +92,7 @@ std::vector el_database_impl::crates_by_name(boost::string_view name) crate el_database_impl::create_crate(boost::string_view name) { - storage_->db << "BEGIN"; + el_transaction_guard_impl trans{storage_}; storage_->db << "INSERT INTO Crate (title, path) VALUES (?, ?)" << name.data() << std::string{name} + ';'; @@ -103,9 +103,11 @@ crate el_database_impl::create_crate(boost::string_view name) "crateParentId) VALUES (?, ?)" << id << id; - storage_->db << "COMMIT"; + crate cr{std::make_shared(storage_, id)}; - return crate{std::make_shared(storage_, id)}; + trans.commit(); + + return cr; } track el_database_impl::create_track(boost::string_view relative_path) @@ -115,7 +117,7 @@ track el_database_impl::create_track(boost::string_view relative_path) auto filename = get_filename(relative_path); - storage_->db << "BEGIN"; + el_transaction_guard_impl trans{storage_}; // Insert a new entry in the track table storage_->db << "INSERT INTO Track (path, filename, trackType, " @@ -185,9 +187,11 @@ track el_database_impl::create_track(boost::string_view relative_path) } } - storage_->db << "COMMIT"; + track tr{std::make_shared(storage_, id)}; - return track{std::make_shared(storage_, id)}; + trans.commit(); + + return tr; } std::string el_database_impl::directory() diff --git a/src/djinterop/enginelibrary/el_track_impl.cpp b/src/djinterop/enginelibrary/el_track_impl.cpp index b84347f..167dece 100644 --- a/src/djinterop/enginelibrary/el_track_impl.cpp +++ b/src/djinterop/enginelibrary/el_track_impl.cpp @@ -21,6 +21,7 @@ #include #include #include +#include #include namespace djinterop @@ -205,11 +206,11 @@ std::vector el_track_impl::adjusted_beatgrid() void el_track_impl::set_adjusted_beatgrid(std::vector beatgrid) { - storage_->db << "BEGIN"; + el_transaction_guard_impl trans{storage_}; auto beat_d = get_beat_data(); beat_d.adjusted_beatgrid = std::move(beatgrid); set_beat_data(std::move(beat_d)); - storage_->db << "COMMIT"; + trans.commit(); } double el_track_impl::adjusted_main_cue() @@ -219,11 +220,11 @@ double el_track_impl::adjusted_main_cue() void el_track_impl::set_adjusted_main_cue(double sample_offset) { - storage_->db << "BEGIN"; + el_transaction_guard_impl trans{storage_}; auto quick_cues_d = get_quick_cues_data(); quick_cues_d.adjusted_main_cue = sample_offset; set_quick_cues_data(std::move(quick_cues_d)); - storage_->db << "COMMIT"; + trans.commit(); } boost::optional el_track_impl::album() @@ -279,11 +280,11 @@ boost::optional el_track_impl::average_loudness() void el_track_impl::set_average_loudness( boost::optional average_loudness) { - storage_->db << "BEGIN"; + el_transaction_guard_impl trans{storage_}; auto track_d = get_track_data(); track_d.average_loudness = average_loudness; set_track_data(track_d); - storage_->db << "COMMIT"; + trans.commit(); } boost::optional el_track_impl::bitrate() @@ -357,11 +358,11 @@ std::vector el_track_impl::default_beatgrid() void el_track_impl::set_default_beatgrid(std::vector beatgrid) { - storage_->db << "BEGIN"; + el_transaction_guard_impl trans{storage_}; auto beat_d = get_beat_data(); beat_d.default_beatgrid = std::move(beatgrid); set_beat_data(std::move(beat_d)); - storage_->db << "COMMIT"; + trans.commit(); } double el_track_impl::default_main_cue() @@ -371,11 +372,11 @@ double el_track_impl::default_main_cue() void el_track_impl::set_default_main_cue(double sample_offset) { - storage_->db << "BEGIN"; + el_transaction_guard_impl trans{storage_}; auto quick_cues_d = get_quick_cues_data(); quick_cues_d.default_main_cue = sample_offset; set_quick_cues_data(std::move(quick_cues_d)); - storage_->db << "COMMIT"; + trans.commit(); } boost::optional el_track_impl::duration() @@ -427,7 +428,7 @@ boost::optional el_track_impl::hot_cue_at(int32_t index) void el_track_impl::set_hot_cue_at(int32_t index, boost::optional cue) { - storage_->db << "BEGIN"; + el_transaction_guard_impl trans{storage_}; auto quick_cues_d = get_quick_cues_data(); quick_cues_d.hot_cues[index] = std::move(cue); set_quick_cues_data(std::move(quick_cues_d)); @@ -442,7 +443,7 @@ std::array, 8> el_track_impl::hot_cues() void el_track_impl::set_hot_cues(std::array, 8> cues) { - storage_->db << "BEGIN"; + el_transaction_guard_impl trans{storage_}; // TODO (haslersn): The following can be optimized because in this case we // overwrite all hot_cues auto quick_cues_d = get_quick_cues_data(); @@ -517,14 +518,12 @@ void el_track_impl::set_key(boost::optional key) key_num = static_cast(*key); } - storage_->db << "BEGIN"; + el_transaction_guard_impl trans{storage_}; auto track_d = get_track_data(); track_d.key = key; set_track_data(track_d); - storage_->db << "COMMIT"; - - // TODO (haslersn): atomic? set_metadata_int(metadata_int_type::musical_key, key_num); + trans.commit(); } boost::optional el_track_impl::last_accessed_at() @@ -607,7 +606,7 @@ boost::optional el_track_impl::loop_at(int32_t index) void el_track_impl::set_loop_at(int32_t index, boost::optional l) { - storage_->db << "BEGIN"; + el_transaction_guard_impl trans{storage_}; auto loops_d = get_loops_data(); loops_d.loops[index] = std::move(l); set_loops_data(std::move(loops_d)); @@ -622,7 +621,7 @@ std::array, 8> el_track_impl::loops() void el_track_impl::set_loops(std::array, 8> cues) { - storage_->db << "BEGIN"; + el_transaction_guard_impl trans{storage_}; loops_data loops_d; loops_d.loops = std::move(cues); set_loops_data(std::move(loops_d)); @@ -687,7 +686,7 @@ boost::optional el_track_impl::sampling() void el_track_impl::set_sampling(boost::optional sampling) { - // TODO (haslersn): atomic? + el_transaction_guard_impl trans{storage_}; boost::optional secs; if (sampling) @@ -712,14 +711,13 @@ void el_track_impl::set_sampling(boost::optional sampling) set_cell("length", secs); set_cell("lengthCalculated", secs); - storage_->db << "BEGIN"; - // read old data auto track_d = get_track_data(); auto beat_d = get_beat_data(); auto high_res_waveform_d = get_high_res_waveform_data(); auto overview_waveform_d = get_overview_waveform_data(); + // write new data track_d.sampling = sampling; beat_d.sampling = sampling; set_beat_data(std::move(beat_d)); @@ -741,7 +739,7 @@ void el_track_impl::set_sampling(boost::optional sampling) set_overview_waveform_data(std::move(overview_waveform_d)); } - storage_->db << "COMMIT"; + trans.commit(); } boost::optional el_track_impl::title() @@ -772,12 +770,13 @@ std::vector el_track_impl::waveform() void el_track_impl::set_waveform(std::vector waveform) { + el_transaction_guard_impl trans{storage_}; + overview_waveform_data overview_waveform_d; high_res_waveform_data high_res_waveform_d; if (!waveform.empty()) { - // TODO (haslersn): atomic? auto smp = sampling(); int64_t sample_count = smp ? smp->sample_count : 0; overview_waveform_d.samples_per_entry = sample_count / 1024; @@ -791,10 +790,10 @@ void el_track_impl::set_waveform(std::vector waveform) high_res_waveform_d.waveform = std::move(waveform); } - storage_->db << "BEGIN"; set_overview_waveform_data(std::move(overview_waveform_d)); set_high_res_waveform_data(std::move(high_res_waveform_d)); - storage_->db << "END"; + + trans.commit(); } boost::optional el_track_impl::year() diff --git a/src/djinterop/enginelibrary/el_track_impl.hpp b/src/djinterop/enginelibrary/el_track_impl.hpp index d06bcff..657498b 100644 --- a/src/djinterop/enginelibrary/el_track_impl.hpp +++ b/src/djinterop/enginelibrary/el_track_impl.hpp @@ -133,7 +133,6 @@ public: return result.value_or(T{}); } - // NOTE: No transaction template void set_perfdata(const char* column_name, const T& content) { diff --git a/src/djinterop/enginelibrary/el_transaction_guard_impl.cpp b/src/djinterop/enginelibrary/el_transaction_guard_impl.cpp index 6632d51..0b214d1 100644 --- a/src/djinterop/enginelibrary/el_transaction_guard_impl.cpp +++ b/src/djinterop/enginelibrary/el_transaction_guard_impl.cpp @@ -28,7 +28,7 @@ el_transaction_guard_impl::el_transaction_guard_impl( { // TODO (haslersn): Should el_storage::last_savepoint be atomic such that // this is thread-safe? - storage_->db << "SAVEPOINT ?" << savepoint_; + storage_->db << ("SAVEPOINT s" + std::to_string(savepoint_)); } el_transaction_guard_impl::~el_transaction_guard_impl() @@ -37,7 +37,7 @@ el_transaction_guard_impl::~el_transaction_guard_impl() { try { - storage_->db << "ROLLBACK TO ?" << savepoint_; + storage_->db << ("ROLLBACK TO s" + std::to_string(savepoint_)); } catch (...) { @@ -55,7 +55,7 @@ void el_transaction_guard_impl::commit() { auto savepoint = savepoint_; savepoint_ = 0; - storage_->db << "RELEASE ?" << savepoint; + storage_->db << ("RELEASE s" + std::to_string(savepoint)); } } // namespace enginelibrary -- cgit v1.2.3