annotate database/sqlite/src/driver.cpp @ 86:cbdd3302998c

Tools: implement basic mlk-map, closes #620
author David Demelier <markand@malikania.fr>
date Tue, 31 Jan 2017 11:23:21 +0100
parents b0593a3e2ca8
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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