From 5bc49de682eec79f3dc8096c6812bee70fe2d496 Mon Sep 17 00:00:00 2001 From: Joel Klinghed Date: Wed, 3 Jun 2015 00:06:31 +0200 Subject: Make it simpler to use DB Add DB::Transaction --- src/db.hh | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) (limited to 'src/db.hh') diff --git a/src/db.hh b/src/db.hh index a4f65e4..dee3d74 100644 --- a/src/db.hh +++ b/src/db.hh @@ -252,6 +252,10 @@ public: : mode_(COMP_BINARY), c_(c), v_(v) { op_.comp_binary = op; } + Condition(const std::string& name, BinaryOperator op, const Value& v) + : mode_(COMP_BINARY), c_(Column(name)), v_(v) { + op_.comp_binary = op; + } Condition(UnaryOperator op, const Column& c) : mode_(COMP_UNARY), c_(c) { op_.comp_unary = op; @@ -340,6 +344,50 @@ public: bool ascending_; }; + class Transaction { + public: + Transaction(std::shared_ptr db) + : db_(db), ptr_(db.get()) { + start(); + } + Transaction(DB* db) + : ptr_(db) { + start(); + } + ~Transaction() { + rollback(); + } + bool rollback() { + if (ptr_ && good_) { + good_ = ptr_->rollback_transaction(); + db_.reset(); + ptr_ = nullptr; + } + return good_; + } + bool commit() { + if (ptr_ && good_) { + good_ = ptr_->commit_transaction(); + if (!good_) { + ptr_->rollback_transaction(); + } + db_.reset(); + ptr_ = nullptr; + } + return good_; + } + private: + Transaction(const Transaction&) = delete; + Transaction& operator=(const Transaction&) = delete; + void start() { + good_ = ptr_ && ptr_->start_transaction(); + } + + std::shared_ptr db_; + DB* ptr_; + bool good_; + }; + // Create a table with the given declarations. // If a table with that name already exists nothing happens. // Returns false in case of error @@ -362,6 +410,11 @@ public: virtual std::shared_ptr select( const std::string& table, const Condition& condition = Condition(), const std::vector& order_by = std::vector()) = 0; + std::shared_ptr select( + const std::string& table, const OrderBy& order_by); + std::shared_ptr select( + const std::string& table, const Condition& condition, + const OrderBy& order_by); // Remove all rows matching condition in table. Returns number of rows // removed or -1 in case of error virtual int64_t remove(const std::string& table, -- cgit v1.2.3-70-g09d2