1 #ifndef GIKOMONA_CORE_DATABASE_HPP
2 #define GIKOMONA_CORE_DATABASE_HPP
8 #include <boost/filesystem.hpp>
10 #include "GikoMona.hpp"
13 namespace monazilla { namespace GikoMona { namespace core {
15 class database final {
18 class sql_executer final {
21 sql_executer(const mona_string& sql) {}
29 typedef ::sqlite3 *db_object_type;
30 typedef database self_type;
32 database() : database("") {}
34 /// @breif すでに存在するデータベースファイルを開く。まだファイルが存在しない場合は、新たに作成する。
35 database(const boost::filesystem::path& db_path) {
39 if(!boost::filesystem::exists(db_path)) {
47 database(const self_type& other) = delete;
49 ~database() { close(); }
51 /// @breif 受け取った SQL を実行する。ただし、実行できる文は返り値の無いものに限られる。
53 * @return SQL が正常に実行された場合は true、それ以外の場合は false を返す。
54 * @note この関数は SQL の実行結果を返さない。したがって、実行結果が必要な場合は、
55 * compile_sql() を用いるべきである。
57 bool run_sql(const mona_string& sql) {
58 return (::sqlite3_exec(db, sql.c_str(), NULL, NULL, NULL) != SQLITE_OK)
62 /// @breif 受け取った SQL を sql_executer へと変換して返す。
64 * @note 返された sql_executer を実行することで、ここで渡した SQL の実行結果を得ることができる。
65 * 実行した SQL の実行結果が不要である (あるいはそもそも実行結果が無い) 場合は、
66 * run_sql() を用いるべきである。
69 sql_executer<T> compile_sql(const mona_string& sql) {
70 return sql_executer<T>(sql);
73 /// @brief すでに存在するデータベースファイルを開く。
74 bool open(const boost::filesystem::path& db_path) {
80 (::sqlite3_open(db_path.c_str(), &db) != SQLITE_OK)
86 /// @breif まだ存在しないデータベースファイルを新たに作成する。
88 * @return true: ファイルが存在せず、かつ新たにデータベースファイルを作成することに成功した
89 * false: ファイルが存在する、あるいは存在しないが新規データベースファイルの作成に失敗した
91 bool create(const boost::filesystem::path& db_path) {
92 if(boost::filesystem::exists(db_path)) {
99 void close() noexcept {
107 void begin_sql_statement() { run_sql("begin;"); }
108 void end_sql_statement() { run_sql("end"); }
112 struct is_responsible_to_query<database> : public boost::mpl::true_ {};