annotate database.c @ 17:09d2f54562ec

pasterd-clean: initial import, closes #2473
author David Demelier <markand@malikania.fr>
date Thu, 06 Feb 2020 14:17:14 +0100
parents 98ef2713eb0d
children 21c103c33ac9
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
6
98ef2713eb0d pasterd: add licenses in database
David Demelier <markand@malikania.fr>
parents: 5
diff changeset
1 /*
98ef2713eb0d pasterd: add licenses in database
David Demelier <markand@malikania.fr>
parents: 5
diff changeset
2 * database.c -- sqlite storage
98ef2713eb0d pasterd: add licenses in database
David Demelier <markand@malikania.fr>
parents: 5
diff changeset
3 *
98ef2713eb0d pasterd: add licenses in database
David Demelier <markand@malikania.fr>
parents: 5
diff changeset
4 * Copyright (c) 2020 David Demelier <markand@malikania.fr>
98ef2713eb0d pasterd: add licenses in database
David Demelier <markand@malikania.fr>
parents: 5
diff changeset
5 *
98ef2713eb0d pasterd: add licenses in database
David Demelier <markand@malikania.fr>
parents: 5
diff changeset
6 * Permission to use, copy, modify, and/or distribute this software for any
98ef2713eb0d pasterd: add licenses in database
David Demelier <markand@malikania.fr>
parents: 5
diff changeset
7 * purpose with or without fee is hereby granted, provided that the above
98ef2713eb0d pasterd: add licenses in database
David Demelier <markand@malikania.fr>
parents: 5
diff changeset
8 * copyright notice and this permission notice appear in all copies.
98ef2713eb0d pasterd: add licenses in database
David Demelier <markand@malikania.fr>
parents: 5
diff changeset
9 *
98ef2713eb0d pasterd: add licenses in database
David Demelier <markand@malikania.fr>
parents: 5
diff changeset
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
98ef2713eb0d pasterd: add licenses in database
David Demelier <markand@malikania.fr>
parents: 5
diff changeset
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
98ef2713eb0d pasterd: add licenses in database
David Demelier <markand@malikania.fr>
parents: 5
diff changeset
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
98ef2713eb0d pasterd: add licenses in database
David Demelier <markand@malikania.fr>
parents: 5
diff changeset
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
98ef2713eb0d pasterd: add licenses in database
David Demelier <markand@malikania.fr>
parents: 5
diff changeset
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
98ef2713eb0d pasterd: add licenses in database
David Demelier <markand@malikania.fr>
parents: 5
diff changeset
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
98ef2713eb0d pasterd: add licenses in database
David Demelier <markand@malikania.fr>
parents: 5
diff changeset
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
98ef2713eb0d pasterd: add licenses in database
David Demelier <markand@malikania.fr>
parents: 5
diff changeset
17 */
98ef2713eb0d pasterd: add licenses in database
David Demelier <markand@malikania.fr>
parents: 5
diff changeset
18
0
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
19 #include <assert.h>
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
20 #include <stdlib.h>
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
21 #include <stdio.h>
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
22 #include <string.h>
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
23
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
24 #include <sqlite3.h>
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
25
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
26 #include "database.h"
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
27 #include "log.h"
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
28 #include "paste.h"
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
29 #include "util.h"
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
30
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
31 static sqlite3 *db;
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
32
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
33 static const char *sql_init =
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
34 "BEGIN EXCLUSIVE TRANSACTION;\n"
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
35 "\n"
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
36 "CREATE TABLE IF NOT EXISTS paste(\n"
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
37 " uuid TEXT PRIMARY KEY,\n"
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
38 " title TEXT,\n"
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
39 " author TEXT,\n"
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
40 " language TEXT,\n"
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
41 " code TEXT,\n"
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
42 " date INT DEFAULT CURRENT_TIMESTAMP,\n"
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
43 " visible INTEGER DEFAULT 1,\n"
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
44 " duration INT\n"
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
45 ");\n"
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
46 "\n"
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
47 "END TRANSACTION";
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
48
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
49 static const char *sql_get =
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
50 "SELECT uuid\n"
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
51 " , title\n"
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
52 " , author\n"
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
53 " , language\n"
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
54 " , code\n"
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
55 " , strftime('%s', date)\n"
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
56 " , visible\n"
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
57 " , duration\n"
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
58 " FROM paste\n"
1
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents: 0
diff changeset
59 " WHERE uuid = ?";
0
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
60
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
61 static const char *sql_insert =
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
62 "INSERT INTO paste(\n"
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
63 " uuid,\n"
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
64 " title,\n"
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
65 " author,\n"
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
66 " language,\n"
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
67 " code,\n"
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
68 " visible,\n"
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
69 " duration\n"
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
70 ") VALUES (?, ?, ?, ?, ?, ?, ?)";
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
71
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
72 static const char *sql_recents =
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
73 "SELECT uuid\n"
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
74 " , title\n"
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
75 " , author\n"
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
76 " , language\n"
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
77 " , code\n"
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
78 " , strftime('%s', date) AS date\n"
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
79 " , visible\n"
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
80 " , duration\n"
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
81 " FROM paste\n"
2
65607ae124b1 pasterd: implement /new
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
82 " WHERE visible = 1\n"
5
f455893bf0b0 pasterd: show dates in /
David Demelier <markand@malikania.fr>
parents: 2
diff changeset
83 " ORDER BY date DESC\n"
0
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
84 " LIMIT ?\n";
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
85
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
86 static const char *sql_clear =
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
87 "BEGIN EXCLUSIVE TRANSACTION;\n"
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
88 "\n"
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
89 "DELETE\n"
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
90 " FROM paste\n"
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
91 " WHERE strftime('%s', 'now') - strftime('%s', date) >= duration;"
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
92 "\n"
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
93 "END TRANSACTION";
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
94
1
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents: 0
diff changeset
95 /* sqlite3 use const unsigned char *. */
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents: 0
diff changeset
96 static char *
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents: 0
diff changeset
97 dup(const unsigned char *s)
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents: 0
diff changeset
98 {
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents: 0
diff changeset
99 return estrdup(s ? (const char *)(s) : "");
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents: 0
diff changeset
100 }
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents: 0
diff changeset
101
0
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
102 static const char *
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
103 create_id(void)
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
104 {
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
105 static char uuid[256];
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
106
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
107 /*
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
108 * Not a very strong generation but does not require to link against
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
109 * util-linux.
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
110 *
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
111 * See https://stackoverflow.com/questions/2174768/generating-random-uuids-in-linux
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
112 */
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
113 sprintf(uuid, "%x%x-%x-%x-%x-%x%x%x",
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
114 rand(), rand(),
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
115 rand(),
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
116 ((rand() & 0x0fff) | 0x4000),
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
117 rand() % 0x3fff + 0x8000,
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
118 rand(), rand(), rand());
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
119
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
120 return uuid;
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
121 }
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
122
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
123 static void
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
124 convert(sqlite3_stmt *stmt, struct paste *paste)
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
125 {
1
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents: 0
diff changeset
126 paste->uuid = dup(sqlite3_column_text(stmt, 0));
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents: 0
diff changeset
127 paste->title = dup(sqlite3_column_text(stmt, 1));
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents: 0
diff changeset
128 paste->author = dup(sqlite3_column_text(stmt, 2));
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents: 0
diff changeset
129 paste->language = dup(sqlite3_column_text(stmt, 3));
836a698946f8 pasterd: add basic routes
David Demelier <markand@malikania.fr>
parents: 0
diff changeset
130 paste->code = dup(sqlite3_column_text(stmt, 4));
0
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
131 paste->timestamp = sqlite3_column_int64(stmt, 5);
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
132 paste->visible = sqlite3_column_int(stmt, 6);
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
133 paste->duration = sqlite3_column_int64(stmt, 7);
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
134 }
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
135
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
136 bool
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
137 database_open(const char *path)
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
138 {
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
139 assert(path);
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
140
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
141 log_debug("opening database: %s\n", path);
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
142
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
143 if (sqlite3_open(path, &db) != SQLITE_OK) {
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
144 log_warn("unable to open %s: %s\n", path, sqlite3_errmsg(db));
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
145 return false;
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
146 }
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
147
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
148 if (sqlite3_exec(db, sql_init, NULL, NULL, NULL) != SQLITE_OK) {
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
149 log_warn("unable to initialize %s: %s\n", path, sqlite3_errmsg(db));
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
150 return false;
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
151 }
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
152
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
153 log_debug("successfully opened database: %s\n", path);
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
154
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
155 return true;
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
156 }
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
157
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
158 bool
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
159 database_recents(struct paste *pastes, size_t *max)
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
160 {
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
161 assert(pastes);
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
162 assert(max);
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
163
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
164 sqlite3_stmt *stmt = NULL;
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
165
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
166 memset(pastes, 0, *max * sizeof (struct paste));
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
167
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
168 if (sqlite3_prepare(db, sql_recents, -1, &stmt, NULL) != SQLITE_OK ||
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
169 sqlite3_bind_int64(stmt, 1, *max) != SQLITE_OK)
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
170 goto sqlite_err;
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
171
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
172 size_t i = 0;
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
173
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
174 for (; i < *max && sqlite3_step(stmt) == SQLITE_ROW; ++i)
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
175 convert(stmt, &pastes[i]);
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
176
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
177 sqlite3_finalize(stmt);
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
178 *max = i;
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
179
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
180 return true;
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
181
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
182 sqlite_err:
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
183 log_warn("database error (recents): %s\n", sqlite3_errmsg(db));
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
184
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
185 if (stmt)
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
186 sqlite3_finalize(stmt);
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
187
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
188 return (*max = 0);
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
189 }
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
190
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
191 bool
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
192 database_get(struct paste *paste, const char *uuid)
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
193 {
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
194 assert(paste);
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
195 assert(uuid);
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
196
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
197 memset(paste, 0, sizeof (struct paste));
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
198
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
199 sqlite3_stmt* stmt = NULL;
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
200
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
201 if (sqlite3_prepare(db, sql_get, -1, &stmt, NULL) != SQLITE_OK ||
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
202 sqlite3_bind_text(stmt, 1, uuid, -1, NULL) != SQLITE_OK)
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
203 goto sqlite_err;
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
204
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
205 switch (sqlite3_step(stmt)) {
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
206 case SQLITE_ROW:
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
207 convert(stmt, paste);
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
208 break;
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
209 case SQLITE_MISUSE:
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
210 case SQLITE_ERROR:
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
211 goto sqlite_err;
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
212 default:
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
213 break;
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
214 }
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
215
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
216 sqlite3_finalize(stmt);
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
217
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
218 return true;
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
219
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
220 sqlite_err:
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
221 if (stmt)
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
222 sqlite3_finalize(stmt);
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
223
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
224 log_warn("database error (get): %s", sqlite3_errmsg(db));
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
225
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
226 return false;
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
227 }
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
228
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
229 bool
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
230 database_insert(struct paste *paste)
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
231 {
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
232 assert(paste);
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
233
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
234 sqlite3_stmt* stmt = NULL;
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
235
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
236 if (sqlite3_exec(db, "BEGIN EXCLUSIVE TRANSACTION", NULL, NULL, NULL) != SQLITE_OK) {
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
237 log_warn("could not lock database: %s\n", sqlite3_errmsg(db));
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
238 return false;
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
239 }
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
240
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
241 if (sqlite3_prepare(db, sql_insert, -1, &stmt, NULL) != SQLITE_OK)
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
242 goto sqlite_err;
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
243
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
244 /* Create a new uuid first. */
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
245 paste->uuid = estrdup(create_id());
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
246
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
247 sqlite3_bind_text(stmt, 1, paste->uuid, -1, SQLITE_STATIC);
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
248 sqlite3_bind_text(stmt, 2, paste->title, -1, SQLITE_STATIC);
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
249 sqlite3_bind_text(stmt, 3, paste->author, -1, SQLITE_STATIC);
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
250 sqlite3_bind_text(stmt, 4, paste->language, -1, SQLITE_STATIC);
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
251 sqlite3_bind_text(stmt, 5, paste->code, -1, SQLITE_STATIC);
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
252 sqlite3_bind_int(stmt, 6, paste->visible);
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
253 sqlite3_bind_int64(stmt, 7, paste->duration);
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
254
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
255 if (sqlite3_step(stmt) != SQLITE_DONE)
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
256 goto sqlite_err;
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
257
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
258 sqlite3_exec(db, "COMMIT", NULL, NULL, NULL);
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
259 sqlite3_finalize(stmt);
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
260
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
261 log_debug("new paste (%s) from %s expires in one %lld seconds",
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
262 paste->uuid, paste->author, paste->duration);
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
263
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
264 return true;
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
265
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
266 sqlite_err:
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
267 log_warn("database error (insert): %s", sqlite3_errmsg(db));
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
268 sqlite3_exec(db, "ROLLBACK", NULL, NULL, NULL);
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
269
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
270 if (stmt)
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
271 sqlite3_finalize(stmt);
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
272
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
273 free(paste->uuid);
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
274 paste->uuid = NULL;
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
275
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
276 return false;
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
277 }
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
278
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
279 void
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
280 database_clear(void)
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
281 {
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
282 if (sqlite3_exec(db, sql_clear, NULL, NULL, NULL) != SQLITE_OK)
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
283 log_warn("database error (clear): %s\n", sqlite3_errmsg(db));
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
284 }
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
285
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
286 void
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
287 database_finish(void)
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
288 {
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
289 if (db)
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
290 sqlite3_close(db);
15a06aa20298 misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
291 }