summaryrefslogtreecommitdiff
path: root/src/backenddb
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2020-05-30 18:53:06 +0200
committerChristian Grothoff <christian@grothoff.org>2020-05-30 18:53:06 +0200
commit059797b86a96e95ca4d61ccbcec690620957aaf9 (patch)
treec46cc5b799a4d277d71f4ac08a216d879f52b9ad /src/backenddb
parente0991aa684c7a4e9895834286dfdf98007e8cfa6 (diff)
downloadmerchant-059797b86a96e95ca4d61ccbcec690620957aaf9.tar.gz
merchant-059797b86a96e95ca4d61ccbcec690620957aaf9.tar.bz2
merchant-059797b86a96e95ca4d61ccbcec690620957aaf9.zip
fix DB use
Diffstat (limited to 'src/backenddb')
-rw-r--r--src/backenddb/merchant-0001.sql2
-rw-r--r--src/backenddb/plugin_merchantdb_postgres.c953
2 files changed, 2 insertions, 953 deletions
diff --git a/src/backenddb/merchant-0001.sql b/src/backenddb/merchant-0001.sql
index beef2cd8..d74b8527 100644
--- a/src/backenddb/merchant-0001.sql
+++ b/src/backenddb/merchant-0001.sql
@@ -415,7 +415,7 @@ CREATE TABLE IF NOT EXISTS merchant_deposit_to_transfer
,UNIQUE(deposit_serial,credit_serial)
);
COMMENT ON TABLE merchant_deposit_to_transfer
- IS 'Mapping of deposits to (possibly unconfirmed) wire transfers';
+ IS 'Mapping of deposits to (possibly unconfirmed) wire transfers; NOTE: not used yet';
COMMENT ON COLUMN merchant_deposit_to_transfer.execution_time
IS 'Execution time as claimed by the exchange, roughly matches time seen by merchant';
diff --git a/src/backenddb/plugin_merchantdb_postgres.c b/src/backenddb/plugin_merchantdb_postgres.c
index a0490c5e..42d5f331 100644
--- a/src/backenddb/plugin_merchantdb_postgres.c
+++ b/src/backenddb/plugin_merchantdb_postgres.c
@@ -5066,724 +5066,6 @@ postgres_insert_pickup_blind_signature (
}
-/* ********************* OLD API ************************** */
-
-/**
- * Insert mapping of @a coin_pub and @a h_contract_terms to
- * corresponding @a wtid.
- *
- * @param cls closure
- * @param h_contract_terms hashcode of the proposal data paid by @a coin_pub
- * @param coin_pub public key of the coin
- * @param wtid identifier of the wire transfer in which the exchange
- * send us the money for the coin deposit
- * @return transaction status
- */
-static enum GNUNET_DB_QueryStatus
-postgres_store_coin_to_transfer (void *cls,
- const struct GNUNET_HashCode *h_contract_terms,
- const struct
- TALER_CoinSpendPublicKeyP *coin_pub,
- const struct
- TALER_WireTransferIdentifierRawP *wtid)
-{
- struct PostgresClosure *pg = cls;
- struct GNUNET_PQ_QueryParam params[] = {
- GNUNET_PQ_query_param_auto_from_type (h_contract_terms),
- GNUNET_PQ_query_param_auto_from_type (coin_pub),
- GNUNET_PQ_query_param_auto_from_type (wtid),
- GNUNET_PQ_query_param_end
- };
-
- check_connection (pg);
- return GNUNET_PQ_eval_prepared_non_select (pg->conn,
- "insert_transfer",
- params);
-}
-
-
-/**
- * Insert wire transfer confirmation from the exchange into the database.
- *
- * @param cls closure
- * @param exchange_url URL of the exchange
- * @param wtid identifier of the wire transfer
- * @param execution_time when was @a wtid executed
- * @param signkey_pub public key used by the exchange for @a exchange_proof
- * @param exchange_proof proof from exchange about what the deposit was for
- * @return transaction status
- */
-static enum GNUNET_DB_QueryStatus
-postgres_store_transfer_to_proof (void *cls,
- const char *exchange_url,
- const struct
- TALER_WireTransferIdentifierRawP *wtid,
- struct GNUNET_TIME_Absolute execution_time,
- const struct
- TALER_ExchangePublicKeyP *signkey_pub,
- const json_t *exchange_proof)
-{
- struct PostgresClosure *pg = cls;
- struct GNUNET_PQ_QueryParam params[] = {
- GNUNET_PQ_query_param_string (exchange_url),
- GNUNET_PQ_query_param_auto_from_type (wtid),
- GNUNET_PQ_query_param_absolute_time (&execution_time),
- GNUNET_PQ_query_param_auto_from_type (signkey_pub),
- TALER_PQ_query_param_json (exchange_proof),
- GNUNET_PQ_query_param_end
- };
-
- check_connection (pg);
- return GNUNET_PQ_eval_prepared_non_select (pg->conn,
- "insert_proof",
- params);
-}
-
-
-/**
- * Closure for #find_tip_authorizations_cb().
- */
-struct GetAuthorizedTipAmountContext
-{
- /**
- * Total authorized amount.
- */
- struct TALER_Amount authorized_amount;
-
- /**
- * Transaction status code to set.
- */
- enum GNUNET_DB_QueryStatus qs;
-
- /**
- * Plugin context.
- */
- struct PostgresClosure *pg;
-
-};
-
-
-/**
- * Function to be called with the results of a SELECT statement
- * that has returned @a num_results results.
- *
- * @param cls of type `struct GetAuthorizedTipAmountContext *`
- * @param result the postgres result
- * @param num_result the number of results in @a result
- */
-static void
-find_tip_authorizations_cb (void *cls,
- PGresult *result,
- unsigned int num_results)
-{
- struct GetAuthorizedTipAmountContext *ctx = cls;
- struct PostgresClosure *pg = ctx->pg;
- unsigned int i;
-
- for (i = 0; i < num_results; i++)
- {
- struct TALER_Amount amount;
- char *just;
- json_t *extra;
- struct GNUNET_HashCode h;
- struct GNUNET_PQ_ResultSpec rs[] = {
- GNUNET_PQ_result_spec_string ("justification",
- &just),
- GNUNET_PQ_result_spec_auto_from_type ("tip_id",
- &h),
- TALER_PQ_RESULT_SPEC_AMOUNT ("amount",
- &amount),
- TALER_PQ_result_spec_json ("extra",
- &extra),
- GNUNET_PQ_result_spec_end
- };
-
- if (GNUNET_OK !=
- GNUNET_PQ_extract_result (result,
- rs,
- i))
- {
- GNUNET_break (0);
- ctx->qs = GNUNET_DB_STATUS_HARD_ERROR;
- return;
- }
-
- if (0 == i)
- {
- ctx->authorized_amount = amount;
- }
- else
- {
- if (0 >
- TALER_amount_add (&ctx->authorized_amount,
- &ctx->authorized_amount,
- &amount))
- {
- GNUNET_break (0);
- GNUNET_PQ_cleanup_result (rs);
- ctx->qs = GNUNET_DB_STATUS_HARD_ERROR;
- return;
- }
- }
- GNUNET_PQ_cleanup_result (rs);
- }
-
- if (0 == i)
- {
- ctx->qs = GNUNET_DB_STATUS_SUCCESS_NO_RESULTS;
- }
- else
- {
- /* one aggregated result */
- ctx->qs = GNUNET_DB_STATUS_SUCCESS_ONE_RESULT;
- }
-}
-
-
-/**
- * Get the total amount of authorized tips for a tipping reserve.
- *
- * @param cls closure, typically a connection to the db
- * @param reserve_priv which reserve to check
- * @param[out] authorzed_amount amount we've authorized so far for tips
- * @return transaction status, usually
- * #GNUNET_DB_STATUS_SUCCESS_ONE_RESULT for success
- * #GNUNET_DB_STATUS_SUCCESS_NO_RESULTS if the reserve_priv
- * does not identify a known tipping reserve
- */
-static enum GNUNET_DB_QueryStatus
-postgres_get_authorized_tip_amount (void *cls,
- const struct
- TALER_ReservePrivateKeyP *reserve_priv,
- struct TALER_Amount *authorized_amount)
-{
- struct PostgresClosure *pg = cls;
- struct GNUNET_PQ_QueryParam params[] = {
- GNUNET_PQ_query_param_auto_from_type (reserve_priv),
- GNUNET_PQ_query_param_end
- };
- enum GNUNET_DB_QueryStatus qs;
- struct GetAuthorizedTipAmountContext ctx = {
- .pg = pg
- };
-
- check_connection (pg);
- qs = GNUNET_PQ_eval_prepared_multi_select (pg->conn,
- "find_tip_authorizations",
- params,
- &find_tip_authorizations_cb,
- &ctx);
- if (0 >= qs)
- return qs;
- *authorized_amount = ctx.authorized_amount;
- return ctx.qs;
-}
-
-
-/**
- * Lookup proof information about a wire transfer.
- *
- * @param cls closure
- * @param exchange_url from which exchange are we looking for proof
- * @param wtid wire transfer identifier for the search
- * @param cb function to call with proof data
- * @param cb_cls closure for @a cb
- * @return transaction status
- */
-static enum GNUNET_DB_QueryStatus
-postgres_find_proof_by_wtid (void *cls,
- const char *exchange_url,
- const struct
- TALER_WireTransferIdentifierRawP *wtid,
- TALER_MERCHANTDB_ProofCallback cb,
- void *cb_cls)
-{
- struct PostgresClosure *pg = cls;
- struct GNUNET_PQ_QueryParam params[] = {
- GNUNET_PQ_query_param_auto_from_type (wtid),
- GNUNET_PQ_query_param_string (exchange_url),
- GNUNET_PQ_query_param_end
- };
- json_t *proof;
- struct GNUNET_PQ_ResultSpec rs[] = {
- TALER_PQ_result_spec_json ("proof",
- &proof),
- GNUNET_PQ_result_spec_end
- };
- enum GNUNET_DB_QueryStatus qs;
-
- check_connection (pg);
- qs = GNUNET_PQ_eval_prepared_singleton_select (pg->conn,
- "find_proof_by_wtid",
- params,
- rs);
- if (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT == qs)
- {
- cb (cb_cls,
- proof);
- GNUNET_PQ_cleanup_result (rs);
- }
- return qs;
-}
-
-
-/**
- * Add @a credit to a reserve to be used for tipping. Note that
- * this function does not actually perform any wire transfers to
- * credit the reserve, it merely tells the merchant backend that
- * a reserve was topped up. This has to happen before tips can be
- * authorized.
- *
- * @param cls closure, typically a connection to the db
- * @param reserve_priv which reserve is topped up or created
- * @param credit_uuid unique identifier for the credit operation
- * @param credit how much money was added to the reserve
- * @param expiration when does the reserve expire?
- * @return transaction status, usually
- * #GNUNET_DB_STATUS_SUCCESS_ONE_RESULT for success
- * #GNUNET_DB_STATUS_SUCCESS_NO_RESULTS if @a credit_uuid already known
- */
-static enum GNUNET_DB_QueryStatus
-postgres_enable_tip_reserve_TR (void *cls,
- const struct
- TALER_ReservePrivateKeyP *reserve_priv,
- const struct GNUNET_HashCode *credit_uuid,
- const struct TALER_Amount *credit,
- struct GNUNET_TIME_Absolute expiration)
-{
- struct PostgresClosure *pg = cls;
- struct GNUNET_TIME_Absolute old_expiration;
- struct TALER_Amount old_balance;
- enum GNUNET_DB_QueryStatus qs;
- struct GNUNET_TIME_Absolute new_expiration;
- struct TALER_Amount new_balance;
- unsigned int retries = 0;
-
- check_connection (pg);
-RETRY:
- if (MAX_RETRIES < ++retries)
- return GNUNET_DB_STATUS_SOFT_ERROR;
- if (GNUNET_OK !=
- postgres_start (pg,
- "enable tip reserve"))
- {
- GNUNET_break (0);
- return GNUNET_DB_STATUS_HARD_ERROR;
- }
-
- /* ensure that credit_uuid is new/unique */
- {
- struct GNUNET_PQ_QueryParam params[] = {
- GNUNET_PQ_query_param_auto_from_type (credit_uuid),
- GNUNET_PQ_query_param_auto_from_type (reserve_priv),
- GNUNET_PQ_query_param_end
- };
-
- struct GNUNET_PQ_ResultSpec rs[] = {
- GNUNET_PQ_result_spec_end
- };
- qs = GNUNET_PQ_eval_prepared_singleton_select (pg->conn,
- "lookup_tip_credit_uuid",
- params,
- rs);
- if (0 > qs)
- {
- GNUNET_break (GNUNET_DB_STATUS_SOFT_ERROR == qs);
- postgres_rollback (pg);
- if (GNUNET_DB_STATUS_SOFT_ERROR == qs)
- goto RETRY;
- return qs;
- }
- if (GNUNET_DB_STATUS_SUCCESS_NO_RESULTS != qs)
- {
- /* UUID already exists, we are done! */
- postgres_rollback (pg);
- return GNUNET_DB_STATUS_SUCCESS_NO_RESULTS;
- }
- }
-
- {
- struct GNUNET_TIME_Absolute now;
- struct GNUNET_PQ_QueryParam params[] = {
- GNUNET_PQ_query_param_auto_from_type (reserve_priv),
- GNUNET_PQ_query_param_auto_from_type (credit_uuid),
- GNUNET_PQ_query_param_absolute_time (&now),
- TALER_PQ_query_param_amount (credit),
- GNUNET_PQ_query_param_end
- };
-
- now = GNUNET_TIME_absolute_get ();
- (void) GNUNET_TIME_round_abs (&now);
- qs = GNUNET_PQ_eval_prepared_non_select (pg->conn,
- "insert_tip_credit_uuid",
- params);
- if (0 > qs)
- {
- GNUNET_break (GNUNET_DB_STATUS_SOFT_ERROR == qs);
- postgres_rollback (pg);
- if (GNUNET_DB_STATUS_SOFT_ERROR == qs)
- goto RETRY;
- return qs;
- }
- }
-
- /* Obtain existing reserve balance */
- {
- struct GNUNET_PQ_QueryParam params[] = {
- GNUNET_PQ_query_param_auto_from_type (reserve_priv),
- GNUNET_PQ_query_param_end
- };
- struct GNUNET_PQ_ResultSpec rs[] = {
- GNUNET_PQ_result_spec_absolute_time ("expiration",
- &old_expiration),
- TALER_PQ_RESULT_SPEC_AMOUNT ("balance",
- &old_balance),
- GNUNET_PQ_result_spec_end
- };
-
- qs = GNUNET_PQ_eval_prepared_singleton_select (pg->conn,
- "lookup_tip_reserve_balance",
- params,
- rs);
- }
- if (0 > qs)
- {
- GNUNET_break (GNUNET_DB_STATUS_SOFT_ERROR == qs);
- postgres_rollback (pg);
- if (GNUNET_DB_STATUS_SOFT_ERROR == qs)
- goto RETRY;
- return qs;
- }
- if ( (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT == qs) &&
- (GNUNET_TIME_absolute_get_remaining (old_expiration).rel_value_us > 0) )
- {
- new_expiration = GNUNET_TIME_absolute_max (old_expiration,
- expiration);
- if (0 >
- TALER_amount_add (&new_balance,
- credit,
- &old_balance))
- {
- GNUNET_break (0);
- postgres_rollback (pg);
- return GNUNET_DB_STATUS_HARD_ERROR;
- }
- }
- else
- {
- if (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT == qs)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Old reserve balance of %s had expired at %s, not carrying it over!\n",
- TALER_amount2s (&old_balance),
- GNUNET_STRINGS_absolute_time_to_string (old_expiration));
- }
- new_expiration = expiration;
- new_balance = *credit;
- }
-
- {
- struct GNUNET_PQ_QueryParam params[] = {
- GNUNET_PQ_query_param_auto_from_type (reserve_priv),
- GNUNET_PQ_query_param_absolute_time (&new_expiration),
- TALER_PQ_query_param_amount (&new_balance),
- GNUNET_PQ_query_param_end
- };
- const char *stmt;
-
- stmt = (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT == qs)
- ? "update_tip_reserve_balance"
- : "insert_tip_reserve_balance";
- qs = GNUNET_PQ_eval_prepared_non_select (pg->conn,
- stmt,
- params);
- if (0 > qs)
- {
- GNUNET_break (GNUNET_DB_STATUS_SOFT_ERROR == qs);
- postgres_rollback (pg);
- if (GNUNET_DB_STATUS_SOFT_ERROR == qs)
- goto RETRY;
- return qs;
- }
- }
- qs = postgres_commit (pg);
- if (GNUNET_DB_STATUS_SUCCESS_NO_RESULTS == qs)
- return GNUNET_DB_STATUS_SUCCESS_ONE_RESULT;
- GNUNET_break (GNUNET_DB_STATUS_SOFT_ERROR == qs);
- if (GNUNET_DB_STATUS_SOFT_ERROR == qs)
- goto RETRY;
- return qs;
-}
-
-
-/**
- * Find out tip authorization details associated with @a tip_id
- *
- * @param cls closure, typically a connection to the d
- * @param tip_id the unique ID for the tip
- * @param[out] exchange_url set to the URL of the exchange (unless NULL)
- * @param[out] extra extra data to pass to the wallet (unless NULL)
- * @param[out] amount set to the authorized amount (unless NULL)
- * @param[out] amount_left set to the amount left (unless NULL)
- * @param[out] timestamp set to the timestamp of the tip authorization (unless NULL)
- * @return transaction status, usually
- * #GNUNET_DB_STATUS_SUCCESS_ONE_RESULT for success
- * #GNUNET_DB_STATUS_SUCCESS_NO_RESULTS if @a credit_uuid already known
- */
-static enum GNUNET_DB_QueryStatus
-postgres_lookup_tip_by_id (void *cls,
- const struct GNUNET_HashCode *tip_id,
- char **exchange_url,
- json_t **extra,
- struct TALER_Amount *amount,
- struct TALER_Amount *amount_left,
- struct GNUNET_TIME_Absolute *timestamp)
-{
- struct PostgresClosure *pg = cls;
- char *res_exchange_url;
- json_t *res_extra;
- struct TALER_Amount res_amount;
- struct TALER_Amount res_amount_left;
- struct GNUNET_TIME_Absolute res_timestamp;
- struct GNUNET_PQ_QueryParam params[] = {
- GNUNET_PQ_query_param_auto_from_type (tip_id),
- GNUNET_PQ_query_param_end
- };
- struct GNUNET_PQ_ResultSpec rs[] = {
- GNUNET_PQ_result_spec_string ("exchange_url",
- &res_exchange_url),
- GNUNET_PQ_result_spec_absolute_time ("timestamp",
- &res_timestamp),
- TALER_PQ_result_spec_json ("extra",
- &res_extra),
- TALER_PQ_RESULT_SPEC_AMOUNT ("amount",
- &res_amount),
- TALER_PQ_RESULT_SPEC_AMOUNT ("left",
- &res_amount_left),
- GNUNET_PQ_result_spec_end
- };
- enum GNUNET_DB_QueryStatus qs;
-
- qs = GNUNET_PQ_eval_prepared_singleton_select (pg->conn,
- "find_tip_by_id",
- params,
- rs);
- if (0 >= qs)
- {
- if (NULL != exchange_url)
- *exchange_url = NULL;
- return qs;
- }
- if (NULL != exchange_url)
- *exchange_url = strdup (res_exchange_url);
- if (NULL != amount)
- *amount = res_amount;
- if (NULL != amount_left)
- *amount_left = res_amount_left;
- if (NULL != timestamp)
- *timestamp = res_timestamp;
- if (NULL != extra)
- {
- json_incref (res_extra);
- *extra = res_extra;
- }
- GNUNET_PQ_cleanup_result (rs);
- return qs;
-}
-
-
-/**
- * Pickup a tip over @a amount using pickup id @a pickup_id.
- *
- * @param cls closure, typically a connection to the db
- * @param amount how high is the amount picked up (with fees)
- * @param tip_id the unique ID from the tip authorization
- * @param pickup_id the unique ID identifying the pick up operation
- * (to allow replays, hash over the coin envelope and denomination key)
- * @param[out] reserve_priv which reserve key to use to sign
- * @return taler error code
- * #TALER_EC_TIP_PICKUP_ID_UNKNOWN if @a tip_id is unknown
- * #TALER_EC_TIP_PICKUP_NO_FUNDS if @a tip_id has insufficient funds left
- * #TALER_EC_TIP_PICKUP_DB_ERROR_HARD on hard database errors
- * #TALER_EC_TIP_PICKUP_AMOUNT_CHANGED if @a amount is different for known @a pickup_id
- * #TALER_EC_TIP_PICKUP_DB_ERROR_SOFT on soft database errors (client should retry)
- * #TALER_EC_NONE upon success (@a reserve_priv was set)
- */
-static enum TALER_ErrorCode
-postgres_pickup_tip_TR (void *cls,
- const struct TALER_Amount *amount,
- const struct GNUNET_HashCode *tip_id,
- const struct GNUNET_HashCode *pickup_id,
- struct TALER_ReservePrivateKeyP *reserve_priv)
-{
- struct PostgresClosure *pg = cls;
- struct TALER_Amount left_amount;
- struct GNUNET_PQ_QueryParam params[] = {
- GNUNET_PQ_query_param_auto_from_type (tip_id),
- GNUNET_PQ_query_param_end
- };
- struct GNUNET_PQ_ResultSpec rs[] = {
- GNUNET_PQ_result_spec_auto_from_type ("reserve_priv",
- reserve_priv),
- TALER_PQ_RESULT_SPEC_AMOUNT ("left",
- &left_amount),
- GNUNET_PQ_result_spec_end
- };
- enum GNUNET_DB_QueryStatus qs;
- unsigned int retries;
-
- retries = 0;
- check_connection (pg);
-RETRY:
- if (MAX_RETRIES < ++retries)
- return TALER_EC_TIP_PICKUP_DB_ERROR_SOFT;
- if (GNUNET_OK !=
- postgres_start (pg,
- "pickup tip"))
- {
- GNUNET_break (0);
- return TALER_EC_TIP_PICKUP_DB_ERROR_HARD;
- }
- qs = GNUNET_PQ_eval_prepared_singleton_select (pg->conn,
- "lookup_reserve_by_tip_id",
- params,
- rs);
- if (0 >= qs)
- {
- /* tip ID unknown */
- memset (reserve_priv,
- 0,
- sizeof (*reserve_priv));
- postgres_rollback (pg);
- if (GNUNET_DB_STATUS_SUCCESS_NO_RESULTS == qs)
- return TALER_EC_TIP_PICKUP_TIP_ID_UNKNOWN;
- if (GNUNET_DB_STATUS_SOFT_ERROR == qs)
- goto RETRY;
- return TALER_EC_TIP_PICKUP_DB_ERROR_HARD;
- }
-
- /* Check if pickup_id already exists */
- {
- struct TALER_Amount existing_amount;
- struct GNUNET_PQ_QueryParam params[] = {
- GNUNET_PQ_query_param_auto_from_type (pickup_id),
- GNUNET_PQ_query_param_auto_from_type (tip_id),
- GNUNET_PQ_query_param_end
- };
- struct GNUNET_PQ_ResultSpec rs[] = {
- TALER_PQ_RESULT_SPEC_AMOUNT ("amount",
- &existing_amount),
- GNUNET_PQ_result_spec_end
- };
-
- qs = GNUNET_PQ_eval_prepared_singleton_select (pg->conn,
- "lookup_amount_by_pickup",
- params,
- rs);
- if (0 > qs)
- {
- /* DB error */
- memset (reserve_priv,
- 0,
- sizeof (*reserve_priv));
- postgres_rollback (pg);
- if (GNUNET_DB_STATUS_SOFT_ERROR == qs)
- goto RETRY;
- return TALER_EC_TIP_PICKUP_DB_ERROR_HARD;
- }
- if (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT == qs)
- {
- if (0 !=
- TALER_amount_cmp (&existing_amount,
- amount))
- {
- GNUNET_break_op (0);
- postgres_rollback (pg);
- return TALER_EC_TIP_PICKUP_AMOUNT_CHANGED;
- }
- qs = postgres_commit (pg);
- if (qs < 0)
- return (GNUNET_DB_STATUS_SOFT_ERROR == qs)
- ? TALER_EC_TIP_PICKUP_DB_ERROR_SOFT
- : TALER_EC_TIP_PICKUP_DB_ERROR_HARD;
- return TALER_EC_NONE; /* we are done! */
- }
- }
-
- /* Calculate new balance */
- {
- struct TALER_Amount new_left;
-
- if (0 >
- TALER_amount_subtract (&new_left,
- &left_amount,
- amount))
- {
- /* attempt to take more tips than the tipping amount */
- GNUNET_break_op (0);
- memset (reserve_priv,
- 0,
- sizeof (*reserve_priv));
- postgres_rollback (pg);
- return TALER_EC_TIP_PICKUP_NO_FUNDS;
- }
-
- /* Update DB: update balance */
- {
- struct GNUNET_PQ_QueryParam params[] = {
- GNUNET_PQ_query_param_auto_from_type (tip_id),
- TALER_PQ_query_param_amount (&new_left),
- GNUNET_PQ_query_param_end
- };
-
- qs = GNUNET_PQ_eval_prepared_non_select (pg->conn,
- "update_tip_balance",
- params);
- if (0 > qs)
- {
- postgres_rollback (pg);
- memset (reserve_priv,
- 0,
- sizeof (*reserve_priv));
- if (GNUNET_DB_STATUS_SOFT_ERROR == qs)
- goto RETRY;
- return TALER_EC_TIP_PICKUP_DB_ERROR_HARD;
- }
- }
-
- /* Update DB: remember pickup_id */
- {
- struct GNUNET_PQ_QueryParam params[] = {
- GNUNET_PQ_query_param_auto_from_type (tip_id),
- GNUNET_PQ_query_param_auto_from_type (pickup_id),
- TALER_PQ_query_param_amount (amount),
- GNUNET_PQ_query_param_end
- };
-
- qs = GNUNET_PQ_eval_prepared_non_select (pg->conn,
- "insert_pickup_id",
- params);
- if (0 > qs)
- {
- postgres_rollback (pg);
- memset (reserve_priv,
- 0,
- sizeof (*reserve_priv));
- if (GNUNET_DB_STATUS_SOFT_ERROR == qs)
- goto RETRY;
- return TALER_EC_TIP_PICKUP_DB_ERROR_HARD;
- }
- }
- }
- qs = postgres_commit (pg);
- if (0 <= qs)
- return TALER_EC_NONE; /* success */
- if (GNUNET_DB_STATUS_SOFT_ERROR == qs)
- goto RETRY;
- return TALER_EC_TIP_PICKUP_DB_ERROR_HARD;
-}
-
-
/**
* Initialize Postgres database subsystem.
*
@@ -7827,229 +7109,6 @@ libtaler_plugin_merchantdb_postgres_init (void *cls)
" FROM merchant_tip_pickups"
" WHERE pickup_id=$1",
3),
-
- /* OLD API: */
-#if 0
- GNUNET_PQ_make_prepare ("insert_contract_terms",
- "INSERT INTO merchant_contract_terms"
- "(order_id"
- ",merchant_pub"
- ",timestamp"
- ",contract_terms"
- ",h_contract_terms)"
- " VALUES "
- "($1, $2, $3, $4, $5)",
- 5),
- GNUNET_PQ_make_prepare ("insert_session_info",
- "INSERT INTO merchant_session_info"
- "(session_id"
- ",fulfillment_url"
- ",order_id"
- ",merchant_pub"
- ",timestamp)"
- " VALUES "
- "($1, $2, $3, $4, $5)",
- 5),
- GNUNET_PQ_make_prepare ("find_contract_terms_from_hash",
- "SELECT"
- " contract_terms"
- " FROM merchant_contract_terms"
- " WHERE h_contract_terms=$1"
- " AND merchant_pub=$2",
- 2),
- GNUNET_PQ_make_prepare ("find_paid_contract_terms_from_hash",
- "SELECT"
- " contract_terms"
- " FROM merchant_contract_terms"
- " WHERE h_contract_terms=$1"
- " AND merchant_pub=$2"
- " AND paid=TRUE",
- 2),
- GNUNET_PQ_make_prepare ("find_refunds",
- "SELECT"
- " refund_amount_val"
- ",refund_amount_frac"
- " FROM merchant_refunds"
- " WHERE coin_pub=$1",
- 1),
- GNUNET_PQ_make_prepare ("find_deposits",
- "SELECT"
- " coin_pub"
- ",exchange_url"
- ",amount_with_fee_val"
- ",amount_with_fee_frac"
- ",deposit_fee_val"
- ",deposit_fee_frac"
- ",refund_fee_val"
- ",refund_fee_frac"
- ",wire_fee_val"
- ",wire_fee_frac"
- ",exchange_proof"
- " FROM merchant_deposits"
- " WHERE h_contract_terms=$1"
- " AND merchant_pub=$2",
- 2),
- GNUNET_PQ_make_prepare ("find_deposits_by_hash_and_coin",
- "SELECT"
- " amount_with_fee_val"
- ",amount_with_fee_frac"
- ",deposit_fee_val"
- ",deposit_fee_frac"
- ",refund_fee_val"
- ",refund_fee_frac"
- ",wire_fee_val"
- ",wire_fee_frac"
- ",exchange_url"
- ",exchange_proof"
- " FROM merchant_deposits"
- " WHERE h_contract_terms=$1"
- " AND merchant_pub=$2"
- " AND coin_pub=$3",
- 3),
- GNUNET_PQ_make_prepare ("find_transfers_by_hash",
- "SELECT"
- " coin_pub"
- ",wtid"
- ",merchant_proofs.execution_time"
- ",merchant_proofs.proof"
- " FROM merchant_transfers"
- " JOIN merchant_proofs USING (wtid)"
- " WHERE h_contract_terms=$1",
- 1),
- GNUNET_PQ_make_prepare ("find_deposits_by_wtid",
- "SELECT"
- " merchant_transfers.h_contract_terms"
- ",merchant_transfers.coin_pub"
- ",merchant_deposits.amount_with_fee_val"
- ",merchant_deposits.amount_with_fee_frac"
- ",merchant_deposits.deposit_fee_val"
- ",merchant_deposits.deposit_fee_frac"
- ",merchant_deposits.refund_fee_val"
- ",merchant_deposits.refund_fee_frac"
- ",merchant_deposits.wire_fee_val"
- ",merchant_deposits.wire_fee_frac"
- ",merchant_deposits.exchange_url"
- ",merchant_deposits.exchange_proof"
- " FROM merchant_transfers"
- " JOIN merchant_deposits"
- " USING (h_contract_terms,coin_pub)"
- " WHERE wtid=$1",
- 1),
- GNUNET_PQ_make_prepare ("find_proof_by_wtid",
- "SELECT"
- " proof"
- " FROM merchant_proofs"
- " WHERE wtid=$1"
- " AND exchange_url=$2",
- 2),
- GNUNET_PQ_make_prepare ("lookup_tip_reserve_balance",
- "SELECT"
- " expiration"
- ",balance_val"
- ",balance_frac"
- " FROM merchant_tip_reserves"
- " WHERE reserve_priv=$1",
- 1),
- GNUNET_PQ_make_prepare ("find_tip_authorizations",
- "SELECT"
- " amount_val"
- ",amount_frac"
- ",justification"
- ",extra"
- ",tip_id"
- " FROM merchant_tips"
- " WHERE reserve_priv=$1",
- 1),
- GNUNET_PQ_make_prepare ("update_tip_reserve_balance",
- "UPDATE merchant_tip_reserves SET"
- " expiration=$2"
- ",balance_val=$3"
- ",balance_frac=$4"
- " WHERE reserve_priv=$1",
- 4),
- GNUNET_PQ_make_prepare ("insert_tip_reserve_balance",
- "INSERT INTO merchant_tip_reserves"
- "(reserve_priv"
- ",expiration"
- ",balance_val"
- ",balance_frac"
- ") VALUES "
- "($1, $2, $3, $4)",
- 4),
- GNUNET_PQ_make_prepare ("insert_tip_justification",
- "INSERT INTO merchant_tips"
- "(reserve_priv"
- ",tip_id"
- ",exchange_url"
- ",justification"
- ",extra"
- ",timestamp"
- ",amount_val"
- ",amount_frac"
- ",left_val"
- ",left_frac"
- ") VALUES "
- "($1, $2, $3, $4, $5, $6, $7, $8, $9, $10)",
- 10),
- GNUNET_PQ_make_prepare ("lookup_reserve_by_tip_id",
- "SELECT"
- " reserve_priv"
- ",left_val"
- ",left_frac"
- " FROM merchant_tips"
- " WHERE tip_id=$1",
- 1),
- GNUNET_PQ_make_prepare ("lookup_amount_by_pickup",
- "SELECT"
- " amount_val"
- ",amount_frac"
- " FROM merchant_tip_pickups"
- " WHERE pickup_id=$1"
- " AND tip_id=$2",
- 2),
- GNUNET_PQ_make_prepare ("find_tip_by_id",
- "SELECT"
- " exchange_url"
- ",extra"
- ",timestamp"
- ",amount_val"
- ",amount_frac"
- ",left_val"
- ",left_frac"
- " FROM merchant_tips"
- " WHERE tip_id=$1",
- 1),
- GNUNET_PQ_make_prepare ("update_tip_balance",
- "UPDATE merchant_tips SET"
- " left_val=$2"
- ",left_frac=$3"
- " WHERE tip_id=$1",
- 3),
- GNUNET_PQ_make_prepare ("insert_pickup_id",
- "INSERT INTO merchant_tip_pickups"
- "(tip_id"
- ",pickup_id"
- ",amount_val"
- ",amount_frac"
- ") VALUES "
- "($1, $2, $3, $4)",
- 4),
- GNUNET_PQ_make_prepare ("insert_tip_credit_uuid",
- "INSERT INTO merchant_tip_reserve_credits"
- "(reserve_priv"
- ",credit_uuid"
- ",timestamp"
- ",amount_val"
- ",amount_frac"
- ") VALUES "
- "($1, $2, $3, $4, $5)",
- 5),
- GNUNET_PQ_make_prepare ("lookup_tip_credit_uuid",
- "SELECT 1 "
- "FROM merchant_tip_reserve_credits "
- "WHERE credit_uuid=$1 AND reserve_priv=$2",
- 2),
-#endif
GNUNET_PQ_PREPARED_STATEMENT_END
};
@@ -8140,6 +7199,7 @@ libtaler_plugin_merchantdb_postgres_init (void *cls)
plugin->lookup_transfer_summary = &postgres_lookup_transfer_summary;
plugin->lookup_transfer_details = &postgres_lookup_transfer_details;
plugin->lookup_transfers = &postgres_lookup_transfers;
+ plugin->store_wire_fee_by_exchange = &postgres_store_wire_fee_by_exchange;
plugin->insert_reserve = &postgres_insert_reserve;
plugin->lookup_reserves = &postgres_lookup_reserves;
plugin->lookup_reserve = &postgres_lookup_reserve;
@@ -8152,17 +7212,6 @@ libtaler_plugin_merchantdb_postgres_init (void *cls)
plugin->insert_pickup = &postgres_insert_pickup;
plugin->insert_pickup_blind_signature =
&postgres_insert_pickup_blind_signature;
- /* OLD API: */
-
- plugin->store_coin_to_transfer = &postgres_store_coin_to_transfer;
- plugin->store_transfer_to_proof = &postgres_store_transfer_to_proof;
- plugin->store_wire_fee_by_exchange = &postgres_store_wire_fee_by_exchange;
- plugin->find_proof_by_wtid = &postgres_find_proof_by_wtid;
- plugin->get_authorized_tip_amount = &postgres_get_authorized_tip_amount;
- plugin->enable_tip_reserve_TR = &postgres_enable_tip_reserve_TR;
- plugin->lookup_tip_by_id = &postgres_lookup_tip_by_id;
- plugin->pickup_tip_TR = &postgres_pickup_tip_TR;
-
return plugin;
}