diff options
author | Christian Grothoff <christian@grothoff.org> | 2018-10-27 21:27:23 +0200 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2018-10-27 21:27:23 +0200 |
commit | 7b62deabac967c2ba94502211ffd553eda572622 (patch) | |
tree | d3293140c44c17ee77071062bec2bd1a49588ccd | |
parent | 2024ccd2f9cc3465a008a88c836be9ce26694b19 (diff) |
split up progress points of auditor by coin/reserve/aggregation to minimize DB conflicts
-rw-r--r-- | src/auditor/taler-auditor.c | 292 | ||||
-rw-r--r-- | src/auditordb/plugin_auditordb_postgres.c | 403 | ||||
-rw-r--r-- | src/auditordb/test_auditordb.c | 64 | ||||
-rw-r--r-- | src/include/taler_auditordb_plugin.h | 162 |
4 files changed, 657 insertions, 264 deletions
diff --git a/src/auditor/taler-auditor.c b/src/auditor/taler-auditor.c index 83f87ae0a..12ababc55 100644 --- a/src/auditor/taler-auditor.c +++ b/src/auditor/taler-auditor.c @@ -109,9 +109,19 @@ static struct GNUNET_TIME_Relative idle_reserve_expiration_time; static struct TALER_MasterPublicKeyP master_pub; /** - * Last reserve_in serial ID seen. + * Checkpointing our progress for reserves. */ -static struct TALER_AUDITORDB_ProgressPoint pp; +static struct TALER_AUDITORDB_ProgressPointReserve ppr; + +/** + * Checkpointing our progress for aggregations. + */ +static struct TALER_AUDITORDB_ProgressPointAggregation ppa; + +/** + * Checkpointing our progress for coins. + */ +static struct TALER_AUDITORDB_ProgressPointCoin ppc; /** * Array of reports about denomination keys with an @@ -773,8 +783,8 @@ handle_reserve_in (void *cls, enum GNUNET_DB_QueryStatus qs; /* should be monotonically increasing */ - GNUNET_assert (rowid >= pp.last_reserve_in_serial_id); - pp.last_reserve_in_serial_id = rowid + 1; + GNUNET_assert (rowid >= ppr.last_reserve_in_serial_id); + ppr.last_reserve_in_serial_id = rowid + 1; GNUNET_CRYPTO_hash (reserve_pub, sizeof (*reserve_pub), @@ -861,8 +871,8 @@ handle_reserve_out (void *cls, enum GNUNET_DB_QueryStatus qs; /* should be monotonically increasing */ - GNUNET_assert (rowid >= pp.last_reserve_out_serial_id); - pp.last_reserve_out_serial_id = rowid + 1; + GNUNET_assert (rowid >= ppr.last_reserve_out_serial_id); + ppr.last_reserve_out_serial_id = rowid + 1; /* lookup denomination pub data (make sure denom_pub is valid, establish fees) */ qs = get_denomination_info (denom_pub, @@ -1011,8 +1021,8 @@ handle_payback_by_reserve (void *cls, const char *rev; /* should be monotonically increasing */ - GNUNET_assert (rowid >= pp.last_reserve_payback_serial_id); - pp.last_reserve_payback_serial_id = rowid + 1; + GNUNET_assert (rowid >= ppr.last_reserve_payback_serial_id); + ppr.last_reserve_payback_serial_id = rowid + 1; GNUNET_CRYPTO_rsa_public_key_hash (coin->denom_pub.rsa_public_key, &pr.h_denom_pub); @@ -1202,8 +1212,8 @@ handle_reserve_closed (void *cls, enum GNUNET_DB_QueryStatus qs; /* should be monotonically increasing */ - GNUNET_assert (rowid >= pp.last_reserve_close_serial_id); - pp.last_reserve_close_serial_id = rowid + 1; + GNUNET_assert (rowid >= ppr.last_reserve_close_serial_id); + ppr.last_reserve_close_serial_id = rowid + 1; GNUNET_CRYPTO_hash (reserve_pub, sizeof (*reserve_pub), @@ -1507,9 +1517,33 @@ analyze_reserves (void *cls) struct ReserveContext rc; enum GNUNET_DB_QueryStatus qsx; enum GNUNET_DB_QueryStatus qs; + enum GNUNET_DB_QueryStatus qsp; GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Analyzing reserves\n"); + qsp = adb->get_auditor_progress_reserve (adb->cls, + asession, + &master_pub, + &ppr); + if (0 > qsp) + { + GNUNET_break (GNUNET_DB_STATUS_SOFT_ERROR == qsp); + return qsp; + } + if (GNUNET_DB_STATUS_SUCCESS_NO_RESULTS == qsp) + { + GNUNET_log (GNUNET_ERROR_TYPE_MESSAGE, + _("First analysis using this auditor, starting audit from scratch\n")); + } + else + { + GNUNET_log (GNUNET_ERROR_TYPE_INFO, + _("Resuming reserve audit at %llu/%llu/%llu/%llu\n"), + (unsigned long long) ppr.last_reserve_in_serial_id, + (unsigned long long) ppr.last_reserve_out_serial_id, + (unsigned long long) ppr.last_reserve_payback_serial_id, + (unsigned long long) ppr.last_reserve_close_serial_id); + } rc.qs = GNUNET_DB_STATUS_SUCCESS_ONE_RESULT; qsx = adb->get_reserve_summary (adb->cls, asession, @@ -1528,7 +1562,7 @@ analyze_reserves (void *cls) qs = edb->select_reserves_in_above_serial_id (edb->cls, esession, - pp.last_reserve_in_serial_id, + ppr.last_reserve_in_serial_id, &handle_reserve_in, &rc); if (qs < 0) @@ -1538,7 +1572,7 @@ analyze_reserves (void *cls) } qs = edb->select_reserves_out_above_serial_id (edb->cls, esession, - pp.last_reserve_out_serial_id, + ppr.last_reserve_out_serial_id, &handle_reserve_out, &rc); if (qs < 0) @@ -1548,7 +1582,7 @@ analyze_reserves (void *cls) } qs = edb->select_payback_above_serial_id (edb->cls, esession, - pp.last_reserve_payback_serial_id, + ppr.last_reserve_payback_serial_id, &handle_payback_by_reserve, &rc); if (qs < 0) @@ -1558,7 +1592,7 @@ analyze_reserves (void *cls) } qs = edb->select_reserve_closed_above_serial_id (edb->cls, esession, - pp.last_reserve_close_serial_id, + ppr.last_reserve_close_serial_id, &handle_reserve_closed, &rc); if (qs < 0) @@ -1599,6 +1633,29 @@ analyze_reserves (void *cls) GNUNET_break (GNUNET_DB_STATUS_SOFT_ERROR == qs); return qs; } + if (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT == qsp) + qs = adb->update_auditor_progress_reserve (adb->cls, + asession, + &master_pub, + &ppr); + else + qs = adb->insert_auditor_progress_reserve (adb->cls, + asession, + &master_pub, + &ppr); + if (0 >= qs) + { + GNUNET_log (GNUNET_ERROR_TYPE_INFO, + "Failed to update auditor DB, not recording progress\n"); + GNUNET_break (GNUNET_DB_STATUS_SOFT_ERROR == qs); + return qs; + } + GNUNET_log (GNUNET_ERROR_TYPE_INFO, + _("Concluded reserve audit step at %llu/%llu/%llu/%llu\n"), + (unsigned long long) ppr.last_reserve_in_serial_id, + (unsigned long long) ppr.last_reserve_out_serial_id, + (unsigned long long) ppr.last_reserve_payback_serial_id, + (unsigned long long) ppr.last_reserve_close_serial_id); return GNUNET_DB_STATUS_SUCCESS_ONE_RESULT; } @@ -2388,8 +2445,8 @@ check_wire_out_cb (void *cls, char *method; /* should be monotonically increasing */ - GNUNET_assert (rowid >= pp.last_wire_out_serial_id); - pp.last_wire_out_serial_id = rowid + 1; + GNUNET_assert (rowid >= ppa.last_wire_out_serial_id); + ppa.last_wire_out_serial_id = rowid + 1; GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Checking wire transfer %s over %s performed on %s\n", @@ -2565,9 +2622,31 @@ analyze_aggregations (void *cls) struct WireFeeInfo *wfi; enum GNUNET_DB_QueryStatus qsx; enum GNUNET_DB_QueryStatus qs; + enum GNUNET_DB_QueryStatus qsp; GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Analyzing aggregations\n"); + qsp = adb->get_auditor_progress_aggregation (adb->cls, + asession, + &master_pub, + &ppa); + if (0 > qsp) + { + GNUNET_break (GNUNET_DB_STATUS_SOFT_ERROR == qsp); + return qsp; + } + if (GNUNET_DB_STATUS_SUCCESS_NO_RESULTS == qsp) + { + GNUNET_log (GNUNET_ERROR_TYPE_MESSAGE, + _("First analysis using this auditor, starting audit from scratch\n")); + } + else + { + GNUNET_log (GNUNET_ERROR_TYPE_INFO, + _("Resuming aggregation audit at %llu\n"), + (unsigned long long) ppa.last_wire_out_serial_id); + } + memset (&ac, 0, sizeof (ac)); @@ -2583,7 +2662,7 @@ analyze_aggregations (void *cls) ac.qs = GNUNET_DB_STATUS_SUCCESS_ONE_RESULT; qs = edb->select_wire_out_above_serial_id (edb->cls, esession, - pp.last_wire_out_serial_id, + ppa.last_wire_out_serial_id, &check_wire_out_cb, &ac); if (0 > qs) @@ -2627,6 +2706,27 @@ analyze_aggregations (void *cls) GNUNET_break (GNUNET_DB_STATUS_SOFT_ERROR == ac.qs); return ac.qs; } + if (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT == qsp) + qs = adb->update_auditor_progress_aggregation (adb->cls, + asession, + &master_pub, + &ppa); + else + qs = adb->insert_auditor_progress_aggregation (adb->cls, + asession, + &master_pub, + &ppa); + if (0 >= qs) + { + GNUNET_log (GNUNET_ERROR_TYPE_INFO, + "Failed to update auditor DB, not recording progress\n"); + GNUNET_break (GNUNET_DB_STATUS_SOFT_ERROR == qs); + return qs; + } + GNUNET_log (GNUNET_ERROR_TYPE_INFO, + _("Concluded aggregation audit step at %llu\n"), + (unsigned long long) ppa.last_wire_out_serial_id); + return GNUNET_DB_STATUS_SUCCESS_ONE_RESULT; } @@ -2925,8 +3025,8 @@ withdraw_cb (void *cls, struct TALER_Amount value; enum GNUNET_DB_QueryStatus qs; - GNUNET_assert (rowid >= pp.last_withdraw_serial_id); /* should be monotonically increasing */ - pp.last_withdraw_serial_id = rowid + 1; + GNUNET_assert (rowid >= ppc.last_withdraw_serial_id); /* should be monotonically increasing */ + ppc.last_withdraw_serial_id = rowid + 1; qs = get_denomination_info (denom_pub, &dki, @@ -3078,8 +3178,8 @@ refresh_session_cb (void *cls, struct TALER_Amount tmp; enum GNUNET_DB_QueryStatus qs; - GNUNET_assert (rowid >= pp.last_melt_serial_id); /* should be monotonically increasing */ - pp.last_melt_serial_id = rowid + 1; + GNUNET_assert (rowid >= ppc.last_melt_serial_id); /* should be monotonically increasing */ + ppc.last_melt_serial_id = rowid + 1; qs = get_denomination_info (denom_pub, &dki, @@ -3412,8 +3512,8 @@ deposit_cb (void *cls, struct TALER_Amount tmp; enum GNUNET_DB_QueryStatus qs; - GNUNET_assert (rowid >= pp.last_deposit_serial_id); /* should be monotonically increasing */ - pp.last_deposit_serial_id = rowid + 1; + GNUNET_assert (rowid >= ppc.last_deposit_serial_id); /* should be monotonically increasing */ + ppc.last_deposit_serial_id = rowid + 1; qs = get_denomination_info (denom_pub, &dki, @@ -3562,8 +3662,8 @@ refund_cb (void *cls, struct TALER_Amount refund_fee; enum GNUNET_DB_QueryStatus qs; - GNUNET_assert (rowid >= pp.last_refund_serial_id); /* should be monotonically increasing */ - pp.last_refund_serial_id = rowid + 1; + GNUNET_assert (rowid >= ppc.last_refund_serial_id); /* should be monotonically increasing */ + ppc.last_refund_serial_id = rowid + 1; qs = get_denomination_info (denom_pub, &dki, @@ -3702,9 +3802,34 @@ analyze_coins (void *cls) struct CoinContext cc; enum GNUNET_DB_QueryStatus qs; enum GNUNET_DB_QueryStatus qsx; + enum GNUNET_DB_QueryStatus qsp; GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Analyzing coins\n"); + qsp = adb->get_auditor_progress_coin (adb->cls, + asession, + &master_pub, + &ppc); + if (0 > qsp) + { + GNUNET_break (GNUNET_DB_STATUS_SOFT_ERROR == qsp); + return qsp; + } + if (GNUNET_DB_STATUS_SUCCESS_NO_RESULTS == qsp) + { + GNUNET_log (GNUNET_ERROR_TYPE_MESSAGE, + _("First analysis using this auditor, starting audit from scratch\n")); + } + else + { + GNUNET_log (GNUNET_ERROR_TYPE_INFO, + _("Resuming coin audit at %llu/%llu/%llu/%llu\n"), + (unsigned long long) ppc.last_deposit_serial_id, + (unsigned long long) ppc.last_melt_serial_id, + (unsigned long long) ppc.last_refund_serial_id, + (unsigned long long) ppc.last_withdraw_serial_id); + } + /* setup 'cc' */ cc.qs = GNUNET_DB_STATUS_SUCCESS_ONE_RESULT; cc.denom_summaries = GNUNET_CONTAINER_multihashmap_create (256, @@ -3727,7 +3852,7 @@ analyze_coins (void *cls) if (0 > (qs = edb->select_reserves_out_above_serial_id (edb->cls, esession, - pp.last_withdraw_serial_id, + ppc.last_withdraw_serial_id, &withdraw_cb, &cc)) ) { @@ -3739,7 +3864,7 @@ analyze_coins (void *cls) if (0 > (qs = edb->select_refunds_above_serial_id (edb->cls, esession, - pp.last_refund_serial_id, + ppc.last_refund_serial_id, &refund_cb, &cc))) { @@ -3751,7 +3876,7 @@ analyze_coins (void *cls) if (0 > (qs = edb->select_refreshs_above_serial_id (edb->cls, esession, - pp.last_melt_serial_id, + ppc.last_melt_serial_id, &refresh_session_cb, &cc))) { @@ -3763,7 +3888,7 @@ analyze_coins (void *cls) if (0 > (qs = edb->select_deposits_above_serial_id (edb->cls, esession, - pp.last_deposit_serial_id, + ppc.last_deposit_serial_id, &deposit_cb, &cc))) { @@ -3805,6 +3930,30 @@ analyze_coins (void *cls) GNUNET_break (GNUNET_DB_STATUS_SOFT_ERROR == qs); return qs; } + + if (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT == qsp) + qs = adb->update_auditor_progress_coin (adb->cls, + asession, + &master_pub, + &ppc); + else + qs = adb->insert_auditor_progress_coin (adb->cls, + asession, + &master_pub, + &ppc); + if (0 >= qs) + { + GNUNET_log (GNUNET_ERROR_TYPE_INFO, + "Failed to update auditor DB, not recording progress\n"); + GNUNET_break (GNUNET_DB_STATUS_SOFT_ERROR == qs); + return qs; + } + GNUNET_log (GNUNET_ERROR_TYPE_INFO, + _("Concluded coin audit step at %llu/%llu/%llu/%llu\n"), + (unsigned long long) ppc.last_deposit_serial_id, + (unsigned long long) ppc.last_melt_serial_id, + (unsigned long long) ppc.last_refund_serial_id, + (unsigned long long) ppc.last_withdraw_serial_id); return qs; } @@ -3823,88 +3972,6 @@ typedef enum GNUNET_DB_QueryStatus /** - * Perform the given @a analysis incrementally, checkpointing our - * progress in the auditor DB. - * - * @param analysis analysis to run - * @param analysis_cls closure for @a analysis - * @return transaction status code - */ -static enum GNUNET_DB_QueryStatus -incremental_processing (Analysis analysis, - void *analysis_cls) -{ - enum GNUNET_DB_QueryStatus qs; - enum GNUNET_DB_QueryStatus qsx; - - qsx = adb->get_auditor_progress (adb->cls, - asession, - &master_pub, - &pp); - if (0 > qsx) - { - GNUNET_break (GNUNET_DB_STATUS_SOFT_ERROR == qsx); - return qsx; - } - if (GNUNET_DB_STATUS_SUCCESS_NO_RESULTS == qsx) - { - GNUNET_log (GNUNET_ERROR_TYPE_MESSAGE, - _("First analysis using this auditor, starting audit from scratch\n")); - } - else - { - GNUNET_log (GNUNET_ERROR_TYPE_INFO, - _("Resuming audit at %llu/%llu/%llu/%llu/%llu/%llu/%llu\n"), - (unsigned long long) pp.last_reserve_in_serial_id, - (unsigned long long) pp.last_reserve_out_serial_id, - (unsigned long long) pp.last_withdraw_serial_id, - (unsigned long long) pp.last_deposit_serial_id, - (unsigned long long) pp.last_melt_serial_id, - (unsigned long long) pp.last_refund_serial_id, - (unsigned long long) pp.last_wire_out_serial_id); - } - qs = analysis (analysis_cls); - if (0 > qs) - { - if (GNUNET_DB_STATUS_SOFT_ERROR == qs) - GNUNET_log (GNUNET_ERROR_TYPE_INFO, - "Serialization issue, not recording progress\n"); - else - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - "Hard database error, not recording progress\n"); - return qs; - } - if (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT == qsx) - qs = adb->update_auditor_progress (adb->cls, - asession, - &master_pub, - &pp); - else - qs = adb->insert_auditor_progress (adb->cls, - asession, - &master_pub, - &pp); - if (0 >= qs) - { - GNUNET_log (GNUNET_ERROR_TYPE_INFO, - "Failed to update auditor DB, not recording progress\n"); - GNUNET_break (GNUNET_DB_STATUS_SOFT_ERROR == qs); - return qs; - } - GNUNET_log (GNUNET_ERROR_TYPE_INFO, - _("Concluded audit step at %llu/%llu/%llu/%llu/%llu/%llu/%llu\n\n"), - (unsigned long long) pp.last_reserve_in_serial_id, - (unsigned long long) pp.last_reserve_out_serial_id, - (unsigned long long) pp.last_withdraw_serial_id, - (unsigned long long) pp.last_deposit_serial_id, - (unsigned long long) pp.last_melt_serial_id, - (unsigned long long) pp.last_refund_serial_id, - (unsigned long long) pp.last_wire_out_serial_id); - return qs; -} - - -/** * Perform the given @a analysis within a transaction scope. * Commit on success. * @@ -3938,8 +4005,7 @@ transact (Analysis analysis, GNUNET_break (0); return GNUNET_SYSERR; } - qs = incremental_processing (analysis, - analysis_cls); + qs = analysis (analysis_cls); if (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT == qs) { qs = edb->commit (edb->cls, diff --git a/src/auditordb/plugin_auditordb_postgres.c b/src/auditordb/plugin_auditordb_postgres.c index 22f58fb7a..42d458998 100644 --- a/src/auditordb/plugin_auditordb_postgres.c +++ b/src/auditordb/plugin_auditordb_postgres.c @@ -147,7 +147,9 @@ postgres_drop_tables (void *cls) GNUNET_PQ_make_execute ("DROP TABLE IF EXISTS auditor_reserve_balance;"), GNUNET_PQ_make_execute ("DROP TABLE IF EXISTS auditor_wire_fee_balance;"), GNUNET_PQ_make_execute ("DROP TABLE IF EXISTS auditor_reserves;"), - GNUNET_PQ_make_execute ("DROP TABLE IF EXISTS auditor_progress;"), + GNUNET_PQ_make_execute ("DROP TABLE IF EXISTS auditor_progress_reserve;"), + GNUNET_PQ_make_execute ("DROP TABLE IF EXISTS auditor_progress_aggregation;"), + GNUNET_PQ_make_execute ("DROP TABLE IF EXISTS auditor_progress_coin;"), GNUNET_PQ_make_execute ("DROP TABLE IF EXISTS wire_auditor_progress;"), GNUNET_PQ_EXECUTE_STATEMENT_END }; @@ -206,28 +208,37 @@ postgres_create_tables (void *cls) ",fee_refund_frac INT4 NOT NULL" ",fee_refund_curr VARCHAR("TALER_CURRENCY_LEN_STR") NOT NULL" ")"), + /* List of exchanges audited by this auditor */ + // TODO: not yet used! + GNUNET_PQ_make_execute ("CREATE TABLE IF NOT EXISTS exchanges" + "(master_pub BYTEA PRIMARY KEY CHECK (LENGTH(master_pub)=32)" + ",exchange_url VARCHAR NOT NULL" + ")"), + /* Table indicating up to which transactions the auditor has processed the exchange database. Used for SELECTing the - statements to process. We basically trace the exchange's - operations by the 6 primary tables: reserves_in, - reserves_out, deposits, refresh_sessions, refunds and prewire. The - other tables of the exchange DB just provide supporting - evidence which is checked alongside the audit of these - five tables. The 6 indices below include the last serial - ID from the respective tables that we have processed. Thus, - we need to select those table entries that are strictly - larger (and process in monotonically increasing order). */ - GNUNET_PQ_make_execute ("CREATE TABLE IF NOT EXISTS auditor_progress" + statements to process. The indices below include the last + serial ID from the respective tables that we have + processed. Thus, we need to select those table entries that are + strictly larger (and process in monotonically increasing + order). */ + GNUNET_PQ_make_execute ("CREATE TABLE IF NOT EXISTS auditor_progress_reserve" "(master_pub BYTEA PRIMARY KEY CHECK (LENGTH(master_pub)=32)" ",last_reserve_in_serial_id INT8 NOT NULL DEFAULT 0" ",last_reserve_out_serial_id INT8 NOT NULL DEFAULT 0" ",last_reserve_payback_serial_id INT8 NOT NULL DEFAULT 0" ",last_reserve_close_serial_id INT8 NOT NULL DEFAULT 0" + ")"), + GNUNET_PQ_make_execute ("CREATE TABLE IF NOT EXISTS auditor_progress_aggregation" + "(master_pub BYTEA PRIMARY KEY CHECK (LENGTH(master_pub)=32)" + ",last_wire_out_serial_id INT8 NOT NULL DEFAULT 0" + ")"), + GNUNET_PQ_make_execute ("CREATE TABLE IF NOT EXISTS auditor_progress_coin" + "(master_pub BYTEA PRIMARY KEY CHECK (LENGTH(master_pub)=32)" ",last_withdraw_serial_id INT8 NOT NULL DEFAULT 0" ",last_deposit_serial_id INT8 NOT NULL DEFAULT 0" ",last_melt_serial_id INT8 NOT NULL DEFAULT 0" ",last_refund_serial_id INT8 NOT NULL DEFAULT 0" - ",last_wire_out_serial_id INT8 NOT NULL DEFAULT 0" ")"), GNUNET_PQ_make_execute ("CREATE TABLE IF NOT EXISTS wire_auditor_progress" "(master_pub BYTEA PRIMARY KEY CHECK (LENGTH(master_pub)=32)" @@ -494,7 +505,7 @@ postgres_prepare (PGconn *db_conn) " FROM auditor_denominations" " WHERE master_pub=$1;", 1), - /* Used in #postgres_insert_auditor_progress() */ + /* Used in #postgres_insert_deposit_confirmation() */ GNUNET_PQ_make_prepare ("auditor_deposit_confirmation_insert", "INSERT INTO deposit_confirmations " "(master_pub" @@ -512,50 +523,84 @@ postgres_prepare (PGconn *db_conn) ",master_sig" /* master_sig could be normalized... */ ") VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13);", 11), - /* Used in #postgres_insert_auditor_progress() */ - GNUNET_PQ_make_prepare ("auditor_progress_insert", - "INSERT INTO auditor_progress " - "(master_pub" - ",last_reserve_in_serial_id" - ",last_reserve_out_serial_id" - ",last_reserve_payback_serial_id" - ",last_reserve_close_serial_id" - ",last_withdraw_serial_id" - ",last_deposit_serial_id" - ",last_melt_serial_id" - ",last_refund_serial_id" - ",last_wire_out_serial_id" - ") VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10);", - 10), - /* Used in #postgres_update_auditor_progress() */ - GNUNET_PQ_make_prepare ("auditor_progress_update", - "UPDATE auditor_progress SET " + /* Used in #postgres_update_auditor_progress_reserve() */ + GNUNET_PQ_make_prepare ("auditor_progress_update_reserve", + "UPDATE auditor_progress_reserve SET " " last_reserve_in_serial_id=$1" ",last_reserve_out_serial_id=$2" ",last_reserve_payback_serial_id=$3" ",last_reserve_close_serial_id=$4" - ",last_withdraw_serial_id=$5" - ",last_deposit_serial_id=$6" - ",last_melt_serial_id=$7" - ",last_refund_serial_id=$8" - ",last_wire_out_serial_id=$9" - " WHERE master_pub=$10", - 10), - /* Used in #postgres_get_auditor_progress() */ - GNUNET_PQ_make_prepare ("auditor_progress_select", + " WHERE master_pub=$5", + 5), + /* Used in #postgres_get_auditor_progress_reserve() */ + GNUNET_PQ_make_prepare ("auditor_progress_select_reserve", "SELECT" " last_reserve_in_serial_id" ",last_reserve_out_serial_id" ",last_reserve_payback_serial_id" ",last_reserve_close_serial_id" - ",last_withdraw_serial_id" + " FROM auditor_progress_reserve" + " WHERE master_pub=$1;", + 1), + /* Used in #postgres_insert_auditor_progress_reserve() */ + GNUNET_PQ_make_prepare ("auditor_progress_insert_reserve", + "INSERT INTO auditor_progress_reserve " + "(master_pub" + ",last_reserve_in_serial_id" + ",last_reserve_out_serial_id" + ",last_reserve_payback_serial_id" + ",last_reserve_close_serial_id" + ") VALUES ($1,$2,$3,$4,$5);", + 5), + /* Used in #postgres_update_auditor_progress_aggregation() */ + GNUNET_PQ_make_prepare ("auditor_progress_update_aggregation", + "UPDATE auditor_progress_aggregation SET " + " last_wire_out_serial_id=$1" + " WHERE master_pub=$2", + 2), + /* Used in #postgres_get_auditor_progress_aggregation() */ + GNUNET_PQ_make_prepare ("auditor_progress_select_aggregation", + "SELECT" + " last_wire_out_serial_id" + " FROM auditor_progress_aggregation" + " WHERE master_pub=$1;", + 1), + /* Used in #postgres_insert_auditor_progress_aggregation() */ + GNUNET_PQ_make_prepare ("auditor_progress_insert_aggregation", + "INSERT INTO auditor_progress_aggregation " + "(master_pub" + ",last_wire_out_serial_id" + ") VALUES ($1,$2);", + 2), + /* Used in #postgres_update_auditor_progress_coin() */ + GNUNET_PQ_make_prepare ("auditor_progress_update_coin", + "UPDATE auditor_progress_coin SET " + " last_withdraw_serial_id=$1" + ",last_deposit_serial_id=$2" + ",last_melt_serial_id=$3" + ",last_refund_serial_id=$4" + " WHERE master_pub=$5", + 4), + /* Used in #postgres_get_auditor_progress_coin() */ + GNUNET_PQ_make_prepare ("auditor_progress_select_coin", + "SELECT" + " last_withdraw_serial_id" ",last_deposit_serial_id" ",last_melt_serial_id" ",last_refund_serial_id" - ",last_wire_out_serial_id" - " FROM auditor_progress" + " FROM auditor_progress_coin" " WHERE master_pub=$1;", 1), + /* Used in #postgres_insert_auditor_progress() */ + GNUNET_PQ_make_prepare ("auditor_progress_insert_coin", + "INSERT INTO auditor_progress_coin " + "(master_pub" + ",last_withdraw_serial_id" + ",last_deposit_serial_id" + ",last_melt_serial_id" + ",last_refund_serial_id" + ") VALUES ($1,$2,$3,$4,$5);", + 5), /* Used in #postgres_insert_wire_auditor_progress() */ GNUNET_PQ_make_prepare ("wire_auditor_progress_insert", "INSERT INTO wire_auditor_progress " @@ -1296,31 +1341,26 @@ postgres_select_denomination_info (void *cls, * @param cls the @e cls of this struct with the plugin-specific state * @param session connection to use * @param master_pub master key of the exchange - * @param pp where is the auditor in processing + * @param ppr where is the auditor in processing * @return transaction status code */ static enum GNUNET_DB_QueryStatus -postgres_insert_auditor_progress (void *cls, - struct TALER_AUDITORDB_Session *session, - const struct TALER_MasterPublicKeyP *master_pub, - const struct TALER_AUDITORDB_ProgressPoint *pp) +postgres_insert_auditor_progress_reserve (void *cls, + struct TALER_AUDITORDB_Session *session, + const struct TALER_MasterPublicKeyP *master_pub, + const struct TALER_AUDITORDB_ProgressPointReserve *ppr) { struct GNUNET_PQ_QueryParam params[] = { GNUNET_PQ_query_param_auto_from_type (master_pub), - GNUNET_PQ_query_param_uint64 (&pp->last_reserve_in_serial_id), - GNUNET_PQ_query_param_uint64 (&pp->last_reserve_out_serial_id), - GNUNET_PQ_query_param_uint64 (&pp->last_reserve_payback_serial_id), - GNUNET_PQ_query_param_uint64 (&pp->last_reserve_close_serial_id), - GNUNET_PQ_query_param_uint64 (&pp->last_withdraw_serial_id), - GNUNET_PQ_query_param_uint64 (&pp->last_deposit_serial_id), - GNUNET_PQ_query_param_uint64 (&pp->last_melt_serial_id), - GNUNET_PQ_query_param_uint64 (&pp->last_refund_serial_id), - GNUNET_PQ_query_param_uint64 (&pp->last_wire_out_serial_id), + GNUNET_PQ_query_param_uint64 (&ppr->last_reserve_in_serial_id), + GNUNET_PQ_query_param_uint64 (&ppr->last_reserve_out_serial_id), + GNUNET_PQ_query_param_uint64 (&ppr->last_reserve_payback_serial_id), + GNUNET_PQ_query_param_uint64 (&ppr->last_reserve_close_serial_id), GNUNET_PQ_query_param_end }; return GNUNET_PQ_eval_prepared_non_select (session->conn, - "auditor_progress_insert", + "auditor_progress_insert_reserve", params); } @@ -1332,31 +1372,26 @@ postgres_insert_auditor_progress (void *cls, * @param cls the @e cls of this struct with the plugin-specific state * @param session connection to use * @param master_pub master key of the exchange - * @param pp where is the auditor in processing + * @param ppr where is the auditor in processing * @return transaction status code */ static enum GNUNET_DB_QueryStatus -postgres_update_auditor_progress (void *cls, - struct TALER_AUDITORDB_Session *session, - const struct TALER_MasterPublicKeyP *master_pub, - const struct TALER_AUDITORDB_ProgressPoint *pp) +postgres_update_auditor_progress_reserve (void *cls, + struct TALER_AUDITORDB_Session *session, + const struct TALER_MasterPublicKeyP *master_pub, + const struct TALER_AUDITORDB_ProgressPointReserve *ppr) { struct GNUNET_PQ_QueryParam params[] = { - GNUNET_PQ_query_param_uint64 (&pp->last_reserve_in_serial_id), - GNUNET_PQ_query_param_uint64 (&pp->last_reserve_out_serial_id), - GNUNET_PQ_query_param_uint64 (&pp->last_reserve_payback_serial_id), - GNUNET_PQ_query_param_uint64 (&pp->last_reserve_close_serial_id), - GNUNET_PQ_query_param_uint64 (&pp->last_withdraw_serial_id), - GNUNET_PQ_query_param_uint64 (&pp->last_deposit_serial_id), - GNUNET_PQ_query_param_uint64 (&pp->last_melt_serial_id), - GNUNET_PQ_query_param_uint64 (&pp->last_refund_serial_id), - GNUNET_PQ_query_param_uint64 (&pp->last_wire_out_serial_id), + GNUNET_PQ_query_param_uint64 (&ppr->last_reserve_in_serial_id), + GNUNET_PQ_query_param_uint64 (&ppr->last_reserve_out_serial_id), + GNUNET_PQ_query_param_uint64 (&ppr->last_reserve_payback_serial_id), + GNUNET_PQ_query_param_uint64 (&ppr->last_reserve_close_serial_id), GNUNET_PQ_query_param_auto_from_type (master_pub), GNUNET_PQ_query_param_end }; return GNUNET_PQ_eval_prepared_non_select (session->conn, - "auditor_progress_update", + "auditor_progress_update_reserve", params); } @@ -1367,14 +1402,14 @@ postgres_update_auditor_progress (void *cls, * @param cls the @e cls of this struct with the plugin-specific state * @param session connection to use * @param master_pub master key of the exchange - * @param[out] pp set to where the auditor is in processing + * @param[out] ppr set to where the auditor is in processing * @return transaction status code */ static enum GNUNET_DB_QueryStatus -postgres_get_auditor_progress (void *cls, - struct TALER_AUDITORDB_Session *session, - const struct TALER_MasterPublicKeyP *master_pub, - struct TALER_AUDITORDB_ProgressPoint *pp) +postgres_get_auditor_progress_reserve (void *cls, + struct TALER_AUDITORDB_Session *session, + const struct TALER_MasterPublicKeyP *master_pub, + struct TALER_AUDITORDB_ProgressPointReserve *ppr) { struct GNUNET_PQ_QueryParam params[] = { GNUNET_PQ_query_param_auto_from_type (master_pub), @@ -1382,28 +1417,206 @@ postgres_get_auditor_progress (void *cls, }; struct GNUNET_PQ_ResultSpec rs[] = { GNUNET_PQ_result_spec_uint64 ("last_reserve_in_serial_id", - &pp->last_reserve_in_serial_id), + &ppr->last_reserve_in_serial_id), GNUNET_PQ_result_spec_uint64 ("last_reserve_out_serial_id", - &pp->last_reserve_out_serial_id), + &ppr->last_reserve_out_serial_id), GNUNET_PQ_result_spec_uint64 ("last_reserve_payback_serial_id", - &pp->last_reserve_payback_serial_id), + &ppr->last_reserve_payback_serial_id), GNUNET_PQ_result_spec_uint64 ("last_reserve_close_serial_id", - &pp->last_reserve_close_serial_id), + &ppr->last_reserve_close_serial_id), + GNUNET_PQ_result_spec_end + }; + + return GNUNET_PQ_eval_prepared_singleton_select (session->conn, + "auditor_progress_select_reserve", + params, + rs); +} + + +/** + * Insert information about the auditor's progress with an exchange's + * data. + * + * @param cls the @e cls of this struct with the plugin-specific state + * @param session connection to use + * @param master_pub master key of the exchange + * @param ppa where is the auditor in processing + * @return transaction status code + */ +static enum GNUNET_DB_QueryStatus +postgres_insert_auditor_progress_aggregation (void *cls, + struct TALER_AUDITORDB_Session *session, + const struct TALER_MasterPublicKeyP *master_pub, + const struct TALER_AUDITORDB_ProgressPointAggregation *ppa) +{ + struct GNUNET_PQ_QueryParam params[] = { + GNUNET_PQ_query_param_auto_from_type (master_pub), + GNUNET_PQ_query_param_uint64 (&ppa->last_wire_out_serial_id), + GNUNET_PQ_query_param_end + }; + + return GNUNET_PQ_eval_prepared_non_select (session->conn, + "auditor_progress_insert_aggregation", + params); +} + + +/** + * Update information about the progress of the auditor. There + * must be an existing record for the exchange. + * + * @param cls the @e cls of this struct with the plugin-specific state + * @param session connection to use + * @param master_pub master key of the exchange + * @param ppa where is the auditor in processing + * @return transaction status code + */ +static enum GNUNET_DB_QueryStatus +postgres_update_auditor_progress_aggregation (void *cls, + struct TALER_AUDITORDB_Session *session, + const struct TALER_MasterPublicKeyP *master_pub, + const struct TALER_AUDITORDB_ProgressPointAggregation *ppa) +{ + struct GNUNET_PQ_QueryParam params[] = { + GNUNET_PQ_query_param_uint64 (&ppa->last_wire_out_serial_id), + GNUNET_PQ_query_param_auto_from_type (master_pub), + GNUNET_PQ_query_param_end + }; + + return GNUNET_PQ_eval_prepared_non_select (session->conn, + "auditor_progress_update_aggregation", + params); +} + + +/** + * Get information about the progress of the auditor. + * + * @param cls the @e cls of this struct with the plugin-specific state + * @param session connection to use + * @param master_pub master key of the exchange + * @param[out] ppa set to where the auditor is in processing + * @return transaction status code + */ +static enum GNUNET_DB_QueryStatus +postgres_get_auditor_progress_aggregation (void *cls, + struct TALER_AUDITORDB_Session *session, + const struct TALER_MasterPublicKeyP *master_pub, + struct TALER_AUDITORDB_ProgressPointAggregation *ppa) +{ + struct GNUNET_PQ_QueryParam params[] = { + GNUNET_PQ_query_param_auto_from_type (master_pub), + GNUNET_PQ_query_param_end + }; + struct GNUNET_PQ_ResultSpec rs[] = { + GNUNET_PQ_result_spec_uint64 ("last_wire_out_serial_id", + &ppa->last_wire_out_serial_id), + GNUNET_PQ_result_spec_end + }; + + return GNUNET_PQ_eval_prepared_singleton_select (session->conn, + "auditor_progress_select_aggregation", + params, + rs); +} + + +/** + * Insert information about the auditor's progress with an exchange's + * data. + * + * @param cls the @e cls of this struct with the plugin-specific state + * @param session connection to use + * @param master_pub master key of the exchange + * @param ppc where is the auditor in processing + * @return transaction status code + */ +static enum GNUNET_DB_QueryStatus +postgres_insert_auditor_progress_coin (void *cls, + struct TALER_AUDITORDB_Session *session, + const struct TALER_MasterPublicKeyP *master_pub, + const struct TALER_AUDITORDB_ProgressPointCoin *ppc) +{ + struct GNUNET_PQ_QueryParam params[] = { + GNUNET_PQ_query_param_auto_from_type (master_pub), + GNUNET_PQ_query_param_uint64 (&ppc->last_withdraw_serial_id), + GNUNET_PQ_query_param_uint64 (&ppc->last_deposit_serial_id), + GNUNET_PQ_query_param_uint64 (&ppc->last_melt_serial_id), + GNUNET_PQ_query_param_uint64 (&ppc->last_refund_serial_id), + GNUNET_PQ_query_param_end + }; + + return GNUNET_PQ_eval_prepared_non_select (session->conn, + "auditor_progress_insert_coin", + params); +} + + +/** + * Update information about the progress of the auditor. There + * must be an existing record for the exchange. + * + * @param cls the @e cls of this struct with the plugin-specific state + * @param session connection to use + * @param master_pub master key of the exchange + * @param ppc where is the auditor in processing + * @return transaction status code + */ +static enum GNUNET_DB_QueryStatus +postgres_update_auditor_progress_coin (void *cls, + struct TALER_AUDITORDB_Session *session, + const struct TALER_MasterPublicKeyP *master_pub, + const struct TALER_AUDITORDB_ProgressPointCoin *ppc) +{ + struct GNUNET_PQ_QueryParam params[] = { + GNUNET_PQ_query_param_uint64 (&ppc->last_withdraw_serial_id), + GNUNET_PQ_query_param_uint64 (&ppc->last_deposit_serial_id), + GNUNET_PQ_query_param_uint64 (&ppc->last_melt_serial_id), + GNUNET_PQ_query_param_uint64 (&ppc->last_refund_serial_id), + GNUNET_PQ_query_param_auto_from_type (master_pub), + GNUNET_PQ_query_param_end + }; + + return GNUNET_PQ_eval_prepared_non_select (session->conn, + "auditor_progress_update_coin", + params); +} + + +/** + * Get information about the progress of the auditor. + * + * @param cls the @e cls of this struct with the plugin-specific state + * @param session connection to use + * @param master_pub master key of the exchange + * @param[out] ppc set to where the auditor is in processing + * @return transaction status code + */ +static enum GNUNET_DB_QueryStatus +postgres_get_auditor_progress_coin (void *cls, + struct TALER_AUDITORDB_Session *session, + const struct TALER_MasterPublicKeyP *master_pub, + struct TALER_AUDITORDB_ProgressPointCoin *ppc) +{ + struct GNUNET_PQ_QueryParam params[] = { + GNUNET_PQ_query_param_auto_from_type (master_pub), + GNUNET_PQ_query_param_end + }; + struct GNUNET_PQ_ResultSpec rs[] = { GNUNET_PQ_result_spec_uint64 ("last_withdraw_serial_id", - &pp->last_withdraw_serial_id), + &ppc->last_withdraw_serial_id), GNUNET_PQ_result_spec_uint64 ("last_deposit_serial_id", - &pp->last_deposit_serial_id), + &ppc->last_deposit_serial_id), GNUNET_PQ_result_spec_uint64 ("last_melt_serial_id", - &pp->last_melt_serial_id), + &ppc->last_melt_serial_id), GNUNET_PQ_result_spec_uint64 ("last_refund_serial_id", - &pp->last_refund_serial_id), - GNUNET_PQ_result_spec_uint64 ("last_wire_out_serial_id", - &pp->last_wire_out_serial_id), + &ppc->last_refund_serial_id), GNUNET_PQ_result_spec_end }; return GNUNET_PQ_eval_prepared_singleton_select (session->conn, - "auditor_progress_select", + "auditor_progress_select_coin", params, rs); } @@ -2702,9 +2915,15 @@ libtaler_plugin_auditordb_postgres_init (void *cls) plugin->select_denomination_info = &postgres_select_denomination_info; plugin->insert_denomination_info = &postgres_insert_denomination_info; - plugin->get_auditor_progress = &postgres_get_auditor_progress; - plugin->update_auditor_progress = &postgres_update_auditor_progress; - plugin->insert_auditor_progress = &postgres_insert_auditor_progress; + plugin->get_auditor_progress_reserve = &postgres_get_auditor_progress_reserve; + plugin->update_auditor_progress_reserve = &postgres_update_auditor_progress_reserve; + plugin->insert_auditor_progress_reserve = &postgres_insert_auditor_progress_reserve; + plugin->get_auditor_progress_aggregation = &postgres_get_auditor_progress_aggregation; + plugin->update_auditor_progress_aggregation = &postgres_update_auditor_progress_aggregation; + plugin->insert_auditor_progress_aggregation = &postgres_insert_auditor_progress_aggregation; + plugin->get_auditor_progress_coin = &postgres_get_auditor_progress_coin; + plugin->update_auditor_progress_coin = &postgres_update_auditor_progress_coin; + plugin->insert_auditor_progress_coin = &postgres_insert_auditor_progress_coin; plugin->get_wire_auditor_progress = &postgres_get_wire_auditor_progress; plugin->update_wire_auditor_progress = &postgres_update_wire_auditor_progress; diff --git a/src/auditordb/test_auditordb.c b/src/auditordb/test_auditordb.c index a5e8ba71d..1b8a4223d 100644 --- a/src/auditordb/test_auditordb.c +++ b/src/auditordb/test_auditordb.c @@ -215,58 +215,50 @@ run (void *cls) GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Test: insert_auditor_progress\n"); - struct TALER_AUDITORDB_ProgressPoint pp = { - .last_reserve_in_serial_id = 1234, - .last_reserve_out_serial_id = 5678, + struct TALER_AUDITORDB_ProgressPointCoin ppc = { .last_deposit_serial_id = 123, .last_melt_serial_id = 456, .last_refund_serial_id = 789, - .last_wire_out_serial_id = 555 + .last_withdraw_serial_id = 555 }; - struct TALER_AUDITORDB_ProgressPoint pp2 = { - .last_reserve_in_serial_id = 0, - .last_reserve_out_serial_id = 0, + struct TALER_AUDITORDB_ProgressPointCoin ppc2 = { .last_deposit_serial_id = 0, .last_melt_serial_id = 0, .last_refund_serial_id = 0, - .last_wire_out_serial_id = 0 + .last_withdraw_serial_id = 0 }; FAILIF (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT != - plugin->insert_auditor_progress (plugin->cls, - session, - &master_pub, - &pp)); + plugin->insert_auditor_progress_coin (plugin->cls, + session, + &master_pub, + &ppc)); GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Test: update_auditor_progress\n"); - pp.last_reserve_in_serial_id++; - pp.last_reserve_out_serial_id++; - pp.last_deposit_serial_id++; - pp.last_melt_serial_id++; - pp.last_refund_serial_id++; - pp.last_wire_out_serial_id++; + ppc.last_deposit_serial_id++; + ppc.last_melt_serial_id++; + ppc.last_refund_serial_id++; + ppc.last_withdraw_serial_id++; FAILIF (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT != - plugin->update_auditor_progress (plugin->cls, - session, - &master_pub, - &pp)); + plugin->update_auditor_progress_coin (plugin->cls, + session, + &master_pub, + &ppc)); GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Test: get_auditor_progress\n"); FAILIF (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT != - plugin->get_auditor_progress (plugin->cls, - session, - &master_pub, - &pp2)); - FAILIF ( (pp.last_reserve_in_serial_id != pp2.last_reserve_in_serial_id) || - (pp.last_reserve_out_serial_id != pp2.last_reserve_out_serial_id) || - (pp.last_deposit_serial_id != pp2.last_deposit_serial_id) || - (pp.last_melt_serial_id != pp2.last_melt_serial_id) || - (pp.last_refund_serial_id != pp2.last_refund_serial_id) || - (pp.last_wire_out_serial_id != pp2.last_wire_out_serial_id) ); + plugin->get_auditor_progress_coin (plugin->cls, + session, + &master_pub, + &ppc2)); + FAILIF ( (ppc.last_deposit_serial_id != ppc2.last_deposit_serial_id) || + (ppc.last_melt_serial_id != ppc2.last_melt_serial_id) || + (ppc.last_refund_serial_id != ppc2.last_refund_serial_id) || + (ppc.last_withdraw_serial_id != ppc2.last_withdraw_serial_id) ); GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Test: insert_reserve_info\n"); @@ -399,10 +391,10 @@ run (void *cls) GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Test: update_denomination_balance\n"); - pp.last_reserve_out_serial_id++; - pp.last_deposit_serial_id++; - pp.last_melt_serial_id++; - pp.last_refund_serial_id++; + ppc.last_withdraw_serial_id++; + ppc.last_deposit_serial_id++; + ppc.last_melt_serial_id++; + ppc.last_refund_serial_id++; FAILIF (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT != plugin->update_denomination_balance (plugin->cls, diff --git a/src/include/taler_auditordb_plugin.h b/src/include/taler_auditordb_plugin.h index fb3930521..ae8cafc03 100644 --- a/src/include/taler_auditordb_plugin.h +++ b/src/include/taler_auditordb_plugin.h @@ -131,10 +131,10 @@ struct TALER_AUDITORDB_WireProgressPoint /** - * Structure for remembering the auditor's progress over the - * various tables and (auditor) transactions. + * Structure for remembering the auditor's progress over the various + * tables and (auditor) transactions when analyzing reserves. */ -struct TALER_AUDITORDB_ProgressPoint +struct TALER_AUDITORDB_ProgressPointReserve { /** * last_reserve_in_serial_id serial ID of the last reserve_in transfer the auditor processed @@ -158,6 +158,29 @@ struct TALER_AUDITORDB_ProgressPoint */ uint64_t last_reserve_close_serial_id; +}; + + +/** + * Structure for remembering the auditor's progress over the various + * tables and (auditor) transactions when analyzing aggregations. + */ +struct TALER_AUDITORDB_ProgressPointAggregation +{ + + /** + * last_prewire_serial_id serial ID of the last prewire transfer the auditor processed + */ + uint64_t last_wire_out_serial_id; +}; + + +/** + * Structure for remembering the auditor's progress over the various + * tables and (auditor) transactions when analyzing coins. + */ +struct TALER_AUDITORDB_ProgressPointCoin +{ /** * last_reserve_out_serial_id serial ID of the last withdraw the auditor processed */ @@ -178,11 +201,6 @@ struct TALER_AUDITORDB_ProgressPoint */ uint64_t last_refund_serial_id; - /** - * last_prewire_serial_id serial ID of the last prewire transfer the auditor processed - */ - uint64_t last_wire_out_serial_id; - }; @@ -473,14 +491,14 @@ struct TALER_AUDITORDB_Plugin * @param cls the @e cls of this struct with the plugin-specific state * @param session connection to use * @param master_pub master key of the exchange - * @param pp where is the auditor in processing + * @param ppc where is the auditor in processing * @return transaction status code */ enum GNUNET_DB_QueryStatus - (*insert_auditor_progress)(void *cls, - struct TALER_AUDITORDB_Session *session, - const struct TALER_MasterPublicKeyP *master_pub, - const struct TALER_AUDITORDB_ProgressPoint *pp); + (*insert_auditor_progress_coin)(void *cls, + struct TALER_AUDITORDB_Session *session, + const struct TALER_MasterPublicKeyP *master_pub, + const struct TALER_AUDITORDB_ProgressPointCoin *ppc); /** @@ -490,14 +508,14 @@ struct TALER_AUDITORDB_Plugin * @param cls the @e cls of this struct with the plugin-specific state * @param session connection to use * @param master_pub master key of the exchange - * @param pp where is the auditor in processing + * @param ppc where is the auditor in processing * @return transaction status code */ enum GNUNET_DB_QueryStatus - (*update_auditor_progress)(void *cls, - struct TALER_AUDITORDB_Session *session, - const struct TALER_MasterPublicKeyP *master_pub, - const struct TALER_AUDITORDB_ProgressPoint *pp); + (*update_auditor_progress_coin)(void *cls, + struct TALER_AUDITORDB_Session *session, + const struct TALER_MasterPublicKeyP *master_pub, + const struct TALER_AUDITORDB_ProgressPointCoin *ppc); /** @@ -506,14 +524,112 @@ struct TALER_AUDITORDB_Plugin * @param cls the @e cls of this struct with the plugin-specific state * @param session connection to use * @param master_pub master key of the exchange - * @param[out] pp set to where the auditor is in processing + * @param[out] ppc set to where the auditor is in processing * @return transaction status code */ enum GNUNET_DB_QueryStatus - (*get_auditor_progress)(void *cls, - struct TALER_AUDITORDB_Session *session, - const struct TALER_MasterPublicKeyP *master_pub, - struct TALER_AUDITORDB_ProgressPoint *pp); + (*get_auditor_progress_coin)(void *cls, + struct TALER_AUDITORDB_Session *session, + const struct TALER_MasterPublicKeyP *master_pub, + struct TALER_AUDITORDB_ProgressPointCoin *ppc); + + /** + * Insert information about the auditor's progress with an exchange's + * data. + * + * @param cls the @e cls of this struct with the plugin-specific state + * @param session connection to use + * @param master_pub master key of the exchange + * @param ppr where is the auditor in processing + * @return transaction status code + */ + enum GNUNET_DB_QueryStatus + (*insert_auditor_progress_reserve)(void *cls, + struct TALER_AUDITORDB_Session *session, + const struct TALER_MasterPublicKeyP *master_pub, + const struct TALER_AUDITORDB_ProgressPointReserve *ppr); + + + /** + * Update information about the progress of the auditor. There + * must be an existing record for the exchange. + * + * @param cls the @e cls of this struct with the plugin-specific state + * @param session connection to use + * @param master_pub master key of the exchange + * @param ppr where is the auditor in processing + * @return transaction status code + */ + enum GNUNET_DB_QueryStatus + (*update_auditor_progress_reserve)(void *cls, + struct TALER_AUDITORDB_Session *session, + const struct TALER_MasterPublicKeyP *master_pub, + const struct TALER_AUDITORDB_ProgressPointReserve *ppr); + + + /** + * Get information about the progress of the auditor. + * + * @param cls the @e cls of this struct with the plugin-specific state + * @param session connection to use + * @param master_pub master key of the exchange + * @param[out] ppr set to where the auditor is in processing + * @return transaction status code + */ + enum GNUNET_DB_QueryStatus + (*get_auditor_progress_reserve)(void *cls, + struct TALER_AUDITORDB_Session *session, + const struct TALER_MasterPublicKeyP *master_pub, + struct TALER_AUDITORDB_ProgressPointReserve *ppr); + + /** + * Insert information about the auditor's progress with an exchange's + * data. + * + * @param cls the @e cls of this struct with the plugin-specific state + * @param session connection to use + * @param master_pub master key of the exchange + * @param ppa where is the auditor in processing + * @return transaction status code + */ + enum GNUNET_DB_QueryStatus + (*insert_auditor_progress_aggregation)(void *cls, + struct TALER_AUDITORDB_Session *session, + const struct TALER_MasterPublicKeyP *master_pub, + const struct TALER_AUDITORDB_ProgressPointAggregation *ppa); + + + /** + * Update information about the progress of the auditor. There + * must be an existing record for the exchange. + * + * @param cls the @e cls of this struct with the plugin-specific state + * @param session connection to use + * @param master_pub master key of the exchange + * @param ppa where is the auditor in processing + * @return transaction status code + */ + enum GNUNET_DB_QueryStatus + (*update_auditor_progress_aggregation)(void *cls, + struct TALER_AUDITORDB_Session *session, + const struct TALER_MasterPublicKeyP *master_pub, + const struct TALER_AUDITORDB_ProgressPointAggregation *ppa); + + + /** + * Get information about the progress of the auditor. + * + * @param cls the @e cls of this struct with the plugin-specific state + * @param session connection to use + * @param master_pub master key of the exchange + * @param[out] ppa set to where the auditor is in processing + * @return transaction status code + */ + enum GNUNET_DB_QueryStatus + (*get_auditor_progress_aggregation)(void *cls, + struct TALER_AUDITORDB_Session *session, + const struct TALER_MasterPublicKeyP *master_pub, + struct TALER_AUDITORDB_ProgressPointAggregation *pp); /** |