Horizon
sqlite.hpp
1 #pragma once
2 #include <sqlite3.h>
3 #include <string>
4 #include <tuple>
5 #include <stdexcept>
6 
7 namespace horizon {
8 enum class ObjectType;
9 class UUID;
10 } // namespace horizon
11 
12 namespace horizon::SQLite {
13 class noncopyable {
14 protected:
15  noncopyable() = default;
16  ~noncopyable() = default;
17 
18  noncopyable(noncopyable &&) = default;
19  noncopyable &operator=(noncopyable &&) = default;
20 
21  noncopyable(noncopyable const &) = delete;
22  noncopyable &operator=(noncopyable const &) = delete;
23 };
24 
25 class Query : noncopyable {
26 public:
27  Query(class Database &d, const std::string &sql);
28  Query(class Database &d, const char *sql, int size = -1);
29  ~Query();
30  bool step();
31  template <class T> T get(int idx) const
32  {
33  T r;
34  get(idx, r);
35  return r;
36  }
37 
38  void bind(int idx, const std::string &v, bool copy = true);
39  void bind(const char *name, const std::string &v, bool copy = true);
40  void bind(int idx, int v);
41  void bind(const char *name, int v);
42  void bind_int64(int idx, sqlite3_int64 v);
43  void bind_int64(const char *name, sqlite3_int64 v);
44  void bind(int idx, const horizon::UUID &v);
45  void bind(const char *name, const horizon::UUID &v);
46  void bind(int idx, ObjectType type);
47  void bind(const char *name, ObjectType type);
48  void reset();
49 
50  int get_column_count();
51  std::string get_column_name(int col);
52 
53 private:
54  class Database &db;
55  sqlite3_stmt *stmt;
56 
57  void get(int idx, std::string &r) const;
58  void get(int idx, UUID &r) const;
59  void get(int idx, int &r) const;
60  void get(int idx, sqlite3_int64 &r) const;
61  void get(int idx, ObjectType &r) const;
62 };
63 
64 class Error : public std::runtime_error {
65 public:
66  Error(int a_rc, const char *what) : std::runtime_error(what), rc(a_rc)
67  {
68  }
69  const int rc;
70 };
71 
72 class Database {
73  friend Query;
74 
75 public:
76  Database(const std::string &filename, int flags = SQLITE_OPEN_READONLY, int timeout_ms = 0);
77  ~Database();
78  void execute(const std::string &query);
79  void execute(const char *query);
80  int get_user_version();
81 
82 private:
83  sqlite3 *db = nullptr;
84 };
85 } // namespace horizon::SQLite
Definition: sqlite.hpp:72
Definition: sqlite.hpp:64
Definition: sqlite.hpp:25
Definition: sqlite.hpp:13
This class encapsulates a UUID and allows it to be uses as a value type.
Definition: uuid.hpp:16
meta::size_t< L::size()> size
An integral constant wrapper that is the size of the meta::list L.
Definition: meta.hpp:1696