diff options
| author | tg(x) <*@tg-x.net> | 2016-11-03 13:01:36 +0100 | 
|---|---|---|
| committer | tg(x) <*@tg-x.net> | 2016-11-03 13:01:36 +0100 | 
| commit | 20a8a569ad334174ca251a4cebc995d14bcbdb11 (patch) | |
| tree | 68a2680e39582aa8b30af6ae07368240a07fc584 /src | |
| parent | 443925caa94f3607c0b71061657da5847bf669f2 (diff) | |
auditordb postgres plugin
Diffstat (limited to 'src')
| -rw-r--r-- | src/auditordb/plugin_auditordb_postgres.c | 1720 | ||||
| -rw-r--r-- | src/include/taler_auditordb_plugin.h | 72 | 
2 files changed, 1726 insertions, 66 deletions
| diff --git a/src/auditordb/plugin_auditordb_postgres.c b/src/auditordb/plugin_auditordb_postgres.c index 3205d489..d0cadbb7 100644 --- a/src/auditordb/plugin_auditordb_postgres.c +++ b/src/auditordb/plugin_auditordb_postgres.c @@ -510,13 +510,487 @@ postgres_prepare (PGconn *db_conn)      PQclear (result); result = NULL;                            \    } while (0); -  /* Used in #postgres_XXX() */ -  PREPARE ("test_insert", -           "INSERT INTO test " -           "(test_pub" -           ") VALUES " -           "($1);", +  /* Used in #postgres_insert_denomination_info() */ +  PREPARE ("auditor_denominations_insert", +           "INSERT INTO auditor_denominations " +           "(denom_pub_hash" +           ",master_pub" +           ",valid_from" +           ",expire_withdraw" +           ",expire_deposit" +           ",expire_legal" +           ",coin_val" +           ",coin_frac" +           ",coin_curr" +           ",fee_withdraw_val" +           ",fee_withdraw_frac" +           ",fee_withdraw_curr" +           ",fee_deposit_val" +           ",fee_deposit_frac" +           ",fee_deposit_curr" +           ",fee_refresh_val" +           ",fee_refresh_frac" +           ",fee_refresh_curr" +           ",fee_refund_val" +           ",fee_refund_frac" +           ",fee_refund_curr" +           ") VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16,$17,$18,$19,$20,$21);", +           21, NULL); + +  /* Used in #postgres_insert_denomination_info() */ +  PREPARE ("auditor_denominations_select", +           "SELECT" +           " denom_pub_hash" +           ",valid_from" +           ",expire_withdraw" +           ",expire_deposit" +           ",expire_legal" +           ",coin_val" +           ",coin_frac" +           ",coin_curr" +           ",fee_withdraw_val" +           ",fee_withdraw_frac" +           ",fee_withdraw_curr" +           ",fee_deposit_val" +           ",fee_deposit_frac" +           ",fee_deposit_curr" +           ",fee_refresh_val" +           ",fee_refresh_frac" +           ",fee_refresh_curr" +           ",fee_refund_val" +           ",fee_refund_frac" +           ",fee_refund_curr" +           " FROM auditor_denominations" +           " WHERE master_pub=$1;",             1, NULL); + +  /* Used in #postgres_insert_reserve_info() */ +  PREPARE ("auditor_reserves_insert", +           "INSERT INTO auditor_reserves" +	   "(reserve_pub" +           ",master_pub" +           ",reserve_balance_val" +           ",reserve_balance_frac" +           ",reserve_balance_curr" +           ",withdraw_fee_balance_val" +           ",withdraw_fee_balance_frac" +           ",withdraw_fee_balance_curr" +           ",expiration_date" +	   ",last_reserve_in_serial_id" +           ",last_reserve_out_serial_id)" +           ") VALUES ($1,$2,$3,$4,$5,$7,$8,$9,$10,$11);", +           11, NULL); + +  /* Used in #postgres_update_reserve_info() */ +  PREPARE ("auditor_reserves_update", +           "UPDATE auditor_reserves SET" +           " reserve_balance_val=$1" +           ",reserve_balance_frac=$2" +           ",reserve_balance_curr=$3" +           ",withdraw_fee_balance_val=$4" +           ",withdraw_fee_balance_frac=$5" +           ",withdraw_fee_balance_curr=$6" +           ",expiration_date=$7" +	   ",last_reserve_in_serial_id=$8" +           ",last_reserve_out_serial_id=$9" +           " WHERE reserve_pub=$10 AND master_pub=$11;", +           11, NULL); + +  /* Used in #postgres_get_reserve_info() */ +  PREPARE ("auditor_reserves_select", +           "SELECT" +           " reserve_balance_val" +           ",reserve_balance_frac" +           ",reserve_balance_curr" +           ",withdraw_fee_balance_val" +           ",withdraw_fee_balance_frac" +           ",withdraw_fee_balance_curr" +           ",expiration_date" +	   ",last_reserve_in_serial_id" +           ",last_reserve_out_serial_id" +           " FROM auditor_reserves" +           " WHERE reserve_pub=$1 AND master_pub=$2;", +           2, NULL); + +  /* Used in #postgres_insert_reserve_summary() */ +  PREPARE ("auditor_reserve_balance_insert", +           "INSERT INTO auditor_reserve_balance" +	   "(master_pub" +	   ",reserve_balance_val" +           ",reserve_balance_frac" +           ",reserve_balance_curr" +           ",withdraw_fee_balance_val" +           ",withdraw_fee_balance_frac" +           ",withdraw_fee_balance_curr" +           ") VALUES ($1,$2,$3,$4,$5,$6,$7)", +           7, NULL); + +  /* Used in #postgres_update_reserve_summary() */ +  PREPARE ("auditor_reserve_balance_update", +           "UPDATE auditor_reserve_balance SET" +	   " reserve_balance_val=$1" +           ",reserve_balance_frac=$2" +           ",reserve_balance_curr=$3" +           ",withdraw_fee_balance_val=$4" +           ",withdraw_fee_balance_frac=$5" +           ",withdraw_fee_balance_curr=$6" +           " WHERE master_pub=$7;", +           7, NULL); + +  /* Used in #postgres_get_reserve_summary() */ +  PREPARE ("auditor_reserve_balance_select", +           "SELECT" +	   " reserve_balance_val" +           ",reserve_balance_frac" +           ",reserve_balance_curr" +           ",withdraw_fee_balance_val" +           ",withdraw_fee_balance_frac" +           ",withdraw_fee_balance_curr" +           " FROM auditor_reserve_balance" +           " WHERE master_pub=$1;", +           1, NULL); + +  /* Used in #postgres_insert_denomination_balance() */ +  PREPARE ("denomination_pending_insert", +           "INSERT INTO denomination_pending" +	   "(denom_pub_hash" +           ",denom_balance_val" +           ",denom_balance_frac" +           ",denom_balance_curr" +           ",deposit_fee_balance_val" +           ",deposit_fee_balance_frac" +           ",deposit_fee_balance_curr" +           ",melt_fee_balance_val" +           ",melt_fee_balance_frac" +           ",melt_fee_balance_curr" +           ",refund_fee_balance_val" +           ",refund_fee_balance_frac" +           ",refund_fee_balance_curr" +           ",last_reserve_out_serial_id" +           ",last_deposit_serial_id" +	   ",last_melt_serial_id" +	   ",last_refund_serial_id" +           ") VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,,$11,$12,$13,$14,$15,$16,$17);", +           17, NULL); + +  /* Used in #postgres_update_denomination_balance() */ +  PREPARE ("denomination_pending_update", +           "UPDATE denomination_pending SET" +           " denom_balance_val=$1" +           ",denom_balance_frac=$2" +           ",denom_balance_curr=$3" +           ",deposit_fee_balance_val=$4" +           ",deposit_fee_balance_frac=$5" +           ",deposit_fee_balance_curr=$6" +           ",melt_fee_balance_val=$7" +           ",melt_fee_balance_frac=$8" +           ",melt_fee_balance_curr=$9" +           ",refund_fee_balance_val=$10" +           ",refund_fee_balance_frac=$11" +           ",refund_fee_balance_curr=$12" +           ",last_reserve_out_serial_id=$13" +           ",last_deposit_serial_id=$14" +	   ",last_melt_serial_id=$15" +	   ",last_refund_serial_id=$16" +           " WHERE donom_pub_hash=$17", +           18, NULL); + +  /* Used in #postgres_get_denomination_balance() */ +  PREPARE ("denomination_pending_select", +           "SELECT" +           " denom_balance_val" +           ",denom_balance_frac" +           ",denom_balance_curr" +           ",deposit_fee_balance_val" +           ",deposit_fee_balance_frac" +           ",deposit_fee_balance_curr" +           ",melt_fee_balance_val" +           ",melt_fee_balance_frac" +           ",melt_fee_balance_curr" +           ",refund_fee_balance_val" +           ",refund_fee_balance_frac" +           ",refund_fee_balance_curr" +           ",last_reserve_out_serial_id" +           ",last_deposit_serial_id" +	   ",last_melt_serial_id" +	   ",last_refund_serial_id" +           " FROM denomination_pending" +           " WHERE denom_pub_hash=$1", +           1, NULL); + +  /* Used in #postgres_insert_denomination_balance() */ +  PREPARE ("denomination_pending_insert", +           "INSERT INTO denomination_pending" +	   "(denom_pub_hash" +           ",denom_balance_val" +           ",denom_balance_frac" +           ",denom_balance_curr" +           ",deposit_fee_balance_val" +           ",deposit_fee_balance_frac" +           ",deposit_fee_balance_curr" +           ",melt_fee_balance_val" +           ",melt_fee_balance_frac" +           ",melt_fee_balance_curr" +           ",refund_fee_balance_val" +           ",refund_fee_balance_frac" +           ",refund_fee_balance_curr" +           ",last_reserve_out_serial_id" +           ",last_deposit_serial_id" +	   ",last_melt_serial_id" +	   ",last_refund_serial_id" +           ") VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16,$17);", +           17, NULL); + +  /* Used in #postgres_update_denomination_balance() */ +  PREPARE ("denomination_pending_update", +           "UPDATE denomination_pending SET" +           " denom_balance_val=$1" +           ",denom_balance_frac=$2" +           ",denom_balance_curr=$3" +           ",deposit_fee_balance_val=$4" +           ",deposit_fee_balance_frac=$5" +           ",deposit_fee_balance_curr=$6" +           ",melt_fee_balance_val=$7" +           ",melt_fee_balance_frac=$8" +           ",melt_fee_balance_curr=$9" +           ",refund_fee_balance_val=$10" +           ",refund_fee_balance_frac=$11" +           ",refund_fee_balance_curr=$12" +           ",last_reserve_out_serial_id=$13" +           ",last_deposit_serial_id=$14" +	   ",last_melt_serial_id=$15" +	   ",last_refund_serial_id=$16" +           " WHERE denom_pub_hash=$17;", +           17, NULL); + +  /* Used in #postgres_insert_denomination_balance() */ +  PREPARE ("denomination_pending_select", +           "SELECT" +           " denom_balance_val" +           ",denom_balance_frac" +           ",denom_balance_curr" +           ",deposit_fee_balance_val" +           ",deposit_fee_balance_frac" +           ",deposit_fee_balance_curr" +           ",melt_fee_balance_val" +           ",melt_fee_balance_frac" +           ",melt_fee_balance_curr" +           ",refund_fee_balance_val" +           ",refund_fee_balance_frac" +           ",refund_fee_balance_curr" +           ",last_reserve_out_serial_id" +           ",last_deposit_serial_id" +	   ",last_melt_serial_id" +	   ",last_refund_serial_id" +           " FROM  denomination_pending" +           " WHERE denom_pub_hash=$1", +           1, NULL); + +  /* Used in #postgres_insert_denomination_summary() */ +  PREPARE ("total_liabilities_insert", +           "INSERT INTO total_liabilities" +	   "(master_pub" +	   ",denom_balance_val" +           ",denom_balance_frac" +           ",denom_balance_curr" +           ",deposit_fee_balance_val" +           ",deposit_fee_balance_frac" +           ",deposit_fee_balance_curr" +           ",melt_fee_balance_val" +           ",melt_fee_balance_frac" +           ",melt_fee_balance_curr" +           ",refund_fee_balance_val" +           ",refund_fee_balance_frac" +           ",refund_fee_balance_curr" +           ") VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13);", +           13, NULL); + +  /* Used in #postgres_update_denomination_summary() */ +  PREPARE ("total_liabilities_update", +           "UPDATE total_liabilities SET" +	   " denom_balance_val=$1" +           ",denom_balance_frac=$2" +           ",denom_balance_curr=$3" +           ",deposit_fee_balance_val=$4" +           ",deposit_fee_balance_frac=$5" +           ",deposit_fee_balance_curr=$6" +           ",melt_fee_balance_val=$7" +           ",melt_fee_balance_frac=$8" +           ",melt_fee_balance_curr=$9" +           ",refund_fee_balance_val=$10" +           ",refund_fee_balance_frac=$11" +           ",refund_fee_balance_curr=$12" +           " WHERE master_pub=$14;", +           13, NULL); + +  /* Used in #postgres_get_denomination_summary() */ +  PREPARE ("total_liabilities_select", +           "SELECT" +	   " denom_balance_val" +           ",denom_balance_frac" +           ",denom_balance_curr" +           ",deposit_fee_balance_val" +           ",deposit_fee_balance_frac" +           ",deposit_fee_balance_curr" +           ",melt_fee_balance_val" +           ",melt_fee_balance_frac" +           ",melt_fee_balance_curr" +           ",refund_fee_balance_val" +           ",refund_fee_balance_frac" +           ",refund_fee_balance_curr" +           " FROM total_liabilities" +           " WHERE master_pub=$1;", +           1, NULL); + +  /* Used in #postgres_insert_risk_summary() */ +  PREPARE ("total_risk_insert", +           "INSERT INTO total_risk" +	   "(master_pub" +	   ",risk_val" +           ",risk_frac" +           ",risk_curr" +           ") VALUES ($1,$2,$3,$4);", +           4, NULL); + +  /* Used in #postgres_update_risk_summary() */ +  PREPARE ("total_risk_select", +           "UPDATE total_risk SET " +	   " risk_val=$1" +           ",risk_frac=$2" +           ",risk_curr=$3" +           " WHERE master_pub=$4;", +           4, NULL); + +  /* Used in #postgres_get_risk_summary() */ +  PREPARE ("total_risk_select", +           "SELECT" +	   " risk_val" +           ",risk_frac" +           ",risk_curr" +           " FROM  total_risk" +           " WHERE master_pub=$1;", +           1, NULL); + + +  /* Used in #postgres_insert_historic_denom_revenue() */ +  PREPARE ("historic_denomination_revenue_insert", +           "INSERT INTO historic_denomination_revenue" +	   "(master_pub" +	   ",denom_pub_hash" +	   ",revenue_timestamp" +	   ",revenue_balance_val" +           ",revenue_balance_frac" +           ",revenue_balance_curr" +           ",deposit_fee_balance_val" +           ",deposit_fee_balance_frac" +           ",deposit_fee_balance_curr" +           ",melt_fee_balance_val" +           ",melt_fee_balance_frac" +           ",melt_fee_balance_curr" +           ",refund_fee_balance_val" +           ",refund_fee_balance_frac" +           ",refund_fee_balance_curr" +           ") VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,,$11,$12,$13,$14,$15);", +           15, NULL); + +  /* Used in #postgres_select_historic_denom_revenue() */ +  PREPARE ("historic_denomination_revenue_select", +           "SELECT" +	   " denom_pub_hash" +	   ",revenue_timestamp" +	   ",revenue_balance_val" +           ",revenue_balance_frac" +           ",revenue_balance_curr" +           ",deposit_fee_balance_val" +           ",deposit_fee_balance_frac" +           ",deposit_fee_balance_curr" +           ",melt_fee_balance_val" +           ",melt_fee_balance_frac" +           ",melt_fee_balance_curr" +           ",refund_fee_balance_val" +           ",refund_fee_balance_frac" +           ",refund_fee_balance_curr" +           " FROM historic_denomination_revenue" +           " WHERE master_pub=$1;", +           1, NULL); + +  /* Used in #postgres_insert_historic_losses() */ +  PREPARE ("historic_losses_insert", +           "INSERT INTO historic_losses" +	   "(master_pub" +	   ",denom_pub_hash" +	   ",loss_timestamp" +	   ",loss_balance_val" +           ",loss_balance_frac" +           ",loss_balance_curr" +           ") VALUES ($1,$2,$3,$4,$5,$6);", +           6, NULL); + +  /* Used in #postgres_select_historic_losses() */ +  PREPARE ("historic_losses_select", +           "SELECT" +	   " denom_pub_hash" +	   ",loss_timestamp" +	   ",loss_balance_val" +           ",loss_balance_frac" +           ",loss_balance_curr" +           " FROM historic_losses" +           " WHERE master_pub=$1;", +           1, NULL); + +  /* Used in #postgres_insert_historic_reserve_revenue() */ +  PREPARE ("historic_reserve_summary_insert", +           "INSERT INTO historic_reserve_summary" +	   "(master_pub" +	   ",start_date" +	   ",end_date" +	   ",reserve_profits_val" +           ",reserve_profits_frac" +           ",reserve_profits_curr" +           ") VALUES ($1,$2,$3,$4,$5,$6);", +           6, NULL); + +  /* Used in #postgres_select_historic_reserve_revenue() */ +  PREPARE ("historic_reserve_summary_select", +           "SELECT" +	   " start_date" +	   ",end_date" +	   ",reserve_profits_val" +           ",reserve_profits_frac" +           ",reserve_profits_curr" +           " FROM historic_reserve_summary" +           " WHERE master_pub=$1;", +           1, NULL); + +  /* Used in #postgres_insert_predicted_result() */ +  PREPARE ("predicted_result_insert", +           "INSERT INTO predicted_result" +	   "(master_pub" +	   ",balance_val" +           ",balance_frac" +           ",balance_curr" +           ") VALUES ($1,$2,$3,$4);", +           4, NULL); + +  /* Used in #postgres_update_predicted_result() */ +  PREPARE ("predicted_result_update", +           "UPDATE predicted_result SET" +	   ",balance_val=$1" +           ",balance_frac=$2" +           ",balance_curr=$3" +           " WHERE master_pub=$4;", +           4, NULL); + +  /* Used in #postgres_get_predicted_balance() */ +  PREPARE ("predicted_result_select", +           "SELECT" +	   " balance_val" +           ",balance_frac" +           ",balance_curr" +           " FROM predicted_result" +           " WHERE master_pub=$1;", +           1, NULL); +    return GNUNET_OK;  #undef PREPARE  } @@ -743,8 +1217,69 @@ postgres_insert_denomination_info (void *cls,                                     struct TALER_AUDITORDB_Session *session,                                     const struct TALER_DenominationKeyValidityPS *issue)  { -  GNUNET_break (0); // FIXME: not implemented -  return GNUNET_SYSERR; +  PGresult *result; +  int ret; + +  struct GNUNET_PQ_QueryParam params[] = { +    GNUNET_PQ_query_param_auto_from_type (&issue->denom_hash), +    GNUNET_PQ_query_param_auto_from_type (&issue->master), + +    GNUNET_PQ_query_param_auto_from_type (&issue->start), +    GNUNET_PQ_query_param_auto_from_type (&issue->expire_withdraw), +    GNUNET_PQ_query_param_auto_from_type (&issue->expire_deposit), +    GNUNET_PQ_query_param_auto_from_type (&issue->expire_legal), + +    GNUNET_PQ_query_param_uint64 (&issue->value.value), +    GNUNET_PQ_query_param_uint32 (&issue->value.fraction), +    GNUNET_PQ_query_param_auto_from_type (&issue->value.currency), + +    GNUNET_PQ_query_param_uint64 (&issue->fee_withdraw.value), +    GNUNET_PQ_query_param_uint32 (&issue->fee_withdraw.fraction), +    GNUNET_PQ_query_param_auto_from_type (&issue->fee_withdraw.currency), + +    GNUNET_PQ_query_param_uint64 (&issue->fee_deposit.value), +    GNUNET_PQ_query_param_uint32 (&issue->fee_deposit.fraction), +    GNUNET_PQ_query_param_auto_from_type (&issue->fee_deposit.currency), + +    GNUNET_PQ_query_param_uint64 (&issue->fee_refresh.value), +    GNUNET_PQ_query_param_uint32 (&issue->fee_refresh.fraction), +    GNUNET_PQ_query_param_auto_from_type (&issue->fee_refresh.currency), + +    GNUNET_PQ_query_param_uint64 (&issue->fee_refund.value), +    GNUNET_PQ_query_param_uint32 (&issue->fee_refund.fraction), +    GNUNET_PQ_query_param_auto_from_type (&issue->fee_refund.currency), + +    GNUNET_PQ_query_param_end +  }; + +  /* check fees match coin currency */ +  GNUNET_assert (GNUNET_YES == +                 TALER_amount_cmp_currency_nbo (&issue->value, +                                                &issue->fee_withdraw)); +  GNUNET_assert (GNUNET_YES == +                 TALER_amount_cmp_currency_nbo (&issue->value, +                                                &issue->fee_deposit)); +  GNUNET_assert (GNUNET_YES == +                 TALER_amount_cmp_currency_nbo (&issue->value, +                                                &issue->fee_refresh)); +  GNUNET_assert (GNUNET_YES == +                 TALER_amount_cmp_currency_nbo (&issue->value, +                                               &issue->fee_refund)); + +  result = GNUNET_PQ_exec_prepared (session->conn, +                                   "auditor_denominations_insert", +                                   params); +  if (PGRES_COMMAND_OK != PQresultStatus (result)) +  { +    ret = GNUNET_SYSERR; +    BREAK_DB_ERR (result); +  } +  else +  { +    ret = GNUNET_OK; +  } +  PQclear (result); +  return ret;  } @@ -762,11 +1297,80 @@ static int  postgres_select_denomination_info (void *cls,                                     struct TALER_AUDITORDB_Session *session,                                     const struct TALER_MasterPublicKeyP *master_pub, -                                   void *cb, /* FIXME: type! */ +                                   TALER_AUDITORDB_DenominationInfoDataCallback cb,                                     void *cb_cls)  { -  GNUNET_break (0); // FIXME: not implemented -  return GNUNET_SYSERR; +  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_denominations_select", +                                    params); +  if (PGRES_TUPLES_OK != +      PQresultStatus (result)) +  { +    BREAK_DB_ERR (result); +    PQclear (result); +    return GNUNET_SYSERR; +  } + +  int nrows = PQntuples (result); +  if (0 == nrows) +  { +    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, +                "postgres_select_denomination_info() returned 0 matching rows\n"); +    PQclear (result); +    return GNUNET_NO; +  } +  for (int i = 0; i < nrows; i++) +  { +    struct TALER_DenominationKeyValidityPS issue; + +    struct GNUNET_PQ_ResultSpec rs[] = { +      GNUNET_PQ_result_spec_auto_from_type ("denom_pub_hash", &issue.denom_hash), + +      GNUNET_PQ_result_spec_auto_from_type ("valid_from", &issue.start), +      GNUNET_PQ_result_spec_auto_from_type ("expire_withdraw", &issue.expire_withdraw), +      GNUNET_PQ_result_spec_auto_from_type ("expire_deposit", &issue.expire_deposit), +      GNUNET_PQ_result_spec_auto_from_type ("expire_legal", &issue.expire_legal), + +      GNUNET_PQ_result_spec_uint64 ("coin_val", &issue.value.value), +      GNUNET_PQ_result_spec_uint32 ("coin_frac", &issue.value.fraction), +      GNUNET_PQ_result_spec_auto_from_type ("coin_curr", &issue.value.currency), + +      GNUNET_PQ_result_spec_uint64 ("fee_withdraw_val", &issue.fee_withdraw.value), +      GNUNET_PQ_result_spec_uint32 ("fee_withdraw_frac", &issue.fee_withdraw.fraction), +      GNUNET_PQ_result_spec_auto_from_type ("fee_withdraw_curr", &issue.fee_withdraw.currency), + +      GNUNET_PQ_result_spec_uint64 ("fee_deposit_val", &issue.fee_deposit.value), +      GNUNET_PQ_result_spec_uint32 ("fee_deposit_frac",&issue.fee_deposit.fraction), +      GNUNET_PQ_result_spec_auto_from_type ("fee_deposit_curr", &issue.fee_deposit.currency), + +      GNUNET_PQ_result_spec_uint64 ("fee_refresh_val", &issue.fee_refresh.value), +      GNUNET_PQ_result_spec_uint32 ("fee_refresh_frac", &issue.fee_refresh.fraction), +      GNUNET_PQ_result_spec_auto_from_type ("fee_refresh_curr", &issue.fee_refresh.currency), + +      GNUNET_PQ_result_spec_uint64 ("fee_refund_val", &issue.fee_refund.value), +      GNUNET_PQ_result_spec_uint32 ("fee_refund_frac", &issue.fee_refund.fraction), +      GNUNET_PQ_result_spec_auto_from_type ("fee_refund_curr", &issue.fee_refund.currency), + +      GNUNET_PQ_result_spec_end +    }; +    if (GNUNET_OK != +        GNUNET_PQ_extract_result (result, rs, 0)) +    { +      GNUNET_break (0); +      PQclear (result); +      return GNUNET_SYSERR; +    } +    cb (cb_cls, +        &issue); +  } +  PQclear (result); +  return GNUNET_OK;  } @@ -799,8 +1403,47 @@ postgres_insert_reserve_info (void *cls,                                uint64_t last_reserve_in_serial_id,                                uint64_t last_reserve_out_serial_id)  { -  GNUNET_break (0); // FIXME: not implemented -  return GNUNET_SYSERR; +  PGresult *result; +  int ret; + +  struct GNUNET_PQ_QueryParam params[] = { +    GNUNET_PQ_query_param_auto_from_type (reserve_pub), +    GNUNET_PQ_query_param_auto_from_type (master_pub), + +    GNUNET_PQ_query_param_uint64 (&reserve_balance->value), +    GNUNET_PQ_query_param_uint32 (&reserve_balance->fraction), +    GNUNET_PQ_query_param_auto_from_type (&reserve_balance->currency), + +    GNUNET_PQ_query_param_uint64 (&withdraw_fee_balance->value), +    GNUNET_PQ_query_param_uint32 (&withdraw_fee_balance->fraction), +    GNUNET_PQ_query_param_auto_from_type (&withdraw_fee_balance->currency), + +    GNUNET_PQ_query_param_auto_from_type (&expiration_date), + +    GNUNET_PQ_query_param_uint64 (&last_reserve_in_serial_id), +    GNUNET_PQ_query_param_uint64 (&last_reserve_out_serial_id), + +    GNUNET_PQ_query_param_end +  }; + +  GNUNET_assert (GNUNET_YES == +                 TALER_amount_cmp_currency (reserve_balance, +                                            withdraw_fee_balance)); + +  result = GNUNET_PQ_exec_prepared (session->conn, +                                   "auditor_reserves_insert", +                                   params); +  if (PGRES_COMMAND_OK != PQresultStatus (result)) +  { +    ret = GNUNET_SYSERR; +    BREAK_DB_ERR (result); +  } +  else +  { +    ret = GNUNET_OK; +  } +  PQclear (result); +  return ret;  } @@ -833,8 +1476,47 @@ postgres_update_reserve_info (void *cls,                                uint64_t last_reserve_in_serial_id,                                uint64_t last_reserve_out_serial_id)  { -  GNUNET_break (0); // FIXME: not implemented -  return GNUNET_SYSERR; +  PGresult *result; +  int ret; + +  struct GNUNET_PQ_QueryParam params[] = { +    GNUNET_PQ_query_param_uint64 (&reserve_balance->value), +    GNUNET_PQ_query_param_uint32 (&reserve_balance->fraction), +    GNUNET_PQ_query_param_auto_from_type (&reserve_balance->currency), + +    GNUNET_PQ_query_param_uint64 (&withdraw_fee_balance->value), +    GNUNET_PQ_query_param_uint32 (&withdraw_fee_balance->fraction), +    GNUNET_PQ_query_param_auto_from_type (&withdraw_fee_balance->currency), + +    GNUNET_PQ_query_param_auto_from_type (&expiration_date), + +    GNUNET_PQ_query_param_uint64 (&last_reserve_in_serial_id), +    GNUNET_PQ_query_param_uint64 (&last_reserve_out_serial_id), + +    GNUNET_PQ_query_param_auto_from_type (reserve_pub), +    GNUNET_PQ_query_param_auto_from_type (master_pub), + +    GNUNET_PQ_query_param_end +  }; + +  GNUNET_assert (GNUNET_YES == +                 TALER_amount_cmp_currency (reserve_balance, +                                            withdraw_fee_balance)); + +  result = GNUNET_PQ_exec_prepared (session->conn, +                                   "auditor_reserves_update", +                                   params); +  if (PGRES_COMMAND_OK != PQresultStatus (result)) +  { +    ret = GNUNET_SYSERR; +    BREAK_DB_ERR (result); +  } +  else +  { +    ret = GNUNET_OK; +  } +  PQclear (result); +  return ret;  } @@ -867,8 +1549,59 @@ postgres_get_reserve_info (void *cls,                             uint64_t *last_reserve_in_serial_id,                             uint64_t *last_reserve_out_serial_id)  { -  GNUNET_break (0); // FIXME: not implemented -  return GNUNET_SYSERR; +  struct GNUNET_PQ_QueryParam params[] = { +    GNUNET_PQ_query_param_auto_from_type (reserve_pub), +    GNUNET_PQ_query_param_auto_from_type (master_pub), + +    GNUNET_PQ_query_param_end +  }; +  PGresult *result; +  result = GNUNET_PQ_exec_prepared (session->conn, +                                    "auditor_reserves_select", +                                    params); +  if (PGRES_TUPLES_OK != +      PQresultStatus (result)) +  { +    BREAK_DB_ERR (result); +    PQclear (result); +    return GNUNET_SYSERR; +  } + +  int nrows = PQntuples (result); +  if (0 == nrows) +  { +    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, +                "postgres_get_reserve_info() returned 0 matching rows\n"); +    PQclear (result); +    return GNUNET_NO; +  } +  GNUNET_assert (1 == nrows); + +  struct GNUNET_PQ_ResultSpec rs[] = { +    GNUNET_PQ_result_spec_uint64 ("reserve_balance_val", &reserve_balance->value), +    GNUNET_PQ_result_spec_uint32 ("reserve_balance_frac", &reserve_balance->fraction), +    GNUNET_PQ_result_spec_auto_from_type ("reserve_balance_curr", &reserve_balance->currency), + +    GNUNET_PQ_result_spec_uint64 ("withdraw_fee_balance_val", &withdraw_fee_balance->value), +    GNUNET_PQ_result_spec_uint32 ("withdraw_fee_balance_frac", &withdraw_fee_balance->fraction), +    GNUNET_PQ_result_spec_auto_from_type ("withdraw_fee_balance_curr", &withdraw_fee_balance->currency), + +    GNUNET_PQ_result_spec_auto_from_type ("expiration_date", expiration_date), + +    GNUNET_PQ_result_spec_uint64 ("last_reserve_in_serial_id", last_reserve_in_serial_id), +    GNUNET_PQ_result_spec_uint64 ("last_reserve_out_serial_id", last_reserve_out_serial_id), + +    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;  } @@ -891,8 +1624,41 @@ postgres_insert_reserve_summary (void *cls,                                   const struct TALER_Amount *reserve_balance,                                   const struct TALER_Amount *withdraw_fee_balance)  { -  GNUNET_break (0); // FIXME: not implemented -  return GNUNET_SYSERR; +  PGresult *result; +  int ret; + +  struct GNUNET_PQ_QueryParam params[] = { +    GNUNET_PQ_query_param_auto_from_type (master_pub), + +    GNUNET_PQ_query_param_uint64 (&reserve_balance->value), +    GNUNET_PQ_query_param_uint32 (&reserve_balance->fraction), +    GNUNET_PQ_query_param_auto_from_type (&reserve_balance->currency), + +    GNUNET_PQ_query_param_uint64 (&withdraw_fee_balance->value), +    GNUNET_PQ_query_param_uint32 (&withdraw_fee_balance->fraction), +    GNUNET_PQ_query_param_auto_from_type (&withdraw_fee_balance->currency), + +    GNUNET_PQ_query_param_end +  }; + +  GNUNET_assert (GNUNET_YES == +                 TALER_amount_cmp_currency (reserve_balance, +                                            withdraw_fee_balance)); + +  result = GNUNET_PQ_exec_prepared (session->conn, +                                   "auditor_reserve_balance_insert", +                                   params); +  if (PGRES_COMMAND_OK != PQresultStatus (result)) +  { +    ret = GNUNET_SYSERR; +    BREAK_DB_ERR (result); +  } +  else +  { +    ret = GNUNET_OK; +  } +  PQclear (result); +  return ret;  } @@ -915,8 +1681,37 @@ postgres_update_reserve_summary (void *cls,                                   const struct TALER_Amount *reserve_balance,                                   const struct TALER_Amount *withdraw_fee_balance)  { -  GNUNET_break (0); // FIXME: not implemented -  return GNUNET_SYSERR; +  PGresult *result; +  int ret; + +  struct GNUNET_PQ_QueryParam params[] = { +    GNUNET_PQ_query_param_uint64 (&reserve_balance->value), +    GNUNET_PQ_query_param_uint32 (&reserve_balance->fraction), +    GNUNET_PQ_query_param_auto_from_type (&reserve_balance->currency), + +    GNUNET_PQ_query_param_uint64 (&withdraw_fee_balance->value), +    GNUNET_PQ_query_param_uint32 (&withdraw_fee_balance->fraction), +    GNUNET_PQ_query_param_auto_from_type (&withdraw_fee_balance->currency), + +    GNUNET_PQ_query_param_auto_from_type (master_pub), + +    GNUNET_PQ_query_param_end +  }; + +  result = GNUNET_PQ_exec_prepared (session->conn, +                                   "auditor_reserve_balance_update", +                                   params); +  if (PGRES_COMMAND_OK != PQresultStatus (result)) +  { +    ret = GNUNET_SYSERR; +    BREAK_DB_ERR (result); +  } +  else +  { +    ret = GNUNET_OK; +  } +  PQclear (result); +  return ret;  } @@ -939,8 +1734,53 @@ postgres_get_reserve_summary (void *cls,                                struct TALER_Amount *reserve_balance,                                struct TALER_Amount *withdraw_fee_balance)  { -  GNUNET_break (0); // FIXME: not implemented -  return GNUNET_SYSERR; +  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_reserve_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) +  { +    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, +                "postgres_get_reserve_summary() returned 0 matching rows\n"); +    PQclear (result); +    return GNUNET_NO; +  } +  GNUNET_assert (1 == nrows); + +  struct GNUNET_PQ_ResultSpec rs[] = { +    GNUNET_PQ_result_spec_uint64 ("reserve_balance_val", &reserve_balance->value), +    GNUNET_PQ_result_spec_uint32 ("reserve_balance_frac", &reserve_balance->fraction), +    GNUNET_PQ_result_spec_auto_from_type ("reserve_balance_curr", &reserve_balance->currency), + +    GNUNET_PQ_result_spec_uint64 ("withdraw_fee_balance_val", &withdraw_fee_balance->value), +    GNUNET_PQ_result_spec_uint32 ("withdraw_fee_balance_frac", &withdraw_fee_balance->fraction), +    GNUNET_PQ_result_spec_auto_from_type ("withdraw_fee_balance_curr", &withdraw_fee_balance->currency), + +    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;  } @@ -978,8 +1818,62 @@ postgres_insert_denomination_balance (void *cls,                                        uint64_t last_melt_serial_id,                                        uint64_t last_refund_serial_id)  { -  GNUNET_break (0); // FIXME: not implemented -  return GNUNET_SYSERR; +  PGresult *result; +  int ret; + +  struct GNUNET_PQ_QueryParam params[] = { +    GNUNET_PQ_query_param_auto_from_type (denom_pub_hash), + +    GNUNET_PQ_query_param_uint64 (&denom_balance->value), +    GNUNET_PQ_query_param_uint32 (&denom_balance->fraction), +    GNUNET_PQ_query_param_auto_from_type (&denom_balance->currency), + +    GNUNET_PQ_query_param_uint64 (&deposit_fee_balance->value), +    GNUNET_PQ_query_param_uint32 (&deposit_fee_balance->fraction), +    GNUNET_PQ_query_param_auto_from_type (&deposit_fee_balance->currency), + +    GNUNET_PQ_query_param_uint64 (&melt_fee_balance->value), +    GNUNET_PQ_query_param_uint32 (&melt_fee_balance->fraction), +    GNUNET_PQ_query_param_auto_from_type (&melt_fee_balance->currency), + +    GNUNET_PQ_query_param_uint64 (&refund_fee_balance->value), +    GNUNET_PQ_query_param_uint32 (&refund_fee_balance->fraction), +    GNUNET_PQ_query_param_auto_from_type (&refund_fee_balance->currency), + +    GNUNET_PQ_query_param_uint64 (&last_reserve_out_serial_id), +    GNUNET_PQ_query_param_uint64 (&last_deposit_serial_id), +    GNUNET_PQ_query_param_uint64 (&last_melt_serial_id), +    GNUNET_PQ_query_param_uint64 (&last_refund_serial_id), + +    GNUNET_PQ_query_param_end +  }; + +  GNUNET_assert (GNUNET_YES == +                 TALER_amount_cmp_currency (denom_balance, +                                            deposit_fee_balance)); + +  GNUNET_assert (GNUNET_YES == +                 TALER_amount_cmp_currency (denom_balance, +                                            melt_fee_balance)); + +  GNUNET_assert (GNUNET_YES == +                 TALER_amount_cmp_currency (denom_balance, +                                            refund_fee_balance)); + +  result = GNUNET_PQ_exec_prepared (session->conn, +                                   "denomination_pending_insert", +                                   params); +  if (PGRES_COMMAND_OK != PQresultStatus (result)) +  { +    ret = GNUNET_SYSERR; +    BREAK_DB_ERR (result); +  } +  else +  { +    ret = GNUNET_OK; +  } +  PQclear (result); +  return ret;  } @@ -1017,8 +1911,50 @@ postgres_update_denomination_balance (void *cls,                                        uint64_t last_melt_serial_id,                                        uint64_t last_refund_serial_id)  { -  GNUNET_break (0); // FIXME: not implemented -  return GNUNET_SYSERR; +  PGresult *result; +  int ret; + +  struct GNUNET_PQ_QueryParam params[] = { +    GNUNET_PQ_query_param_uint64 (&denom_balance->value), +    GNUNET_PQ_query_param_uint32 (&denom_balance->fraction), +    GNUNET_PQ_query_param_auto_from_type (&denom_balance->currency), + +    GNUNET_PQ_query_param_uint64 (&deposit_fee_balance->value), +    GNUNET_PQ_query_param_uint32 (&deposit_fee_balance->fraction), +    GNUNET_PQ_query_param_auto_from_type (&deposit_fee_balance->currency), + +    GNUNET_PQ_query_param_uint64 (&melt_fee_balance->value), +    GNUNET_PQ_query_param_uint32 (&melt_fee_balance->fraction), +    GNUNET_PQ_query_param_auto_from_type (&melt_fee_balance->currency), + +    GNUNET_PQ_query_param_uint64 (&refund_fee_balance->value), +    GNUNET_PQ_query_param_uint32 (&refund_fee_balance->fraction), +    GNUNET_PQ_query_param_auto_from_type (&refund_fee_balance->currency), + +    GNUNET_PQ_query_param_uint64 (&last_reserve_out_serial_id), +    GNUNET_PQ_query_param_uint64 (&last_deposit_serial_id), +    GNUNET_PQ_query_param_uint64 (&last_melt_serial_id), +    GNUNET_PQ_query_param_uint64 (&last_refund_serial_id), + +    GNUNET_PQ_query_param_auto_from_type (denom_pub_hash), + +    GNUNET_PQ_query_param_end +  }; + +  result = GNUNET_PQ_exec_prepared (session->conn, +                                   "denomination_pending_update", +                                   params); +  if (PGRES_COMMAND_OK != PQresultStatus (result)) +  { +    ret = GNUNET_SYSERR; +    BREAK_DB_ERR (result); +  } +  else +  { +    ret = GNUNET_OK; +  } +  PQclear (result); +  return ret;  } @@ -1055,8 +1991,66 @@ postgres_get_denomination_balance (void *cls,                                     uint64_t *last_melt_serial_id,                                     uint64_t *last_refund_serial_id)  { -  GNUNET_break (0); // FIXME: not implemented -  return GNUNET_SYSERR; +  struct GNUNET_PQ_QueryParam params[] = { +    GNUNET_PQ_query_param_auto_from_type (denom_pub_hash), + +    GNUNET_PQ_query_param_end +  }; +  PGresult *result; +  result = GNUNET_PQ_exec_prepared (session->conn, +                                    "denomination_pending_select", +                                    params); +  if (PGRES_TUPLES_OK != +      PQresultStatus (result)) +  { +    BREAK_DB_ERR (result); +    PQclear (result); +    return GNUNET_SYSERR; +  } + +  int nrows = PQntuples (result); +  if (0 == nrows) +  { +    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, +                "postgres_get_denomination_balance() returned 0 matching rows\n"); +    PQclear (result); +    return GNUNET_NO; +  } +  GNUNET_assert (1 == nrows); + +  struct GNUNET_PQ_ResultSpec rs[] = { +    GNUNET_PQ_result_spec_uint64 ("denom_balance_val", &denom_balance->value), +    GNUNET_PQ_result_spec_uint32 ("denom_balance_frac", &denom_balance->fraction), +    GNUNET_PQ_result_spec_auto_from_type ("denom_balance_curr", &denom_balance->currency), + +    GNUNET_PQ_result_spec_uint64 ("deposit_fee_balance_val", &deposit_fee_balance->value), +    GNUNET_PQ_result_spec_uint32 ("deposit_fee_balance_frac", &deposit_fee_balance->fraction), +    GNUNET_PQ_result_spec_auto_from_type ("deposit_fee_balance_curr", &deposit_fee_balance->currency), + +    GNUNET_PQ_result_spec_uint64 ("melt_fee_balance_val", &melt_fee_balance->value), +    GNUNET_PQ_result_spec_uint32 ("melt_fee_balance_frac", &melt_fee_balance->fraction), +    GNUNET_PQ_result_spec_auto_from_type ("melt_fee_balance_curr", &melt_fee_balance->currency), + +    GNUNET_PQ_result_spec_uint64 ("refund_fee_balance_val", &refund_fee_balance->value), +    GNUNET_PQ_result_spec_uint32 ("refund_fee_balance_frac", &refund_fee_balance->fraction), +    GNUNET_PQ_result_spec_auto_from_type ("refund_fee_balance_curr", &refund_fee_balance->currency), + +    GNUNET_PQ_result_spec_uint64 ("last_reserve_out_serial_id", last_reserve_out_serial_id), +    GNUNET_PQ_result_spec_uint64 ("last_deposit_serial_id", last_deposit_serial_id), +    GNUNET_PQ_result_spec_uint64 ("last_melt_serial_id", last_melt_serial_id), +    GNUNET_PQ_result_spec_uint64 ("last_refund_serial_id", last_refund_serial_id), + +    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;  } @@ -1082,8 +2076,57 @@ postgres_insert_denomination_summary (void *cls,                                        const struct TALER_Amount *melt_fee_balance,                                        const struct TALER_Amount *refund_fee_balance)  { -  GNUNET_break (0); // FIXME: not implemented -  return GNUNET_SYSERR; +  PGresult *result; +  int ret; + +  struct GNUNET_PQ_QueryParam params[] = { +    GNUNET_PQ_query_param_auto_from_type (master_pub), + +    GNUNET_PQ_query_param_uint64 (&denom_balance->value), +    GNUNET_PQ_query_param_uint32 (&denom_balance->fraction), +    GNUNET_PQ_query_param_auto_from_type (&denom_balance->currency), + +    GNUNET_PQ_query_param_uint64 (&deposit_fee_balance->value), +    GNUNET_PQ_query_param_uint32 (&deposit_fee_balance->fraction), +    GNUNET_PQ_query_param_auto_from_type (&deposit_fee_balance->currency), + +    GNUNET_PQ_query_param_uint64 (&melt_fee_balance->value), +    GNUNET_PQ_query_param_uint32 (&melt_fee_balance->fraction), +    GNUNET_PQ_query_param_auto_from_type (&melt_fee_balance->currency), + +    GNUNET_PQ_query_param_uint64 (&refund_fee_balance->value), +    GNUNET_PQ_query_param_uint32 (&refund_fee_balance->fraction), +    GNUNET_PQ_query_param_auto_from_type (&refund_fee_balance->currency), + +    GNUNET_PQ_query_param_end +  }; + +  GNUNET_assert (GNUNET_YES == +                 TALER_amount_cmp_currency (denom_balance, +                                            deposit_fee_balance)); + +  GNUNET_assert (GNUNET_YES == +                 TALER_amount_cmp_currency (denom_balance, +                                            melt_fee_balance)); + +  GNUNET_assert (GNUNET_YES == +                 TALER_amount_cmp_currency (denom_balance, +                                            refund_fee_balance)); + +  result = GNUNET_PQ_exec_prepared (session->conn, +                                   "total_liabilities_insert", +                                   params); +  if (PGRES_COMMAND_OK != PQresultStatus (result)) +  { +    ret = GNUNET_SYSERR; +    BREAK_DB_ERR (result); +  } +  else +  { +    ret = GNUNET_OK; +  } +  PQclear (result); +  return ret;  } @@ -1109,8 +2152,45 @@ postgres_update_denomination_summary (void *cls,                                        const struct TALER_Amount *melt_fee_balance,                                        const struct TALER_Amount *refund_fee_balance)  { -  GNUNET_break (0); // FIXME: not implemented -  return GNUNET_SYSERR; +  PGresult *result; +  int ret; + +  struct GNUNET_PQ_QueryParam params[] = { +    GNUNET_PQ_query_param_uint64 (&denom_balance->value), +    GNUNET_PQ_query_param_uint32 (&denom_balance->fraction), +    GNUNET_PQ_query_param_auto_from_type (&denom_balance->currency), + +    GNUNET_PQ_query_param_uint64 (&deposit_fee_balance->value), +    GNUNET_PQ_query_param_uint32 (&deposit_fee_balance->fraction), +    GNUNET_PQ_query_param_auto_from_type (&deposit_fee_balance->currency), + +    GNUNET_PQ_query_param_uint64 (&melt_fee_balance->value), +    GNUNET_PQ_query_param_uint32 (&melt_fee_balance->fraction), +    GNUNET_PQ_query_param_auto_from_type (&melt_fee_balance->currency), + +    GNUNET_PQ_query_param_uint64 (&refund_fee_balance->value), +    GNUNET_PQ_query_param_uint32 (&refund_fee_balance->fraction), +    GNUNET_PQ_query_param_auto_from_type (&refund_fee_balance->currency), + +    GNUNET_PQ_query_param_auto_from_type (master_pub), + +    GNUNET_PQ_query_param_end +  }; + +  result = GNUNET_PQ_exec_prepared (session->conn, +                                   "total_liabilities_update", +                                   params); +  if (PGRES_COMMAND_OK != PQresultStatus (result)) +  { +    ret = GNUNET_SYSERR; +    BREAK_DB_ERR (result); +  } +  else +  { +    ret = GNUNET_OK; +  } +  PQclear (result); +  return ret;  } @@ -1136,8 +2216,61 @@ postgres_get_denomination_summary (void *cls,                                     struct TALER_Amount *melt_fee_balance,                                     struct TALER_Amount *refund_fee_balance)  { -  GNUNET_break (0); // FIXME: not implemented -  return GNUNET_SYSERR; +  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, +                                    "total_liabilities_select", +                                    params); +  if (PGRES_TUPLES_OK != +      PQresultStatus (result)) +  { +    BREAK_DB_ERR (result); +    PQclear (result); +    return GNUNET_SYSERR; +  } + +  int nrows = PQntuples (result); +  if (0 == nrows) +  { +    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, +                "postgres_get_denomination_summary() returned 0 matching rows\n"); +    PQclear (result); +    return GNUNET_NO; +  } +  GNUNET_assert (1 == nrows); + +  struct GNUNET_PQ_ResultSpec rs[] = { +    GNUNET_PQ_result_spec_uint64 ("denom_balance_val", &denom_balance->value), +    GNUNET_PQ_result_spec_uint32 ("denom_balance_frac", &denom_balance->fraction), +    GNUNET_PQ_result_spec_auto_from_type ("denom_balance_curr", &denom_balance->currency), + +    GNUNET_PQ_result_spec_uint64 ("deposit_fee_balance_val", &deposit_fee_balance->value), +    GNUNET_PQ_result_spec_uint32 ("deposit_fee_balance_frac", &deposit_fee_balance->fraction), +    GNUNET_PQ_result_spec_auto_from_type ("deposit_fee_balance_curr", &deposit_fee_balance->currency), + +    GNUNET_PQ_result_spec_uint64 ("melt_fee_balance_val", &melt_fee_balance->value), +    GNUNET_PQ_result_spec_uint32 ("melt_fee_balance_frac", &melt_fee_balance->fraction), +    GNUNET_PQ_result_spec_auto_from_type ("melt_fee_balance_curr", &melt_fee_balance->currency), + +    GNUNET_PQ_result_spec_uint64 ("refund_fee_balance_val", &refund_fee_balance->value), +    GNUNET_PQ_result_spec_uint32 ("refund_fee_balance_frac", &refund_fee_balance->fraction), +    GNUNET_PQ_result_spec_auto_from_type ("refund_fee_balance_curr", &refund_fee_balance->currency), + +    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;  } @@ -1157,8 +2290,33 @@ postgres_insert_risk_summary (void *cls,                                const struct TALER_MasterPublicKeyP *master_pub,                                const struct TALER_Amount *risk)  { -  GNUNET_break (0); // FIXME: not implemented -  return GNUNET_SYSERR; +  PGresult *result; +  int ret; + +  struct GNUNET_PQ_QueryParam params[] = { +    GNUNET_PQ_query_param_auto_from_type (master_pub), + +    GNUNET_PQ_query_param_uint64 (&risk->value), +    GNUNET_PQ_query_param_uint32 (&risk->fraction), +    GNUNET_PQ_query_param_auto_from_type (&risk->currency), + +    GNUNET_PQ_query_param_end +  }; + +  result = GNUNET_PQ_exec_prepared (session->conn, +                                   "total_risk_insert", +                                   params); +  if (PGRES_COMMAND_OK != PQresultStatus (result)) +  { +    ret = GNUNET_SYSERR; +    BREAK_DB_ERR (result); +  } +  else +  { +    ret = GNUNET_OK; +  } +  PQclear (result); +  return ret;  } @@ -1178,8 +2336,33 @@ postgres_update_risk_summary (void *cls,                                const struct TALER_MasterPublicKeyP *master_pub,                                const struct TALER_Amount *risk)  { -  GNUNET_break (0); // FIXME: not implemented -  return GNUNET_SYSERR; +  PGresult *result; +  int ret; + +  struct GNUNET_PQ_QueryParam params[] = { +    GNUNET_PQ_query_param_uint64 (&risk->value), +    GNUNET_PQ_query_param_uint32 (&risk->fraction), +    GNUNET_PQ_query_param_auto_from_type (&risk->currency), + +    GNUNET_PQ_query_param_auto_from_type (master_pub), + +    GNUNET_PQ_query_param_end +  }; + +  result = GNUNET_PQ_exec_prepared (session->conn, +                                   "total_risk_update", +                                   params); +  if (PGRES_COMMAND_OK != PQresultStatus (result)) +  { +    ret = GNUNET_SYSERR; +    BREAK_DB_ERR (result); +  } +  else +  { +    ret = GNUNET_OK; +  } +  PQclear (result); +  return ret;  } @@ -1199,8 +2382,49 @@ postgres_get_risk_summary (void *cls,                             const struct TALER_MasterPublicKeyP *master_pub,                             struct TALER_Amount *risk)  { -  GNUNET_break (0); // FIXME: not implemented -  return GNUNET_SYSERR; +  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, +                                    "total_risk_select", +                                    params); +  if (PGRES_TUPLES_OK != +      PQresultStatus (result)) +  { +    BREAK_DB_ERR (result); +    PQclear (result); +    return GNUNET_SYSERR; +  } + +  int nrows = PQntuples (result); +  if (0 == nrows) +  { +    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, +                "postgres_get_risk_summary() returned 0 matching rows\n"); +    PQclear (result); +    return GNUNET_NO; +  } +  GNUNET_assert (1 == nrows); + +  struct GNUNET_PQ_ResultSpec rs[] = { +    GNUNET_PQ_result_spec_uint64 ("risk_val", &risk->value), +    GNUNET_PQ_result_spec_uint32 ("risk_frac", &risk->fraction), +    GNUNET_PQ_result_spec_auto_from_type ("risk_curr", &risk->currency), + +    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;  } @@ -1232,8 +2456,60 @@ postgres_insert_historic_denom_revenue (void *cls,                                          const struct TALER_Amount *melt_fee_balance,                                          const struct TALER_Amount *refund_fee_balance)  { -  GNUNET_break (0); // FIXME: not implemented -  return GNUNET_SYSERR; +  PGresult *result; +  int ret; + +  struct GNUNET_PQ_QueryParam params[] = { +    GNUNET_PQ_query_param_auto_from_type (master_pub), +    GNUNET_PQ_query_param_auto_from_type (denom_pub_hash), + +    GNUNET_PQ_query_param_auto_from_type (&revenue_timestamp), + +    GNUNET_PQ_query_param_uint64 (&revenue_balance->value), +    GNUNET_PQ_query_param_uint32 (&revenue_balance->fraction), +    GNUNET_PQ_query_param_auto_from_type (&revenue_balance->currency), + +    GNUNET_PQ_query_param_uint64 (&deposit_fee_balance->value), +    GNUNET_PQ_query_param_uint32 (&deposit_fee_balance->fraction), +    GNUNET_PQ_query_param_auto_from_type (&deposit_fee_balance->currency), + +    GNUNET_PQ_query_param_uint64 (&melt_fee_balance->value), +    GNUNET_PQ_query_param_uint32 (&melt_fee_balance->fraction), +    GNUNET_PQ_query_param_auto_from_type (&melt_fee_balance->currency), + +    GNUNET_PQ_query_param_uint64 (&refund_fee_balance->value), +    GNUNET_PQ_query_param_uint32 (&refund_fee_balance->fraction), +    GNUNET_PQ_query_param_auto_from_type (&refund_fee_balance->currency), + +    GNUNET_PQ_query_param_end +  }; + +  GNUNET_assert (GNUNET_YES == +                 TALER_amount_cmp_currency (revenue_balance, +                                            deposit_fee_balance)); + +  GNUNET_assert (GNUNET_YES == +                 TALER_amount_cmp_currency (revenue_balance, +                                            melt_fee_balance)); + +  GNUNET_assert (GNUNET_YES == +                 TALER_amount_cmp_currency (revenue_balance, +                                            refund_fee_balance)); + +  result = GNUNET_PQ_exec_prepared (session->conn, +                                   "historic_denomination_revenue_insert", +                                   params); +  if (PGRES_COMMAND_OK != PQresultStatus (result)) +  { +    ret = GNUNET_SYSERR; +    BREAK_DB_ERR (result); +  } +  else +  { +    ret = GNUNET_OK; +  } +  PQclear (result); +  return ret;  } @@ -1252,11 +2528,83 @@ static int  postgres_select_historic_denom_revenue (void *cls,                                          struct TALER_AUDITORDB_Session *session,                                          const struct TALER_MasterPublicKeyP *master_pub, -                                        void *cb, /* FIXME: fix type */ +                                        TALER_AUDITORDB_HistoricDenominationRevenueDataCallback cb,                                          void *cb_cls)  { -  GNUNET_break (0); // FIXME: not implemented -  return GNUNET_SYSERR; +  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, +                                    "historic_denomination_revenue_select", +                                    params); +  if (PGRES_TUPLES_OK != +      PQresultStatus (result)) +  { +    BREAK_DB_ERR (result); +    PQclear (result); +    return GNUNET_SYSERR; +  } + +  int nrows = PQntuples (result); +  if (0 == nrows) +  { +    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, +                "postgres_select_historic_denom_revenue() returned 0 matching rows\n"); +    PQclear (result); +    return GNUNET_NO; +  } +  for (int i = 0; i < nrows; i++) +  { +    struct GNUNET_HashCode denom_pub_hash; +    struct GNUNET_TIME_Absolute revenue_timestamp; +    struct TALER_Amount revenue_balance; +    struct TALER_Amount deposit_fee_balance; +    struct TALER_Amount melt_fee_balance; +    struct TALER_Amount refund_fee_balance; + +    struct GNUNET_PQ_ResultSpec rs[] = { +      GNUNET_PQ_result_spec_auto_from_type ("denom_pub_hash", &denom_pub_hash), + +      GNUNET_PQ_result_spec_auto_from_type ("revenue_timestamp", &revenue_timestamp), + +      GNUNET_PQ_result_spec_uint64 ("revenue_balance_val", &revenue_balance.value), +      GNUNET_PQ_result_spec_uint32 ("revenue_balance_frac", &revenue_balance.fraction), +      GNUNET_PQ_result_spec_auto_from_type ("revenue_balance_curr", &revenue_balance.currency), + +      GNUNET_PQ_result_spec_uint64 ("deposit_fee_balance_val", &deposit_fee_balance.value), +      GNUNET_PQ_result_spec_uint32 ("deposit_fee_balance_frac", &deposit_fee_balance.fraction), +      GNUNET_PQ_result_spec_auto_from_type ("deposit_fee_balance_curr", &deposit_fee_balance.currency), + +      GNUNET_PQ_result_spec_uint64 ("melt_fee_balance_val", &melt_fee_balance.value), +      GNUNET_PQ_result_spec_uint32 ("melt_fee_balance_frac", &melt_fee_balance.fraction), +      GNUNET_PQ_result_spec_auto_from_type ("melt_fee_balance_curr", &melt_fee_balance.currency), + +      GNUNET_PQ_result_spec_uint64 ("refund_fee_balance_val", &refund_fee_balance.value), +      GNUNET_PQ_result_spec_uint32 ("refund_fee_balance_frac", &refund_fee_balance.fraction), +      GNUNET_PQ_result_spec_auto_from_type ("refund_fee_balance_curr", &refund_fee_balance.currency), + +      GNUNET_PQ_result_spec_end +    }; +    if (GNUNET_OK != +        GNUNET_PQ_extract_result (result, rs, 0)) +    { +      GNUNET_break (0); +      PQclear (result); +      return GNUNET_SYSERR; +    } +    cb (cb_cls, +        &denom_pub_hash, +        revenue_timestamp, +        &revenue_balance, +        &deposit_fee_balance, +        &melt_fee_balance, +        &refund_fee_balance); +  } +  PQclear (result); +  return GNUNET_OK;  } @@ -1283,8 +2631,36 @@ postgres_insert_historic_losses (void *cls,                                   struct GNUNET_TIME_Absolute loss_timestamp,                                   const struct TALER_Amount *loss_balance)  { -  GNUNET_break (0); // FIXME: not implemented -  return GNUNET_SYSERR; +  PGresult *result; +  int ret; + +  struct GNUNET_PQ_QueryParam params[] = { +    GNUNET_PQ_query_param_auto_from_type (master_pub), +    GNUNET_PQ_query_param_auto_from_type (denom_pub_hash), + +    GNUNET_PQ_query_param_auto_from_type (&loss_timestamp), + +    GNUNET_PQ_query_param_uint64 (&loss_balance->value), +    GNUNET_PQ_query_param_uint32 (&loss_balance->fraction), +    GNUNET_PQ_query_param_auto_from_type (&loss_balance->currency), + +    GNUNET_PQ_query_param_end +  }; + +  result = GNUNET_PQ_exec_prepared (session->conn, +                                   "historic_losses_insert", +                                   params); +  if (PGRES_COMMAND_OK != PQresultStatus (result)) +  { +    ret = GNUNET_SYSERR; +    BREAK_DB_ERR (result); +  } +  else +  { +    ret = GNUNET_OK; +  } +  PQclear (result); +  return ret;  } @@ -1303,11 +2679,65 @@ static int  postgres_select_historic_losses (void *cls,                                   struct TALER_AUDITORDB_Session *session,                                   const struct TALER_MasterPublicKeyP *master_pub, -                                 void *cb, /* FIXME: fix type */ +                                 TALER_AUDITORDB_HistoricLossesDataCallback cb,                                   void *cb_cls)  { -  GNUNET_break (0); // FIXME: not implemented -  return GNUNET_SYSERR; +  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, +                                    "historic_losses_select", +                                    params); +  if (PGRES_TUPLES_OK != +      PQresultStatus (result)) +  { +    BREAK_DB_ERR (result); +    PQclear (result); +    return GNUNET_SYSERR; +  } + +  int nrows = PQntuples (result); +  if (0 == nrows) +  { +    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, +                "postgres_select_historic_losses() returned 0 matching rows\n"); +    PQclear (result); +    return GNUNET_NO; +  } +  for (int i = 0; i < nrows; i++) +  { +    struct GNUNET_HashCode denom_pub_hash; +    struct GNUNET_TIME_Absolute loss_timestamp; +    struct TALER_Amount loss_balance; + +    struct GNUNET_PQ_ResultSpec rs[] = { +      GNUNET_PQ_result_spec_auto_from_type ("denom_pub_hash", &denom_pub_hash), + +      GNUNET_PQ_result_spec_auto_from_type ("loss_timestamp", &loss_timestamp), + +      GNUNET_PQ_result_spec_uint64 ("loss_balance_val", &loss_balance.value), +      GNUNET_PQ_result_spec_uint32 ("loss_balance_frac", &loss_balance.fraction), +      GNUNET_PQ_result_spec_auto_from_type ("loss_balance_curr", &loss_balance.currency), + +      GNUNET_PQ_result_spec_end +    }; +    if (GNUNET_OK != +        GNUNET_PQ_extract_result (result, rs, 0)) +    { +      GNUNET_break (0); +      PQclear (result); +      return GNUNET_SYSERR; +    } +    cb (cb_cls, +        &denom_pub_hash, +        loss_timestamp, +        &loss_balance); +  } +  PQclear (result); +  return GNUNET_OK;  } @@ -1330,8 +2760,36 @@ postgres_insert_historic_reserve_revenue (void *cls,                                            struct GNUNET_TIME_Absolute end_time,                                            const struct TALER_Amount *reserve_profits)  { -  GNUNET_break (0); // FIXME: not implemented -  return GNUNET_SYSERR; +  PGresult *result; +  int ret; + +  struct GNUNET_PQ_QueryParam params[] = { +    GNUNET_PQ_query_param_auto_from_type (master_pub), + +    GNUNET_PQ_query_param_auto_from_type (&start_time), +    GNUNET_PQ_query_param_auto_from_type (&end_time), + +    GNUNET_PQ_query_param_uint64 (&reserve_profits->value), +    GNUNET_PQ_query_param_uint32 (&reserve_profits->fraction), +    GNUNET_PQ_query_param_auto_from_type (&reserve_profits->currency), + +    GNUNET_PQ_query_param_end +  }; + +  result = GNUNET_PQ_exec_prepared (session->conn, +                                   "historic_reserve_summary_insert", +                                   params); +  if (PGRES_COMMAND_OK != PQresultStatus (result)) +  { +    ret = GNUNET_SYSERR; +    BREAK_DB_ERR (result); +  } +  else +  { +    ret = GNUNET_OK; +  } +  PQclear (result); +  return ret;  } @@ -1349,11 +2807,64 @@ static int  postgres_select_historic_reserve_revenue (void *cls,                                            struct TALER_AUDITORDB_Session *session,                                            const struct TALER_MasterPublicKeyP *master_pub, -                                          void *cb, /* FIXME: type */ +                                          TALER_AUDITORDB_HistoricReserveRevenueDataCallback cb,                                            void *cb_cls)  { -  GNUNET_break (0); // FIXME: not implemented -  return GNUNET_SYSERR; +  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, +                                    "historic_reserve_summary_select", +                                    params); +  if (PGRES_TUPLES_OK != +      PQresultStatus (result)) +  { +    BREAK_DB_ERR (result); +    PQclear (result); +    return GNUNET_SYSERR; +  } + +  int nrows = PQntuples (result); +  if (0 == nrows) +  { +    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, +                "postgres_select_historic_reserve_revenue() returned 0 matching rows\n"); +    PQclear (result); +    return GNUNET_NO; +  } +  for (int i = 0; i < nrows; i++) +  { +    struct GNUNET_TIME_Absolute start_time; +    struct GNUNET_TIME_Absolute end_time; +    struct TALER_Amount reserve_profits; + +    struct GNUNET_PQ_ResultSpec rs[] = { +      GNUNET_PQ_result_spec_auto_from_type ("start_time", &start_time), +      GNUNET_PQ_result_spec_auto_from_type ("end_time", &end_time), + +      GNUNET_PQ_result_spec_uint64 ("reserve_profits_val", &reserve_profits.value), +      GNUNET_PQ_result_spec_uint32 ("reserve_profits_frac", &reserve_profits.fraction), +      GNUNET_PQ_result_spec_auto_from_type ("reserve_profits_curr", &reserve_profits.currency), + +      GNUNET_PQ_result_spec_end +    }; +    if (GNUNET_OK != +        GNUNET_PQ_extract_result (result, rs, 0)) +    { +      GNUNET_break (0); +      PQclear (result); +      return GNUNET_SYSERR; +    } +    cb (cb_cls, +        start_time, +        end_time, +        &reserve_profits); +  } +  PQclear (result); +  return GNUNET_OK;  } @@ -1373,8 +2884,33 @@ postgres_insert_predicted_result (void *cls,                                    const struct TALER_MasterPublicKeyP *master_pub,                                    const struct TALER_Amount *balance)  { -  GNUNET_break (0); // FIXME: not implemented -  return GNUNET_SYSERR; +  PGresult *result; +  int ret; + +  struct GNUNET_PQ_QueryParam params[] = { +    GNUNET_PQ_query_param_auto_from_type (master_pub), + +    GNUNET_PQ_query_param_uint64 (&balance->value), +    GNUNET_PQ_query_param_uint32 (&balance->fraction), +    GNUNET_PQ_query_param_auto_from_type (&balance->currency), + +    GNUNET_PQ_query_param_end +  }; + +  result = GNUNET_PQ_exec_prepared (session->conn, +                                   "predicted_result_insert", +                                   params); +  if (PGRES_COMMAND_OK != PQresultStatus (result)) +  { +    ret = GNUNET_SYSERR; +    BREAK_DB_ERR (result); +  } +  else +  { +    ret = GNUNET_OK; +  } +  PQclear (result); +  return ret;  } @@ -1394,8 +2930,27 @@ postgres_update_predicted_result (void *cls,                                    const struct TALER_MasterPublicKeyP *master_pub,                                    const struct TALER_Amount *balance)  { -  GNUNET_break (0); // FIXME: not implemented -  return GNUNET_SYSERR; +  PGresult *result; +  int ret; + +  struct GNUNET_PQ_QueryParam params[] = { +    GNUNET_PQ_query_param_end +  }; + +  result = GNUNET_PQ_exec_prepared (session->conn, +                                   "predicted_result_update", +                                   params); +  if (PGRES_COMMAND_OK != PQresultStatus (result)) +  { +    ret = GNUNET_SYSERR; +    BREAK_DB_ERR (result); +  } +  else +  { +    ret = GNUNET_OK; +  } +  PQclear (result); +  return ret;  } @@ -1415,8 +2970,49 @@ postgres_get_predicted_balance (void *cls,                                  const struct TALER_MasterPublicKeyP *master_pub,                                  struct TALER_Amount *balance)  { -  GNUNET_break (0); // FIXME: not implemented -  return GNUNET_SYSERR; +  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, +                                    "predicted_result_select", +                                    params); +  if (PGRES_TUPLES_OK != +      PQresultStatus (result)) +  { +    BREAK_DB_ERR (result); +    PQclear (result); +    return GNUNET_SYSERR; +  } + +  int nrows = PQntuples (result); +  if (0 == nrows) +  { +    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, +                "postgres_get_predicted_balance() returned 0 matching rows\n"); +    PQclear (result); +    return GNUNET_NO; +  } +  GNUNET_assert (1 == nrows); + +  struct GNUNET_PQ_ResultSpec rs[] = { +    GNUNET_PQ_result_spec_uint64 ("balance_val", &balance->value), +    GNUNET_PQ_result_spec_uint32 ("balance_frac", &balance->fraction), +    GNUNET_PQ_result_spec_auto_from_type ("balance_curr", &balance->currency), + +    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;  } diff --git a/src/include/taler_auditordb_plugin.h b/src/include/taler_auditordb_plugin.h index cc75fb01..a04fedc8 100644 --- a/src/include/taler_auditordb_plugin.h +++ b/src/include/taler_auditordb_plugin.h @@ -29,6 +29,70 @@  /** + * Function called with the results of select_denomination_info() + * + * @param cls closure + * @param issue issuing information with value, fees and other info about the denomination. + */ +typedef void +(*TALER_AUDITORDB_DenominationInfoDataCallback)(void *cls, +                                                const struct TALER_DenominationKeyValidityPS *issue); + + +/** + * Function called with the results of select_historic_denom_revenue() + * + * @param cls closure + * @param denom_pub_hash hash of the denomination key + * @param revenue_timestamp when did this profit get realized + * @param revenue_balance what was the total profit made from + *                        deposit fees, melting fees, refresh fees + *                        and coins that were never returned? + * @param deposit_fee_balance total profits from deposit fees + * @param melt_fee_balance total profits from melting fees + * @param refund_fee_balance total profits from refund fees + */ +typedef void +(*TALER_AUDITORDB_HistoricDenominationRevenueDataCallback)(void *cls, +                                                           const struct GNUNET_HashCode *denom_pub_hash, +                                                           struct GNUNET_TIME_Absolute revenue_timestamp, +                                                           const struct TALER_Amount *revenue_balance, +                                                           const struct TALER_Amount *deposit_fee_balance, +                                                           const struct TALER_Amount *melt_fee_balance, +                                                           const struct TALER_Amount *refund_fee_balance); + + +/** + * Function called with the results of select_historic_losses() + * + * @param cls closure + * @param denom_pub_hash hash of the denomination key + * @param loss_timestamp when did this profit get realized + * @param loss_balance what was the total loss + */ +typedef void +(*TALER_AUDITORDB_HistoricLossesDataCallback)(void *cls, +                                              const struct GNUNET_HashCode *denom_pub_hash, +                                              struct GNUNET_TIME_Absolute loss_timestamp, +                                              const struct TALER_Amount *loss_balance); + + +/** + * Function called with the results of select_historic_reserve_revenue() + * + * @param cls closure + * @param start_time beginning of aggregated time interval + * @param end_time end of aggregated time interval + * @param reserve_profits total profits made + */ +typedef void +(*TALER_AUDITORDB_HistoricReserveRevenueDataCallback)(void *cls, +                                                      struct GNUNET_TIME_Absolute start_time, +                                                      struct GNUNET_TIME_Absolute end_time, +                                                      const struct TALER_Amount *reserve_profits); + + +/**   * Handle for one session with the database.   */  struct TALER_AUDITORDB_Session; @@ -164,7 +228,7 @@ struct TALER_AUDITORDB_Plugin    (*select_denomination_info)(void *cls,                                struct TALER_AUDITORDB_Session *session,                                const struct TALER_MasterPublicKeyP *master_pub, -                              void *cb, /* FIXME: type! */ +                              TALER_AUDITORDB_DenominationInfoDataCallback cb,                                void *cb_cls); @@ -586,7 +650,7 @@ struct TALER_AUDITORDB_Plugin    (*select_historic_denom_revenue)(void *cls,                                     struct TALER_AUDITORDB_Session *session,                                     const struct TALER_MasterPublicKeyP *master_pub, -                                   void *cb, /* FIXME: fix type */ +                                   TALER_AUDITORDB_HistoricDenominationRevenueDataCallback cb,                                     void *cb_cls); @@ -628,7 +692,7 @@ struct TALER_AUDITORDB_Plugin    (*select_historic_losses)(void *cls,                              struct TALER_AUDITORDB_Session *session,                              const struct TALER_MasterPublicKeyP *master_pub, -                            void *cb, /* FIXME: fix type */ +                            TALER_AUDITORDB_HistoricLossesDataCallback cb,                              void *cb_cls); @@ -666,7 +730,7 @@ struct TALER_AUDITORDB_Plugin    (*select_historic_reserve_revenue)(void *cls,                                       struct TALER_AUDITORDB_Session *session,                                       const struct TALER_MasterPublicKeyP *master_pub, -                                     void *cb, /* FIXME: type */ +                                     TALER_AUDITORDB_HistoricReserveRevenueDataCallback cb,                                       void *cb_cls); | 
