aboutsummaryrefslogtreecommitdiff
path: root/src/psycstore
diff options
context:
space:
mode:
authorJeffrey Burdges <burdges@gnunet.org>2017-06-03 22:01:28 +0200
committerJeffrey Burdges <burdges@gnunet.org>2017-06-03 22:01:28 +0200
commitdc230e1772729e9edda1aa2325d6904a13f68dd4 (patch)
tree712ca3e27a29f90248abcb7c99e1918958134567 /src/psycstore
parent646c1428a2750c5c4620677eec353788f838c5f8 (diff)
downloadgnunet-dc230e1772729e9edda1aa2325d6904a13f68dd4.tar.gz
gnunet-dc230e1772729e9edda1aa2325d6904a13f68dd4.zip
Jeff in sed mode
Diffstat (limited to 'src/psycstore')
-rw-r--r--src/psycstore/plugin_psycstore_postgres.c406
1 files changed, 184 insertions, 222 deletions
diff --git a/src/psycstore/plugin_psycstore_postgres.c b/src/psycstore/plugin_psycstore_postgres.c
index f410e2737..f20a8c151 100644
--- a/src/psycstore/plugin_psycstore_postgres.c
+++ b/src/psycstore/plugin_psycstore_postgres.c
@@ -175,230 +175,192 @@ database_setup (struct Plugin *plugin)
175 } 175 }
176 176
177 /* Prepare statements */ 177 /* Prepare statements */
178 if ((GNUNET_OK != GNUNET_POSTGRES_prepare (plugin->dbh, 178 {
179 "transaction_begin", 179 struct GNUNET_PQ_PreparedStatement ps[] = {
180 "BEGIN", 0)) || 180 GNUNET_PQ_make_prepare ("transaction_begin",
181 181 "BEGIN", 0),
182 (GNUNET_OK != GNUNET_POSTGRES_prepare (plugin->dbh, 182 GNUNET_PQ_make_prepare ("transaction_commit",
183 "transaction_commit", 183 "COMMIT", 0),
184 "COMMIT", 0)) || 184 GNUNET_PQ_make_prepare ("transaction_rollback",
185 185 "ROLLBACK", 0),
186 (GNUNET_OK != GNUNET_POSTGRES_prepare (plugin->dbh, 186 GNUNET_PQ_make_prepare ("insert_channel_key",
187 "transaction_rollback", 187 "INSERT INTO channels (pub_key) VALUES ($1)"
188 "ROLLBACK", 0)) || 188 " ON CONFLICT DO NOTHING", 1),
189 189 GNUNET_PQ_make_prepare ("insert_slave_key",
190 (GNUNET_OK != GNUNET_POSTGRES_prepare (plugin->dbh, 190 "INSERT INTO slaves (pub_key) VALUES ($1)"
191 "insert_channel_key", 191 " ON CONFLICT DO NOTHING", 1),
192 "INSERT INTO channels (pub_key) VALUES ($1)" 192 GNUNET_PQ_make_prepare ("insert_membership",
193 " ON CONFLICT DO NOTHING", 1)) || 193 "INSERT INTO membership\n"
194 194 " (channel_id, slave_id, did_join, announced_at,\n"
195 (GNUNET_OK != GNUNET_POSTGRES_prepare (plugin->dbh, 195 " effective_since, group_generation)\n"
196 "insert_slave_key", 196 "VALUES (get_chan_id($1),\n"
197 "INSERT INTO slaves (pub_key) VALUES ($1)" 197 " get_slave_id($2),\n"
198 " ON CONFLICT DO NOTHING", 1)) || 198 " $3, $4, $5, $6)", 6),
199 199 GNUNET_PQ_make_prepare ("insert_membership",
200 (GNUNET_OK != GNUNET_POSTGRES_prepare (plugin->dbh, 200 "INSERT INTO membership\n"
201 "insert_membership", 201 " (channel_id, slave_id, did_join, announced_at,\n"
202 "INSERT INTO membership\n" 202 " effective_since, group_generation)\n"
203 " (channel_id, slave_id, did_join, announced_at,\n" 203 "VALUES (get_chan_id($1),\n"
204 " effective_since, group_generation)\n" 204 " get_slave_id($2),\n"
205 "VALUES (get_chan_id($1),\n" 205 " $3, $4, $5, $6)", 6),
206 " get_slave_id($2),\n" 206 GNUNET_PQ_make_prepare ("select_membership",
207 " $3, $4, $5, $6)", 6)) || 207 "SELECT did_join FROM membership\n"
208 208 "WHERE channel_id = get_chan_id($1)\n"
209 (GNUNET_OK != GNUNET_POSTGRES_prepare (plugin->dbh, 209 " AND slave_id = get_slave_id($2)\n"
210 "select_membership", 210 " AND effective_since <= $3 AND did_join = 1\n"
211 "SELECT did_join FROM membership\n" 211 "ORDER BY announced_at DESC LIMIT 1", 3),
212 "WHERE channel_id = get_chan_id($1)\n" 212 GNUNET_PQ_make_prepare ("insert_fragment",
213 " AND slave_id = get_slave_id($2)\n" 213 "INSERT INTO messages\n"
214 " AND effective_since <= $3 AND did_join = 1\n" 214 " (channel_id, hop_counter, signature, purpose,\n"
215 "ORDER BY announced_at DESC LIMIT 1", 3)) || 215 " fragment_id, fragment_offset, message_id,\n"
216 216 " group_generation, multicast_flags, psycstore_flags, data)\n"
217 (GNUNET_OK != GNUNET_POSTGRES_prepare (plugin->dbh, 217 "VALUES (get_chan_id($1),\n"
218 "insert_fragment", 218 " $2, $3, $4, $5, $6, $7, $8, $9, $10, $11)"
219 "INSERT INTO messages\n" 219 "ON CONFLICT DO NOTHING", 11),
220 " (channel_id, hop_counter, signature, purpose,\n" 220 GNUNET_PQ_make_prepare ("update_message_flags",
221 " fragment_id, fragment_offset, message_id,\n" 221 "UPDATE messages\n"
222 " group_generation, multicast_flags, psycstore_flags, data)\n" 222 "SET psycstore_flags = psycstore_flags | $1\n"
223 "VALUES (get_chan_id($1),\n" 223 "WHERE channel_id = get_chan_id($2) \n"
224 " $2, $3, $4, $5, $6, $7, $8, $9, $10, $11)" 224 " AND message_id = $3 AND fragment_offset = 0", 3),
225 "ON CONFLICT DO NOTHING", 11)) || 225 GNUNET_PQ_make_prepare ("select_fragments",
226 226 "SELECT hop_counter, signature, purpose, fragment_id,\n"
227 (GNUNET_OK != GNUNET_POSTGRES_prepare (plugin->dbh, 227 " fragment_offset, message_id, group_generation,\n"
228 "update_message_flags", 228 " multicast_flags, psycstore_flags, data\n"
229 "UPDATE messages\n" 229 "FROM messages\n"
230 "SET psycstore_flags = psycstore_flags | $1\n" 230 "WHERE channel_id = get_chan_id($1) \n"
231 "WHERE channel_id = get_chan_id($2) \n" 231 " AND $2 <= fragment_id AND fragment_id <= $3", 3),
232 " AND message_id = $3 AND fragment_offset = 0", 3)) ||
233
234 (GNUNET_OK != GNUNET_POSTGRES_prepare (plugin->dbh,
235 "select_fragments",
236 "SELECT hop_counter, signature, purpose, fragment_id,\n"
237 " fragment_offset, message_id, group_generation,\n"
238 " multicast_flags, psycstore_flags, data\n"
239 "FROM messages\n"
240 "WHERE channel_id = get_chan_id($1) \n"
241 " AND $2 <= fragment_id AND fragment_id <= $3", 3)) ||
242
243 /** @todo select_messages: add method_prefix filter */ 232 /** @todo select_messages: add method_prefix filter */
244 (GNUNET_OK != GNUNET_POSTGRES_prepare (plugin->dbh, 233 GNUNET_PQ_make_prepare ("select_messages",
245 "select_messages", 234 "SELECT hop_counter, signature, purpose, fragment_id,\n"
246 "SELECT hop_counter, signature, purpose, fragment_id,\n" 235 " fragment_offset, message_id, group_generation,\n"
247 " fragment_offset, message_id, group_generation,\n" 236 " multicast_flags, psycstore_flags, data\n"
248 " multicast_flags, psycstore_flags, data\n" 237 "FROM messages\n"
249 "FROM messages\n" 238 "WHERE channel_id = get_chan_id($1) \n"
250 "WHERE channel_id = get_chan_id($1) \n" 239 " AND $2 <= message_id AND message_id <= $3\n"
251 " AND $2 <= message_id AND message_id <= $3\n" 240 "LIMIT $4;", 4),
252 "LIMIT $4;", 4)) ||
253
254 /** @todo select_latest_messages: add method_prefix filter */ 241 /** @todo select_latest_messages: add method_prefix filter */
255 (GNUNET_OK != GNUNET_POSTGRES_prepare (plugin->dbh, 242 GNUNET_PQ_make_prepare ("select_latest_fragments",
256 "select_latest_fragments", 243 "SELECT rev.hop_counter AS hop_counter,\n"
257 "SELECT rev.hop_counter AS hop_counter,\n" 244 " rev.signature AS signature,\n"
258 " rev.signature AS signature,\n" 245 " rev.purpose AS purpose,\n"
259 " rev.purpose AS purpose,\n" 246 " rev.fragment_id AS fragment_id,\n"
260 " rev.fragment_id AS fragment_id,\n" 247 " rev.fragment_offset AS fragment_offset,\n"
261 " rev.fragment_offset AS fragment_offset,\n" 248 " rev.message_id AS message_id,\n"
262 " rev.message_id AS message_id,\n" 249 " rev.group_generation AS group_generation,\n"
263 " rev.group_generation AS group_generation,\n" 250 " rev.multicast_flags AS multicast_flags,\n"
264 " rev.multicast_flags AS multicast_flags,\n" 251 " rev.psycstore_flags AS psycstore_flags,\n"
265 " rev.psycstore_flags AS psycstore_flags,\n" 252 " rev.data AS data\n"
266 " rev.data AS data\n" 253 " FROM\n"
267 " FROM\n" 254 " (SELECT hop_counter, signature, purpose, fragment_id,\n"
268 " (SELECT hop_counter, signature, purpose, fragment_id,\n" 255 " fragment_offset, message_id, group_generation,\n"
269 " fragment_offset, message_id, group_generation,\n" 256 " multicast_flags, psycstore_flags, data \n"
270 " multicast_flags, psycstore_flags, data \n" 257 " FROM messages\n"
271 " FROM messages\n" 258 " WHERE channel_id = get_chan_id($1) \n"
272 " WHERE channel_id = get_chan_id($1) \n" 259 " ORDER BY fragment_id DESC\n"
273 " ORDER BY fragment_id DESC\n" 260 " LIMIT $2) AS rev\n"
274 " LIMIT $2) AS rev\n" 261 " ORDER BY rev.fragment_id;", 2),
275 " ORDER BY rev.fragment_id;", 2)) || 262 GNUNET_PQ_make_prepare ("select_latest_messages",
276 263 "SELECT hop_counter, signature, purpose, fragment_id,\n"
277 (GNUNET_OK != GNUNET_POSTGRES_prepare (plugin->dbh, 264 " fragment_offset, message_id, group_generation,\n"
278 "select_latest_messages", 265 " multicast_flags, psycstore_flags, data\n"
279 "SELECT hop_counter, signature, purpose, fragment_id,\n" 266 "FROM messages\n"
280 " fragment_offset, message_id, group_generation,\n" 267 "WHERE channel_id = get_chan_id($1)\n"
281 " multicast_flags, psycstore_flags, data\n" 268 " AND message_id IN\n"
282 "FROM messages\n" 269 " (SELECT message_id\n"
283 "WHERE channel_id = get_chan_id($1)\n" 270 " FROM messages\n"
284 " AND message_id IN\n" 271 " WHERE channel_id = get_chan_id($2) \n"
285 " (SELECT message_id\n" 272 " GROUP BY message_id\n"
286 " FROM messages\n" 273 " ORDER BY message_id\n"
287 " WHERE channel_id = get_chan_id($2) \n" 274 " DESC LIMIT $3)\n"
288 " GROUP BY message_id\n" 275 "ORDER BY fragment_id", 3),
289 " ORDER BY message_id\n" 276 GNUNET_PQ_make_prepare ("select_message_fragment",
290 " DESC LIMIT $3)\n" 277 "SELECT hop_counter, signature, purpose, fragment_id,\n"
291 "ORDER BY fragment_id", 3)) || 278 " fragment_offset, message_id, group_generation,\n"
292 279 " multicast_flags, psycstore_flags, data\n"
293 (GNUNET_OK != GNUNET_POSTGRES_prepare (plugin->dbh, 280 "FROM messages\n"
294 "select_message_fragment", 281 "WHERE channel_id = get_chan_id($1) \n"
295 "SELECT hop_counter, signature, purpose, fragment_id,\n" 282 " AND message_id = $2 AND fragment_offset = $3", 3),
296 " fragment_offset, message_id, group_generation,\n" 283 GNUNET_PQ_make_prepare ("select_counters_message",
297 " multicast_flags, psycstore_flags, data\n" 284 "SELECT fragment_id, message_id, group_generation\n"
298 "FROM messages\n" 285 "FROM messages\n"
299 "WHERE channel_id = get_chan_id($1) \n" 286 "WHERE channel_id = get_chan_id($1)\n"
300 " AND message_id = $2 AND fragment_offset = $3", 3)) || 287 "ORDER BY fragment_id DESC LIMIT 1", 1),
301 288 GNUNET_PQ_make_prepare ("select_counters_state",
302 (GNUNET_OK != GNUNET_POSTGRES_prepare (plugin->dbh, 289 "SELECT max_state_message_id\n"
303 "select_counters_message", 290 "FROM channels\n"
304 "SELECT fragment_id, message_id, group_generation\n" 291 "WHERE pub_key = $1 AND max_state_message_id IS NOT NULL", 1),
305 "FROM messages\n" 292 GNUNET_PQ_make_prepare ("update_max_state_message_id",
306 "WHERE channel_id = get_chan_id($1)\n" 293 "UPDATE channels\n"
307 "ORDER BY fragment_id DESC LIMIT 1", 1)) || 294 "SET max_state_message_id = $1\n"
308 295 "WHERE pub_key = $2", 2),
309 (GNUNET_OK != GNUNET_POSTGRES_prepare (plugin->dbh, 296
310 "select_counters_state", 297 GNUNET_PQ_make_prepare ("update_state_hash_message_id",
311 "SELECT max_state_message_id\n" 298 "UPDATE channels\n"
312 "FROM channels\n" 299 "SET state_hash_message_id = $1\n"
313 "WHERE pub_key = $1 AND max_state_message_id IS NOT NULL", 1)) || 300 "WHERE pub_key = $2", 2),
314 301 GNUNET_PQ_make_prepare ("insert_state_current",
315 (GNUNET_OK != GNUNET_POSTGRES_prepare (plugin->dbh, 302 "INSERT INTO state\n"
316 "update_max_state_message_id", 303 " (channel_id, name, value_current, value_signed)\n"
317 "UPDATE channels\n" 304 "SELECT new.channel_id, new.name,\n"
318 "SET max_state_message_id = $1\n" 305 " new.value_current, old.value_signed\n"
319 "WHERE pub_key = $2", 2)) || 306 "FROM (SELECT get_chan_id($1) AS channel_id,\n"
320 307 " $2::TEXT AS name, $3::BYTEA AS value_current) AS new\n"
321 (GNUNET_OK != GNUNET_POSTGRES_prepare (plugin->dbh, 308 "LEFT JOIN (SELECT channel_id, name, value_signed\n"
322 "update_state_hash_message_id", 309 " FROM state) AS old\n"
323 "UPDATE channels\n" 310 "ON new.channel_id = old.channel_id AND new.name = old.name\n"
324 "SET state_hash_message_id = $1\n" 311 "ON CONFLICT (channel_id, name)\n"
325 "WHERE pub_key = $2", 2)) || 312 " DO UPDATE SET value_current = EXCLUDED.value_current,\n"
326 313 " value_signed = EXCLUDED.value_signed", 3),
327 (GNUNET_OK != GNUNET_POSTGRES_prepare (plugin->dbh, 314 GNUNET_PQ_make_prepare ("delete_state_empty",
328 "insert_state_current", 315 "DELETE FROM state\n"
329 "INSERT INTO state\n" 316 "WHERE channel_id = (SELECT id FROM channels WHERE pub_key = $1)\n"
330 " (channel_id, name, value_current, value_signed)\n" 317 " AND (value_current IS NULL OR length(value_current) = 0)\n"
331 "SELECT new.channel_id, new.name,\n" 318 " AND (value_signed IS NULL OR length(value_signed) = 0)", 1),
332 " new.value_current, old.value_signed\n" 319 GNUNET_PQ_make_prepare ("update_state_signed",
333 "FROM (SELECT get_chan_id($1) AS channel_id,\n" 320 "UPDATE state\n"
334 " $2::TEXT AS name, $3::BYTEA AS value_current) AS new\n" 321 "SET value_signed = value_current\n"
335 "LEFT JOIN (SELECT channel_id, name, value_signed\n" 322 "WHERE channel_id = get_chan_id($1) ", 1),
336 " FROM state) AS old\n" 323 GNUNET_PQ_make_prepare ("delete_state",
337 "ON new.channel_id = old.channel_id AND new.name = old.name\n" 324 "DELETE FROM state\n"
338 "ON CONFLICT (channel_id, name)\n" 325 "WHERE channel_id = get_chan_id($1) ", 1),
339 " DO UPDATE SET value_current = EXCLUDED.value_current,\n" 326 GNUNET_PQ_make_prepare ("insert_state_sync",
340 " value_signed = EXCLUDED.value_signed", 3)) || 327 "INSERT INTO state_sync (channel_id, name, value)\n"
341 328 "VALUES (get_chan_id($1), $2, $3)", 3),
342 (GNUNET_OK != GNUNET_POSTGRES_prepare (plugin->dbh, 329 GNUNET_PQ_make_prepare ("insert_state_from_sync",
343 "delete_state_empty", 330 "INSERT INTO state\n"
344 "DELETE FROM state\n" 331 " (channel_id, name, value_current, value_signed)\n"
345 "WHERE channel_id = (SELECT id FROM channels WHERE pub_key = $1)\n" 332 "SELECT channel_id, name, value, value\n"
346 " AND (value_current IS NULL OR length(value_current) = 0)\n" 333 "FROM state_sync\n"
347 " AND (value_signed IS NULL OR length(value_signed) = 0)", 1)) || 334 "WHERE channel_id = get_chan_id($1)", 1),
348 335 GNUNET_PQ_make_prepare ("delete_state_sync",
349 (GNUNET_OK != GNUNET_POSTGRES_prepare (plugin->dbh, 336 "DELETE FROM state_sync\n"
350 "update_state_signed", 337 "WHERE channel_id = get_chan_id($1)", 1),
351 "UPDATE state\n" 338 GNUNET_PQ_make_prepare ("select_state_one",
352 "SET value_signed = value_current\n" 339 "SELECT value_current\n"
353 "WHERE channel_id = get_chan_id($1) ", 1)) || 340 "FROM state\n"
354 341 "WHERE channel_id = get_chan_id($1)\n"
355 (GNUNET_OK != GNUNET_POSTGRES_prepare (plugin->dbh, 342 " AND name = $2", 2),
356 "delete_state", 343 GNUNET_PQ_make_prepare ("select_state_prefix",
357 "DELETE FROM state\n" 344 "SELECT name, value_current\n"
358 "WHERE channel_id = get_chan_id($1) ", 1)) || 345 "FROM state\n"
359 346 "WHERE channel_id = get_chan_id($1)\n"
360 (GNUNET_OK != GNUNET_POSTGRES_prepare (plugin->dbh, 347 " AND (name = $2 OR substr(name, 1, $3) = $4)", 4),
361 "insert_state_sync", 348 GNUNET_PQ_make_prepare ("select_state_signed",
362 "INSERT INTO state_sync (channel_id, name, value)\n" 349 "SELECT name, value_signed\n"
363 "VALUES (get_chan_id($1), $2, $3)", 3)) || 350 "FROM state\n"
364 351 "WHERE channel_id = get_chan_id($1)\n"
365 (GNUNET_OK != GNUNET_POSTGRES_prepare (plugin->dbh, 352 " AND value_signed IS NOT NULL", 1),
366 "insert_state_from_sync", 353 GNUNET_PQ_PREPARED_STATEMENT_END
367 "INSERT INTO state\n" 354 };
368 " (channel_id, name, value_current, value_signed)\n" 355
369 "SELECT channel_id, name, value, value\n" 356 if (GNUNET_OK !=
370 "FROM state_sync\n" 357 GNUNET_PQ_prepare_statements (plugin->dbh,
371 "WHERE channel_id = get_chan_id($1)", 1)) || 358 ps))
372 359 {
373 (GNUNET_OK != GNUNET_POSTGRES_prepare (plugin->dbh, 360 PQfinish (plugin->dbh);
374 "delete_state_sync", 361 plugin->dbh = NULL;
375 "DELETE FROM state_sync\n" 362 return GNUNET_SYSERR;
376 "WHERE channel_id = get_chan_id($1)", 1)) || 363 }
377
378 (GNUNET_OK != GNUNET_POSTGRES_prepare (plugin->dbh,
379 "select_state_one",
380 "SELECT value_current\n"
381 "FROM state\n"
382 "WHERE channel_id = get_chan_id($1)\n"
383 " AND name = $2", 2)) ||
384
385 (GNUNET_OK != GNUNET_POSTGRES_prepare (plugin->dbh,
386 "select_state_prefix",
387 "SELECT name, value_current\n"
388 "FROM state\n"
389 "WHERE channel_id = get_chan_id($1)\n"
390 " AND (name = $2 OR substr(name, 1, $3) = $4)", 4)) ||
391
392 (GNUNET_OK != GNUNET_POSTGRES_prepare (plugin->dbh,
393 "select_state_signed",
394 "SELECT name, value_signed\n"
395 "FROM state\n"
396 "WHERE channel_id = get_chan_id($1)\n"
397 " AND value_signed IS NOT NULL", 1)))
398 {
399 PQfinish (plugin->dbh);
400 plugin->dbh = NULL;
401 return GNUNET_SYSERR;
402 } 364 }
403 365
404 return GNUNET_OK; 366 return GNUNET_OK;