Mercurial > malikania
annotate database/sqlite/src/driver.cpp @ 39:56ab2f0c90dc
Server: add sqlite basic backend, closes #558
author | David Demelier <markand@malikania.fr> |
---|---|
date | Sun, 27 Nov 2016 18:00:49 +0100 |
parents | |
children | 1e206fdc7021 |
rev | line source |
---|---|
39
56ab2f0c90dc
Server: add sqlite basic backend, closes #558
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
1 #include <unordered_map> |
56ab2f0c90dc
Server: add sqlite basic backend, closes #558
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
2 #include <string> |
56ab2f0c90dc
Server: add sqlite basic backend, closes #558
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
3 |
56ab2f0c90dc
Server: add sqlite basic backend, closes #558
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
4 #include <malikania/dynlib.hpp> |
56ab2f0c90dc
Server: add sqlite basic backend, closes #558
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
5 |
56ab2f0c90dc
Server: add sqlite basic backend, closes #558
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
6 #include "driver.hpp" |
56ab2f0c90dc
Server: add sqlite basic backend, closes #558
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
7 |
56ab2f0c90dc
Server: add sqlite basic backend, closes #558
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
8 namespace sqlite { |
56ab2f0c90dc
Server: add sqlite basic backend, closes #558
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
9 |
56ab2f0c90dc
Server: add sqlite basic backend, closes #558
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
10 std::unique_ptr<sqlite3, int (*)(sqlite3 *)> database{nullptr, nullptr}; |
56ab2f0c90dc
Server: add sqlite basic backend, closes #558
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
11 |
56ab2f0c90dc
Server: add sqlite basic backend, closes #558
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
12 statement prepare(const std::string& sql) |
56ab2f0c90dc
Server: add sqlite basic backend, closes #558
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
13 { |
56ab2f0c90dc
Server: add sqlite basic backend, closes #558
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
14 sqlite3_stmt* stmt; |
56ab2f0c90dc
Server: add sqlite basic backend, closes #558
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
15 |
56ab2f0c90dc
Server: add sqlite basic backend, closes #558
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
16 if (sqlite3_prepare_v2(database.get(), sql.c_str(), sql.length(), &stmt, nullptr) != SQLITE_OK) { |
56ab2f0c90dc
Server: add sqlite basic backend, closes #558
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
17 throw std::runtime_error(sqlite3_errmsg(database.get())); |
56ab2f0c90dc
Server: add sqlite basic backend, closes #558
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
18 } |
56ab2f0c90dc
Server: add sqlite basic backend, closes #558
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
19 |
56ab2f0c90dc
Server: add sqlite basic backend, closes #558
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
20 return {stmt, &sqlite3_finalize}; |
56ab2f0c90dc
Server: add sqlite basic backend, closes #558
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
21 } |
56ab2f0c90dc
Server: add sqlite basic backend, closes #558
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
22 |
56ab2f0c90dc
Server: add sqlite basic backend, closes #558
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
23 } // !sqlite |
56ab2f0c90dc
Server: add sqlite basic backend, closes #558
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
24 |
56ab2f0c90dc
Server: add sqlite basic backend, closes #558
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
25 extern "C" { |
56ab2f0c90dc
Server: add sqlite basic backend, closes #558
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
26 |
56ab2f0c90dc
Server: add sqlite basic backend, closes #558
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
27 DYNLIB_EXPORT void malikania_driver_load(const std::unordered_map<std::string, std::string>& params) |
56ab2f0c90dc
Server: add sqlite basic backend, closes #558
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
28 { |
56ab2f0c90dc
Server: add sqlite basic backend, closes #558
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
29 auto path = params.find("path"); |
56ab2f0c90dc
Server: add sqlite basic backend, closes #558
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
30 |
56ab2f0c90dc
Server: add sqlite basic backend, closes #558
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
31 if (path == params.end()) { |
56ab2f0c90dc
Server: add sqlite basic backend, closes #558
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
32 throw std::runtime_error("missing 'path' parameter"); |
56ab2f0c90dc
Server: add sqlite basic backend, closes #558
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
33 } |
56ab2f0c90dc
Server: add sqlite basic backend, closes #558
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
34 |
56ab2f0c90dc
Server: add sqlite basic backend, closes #558
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
35 sqlite3* db; |
56ab2f0c90dc
Server: add sqlite basic backend, closes #558
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
36 |
56ab2f0c90dc
Server: add sqlite basic backend, closes #558
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
37 if (sqlite3_open(path->second.c_str(), &db) != SQLITE_OK) { |
56ab2f0c90dc
Server: add sqlite basic backend, closes #558
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
38 throw std::runtime_error(sqlite3_errmsg(db)); |
56ab2f0c90dc
Server: add sqlite basic backend, closes #558
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
39 } |
56ab2f0c90dc
Server: add sqlite basic backend, closes #558
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
40 |
56ab2f0c90dc
Server: add sqlite basic backend, closes #558
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
41 sqlite::database = {db, &sqlite3_close}; |
56ab2f0c90dc
Server: add sqlite basic backend, closes #558
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
42 |
56ab2f0c90dc
Server: add sqlite basic backend, closes #558
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
43 #if 0 |
56ab2f0c90dc
Server: add sqlite basic backend, closes #558
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
44 // Not needed with SQLITE_DEFAULT_FOREIGN_KEYS |
56ab2f0c90dc
Server: add sqlite basic backend, closes #558
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
45 if (sqlite3_exec(db, "PRAGMA foreign_keys = ON", nullptr, nullptr, nullptr) != SQLITE_OK) { |
56ab2f0c90dc
Server: add sqlite basic backend, closes #558
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
46 throw std::runtime_error(sqlite3_errmsg(db)); |
56ab2f0c90dc
Server: add sqlite basic backend, closes #558
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
47 } |
56ab2f0c90dc
Server: add sqlite basic backend, closes #558
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
48 #endif |
56ab2f0c90dc
Server: add sqlite basic backend, closes #558
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
49 } |
56ab2f0c90dc
Server: add sqlite basic backend, closes #558
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
50 |
56ab2f0c90dc
Server: add sqlite basic backend, closes #558
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
51 DYNLIB_EXPORT void malikania_driver_unload() |
56ab2f0c90dc
Server: add sqlite basic backend, closes #558
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
52 { |
56ab2f0c90dc
Server: add sqlite basic backend, closes #558
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
53 // Explicit destruction, optional. |
56ab2f0c90dc
Server: add sqlite basic backend, closes #558
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
54 sqlite::database = nullptr; |
56ab2f0c90dc
Server: add sqlite basic backend, closes #558
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
55 } |
56ab2f0c90dc
Server: add sqlite basic backend, closes #558
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
56 |
56ab2f0c90dc
Server: add sqlite basic backend, closes #558
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
57 } // !C |