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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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