· 5 years ago · Oct 29, 2020, 07:26 PM
1#include <stdexcept>
2#include "sqlite.hpp"
3
4using std::string;
5using std::invalid_argument;
6using std::to_string;
7
8int Database::callback(
9 void* not_used,
10 int argc,
11 char** argv,
12 char** col_name)
13{
14 return 0;
15}
16
17void Database::open() {
18 if (rc = sqlite3_open("users.db", &database); rc) {
19 throw invalid_argument(sqlite3_errmsg(database));
20 } else {
21 is_opened = true;
22 }
23}
24
25void Database::init_table() {
26 string query =
27 "CREATE TABLE IF NOT EXISTS USERS ("
28 "USER_ID INTEGER NOT NULL UNIQUE, "
29 "PREFIX TEXT NOT NULL);";
30 sqlite3_exec(
31 database, /* An open database */
32 query.c_str(), /* SQL to be evaluated */
33 callback, /* Callback function */
34 0, /* 1st argument to callback */
35 &err /* Error msg written here */
36 );
37}
38
39void Database::insert_nickname(const long& user_id, const string& prefix) {
40 string query =
41 "REPLACE INTO USERS ('USER_ID', 'PREFIX') "
42 "VALUES ('" + to_string(user_id) + "','" + prefix + "');";
43 sqlite3_exec(
44 database, /* An open database */
45 query.c_str(), /* SQL to be evaluated */
46 callback, /* Callback function */
47 0, /* 1st argument to callback */
48 &err /* Error msg written here */
49 );
50}
51
52string Database::return_nickname(const long& user_id) {
53 string result;
54 sqlite3_stmt* stmt;
55 char query[255];
56
57 if (not is_opened) {
58 open();
59 }
60 snprintf(
61 query,
62 sizeof query - 1,
63 "SELECT PREFIX FROM USERS WHERE USER_ID = %s;",
64 to_string(user_id).c_str());
65 rc =
66 sqlite3_prepare(
67 database, /* An open database */
68 query, /* SQL to be evaluated */
69 sizeof (query), /* Callback function */
70 &stmt, /* 1st argument to callback */
71 NULL /* Error msg written here */
72 );
73 if (not rc) {
74 while ((rc = sqlite3_step(stmt)) == SQLITE_ROW) {
75 result += (const char*)sqlite3_column_text(stmt, 0);
76 }
77 }
78 if (result.empty()) {
79 return "";
80 } else {
81 return result;
82 }
83}
84