NexusForce 1.0.0
A rigorously engineered full-stack C++ backend library.
载入中...
搜索中...
未找到
sqlite_connect.hpp
浏览该文件的文档.
1#ifndef NEFORCE_DATABASE_SQLITE_CONNECT_HPP__
2#define NEFORCE_DATABASE_SQLITE_CONNECT_HPP__
3
10
11#ifdef NEFORCE_SUPPORT_SQLITE3
12# ifdef NEFORCE_SUPPORT_SQLCIPHER
13# include <sqlcipher/sqlite3.h>
14
15# include <utility>
16# else
17# include <sqlite3.h>
18# endif
20NEFORCE_BEGIN_NAMESPACE__
21
27
33
51struct NEFORCE_API sqlite_connect final : sql_connect_base<sqlite_connect> {
52public:
53# ifdef NEFORCE_SUPPORT_SQLCIPHER
63 enum class key_type : byte_t {
64 PBKDF2,
65 RAW
66 };
67# endif
68
69protected:
70 ::sqlite3* link_ = nullptr;
72
73private:
74 mutable string last_error_;
75 mutable uint32_t last_errno_ = 0;
76
77public:
83 sqlite_connect() noexcept { ::sqlite3_open(nullptr, &link_); }
84
90 ~sqlite_connect() noexcept override { this->close(); }
91
100 bool connect(const db_config& config) override;
101
109 NEFORCE_NODISCARD bool reconnect(const db_config& config) override;
110
111# ifdef NEFORCE_SUPPORT_SQLCIPHER
112
123 bool connect(const db_config& config, const string& encryption_key, key_type type = key_type::PBKDF2);
124
134 NEFORCE_NODISCARD bool reconnect(const db_config& config, const string& encryption_key,
135 key_type type = key_type::PBKDF2);
136
145 NEFORCE_NODISCARD bool rekey(const string& new_key, key_type type = key_type::PBKDF2);
146
147# endif
148
152 void close() noexcept override;
153
159 NEFORCE_NODISCARD bool set_character_set(const string& encoding) override;
160
165 NEFORCE_NODISCARD string_view get_character_set() const override;
166
171 NEFORCE_NODISCARD string_view get_error() const override;
172
177 NEFORCE_NODISCARD uint32_t get_errno() const override { return last_errno_; }
178
184 NEFORCE_NODISCARD bool update(const string& sql) const override;
185
191 NEFORCE_NODISCARD unique_ptr<idb_tb_result> query(const string& sql) const override;
192
198 NEFORCE_NODISCARD unique_ptr<idb_prepared_statement> prepare_statement(const string& sql) const override;
199
204 NEFORCE_NODISCARD bool connected() const override { return link_ != nullptr; }
205
210 NEFORCE_NODISCARD bool is_valid() const override;
211
212 NEFORCE_NODISCARD bool table_exists(const string& table) const override;
213
214 size_t batch_insert(const string& table, const vector<string>& columns,
215 const vector<vector<string>>& rows) override;
216
217private:
218 string begin_sql() { return "BEGIN TRANSACTION"; }
219 string commit_sql() { return "COMMIT"; }
220 string rollback_sql() { return "ROLLBACK"; }
221 string table_exists_query(const string& table) const {
222 return "SELECT name FROM sqlite_master WHERE type='table' AND name='" + table + "'";
223 }
224};
225
232class NEFORCE_API sqlite_factory final : public idb_factory {
233# ifdef NEFORCE_SUPPORT_SQLCIPHER
234 string encryption_key_;
235 sqlite_connect::key_type key_type_ = sqlite_connect::key_type::PBKDF2;
236# endif
237
238public:
243 explicit sqlite_factory(db_config config) :
244 idb_factory(move(config)) {}
245
246# ifdef NEFORCE_SUPPORT_SQLCIPHER
253 explicit sqlite_factory(db_config config, string encryption_key,
254 sqlite_connect::key_type type = sqlite_connect::key_type::PBKDF2) :
255 idb_factory(move(config)),
256 encryption_key_(move(encryption_key)),
257 key_type_(type) {}
258# endif
259
265
271 idb_result* create_result(void* native_result) override;
272};
273 // SQLite3
275 // Database
277
278NEFORCE_END_NAMESPACE__
279#endif
280#endif // NEFORCE_DATABASE_SQLITE_CONNECT_HPP__
数据库连接工厂抽象基类
idb_factory(db_config config) noexcept
构造函数
idb_result * create_result(void *native_result) override
创建SQLite结果集对象
sqlite_factory(db_config config)
构造函数
idb_connect * create_connect() override
创建SQLite连接对象
独占智能指针
动态大小数组容器
unsigned char byte_t
字节类型,定义为无符号字符
unsigned int uint32_t
32位无符号整数类型
constexpr Iterator2 move(Iterator1 first, Iterator1 last, Iterator2 result) noexcept(noexcept(inner::__move_aux(first, last, result)))
移动范围元素
basic_string_view< char > string_view
字符字符串视图
SQL连接CRTP基类
数据库连接配置结构
数据库连接抽象基类
virtual bool reconnect(const db_config &config)=0
重新连接
virtual bool connect(const db_config &config)=0
建立连接
virtual void close()=0
关闭连接
数据库结果集抽象基类
bool update(const string &sql) const override
执行非查询SQL语句
::sqlite3 * link_
SQLite数据库连接句柄
uint32_t get_errno() const override
获取最后错误码
bool connected() const override
检查连接是否已建立
unique_ptr< idb_tb_result > query(const string &sql) const override
执行查询SQL语句
string_view get_error() const override
获取最后错误信息
void close() noexcept override
关闭数据库连接
~sqlite_connect() noexcept override
析构函数
string_view get_character_set() const override
获取当前字符集
bool connect(const db_config &config) override
建立数据库连接
bool reconnect(const db_config &config) override
重新连接数据库
bool is_valid() const override
检查连接是否有效
unique_ptr< idb_prepared_statement > prepare_statement(const string &sql) const override
创建预处理语句
sqlite_connect() noexcept
默认构造函数
bool set_character_set(const string &encoding) override
设置字符集