Mercurial > malikania
annotate database/sqlite/src/driver.cpp @ 46:b0593a3e2ca8
Server: use Boost.Asio and add basic authentication support
author | David Demelier <markand@malikania.fr> |
---|---|
date | Sun, 04 Dec 2016 21:26:18 +0100 |
parents | 1e206fdc7021 |
children |
rev | line source |
---|---|
40
1e206fdc7021
Server: switch to Boost.DLL, closes #583
David Demelier <markand@malikania.fr>
parents:
39
diff
changeset
|
1 #include <boost/dll.hpp> |
1e206fdc7021
Server: switch to Boost.DLL, closes #583
David Demelier <markand@malikania.fr>
parents:
39
diff
changeset
|
2 |
39
56ab2f0c90dc
Server: add sqlite basic backend, closes #558
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
3 #include <unordered_map> |
56ab2f0c90dc
Server: add sqlite basic backend, closes #558
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
4 #include <string> |
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 |
46
b0593a3e2ca8
Server: use Boost.Asio and add basic authentication support
David Demelier <markand@malikania.fr>
parents:
40
diff
changeset
|
8 /* |
b0593a3e2ca8
Server: use Boost.Asio and add basic authentication support
David Demelier <markand@malikania.fr>
parents:
40
diff
changeset
|
9 * Global shared stuff for the driver |
b0593a3e2ca8
Server: use Boost.Asio and add basic authentication support
David Demelier <markand@malikania.fr>
parents:
40
diff
changeset
|
10 * ------------------------------------------------------------------ |
b0593a3e2ca8
Server: use Boost.Asio and add basic authentication support
David Demelier <markand@malikania.fr>
parents:
40
diff
changeset
|
11 */ |
b0593a3e2ca8
Server: use Boost.Asio and add basic authentication support
David Demelier <markand@malikania.fr>
parents:
40
diff
changeset
|
12 |
39
56ab2f0c90dc
Server: add sqlite basic backend, closes #558
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
13 namespace sqlite { |
56ab2f0c90dc
Server: add sqlite basic backend, closes #558
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
14 |
56ab2f0c90dc
Server: add sqlite basic backend, closes #558
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
15 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
|
16 |
56ab2f0c90dc
Server: add sqlite basic backend, closes #558
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
17 statement prepare(const std::string& sql) |
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 sqlite3_stmt* stmt; |
56ab2f0c90dc
Server: add sqlite basic backend, closes #558
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
20 |
56ab2f0c90dc
Server: add sqlite basic backend, closes #558
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
21 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
|
22 throw std::runtime_error(sqlite3_errmsg(database.get())); |
56ab2f0c90dc
Server: add sqlite basic backend, closes #558
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
23 } |
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 return {stmt, &sqlite3_finalize}; |
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 |
56ab2f0c90dc
Server: add sqlite basic backend, closes #558
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
28 } // !sqlite |
56ab2f0c90dc
Server: add sqlite basic backend, closes #558
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
29 |
46
b0593a3e2ca8
Server: use Boost.Asio and add basic authentication support
David Demelier <markand@malikania.fr>
parents:
40
diff
changeset
|
30 /* |
b0593a3e2ca8
Server: use Boost.Asio and add basic authentication support
David Demelier <markand@malikania.fr>
parents:
40
diff
changeset
|
31 * Local function to this file. |
b0593a3e2ca8
Server: use Boost.Asio and add basic authentication support
David Demelier <markand@malikania.fr>
parents:
40
diff
changeset
|
32 * ------------------------------------------------------------------ |
b0593a3e2ca8
Server: use Boost.Asio and add basic authentication support
David Demelier <markand@malikania.fr>
parents:
40
diff
changeset
|
33 */ |
b0593a3e2ca8
Server: use Boost.Asio and add basic authentication support
David Demelier <markand@malikania.fr>
parents:
40
diff
changeset
|
34 |
b0593a3e2ca8
Server: use Boost.Asio and add basic authentication support
David Demelier <markand@malikania.fr>
parents:
40
diff
changeset
|
35 namespace { |
b0593a3e2ca8
Server: use Boost.Asio and add basic authentication support
David Demelier <markand@malikania.fr>
parents:
40
diff
changeset
|
36 |
b0593a3e2ca8
Server: use Boost.Asio and add basic authentication support
David Demelier <markand@malikania.fr>
parents:
40
diff
changeset
|
37 const std::string verify_query( |
b0593a3e2ca8
Server: use Boost.Asio and add basic authentication support
David Demelier <markand@malikania.fr>
parents:
40
diff
changeset
|
38 "select name " |
b0593a3e2ca8
Server: use Boost.Asio and add basic authentication support
David Demelier <markand@malikania.fr>
parents:
40
diff
changeset
|
39 "from sqlite_master " |
b0593a3e2ca8
Server: use Boost.Asio and add basic authentication support
David Demelier <markand@malikania.fr>
parents:
40
diff
changeset
|
40 "where type='table' " |
b0593a3e2ca8
Server: use Boost.Asio and add basic authentication support
David Demelier <markand@malikania.fr>
parents:
40
diff
changeset
|
41 "and name='mk_info'" |
b0593a3e2ca8
Server: use Boost.Asio and add basic authentication support
David Demelier <markand@malikania.fr>
parents:
40
diff
changeset
|
42 ); |
b0593a3e2ca8
Server: use Boost.Asio and add basic authentication support
David Demelier <markand@malikania.fr>
parents:
40
diff
changeset
|
43 |
b0593a3e2ca8
Server: use Boost.Asio and add basic authentication support
David Demelier <markand@malikania.fr>
parents:
40
diff
changeset
|
44 bool is_initialized() |
b0593a3e2ca8
Server: use Boost.Asio and add basic authentication support
David Demelier <markand@malikania.fr>
parents:
40
diff
changeset
|
45 { |
b0593a3e2ca8
Server: use Boost.Asio and add basic authentication support
David Demelier <markand@malikania.fr>
parents:
40
diff
changeset
|
46 auto stmt = sqlite::prepare(verify_query); |
b0593a3e2ca8
Server: use Boost.Asio and add basic authentication support
David Demelier <markand@malikania.fr>
parents:
40
diff
changeset
|
47 |
b0593a3e2ca8
Server: use Boost.Asio and add basic authentication support
David Demelier <markand@malikania.fr>
parents:
40
diff
changeset
|
48 if (sqlite3_step(stmt.get()) != SQLITE_ROW) { |
b0593a3e2ca8
Server: use Boost.Asio and add basic authentication support
David Demelier <markand@malikania.fr>
parents:
40
diff
changeset
|
49 return false; |
b0593a3e2ca8
Server: use Boost.Asio and add basic authentication support
David Demelier <markand@malikania.fr>
parents:
40
diff
changeset
|
50 } |
b0593a3e2ca8
Server: use Boost.Asio and add basic authentication support
David Demelier <markand@malikania.fr>
parents:
40
diff
changeset
|
51 |
b0593a3e2ca8
Server: use Boost.Asio and add basic authentication support
David Demelier <markand@malikania.fr>
parents:
40
diff
changeset
|
52 return strcmp((char*)sqlite3_column_text(stmt.get(), 0), "mk_info") == 0; |
b0593a3e2ca8
Server: use Boost.Asio and add basic authentication support
David Demelier <markand@malikania.fr>
parents:
40
diff
changeset
|
53 } |
b0593a3e2ca8
Server: use Boost.Asio and add basic authentication support
David Demelier <markand@malikania.fr>
parents:
40
diff
changeset
|
54 |
b0593a3e2ca8
Server: use Boost.Asio and add basic authentication support
David Demelier <markand@malikania.fr>
parents:
40
diff
changeset
|
55 } // !namespace |
b0593a3e2ca8
Server: use Boost.Asio and add basic authentication support
David Demelier <markand@malikania.fr>
parents:
40
diff
changeset
|
56 |
b0593a3e2ca8
Server: use Boost.Asio and add basic authentication support
David Demelier <markand@malikania.fr>
parents:
40
diff
changeset
|
57 /* |
b0593a3e2ca8
Server: use Boost.Asio and add basic authentication support
David Demelier <markand@malikania.fr>
parents:
40
diff
changeset
|
58 * Driver API |
b0593a3e2ca8
Server: use Boost.Asio and add basic authentication support
David Demelier <markand@malikania.fr>
parents:
40
diff
changeset
|
59 * ------------------------------------------------------------------ |
b0593a3e2ca8
Server: use Boost.Asio and add basic authentication support
David Demelier <markand@malikania.fr>
parents:
40
diff
changeset
|
60 */ |
b0593a3e2ca8
Server: use Boost.Asio and add basic authentication support
David Demelier <markand@malikania.fr>
parents:
40
diff
changeset
|
61 |
39
56ab2f0c90dc
Server: add sqlite basic backend, closes #558
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
62 extern "C" { |
56ab2f0c90dc
Server: add sqlite basic backend, closes #558
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
63 |
40
1e206fdc7021
Server: switch to Boost.DLL, closes #583
David Demelier <markand@malikania.fr>
parents:
39
diff
changeset
|
64 BOOST_SYMBOL_EXPORT void malikania_driver_load(const std::unordered_map<std::string, std::string>& params) |
39
56ab2f0c90dc
Server: add sqlite basic backend, closes #558
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
65 { |
56ab2f0c90dc
Server: add sqlite basic backend, closes #558
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
66 auto path = params.find("path"); |
56ab2f0c90dc
Server: add sqlite basic backend, closes #558
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
67 |
56ab2f0c90dc
Server: add sqlite basic backend, closes #558
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
68 if (path == params.end()) { |
56ab2f0c90dc
Server: add sqlite basic backend, closes #558
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
69 throw std::runtime_error("missing 'path' parameter"); |
56ab2f0c90dc
Server: add sqlite basic backend, closes #558
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
70 } |
56ab2f0c90dc
Server: add sqlite basic backend, closes #558
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
71 |
56ab2f0c90dc
Server: add sqlite basic backend, closes #558
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
72 sqlite3* db; |
56ab2f0c90dc
Server: add sqlite basic backend, closes #558
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
73 |
56ab2f0c90dc
Server: add sqlite basic backend, closes #558
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
74 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
|
75 throw std::runtime_error(sqlite3_errmsg(db)); |
56ab2f0c90dc
Server: add sqlite basic backend, closes #558
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
76 } |
56ab2f0c90dc
Server: add sqlite basic backend, closes #558
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
77 |
56ab2f0c90dc
Server: add sqlite basic backend, closes #558
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
78 sqlite::database = {db, &sqlite3_close}; |
56ab2f0c90dc
Server: add sqlite basic backend, closes #558
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
79 |
46
b0593a3e2ca8
Server: use Boost.Asio and add basic authentication support
David Demelier <markand@malikania.fr>
parents:
40
diff
changeset
|
80 if (!is_initialized()) { |
b0593a3e2ca8
Server: use Boost.Asio and add basic authentication support
David Demelier <markand@malikania.fr>
parents:
40
diff
changeset
|
81 throw std::runtime_error("database not initialized"); |
39
56ab2f0c90dc
Server: add sqlite basic backend, closes #558
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
82 } |
56ab2f0c90dc
Server: add sqlite basic backend, closes #558
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
83 } |
56ab2f0c90dc
Server: add sqlite basic backend, closes #558
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
84 |
40
1e206fdc7021
Server: switch to Boost.DLL, closes #583
David Demelier <markand@malikania.fr>
parents:
39
diff
changeset
|
85 BOOST_SYMBOL_EXPORT void malikania_driver_unload() |
39
56ab2f0c90dc
Server: add sqlite basic backend, closes #558
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
86 { |
56ab2f0c90dc
Server: add sqlite basic backend, closes #558
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
87 // Explicit destruction, optional. |
56ab2f0c90dc
Server: add sqlite basic backend, closes #558
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
88 sqlite::database = nullptr; |
56ab2f0c90dc
Server: add sqlite basic backend, closes #558
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
89 } |
56ab2f0c90dc
Server: add sqlite basic backend, closes #558
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
90 |
56ab2f0c90dc
Server: add sqlite basic backend, closes #558
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
91 } // !C |