summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorhaslersn <sebastian.hasler@gmx.net>2019-07-08 02:22:13 +0200
committerhaslersn <sebastian.hasler@gmx.net>2019-07-08 02:24:37 +0200
commitee7d0f0d144d8204020cbe51323b0c7741b76060 (patch)
tree27d1e57be52ca8baf194a9c290683f093a96f7a8 /src
parent835c3f94a3301392d56396b25e3f5a3012b38b90 (diff)
enginelibrary: Use el_transaction_guard_impl
Diffstat (limited to 'src')
-rw-r--r--src/djinterop/enginelibrary.cpp5
-rw-r--r--src/djinterop/enginelibrary/el_crate_impl.cpp13
-rw-r--r--src/djinterop/enginelibrary/el_database_impl.cpp16
-rw-r--r--src/djinterop/enginelibrary/el_track_impl.cpp49
-rw-r--r--src/djinterop/enginelibrary/el_track_impl.hpp1
-rw-r--r--src/djinterop/enginelibrary/el_transaction_guard_impl.cpp6
6 files changed, 47 insertions, 43 deletions
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 <djinterop/djinterop.hpp>
#include <djinterop/enginelibrary/el_database_impl.hpp>
+#include <djinterop/enginelibrary/el_transaction_guard_impl.hpp>
#include <djinterop/enginelibrary/schema.hpp>
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<el_storage>(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<el_database_impl>(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 <djinterop/enginelibrary/el_database_impl.hpp>
#include <djinterop/enginelibrary/el_storage.hpp>
#include <djinterop/enginelibrary/el_track_impl.hpp>
+#include <djinterop/enginelibrary/el_transaction_guard_impl.hpp>
namespace djinterop
{
@@ -55,7 +56,7 @@ el_crate_impl::el_crate_impl(std::shared_ptr<el_storage> 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<crate> 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<crate> 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<crate> parent)
<< id() << parent->id() << parent->id() << id();
}
- storage_->db << "COMMIT";
+ trans.commit();
}
std::vector<track> 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<crate> 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<el_crate_impl>(storage_, id)};
- return crate{std::make_shared<el_crate_impl>(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<el_track_impl>(storage_, id)};
- return track{std::make_shared<el_track_impl>(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 <djinterop/enginelibrary/el_crate_impl.hpp>
#include <djinterop/enginelibrary/el_database_impl.hpp>
#include <djinterop/enginelibrary/el_track_impl.hpp>
+#include <djinterop/enginelibrary/el_transaction_guard_impl.hpp>
#include <djinterop/impl/util.hpp>
namespace djinterop
@@ -205,11 +206,11 @@ std::vector<beatgrid_marker> el_track_impl::adjusted_beatgrid()
void el_track_impl::set_adjusted_beatgrid(std::vector<beatgrid_marker> 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<std::string> el_track_impl::album()
@@ -279,11 +280,11 @@ boost::optional<double> el_track_impl::average_loudness()
void el_track_impl::set_average_loudness(
boost::optional<double> 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<int64_t> el_track_impl::bitrate()
@@ -357,11 +358,11 @@ std::vector<beatgrid_marker> el_track_impl::default_beatgrid()
void el_track_impl::set_default_beatgrid(std::vector<beatgrid_marker> 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<milliseconds> el_track_impl::duration()
@@ -427,7 +428,7 @@ boost::optional<hot_cue> el_track_impl::hot_cue_at(int32_t index)
void el_track_impl::set_hot_cue_at(int32_t index, boost::optional<hot_cue> 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<boost::optional<hot_cue>, 8> el_track_impl::hot_cues()
void el_track_impl::set_hot_cues(std::array<boost::optional<hot_cue>, 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<musical_key> key)
key_num = static_cast<int64_t>(*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<system_clock::time_point> el_track_impl::last_accessed_at()
@@ -607,7 +606,7 @@ boost::optional<loop> el_track_impl::loop_at(int32_t index)
void el_track_impl::set_loop_at(int32_t index, boost::optional<loop> 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<boost::optional<loop>, 8> el_track_impl::loops()
void el_track_impl::set_loops(std::array<boost::optional<loop>, 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<sampling_info> el_track_impl::sampling()
void el_track_impl::set_sampling(boost::optional<sampling_info> sampling)
{
- // TODO (haslersn): atomic?
+ el_transaction_guard_impl trans{storage_};
boost::optional<int64_t> secs;
if (sampling)
@@ -712,14 +711,13 @@ void el_track_impl::set_sampling(boost::optional<sampling_info> 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_info> sampling)
set_overview_waveform_data(std::move(overview_waveform_d));
}
- storage_->db << "COMMIT";
+ trans.commit();
}
boost::optional<std::string> el_track_impl::title()
@@ -772,12 +770,13 @@ std::vector<waveform_entry> el_track_impl::waveform()
void el_track_impl::set_waveform(std::vector<waveform_entry> 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_entry> 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<int32_t> 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 <typename T>
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