OSDN Git Service

* {init_/done_}core() に引数を追加
[gikomona/libcore.git] / include / database.hpp
1 #ifndef GIKOMONA_CORE_DATABASE_HPP
2 #define GIKOMONA_CORE_DATABASE_HPP
3
4 #include <memory>
5
6 #include <boost/filesystem.hpp>
7
8 #include "GikoMona.hpp"
9
10 namespace monazilla { namespace GikoMona { namespace core {
11
12 class database final {
13 public:
14     typedef database self_type;
15
16     database() : database("", boost::system::error_code()) {}
17     
18     /// @brief すでに存在するデータベースファイルを開く。まだファイルが存在しない場合は、新たに作成する。
19     database(const boost::filesystem::path& db_path,
20              boost::system::error_code& ec) : db(db_path.c_str(), ec) {}
21     
22     database(const self_type& other) = delete;
23     
24     ~database() { db.close(); }
25     
26     sqlite::connection& get_connection() { return db; }
27
28     /// @brief データベースの最適化を行う。
29     /**
30      * @note 内部では以下のコマンドが実行され、データベース中の不要なデータの圧縮と再構築が行われる。
31      *       VACUUM; REINDEX;
32      */
33     void optimize(boost::system::error_code& ec) noexcept {
34         sqlite::execute_statement<>(db, u8"VACUUM;", ec);
35         sqlite::execute_statement<>(db, u8"REINDEX;", ec);
36     }
37     
38     void begin_sql_statement() noexcept {
39         sqlite::execute_statement<>(db, u8"BEGIN;", transaction_ec);
40         
41         if(transaction_ec) { /* logger */ }
42     }
43     
44     void end_sql_statement() noexcept {
45         if(!transaction_ec) {
46             sqlite::execute_statement<>(db, "END;");
47         } else {
48             // logger
49         }
50     }
51     
52 private:
53     sqlite::connection db;
54     boost::system::error_code transaction_ec;
55 };
56
57 struct sql_transaction final {
58     sql_transaction(database& db_) : db(db_) { db.begin_sql_statement(); }
59     ~sql_transaction() { db.end_sql_statement(); }
60 private:
61     database db;
62 };
63
64 } } }
65
66 #endif