11#pragma once
22#include " core_as/str/sstring.h"
33#include " sqlite3.h"
4+ #include < utility>
45using namespace core_as ::str;
56
67class SqliteQuery ;
@@ -21,13 +22,17 @@ concept QueryResultReceiver = requires(T& t) {
2122class SqliteBase {
2223public:
2324 SqliteBase () = default ;
25+ ~SqliteBase () {
26+ close ();
27+ }
2428 SqliteBase (const SqliteBase&) = delete ;
25- SqliteBase (SqliteBase&& other) noexcept : db_(other.db_) {
29+ SqliteBase (SqliteBase&& other) noexcept : db_(other.db_), opened_(other.opened_) {
2630 other.db_ = nullptr ;
31+ other.opened_ = false ;
2732 }
2833 SqliteBase& operator =(SqliteBase other) noexcept {
29- this -> ~SqliteBase ( );
30- new ( this ) SqliteBase ( std::move ( other) );
34+ std::swap (db_, other. db_ );
35+ std::swap (opened_, other. opened_ );
3136 return *this ;
3237 }
3338
@@ -45,16 +50,16 @@ class SqliteBase {
4550 return stru{ db_ ? (const u16s*)sqlite3_errmsg16 (db_) : nullptr };
4651 }
4752 int64_t lastId () const {
48- return db_ ? sqlite3_last_insert_rowid (db_) : 0 ;
53+ return opened_ ? sqlite3_last_insert_rowid (db_) : 0 ;
4954 }
5055 int64_t changes () const {
51- return db_ ? sqlite3_changes64 (db_) : 0 ;
56+ return opened_ ? sqlite3_changes64 (db_) : 0 ;
5257 }
5358 SqliteQuery prepare (stru query);
5459
5560protected:
56- sqlite3* db_{nullptr };
57- bool opened_{false };
61+ sqlite3* db_{};
62+ bool opened_{};
5863};
5964
6065template <typename T>
@@ -238,14 +243,15 @@ class SqliteQuery {
238243 sqlite3_reset (stmt_);
239244 receiver.setResult (result, sqlite3_db_handle (stmt_));
240245 }
241- template <QueryResultReceiver Q>
242- Q exec () {
243- Q receiver;
246+ template <QueryResultReceiver Q, typename ...Args >
247+ Q exec (Args&&... args ) {
248+ Q receiver (std::forward<Args>(args)...) ;
244249 exec (receiver);
245250 return receiver;
246251 }
252+
247253protected:
248- sqlite3_stmt* stmt_{nullptr };
254+ sqlite3_stmt* stmt_{};
249255};
250256
251257double calcJulianDate (tm& dt);
0 commit comments