7 #include "third_party/sqlite/sqlite3.h"
20 explicit Handle(
const std::string& filename) {
21 if (::sqlite3_initialize() != SQLITE_OK) {
26 sqlite3* db =
nullptr;
27 auto res = ::sqlite3_open(filename.c_str(), &db);
29 if (res != SQLITE_OK || db ==
nullptr) {
37 if (handle_ ==
nullptr) {
40 ::sqlite3_close(handle_);
43 ::sqlite3*
Get()
const {
return handle_; }
45 bool IsValid()
const {
return handle_ !=
nullptr; }
48 ::sqlite3* handle_ =
nullptr;
56 : handle_(
std::make_unique<
Handle>(filename)) {
57 if (!handle_->IsValid()) {
62 begin_transaction_stmt_ = std::unique_ptr<ArchiveStatement>(
65 if (!begin_transaction_stmt_->IsValid()) {
69 end_transaction_stmt_ = std::unique_ptr<ArchiveStatement>(
72 if (!end_transaction_stmt_->IsValid()) {
76 rollback_transaction_stmt_ = std::unique_ptr<ArchiveStatement>(
79 if (!rollback_transaction_stmt_->IsValid()) {
87 return handle_ !=
nullptr;
94 return ::sqlite3_last_insert_rowid(handle_->Get());
99 if (registration ==
nullptr) {
102 return registration->
IsValid() ? registration :
nullptr;
107 auto found = registrations_.find(definition.
table_name);
108 if (found != registrations_.end()) {
118 auto registration = std::unique_ptr<ArchiveClassRegistration>(
121 registrations_.emplace(definition.
table_name, std::move(registration));
131 const std::string& statementString)
const {
132 return ArchiveStatement{handle_ ? handle_->Get() :
nullptr, statementString};
136 int64_t& transactionCount) {
138 *begin_transaction_stmt_,
139 *end_transaction_stmt_,
140 *rollback_transaction_stmt_};