summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/auditor/taler-auditor.c36
-rw-r--r--src/auditordb/plugin_auditordb_postgres.c189
-rw-r--r--src/include/taler_auditordb_plugin.h93
3 files changed, 291 insertions, 27 deletions
diff --git a/src/auditor/taler-auditor.c b/src/auditor/taler-auditor.c
index 24228da5..04e9da98 100644
--- a/src/auditor/taler-auditor.c
+++ b/src/auditor/taler-auditor.c
@@ -1923,6 +1923,7 @@ analyze_aggregations (void *cls)
struct AggregationContext ac;
struct WirePlugin *wc;
struct WireFeeInfo *wfi;
+ int have_balance;
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
"Analyzing aggregations\n");
@@ -1931,10 +1932,19 @@ analyze_aggregations (void *cls)
ac.wire_tail = NULL;
ac.fee_head = NULL;
ac.fee_tail = NULL;
- /* FIXME: load existing value from DB! */
- GNUNET_assert (GNUNET_OK ==
- TALER_amount_get_zero (currency,
- &ac.total_aggregation_fees));
+ have_balance = adb->get_wire_fee_summary (adb->cls,
+ asession,
+ &master_pub,
+ &ac.total_aggregation_fees);
+ if (GNUNET_SYSERR == have_balance)
+ {
+ GNUNET_break (0);
+ return GNUNET_SYSERR;
+ }
+ if (GNUNET_NO == have_balance)
+ GNUNET_assert (GNUNET_OK ==
+ TALER_amount_get_zero (currency,
+ &ac.total_aggregation_fees));
if (GNUNET_SYSERR ==
edb->select_wire_out_above_serial_id (edb->cls,
esession,
@@ -1966,9 +1976,23 @@ analyze_aggregations (void *cls)
GNUNET_break (0);
return GNUNET_SYSERR;
}
- /* FIXME: store aggregation fee total to DB! */
+ if (GNUNET_NO == have_balance)
+ ac.ret = adb->insert_wire_fee_summary (adb->cls,
+ asession,
+ &master_pub,
+ &ac.total_aggregation_fees);
+ else
+ ac.ret = adb->update_wire_fee_summary (adb->cls,
+ asession,
+ &master_pub,
+ &ac.total_aggregation_fees);
+ if (GNUNET_OK != ac.ret)
+ {
+ GNUNET_break (0);
+ return GNUNET_SYSERR;
+ }
report_aggregation_fee_balance (&ac.total_aggregation_fees);
- return ac.ret;
+ return GNUNET_OK;
}
diff --git a/src/auditordb/plugin_auditordb_postgres.c b/src/auditordb/plugin_auditordb_postgres.c
index 2a63eebd..b4dfaeec 100644
--- a/src/auditordb/plugin_auditordb_postgres.c
+++ b/src/auditordb/plugin_auditordb_postgres.c
@@ -229,6 +229,8 @@ postgres_drop_tables (void *cls)
SQLEXEC_ (conn,
"DROP TABLE IF EXISTS auditor_reserve_balance;");
SQLEXEC_ (conn,
+ "DROP TABLE IF EXISTS auditor_wire_fee_balance;");
+ SQLEXEC_ (conn,
"DROP TABLE IF EXISTS auditor_reserves;");
SQLEXEC_ (conn,
"DROP TABLE IF EXISTS auditor_progress;");
@@ -340,6 +342,15 @@ postgres_create_tables (void *cls)
",withdraw_fee_balance_curr VARCHAR("TALER_CURRENCY_LEN_STR") NOT NULL"
")");
+ /* Table with the sum of the balances of all wire fees
+ (by exchange's master public key) */
+ SQLEXEC ("CREATE TABLE IF NOT EXISTS auditor_wire_fee_balance"
+ "(master_pub BYTEA PRIMARY KEY CHECK (LENGTH(master_pub)=32)"
+ ",wire_fee_balance_val INT8 NOT NULL"
+ ",wire_fee_balance_frac INT4 NOT NULL"
+ ",wire_fee_balance_curr VARCHAR("TALER_CURRENCY_LEN_STR") NOT NULL"
+ ")");
+
/* Table with all of the outstanding denomination coins that the
exchange is aware of. "last_deposit_serial_id" marks the
deposit_serial_id from "deposits" about this denomination key
@@ -686,6 +697,36 @@ postgres_prepare (PGconn *db_conn)
" WHERE master_pub=$1;",
1, NULL);
+ /* Used in #postgres_insert_wire_fee_summary() */
+ PREPARE ("auditor_wire_fee_balance_insert",
+ "INSERT INTO auditor_wire_fee_balance"
+ "(master_pub"
+ ",wire_fee_balance_val"
+ ",wire_fee_balance_frac"
+ ",wire_fee_balance_curr"
+ ") VALUES ($1,$2,$3,$4)",
+ 4, NULL);
+
+ /* Used in #postgres_update_wire_fee_summary() */
+ PREPARE ("auditor_wire_fee_balance_update",
+ "UPDATE auditor_wire_fee_balance SET"
+ " wire_fee_balance_val=$1"
+ ",wire_fee_balance_frac=$2"
+ ",wire_fee_balance_curr=$3"
+ " WHERE master_pub=$4;",
+ 4, NULL);
+
+ /* Used in #postgres_get_wire_fee_summary() */
+ PREPARE ("auditor_wire_fee_balance_select",
+ "SELECT"
+ " wire_fee_balance_val"
+ ",wire_fee_balance_frac"
+ ",wire_fee_balance_curr"
+ " FROM auditor_wire_fee_balance"
+ " WHERE master_pub=$1;",
+ 1, NULL);
+
+
/* Used in #postgres_insert_denomination_balance() */
PREPARE ("denomination_pending_insert",
"INSERT INTO denomination_pending "
@@ -1787,6 +1828,150 @@ postgres_get_reserve_summary (void *cls,
}
+
+
+
+/**
+ * Insert information about exchange's wire fee balance. There must not be an
+ * existing record for the same @a master_pub.
+ *
+ * @param cls the @e cls of this struct with the plugin-specific state
+ * @param session connection to use
+ * @param master_pub master public key of the exchange
+ * @param wire_fee_balance amount the exchange gained in wire fees
+ * @return #GNUNET_OK on success; #GNUNET_SYSERR on failure
+ */
+static int
+postgres_insert_wire_fee_summary (void *cls,
+ struct TALER_AUDITORDB_Session *session,
+ const struct TALER_MasterPublicKeyP *master_pub,
+ const struct TALER_Amount *wire_fee_balance)
+{
+ PGresult *result;
+ int ret;
+ struct GNUNET_PQ_QueryParam params[] = {
+ GNUNET_PQ_query_param_auto_from_type (master_pub),
+ TALER_PQ_query_param_amount (wire_fee_balance),
+ GNUNET_PQ_query_param_end
+ };
+
+ result = GNUNET_PQ_exec_prepared (session->conn,
+ "auditor_wire_fee_balance_insert",
+ params);
+ if (PGRES_COMMAND_OK != PQresultStatus (result))
+ {
+ ret = GNUNET_SYSERR;
+ BREAK_DB_ERR (result);
+ }
+ else
+ {
+ ret = GNUNET_OK;
+ }
+ PQclear (result);
+ return ret;
+}
+
+
+/**
+ * Insert information about exchange's wire fee balance. Destructively updates an
+ * existing record, which must already exist.
+ *
+ * @param cls the @e cls of this struct with the plugin-specific state
+ * @param session connection to use
+ * @param master_pub master public key of the exchange
+ * @param wire_fee_balance amount the exchange gained in wire fees
+ * @return #GNUNET_OK on success; #GNUNET_SYSERR on failure
+ */
+static int
+postgres_update_wire_fee_summary (void *cls,
+ struct TALER_AUDITORDB_Session *session,
+ const struct TALER_MasterPublicKeyP *master_pub,
+ const struct TALER_Amount *wire_fee_balance)
+{
+ PGresult *result;
+ int ret;
+ struct GNUNET_PQ_QueryParam params[] = {
+ TALER_PQ_query_param_amount (wire_fee_balance),
+ GNUNET_PQ_query_param_auto_from_type (master_pub),
+ GNUNET_PQ_query_param_end
+ };
+
+ result = GNUNET_PQ_exec_prepared (session->conn,
+ "auditor_wire_fee_balance_update",
+ params);
+ if (PGRES_COMMAND_OK != PQresultStatus (result))
+ {
+ ret = GNUNET_SYSERR;
+ BREAK_DB_ERR (result);
+ }
+ else
+ {
+ ret = GNUNET_OK;
+ }
+ PQclear (result);
+ return ret;
+}
+
+
+/**
+ * Get summary information about an exchanges wire fee balance.
+ *
+ * @param cls the @e cls of this struct with the plugin-specific state
+ * @param session connection to use
+ * @param master_pub master public key of the exchange
+ * @param[out] wire_fee_balance set amount the exchange gained in wire fees
+ * @return #GNUNET_OK on success; #GNUNET_NO if there is no known
+ * record about this exchange; #GNUNET_SYSERR on failure
+ */
+static int
+postgres_get_wire_fee_summary (void *cls,
+ struct TALER_AUDITORDB_Session *session,
+ const struct TALER_MasterPublicKeyP *master_pub,
+ struct TALER_Amount *wire_fee_balance)
+{
+ struct GNUNET_PQ_QueryParam params[] = {
+ GNUNET_PQ_query_param_auto_from_type (master_pub),
+ GNUNET_PQ_query_param_end
+ };
+ PGresult *result;
+ result = GNUNET_PQ_exec_prepared (session->conn,
+ "auditor_wire_fee_balance_select",
+ params);
+ if (PGRES_TUPLES_OK !=
+ PQresultStatus (result))
+ {
+ BREAK_DB_ERR (result);
+ PQclear (result);
+ return GNUNET_SYSERR;
+ }
+
+ int nrows = PQntuples (result);
+ if (0 == nrows)
+ {
+ LOG (GNUNET_ERROR_TYPE_DEBUG,
+ "postgres_get_wire_fee_summary() returned 0 matching rows\n");
+ PQclear (result);
+ return GNUNET_NO;
+ }
+ GNUNET_assert (1 == nrows);
+
+ struct GNUNET_PQ_ResultSpec rs[] = {
+ TALER_PQ_result_spec_amount ("wire_fee_balance", wire_fee_balance),
+
+ GNUNET_PQ_result_spec_end
+ };
+ if (GNUNET_OK !=
+ GNUNET_PQ_extract_result (result, rs, 0))
+ {
+ GNUNET_break (0);
+ PQclear (result);
+ return GNUNET_SYSERR;
+ }
+ PQclear (result);
+ return GNUNET_OK;
+}
+
+
/**
* Insert information about a denomination key's balances. There
* must not be an existing record for the denomination key.
@@ -2727,6 +2912,10 @@ libtaler_plugin_auditordb_postgres_init (void *cls)
plugin->update_reserve_summary = &postgres_update_reserve_summary;
plugin->insert_reserve_summary = &postgres_insert_reserve_summary;
+ plugin->get_wire_fee_summary = &postgres_get_wire_fee_summary;
+ plugin->update_wire_fee_summary = &postgres_update_wire_fee_summary;
+ plugin->insert_wire_fee_summary = &postgres_insert_wire_fee_summary;
+
plugin->get_denomination_balance = &postgres_get_denomination_balance;
plugin->update_denomination_balance = &postgres_update_denomination_balance;
plugin->insert_denomination_balance = &postgres_insert_denomination_balance;
diff --git a/src/include/taler_auditordb_plugin.h b/src/include/taler_auditordb_plugin.h
index 68d0cb51..031df58c 100644
--- a/src/include/taler_auditordb_plugin.h
+++ b/src/include/taler_auditordb_plugin.h
@@ -492,6 +492,57 @@ struct TALER_AUDITORDB_Plugin
/**
+ * Insert information about exchange's wire fee balance. There must not be an
+ * existing record for the same @a master_pub.
+ *
+ * @param cls the @e cls of this struct with the plugin-specific state
+ * @param session connection to use
+ * @param master_pub master public key of the exchange
+ * @param wire_fee_balance amount the exchange gained in wire fees
+ * @return #GNUNET_OK on success; #GNUNET_SYSERR on failure
+ */
+ int
+ (*insert_wire_fee_summary)(void *cls,
+ struct TALER_AUDITORDB_Session *session,
+ const struct TALER_MasterPublicKeyP *master_pub,
+ const struct TALER_Amount *wire_fee_balance);
+
+
+ /**
+ * Insert information about exchange's wire fee balance. Destructively updates an
+ * existing record, which must already exist.
+ *
+ * @param cls the @e cls of this struct with the plugin-specific state
+ * @param session connection to use
+ * @param master_pub master public key of the exchange
+ * @param wire_fee_balance amount the exchange gained in wire fees
+ * @return #GNUNET_OK on success; #GNUNET_SYSERR on failure
+ */
+ int
+ (*update_wire_fee_summary)(void *cls,
+ struct TALER_AUDITORDB_Session *session,
+ const struct TALER_MasterPublicKeyP *master_pub,
+ const struct TALER_Amount *wire_fee_balance);
+
+
+ /**
+ * Get summary information about an exchanges wire fee balance.
+ *
+ * @param cls the @e cls of this struct with the plugin-specific state
+ * @param session connection to use
+ * @param master_pub master public key of the exchange
+ * @param[out] wire_fee_balance set amount the exchange gained in wire fees
+ * @return #GNUNET_OK on success; #GNUNET_NO if there is no known
+ * record about this exchange; #GNUNET_SYSERR on failure
+ */
+ int
+ (*get_wire_fee_summary)(void *cls,
+ struct TALER_AUDITORDB_Session *session,
+ const struct TALER_MasterPublicKeyP *master_pub,
+ struct TALER_Amount *wire_fee_balance);
+
+
+ /**
* Insert information about a denomination key's balances. There
* must not be an existing record for the denomination key.
*
@@ -577,13 +628,13 @@ struct TALER_AUDITORDB_Plugin
*/
int
(*insert_balance_summary)(void *cls,
- struct TALER_AUDITORDB_Session *session,
- const struct TALER_MasterPublicKeyP *master_pub,
- const struct TALER_Amount *denom_balance,
- const struct TALER_Amount *deposit_fee_balance,
- const struct TALER_Amount *melt_fee_balance,
- const struct TALER_Amount *refund_fee_balance,
- const struct TALER_Amount *risk);
+ struct TALER_AUDITORDB_Session *session,
+ const struct TALER_MasterPublicKeyP *master_pub,
+ const struct TALER_Amount *denom_balance,
+ const struct TALER_Amount *deposit_fee_balance,
+ const struct TALER_Amount *melt_fee_balance,
+ const struct TALER_Amount *refund_fee_balance,
+ const struct TALER_Amount *risk);
/**
@@ -602,13 +653,13 @@ struct TALER_AUDITORDB_Plugin
*/
int
(*update_balance_summary)(void *cls,
- struct TALER_AUDITORDB_Session *session,
- const struct TALER_MasterPublicKeyP *master_pub,
- const struct TALER_Amount *denom_balance,
- const struct TALER_Amount *deposit_fee_balance,
- const struct TALER_Amount *melt_fee_balance,
- const struct TALER_Amount *refund_fee_balance,
- const struct TALER_Amount *risk);
+ struct TALER_AUDITORDB_Session *session,
+ const struct TALER_MasterPublicKeyP *master_pub,
+ const struct TALER_Amount *denom_balance,
+ const struct TALER_Amount *deposit_fee_balance,
+ const struct TALER_Amount *melt_fee_balance,
+ const struct TALER_Amount *refund_fee_balance,
+ const struct TALER_Amount *risk);
/**
@@ -627,13 +678,13 @@ struct TALER_AUDITORDB_Plugin
*/
int
(*get_balance_summary)(void *cls,
- struct TALER_AUDITORDB_Session *session,
- const struct TALER_MasterPublicKeyP *master_pub,
- struct TALER_Amount *denom_balance,
- struct TALER_Amount *deposit_fee_balance,
- struct TALER_Amount *melt_fee_balance,
- struct TALER_Amount *refund_fee_balance,
- struct TALER_Amount *risk);
+ struct TALER_AUDITORDB_Session *session,
+ const struct TALER_MasterPublicKeyP *master_pub,
+ struct TALER_Amount *denom_balance,
+ struct TALER_Amount *deposit_fee_balance,
+ struct TALER_Amount *melt_fee_balance,
+ struct TALER_Amount *refund_fee_balance,
+ struct TALER_Amount *risk);
/**