diff options
Diffstat (limited to 'src/psycstore')
-rw-r--r-- | src/psycstore/plugin_psycstore_postgres.c | 249 |
1 files changed, 122 insertions, 127 deletions
diff --git a/src/psycstore/plugin_psycstore_postgres.c b/src/psycstore/plugin_psycstore_postgres.c index 1111da895..2bf7e894e 100644 --- a/src/psycstore/plugin_psycstore_postgres.c +++ b/src/psycstore/plugin_psycstore_postgres.c | |||
@@ -277,159 +277,159 @@ database_setup (struct Plugin *plugin) | |||
277 | 277 | ||
278 | /** @todo select_messages: add method_prefix filter */ | 278 | /** @todo select_messages: add method_prefix filter */ |
279 | (GNUNET_OK != GNUNET_POSTGRES_prepare (plugin->dbh, | 279 | (GNUNET_OK != GNUNET_POSTGRES_prepare (plugin->dbh, |
280 | "select_messages", | 280 | "select_messages", |
281 | "SELECT hop_counter, signature, purpose, fragment_id,\n" | 281 | "SELECT hop_counter, signature, purpose, fragment_id,\n" |
282 | " fragment_offset, message_id, group_generation,\n" | 282 | " fragment_offset, message_id, group_generation,\n" |
283 | " multicast_flags, psycstore_flags, data\n" | 283 | " multicast_flags, psycstore_flags, data\n" |
284 | "FROM messages\n" | 284 | "FROM messages\n" |
285 | "WHERE channel_id = get_chan_id($1) \n" | 285 | "WHERE channel_id = get_chan_id($1) \n" |
286 | " AND $2 <= message_id AND message_id <= $3" | 286 | " AND $2 <= message_id AND message_id <= $3\n" |
287 | "LIMIT $4;", 4)) || | 287 | "LIMIT $4;", 4)) || |
288 | 288 | ||
289 | /** @todo select_latest_messages: add method_prefix filter */ | 289 | /** @todo select_latest_messages: add method_prefix filter */ |
290 | (GNUNET_OK != GNUNET_POSTGRES_prepare (plugin->dbh, | 290 | (GNUNET_OK != GNUNET_POSTGRES_prepare (plugin->dbh, |
291 | "select_latest_fragments", | 291 | "select_latest_fragments", |
292 | "SELECT rev.hop_counter AS hop_counter,\n" | 292 | "SELECT rev.hop_counter AS hop_counter,\n" |
293 | " rev.signature AS signature,\n" | 293 | " rev.signature AS signature,\n" |
294 | " rev.purpose AS purpose,\n" | 294 | " rev.purpose AS purpose,\n" |
295 | " rev.fragment_id AS fragment_id,\n" | 295 | " rev.fragment_id AS fragment_id,\n" |
296 | " rev.fragment_offset AS fragment_offset,\n" | 296 | " rev.fragment_offset AS fragment_offset,\n" |
297 | " rev.message_id AS message_id,\n" | 297 | " rev.message_id AS message_id,\n" |
298 | " rev.group_generation AS group_generation,\n" | 298 | " rev.group_generation AS group_generation,\n" |
299 | " rev.multicast_flags AS multicast_flags,\n" | 299 | " rev.multicast_flags AS multicast_flags,\n" |
300 | " rev.psycstore_flags AS psycstore_flags,\n" | 300 | " rev.psycstore_flags AS psycstore_flags,\n" |
301 | " rev.data AS data\n" | 301 | " rev.data AS data\n" |
302 | " FROM\n" | 302 | " FROM\n" |
303 | " (SELECT hop_counter, signature, purpose, fragment_id,\n" | 303 | " (SELECT hop_counter, signature, purpose, fragment_id,\n" |
304 | " fragment_offset, message_id, group_generation,\n" | 304 | " fragment_offset, message_id, group_generation,\n" |
305 | " multicast_flags, psycstore_flags, data \n" | 305 | " multicast_flags, psycstore_flags, data \n" |
306 | " FROM messages\n" | 306 | " FROM messages\n" |
307 | " WHERE channel_id = get_chan_id($1) \n" | 307 | " WHERE channel_id = get_chan_id($1) \n" |
308 | " ORDER BY fragment_id DESC\n" | 308 | " ORDER BY fragment_id DESC\n" |
309 | " LIMIT $2) AS rev\n" | 309 | " LIMIT $2) AS rev\n" |
310 | " ORDER BY rev.fragment_id;", 2)) || | 310 | " ORDER BY rev.fragment_id;", 2)) || |
311 | 311 | ||
312 | (GNUNET_OK != GNUNET_POSTGRES_prepare (plugin->dbh, | 312 | (GNUNET_OK != GNUNET_POSTGRES_prepare (plugin->dbh, |
313 | "select_latest_messages", | 313 | "select_latest_messages", |
314 | "SELECT hop_counter, signature, purpose, fragment_id,\n" | 314 | "SELECT hop_counter, signature, purpose, fragment_id,\n" |
315 | " fragment_offset, message_id, group_generation,\n" | 315 | " fragment_offset, message_id, group_generation,\n" |
316 | " multicast_flags, psycstore_flags, data\n" | 316 | " multicast_flags, psycstore_flags, data\n" |
317 | "FROM messages\n" | 317 | "FROM messages\n" |
318 | "WHERE channel_id = get_chan_id($1)\n" | 318 | "WHERE channel_id = get_chan_id($1)\n" |
319 | " AND message_id IN\n" | 319 | " AND message_id IN\n" |
320 | " (SELECT message_id\n" | 320 | " (SELECT message_id\n" |
321 | " FROM messages\n" | 321 | " FROM messages\n" |
322 | " WHERE channel_id = get_chan_id($2) \n" | 322 | " WHERE channel_id = get_chan_id($2) \n" |
323 | " GROUP BY message_id\n" | 323 | " GROUP BY message_id\n" |
324 | " ORDER BY message_id\n" | 324 | " ORDER BY message_id\n" |
325 | " DESC LIMIT $3)\n" | 325 | " DESC LIMIT $3)\n" |
326 | "ORDER BY fragment_id", 3)) || | 326 | "ORDER BY fragment_id", 3)) || |
327 | 327 | ||
328 | (GNUNET_OK != GNUNET_POSTGRES_prepare (plugin->dbh, | 328 | (GNUNET_OK != GNUNET_POSTGRES_prepare (plugin->dbh, |
329 | "select_message_fragment", | 329 | "select_message_fragment", |
330 | "SELECT hop_counter, signature, purpose, fragment_id,\n" | 330 | "SELECT hop_counter, signature, purpose, fragment_id,\n" |
331 | " fragment_offset, message_id, group_generation,\n" | 331 | " fragment_offset, message_id, group_generation,\n" |
332 | " multicast_flags, psycstore_flags, data\n" | 332 | " multicast_flags, psycstore_flags, data\n" |
333 | "FROM messages\n" | 333 | "FROM messages\n" |
334 | "WHERE channel_id = get_chan_id($1) \n" | 334 | "WHERE channel_id = get_chan_id($1) \n" |
335 | " AND message_id = $2 AND fragment_offset = $3", 3)) || | 335 | " AND message_id = $2 AND fragment_offset = $3", 3)) || |
336 | 336 | ||
337 | (GNUNET_OK != GNUNET_POSTGRES_prepare (plugin->dbh, | 337 | (GNUNET_OK != GNUNET_POSTGRES_prepare (plugin->dbh, |
338 | "select_counters_message", | 338 | "select_counters_message", |
339 | "SELECT fragment_id, message_id, group_generation\n" | 339 | "SELECT fragment_id, message_id, group_generation\n" |
340 | "FROM messages\n" | 340 | "FROM messages\n" |
341 | "WHERE channel_id = get_chan_id($1)\n" | 341 | "WHERE channel_id = get_chan_id($1)\n" |
342 | "ORDER BY fragment_id DESC LIMIT 1", 1)) || | 342 | "ORDER BY fragment_id DESC LIMIT 1", 1)) || |
343 | 343 | ||
344 | (GNUNET_OK != GNUNET_POSTGRES_prepare (plugin->dbh, | 344 | (GNUNET_OK != GNUNET_POSTGRES_prepare (plugin->dbh, |
345 | "select_counters_state", | 345 | "select_counters_state", |
346 | "SELECT max_state_message_id\n" | 346 | "SELECT max_state_message_id\n" |
347 | "FROM channels\n" | 347 | "FROM channels\n" |
348 | "WHERE pub_key = $1 AND max_state_message_id IS NOT NULL", 1)) || | 348 | "WHERE pub_key = $1 AND max_state_message_id IS NOT NULL", 1)) || |
349 | 349 | ||
350 | (GNUNET_OK != GNUNET_POSTGRES_prepare (plugin->dbh, | 350 | (GNUNET_OK != GNUNET_POSTGRES_prepare (plugin->dbh, |
351 | "update_max_state_message_id", | 351 | "update_max_state_message_id", |
352 | "UPDATE channels\n" | 352 | "UPDATE channels\n" |
353 | "SET max_state_message_id = $1\n" | 353 | "SET max_state_message_id = $1\n" |
354 | "WHERE pub_key = $2", 2)) || | 354 | "WHERE pub_key = $2", 2)) || |
355 | 355 | ||
356 | (GNUNET_OK != GNUNET_POSTGRES_prepare (plugin->dbh, | 356 | (GNUNET_OK != GNUNET_POSTGRES_prepare (plugin->dbh, |
357 | "update_state_hash_message_id", | 357 | "update_state_hash_message_id", |
358 | "UPDATE channels\n" | 358 | "UPDATE channels\n" |
359 | "SET state_hash_message_id = $1\n" | 359 | "SET state_hash_message_id = $1\n" |
360 | "WHERE pub_key = $2", 2)) || | 360 | "WHERE pub_key = $2", 2)) || |
361 | 361 | ||
362 | (GNUNET_OK != GNUNET_POSTGRES_prepare (plugin->dbh, | 362 | (GNUNET_OK != GNUNET_POSTGRES_prepare (plugin->dbh, |
363 | "insert_state_current", | 363 | "insert_state_current", |
364 | "INSERT INTO state\n" | 364 | "INSERT INTO state\n" |
365 | " (channel_id, name, value_current, value_signed)\n" | 365 | " (channel_id, name, value_current, value_signed)\n" |
366 | "SELECT new.channel_id, new.name,\n" | 366 | "SELECT new.channel_id, new.name,\n" |
367 | " new.value_current, old.value_signed\n" | 367 | " new.value_current, old.value_signed\n" |
368 | "FROM (SELECT get_chan_id($1) AS channel_id,\n" | 368 | "FROM (SELECT get_chan_id($1) AS channel_id,\n" |
369 | " $2::TEXT AS name, $3::BYTEA AS value_current) AS new\n" | 369 | " $2::TEXT AS name, $3::BYTEA AS value_current) AS new\n" |
370 | "LEFT JOIN (SELECT channel_id, name, value_signed\n" | 370 | "LEFT JOIN (SELECT channel_id, name, value_signed\n" |
371 | " FROM state) AS old\n" | 371 | " FROM state) AS old\n" |
372 | "ON new.channel_id = old.channel_id AND new.name = old.name\n" | 372 | "ON new.channel_id = old.channel_id AND new.name = old.name\n" |
373 | "ON CONFLICT ( channel_id, substring(name from 1 for 5) )\n" | 373 | "ON CONFLICT ( channel_id, substring(name from 1 for 5) )\n" |
374 | " DO UPDATE SET value_current = EXCLUDED.value_current,\n" | 374 | " DO UPDATE SET value_current = EXCLUDED.value_current,\n" |
375 | " value_signed = EXCLUDED.value_signed", 3)) || | 375 | " value_signed = EXCLUDED.value_signed", 3)) || |
376 | 376 | ||
377 | (GNUNET_OK != GNUNET_POSTGRES_prepare (plugin->dbh, | 377 | (GNUNET_OK != GNUNET_POSTGRES_prepare (plugin->dbh, |
378 | "delete_state_empty", | 378 | "delete_state_empty", |
379 | "DELETE FROM state\n" | 379 | "DELETE FROM state\n" |
380 | "WHERE channel_id = (SELECT id FROM channels WHERE pub_key = $1)\n" | 380 | "WHERE channel_id = (SELECT id FROM channels WHERE pub_key = $1)\n" |
381 | " AND (value_current IS NULL OR length(value_current) = 0)\n" | 381 | " AND (value_current IS NULL OR length(value_current) = 0)\n" |
382 | " AND (value_signed IS NULL OR length(value_signed) = 0)", 1)) || | 382 | " AND (value_signed IS NULL OR length(value_signed) = 0)", 1)) || |
383 | 383 | ||
384 | (GNUNET_OK != GNUNET_POSTGRES_prepare (plugin->dbh, | 384 | (GNUNET_OK != GNUNET_POSTGRES_prepare (plugin->dbh, |
385 | "update_state_signed", | 385 | "update_state_signed", |
386 | "UPDATE state\n" | 386 | "UPDATE state\n" |
387 | "SET value_signed = value_current\n" | 387 | "SET value_signed = value_current\n" |
388 | "WHERE channel_id = get_chan_id($1) ", 1)) || | 388 | "WHERE channel_id = get_chan_id($1) ", 1)) || |
389 | 389 | ||
390 | (GNUNET_OK != GNUNET_POSTGRES_prepare (plugin->dbh, | 390 | (GNUNET_OK != GNUNET_POSTGRES_prepare (plugin->dbh, |
391 | "delete_state", | 391 | "delete_state", |
392 | "DELETE FROM state\n" | 392 | "DELETE FROM state\n" |
393 | "WHERE channel_id = get_chan_id($1) ", 1)) || | 393 | "WHERE channel_id = get_chan_id($1) ", 1)) || |
394 | 394 | ||
395 | (GNUNET_OK != GNUNET_POSTGRES_prepare (plugin->dbh, | 395 | (GNUNET_OK != GNUNET_POSTGRES_prepare (plugin->dbh, |
396 | "insert_state_sync", | 396 | "insert_state_sync", |
397 | "INSERT INTO state_sync (channel_id, name, value)\n" | 397 | "INSERT INTO state_sync (channel_id, name, value)\n" |
398 | "VALUES (get_chan_id($1), $2, $3)", 3)) || | 398 | "VALUES (get_chan_id($1), $2, $3)", 3)) || |
399 | 399 | ||
400 | (GNUNET_OK != GNUNET_POSTGRES_prepare (plugin->dbh, | 400 | (GNUNET_OK != GNUNET_POSTGRES_prepare (plugin->dbh, |
401 | "insert_state_from_sync", | 401 | "insert_state_from_sync", |
402 | "INSERT INTO state\n" | 402 | "INSERT INTO state\n" |
403 | " (channel_id, name, value_current, value_signed)\n" | 403 | " (channel_id, name, value_current, value_signed)\n" |
404 | "SELECT channel_id, name, value, value\n" | 404 | "SELECT channel_id, name, value, value\n" |
405 | "FROM state_sync\n" | 405 | "FROM state_sync\n" |
406 | "WHERE channel_id = get_chan_id($1)", 1)) || | 406 | "WHERE channel_id = get_chan_id($1)", 1)) || |
407 | 407 | ||
408 | (GNUNET_OK != GNUNET_POSTGRES_prepare (plugin->dbh, | 408 | (GNUNET_OK != GNUNET_POSTGRES_prepare (plugin->dbh, |
409 | "delete_state_sync", | 409 | "delete_state_sync", |
410 | "DELETE FROM state_sync\n" | 410 | "DELETE FROM state_sync\n" |
411 | "WHERE channel_id = get_chan_id($1)", 1)) || | 411 | "WHERE channel_id = get_chan_id($1)", 1)) || |
412 | 412 | ||
413 | (GNUNET_OK != GNUNET_POSTGRES_prepare (plugin->dbh, | 413 | (GNUNET_OK != GNUNET_POSTGRES_prepare (plugin->dbh, |
414 | "select_state_one", | 414 | "select_state_one", |
415 | "SELECT value_current\n" | 415 | "SELECT value_current\n" |
416 | "FROM state\n" | 416 | "FROM state\n" |
417 | "WHERE channel_id = get_chan_id($1)\n" | 417 | "WHERE channel_id = get_chan_id($1)\n" |
418 | " AND name = $2", 2)) || | 418 | " AND name = $2", 2)) || |
419 | 419 | ||
420 | (GNUNET_OK != GNUNET_POSTGRES_prepare (plugin->dbh, | 420 | (GNUNET_OK != GNUNET_POSTGRES_prepare (plugin->dbh, |
421 | "select_state_prefix", | 421 | "select_state_prefix", |
422 | "SELECT name, value_current\n" | 422 | "SELECT name, value_current\n" |
423 | "FROM state\n" | 423 | "FROM state\n" |
424 | "WHERE channel_id = get_chan_id($1)\n" | 424 | "WHERE channel_id = get_chan_id($1)\n" |
425 | " AND (name = $2 OR substr(name, 1, $3) = $4 || '_')", 4)) || | 425 | " AND (name = $2 OR substr(name, 1, $3) = $4 || '_')", 4)) || |
426 | 426 | ||
427 | (GNUNET_OK != GNUNET_POSTGRES_prepare (plugin->dbh, | 427 | (GNUNET_OK != GNUNET_POSTGRES_prepare (plugin->dbh, |
428 | "select_state_signed", | 428 | "select_state_signed", |
429 | "SELECT name, value_signed\n" | 429 | "SELECT name, value_signed\n" |
430 | "FROM state\n" | 430 | "FROM state\n" |
431 | "WHERE channel_id = get_chan_id($1)\n" | 431 | "WHERE channel_id = get_chan_id($1)\n" |
432 | " AND value_signed IS NOT NULL", 1))) | 432 | " AND value_signed IS NOT NULL", 1))) |
433 | { | 433 | { |
434 | PQfinish (plugin->dbh); | 434 | PQfinish (plugin->dbh); |
435 | plugin->dbh = NULL; | 435 | plugin->dbh = NULL; |
@@ -938,21 +938,16 @@ fragment_row (struct Plugin *plugin, | |||
938 | 938 | ||
939 | 939 | ||
940 | static int | 940 | static int |
941 | fragment_select (struct Plugin *plugin, const char *stmt, | 941 | fragment_select (struct Plugin *plugin, |
942 | const char *stmt, | ||
942 | struct GNUNET_PQ_QueryParam *params, | 943 | struct GNUNET_PQ_QueryParam *params, |
943 | uint64_t *returned_fragments, | 944 | uint64_t *returned_fragments, |
944 | GNUNET_PSYCSTORE_FragmentCallback cb, void *cb_cls) | 945 | GNUNET_PSYCSTORE_FragmentCallback cb, |
946 | void *cb_cls) | ||
945 | { | 947 | { |
946 | PGresult *res; | 948 | PGresult *res; |
947 | int ret = GNUNET_SYSERR; | 949 | int ret = GNUNET_SYSERR; |
948 | 950 | ||
949 | // FIXME | ||
950 | if (NULL == plugin->dbh || NULL == stmt || NULL == params) | ||
951 | { | ||
952 | fprintf(stderr, "%p %p %p\n", plugin->dbh, stmt, params); | ||
953 | return GNUNET_SYSERR; | ||
954 | } | ||
955 | |||
956 | res = GNUNET_PQ_exec_prepared (plugin->dbh, stmt, params); | 951 | res = GNUNET_PQ_exec_prepared (plugin->dbh, stmt, params); |
957 | if (GNUNET_YES == | 952 | if (GNUNET_YES == |
958 | GNUNET_POSTGRES_check_result (plugin->dbh, | 953 | GNUNET_POSTGRES_check_result (plugin->dbh, |