diff options
Diffstat (limited to 'src/backenddb/pg_insert_transfer_details.c')
-rw-r--r-- | src/backenddb/pg_insert_transfer_details.c | 60 |
1 files changed, 36 insertions, 24 deletions
diff --git a/src/backenddb/pg_insert_transfer_details.c b/src/backenddb/pg_insert_transfer_details.c index a4f69989..66859649 100644 --- a/src/backenddb/pg_insert_transfer_details.c +++ b/src/backenddb/pg_insert_transfer_details.c @@ -87,35 +87,47 @@ TMH_PG_insert_transfer_details ( ",offset_in_exchange_list" ",exchange_deposit_value" ",exchange_deposit_fee) " - "SELECT deposit_serial, $1, $2, $3, $4" - " FROM merchant_deposits" - " JOIN merchant_contract_terms USING (order_serial)" - " WHERE coin_pub=$5" - " AND h_contract_terms=$6" - " AND merchant_serial=" + "SELECT dep.deposit_serial, $1, $2, $3, $4" + " FROM merchant_deposits dep" + " JOIN merchant_deposit_confirmations dcon" + " USING (deposit_confirmation_serial)" + " JOIN merchant_contract_terms cterm" + " USING (order_serial)" + " WHERE dep.coin_pub=$5" + " AND cterm.h_contract_terms=$6" + " AND cterm.merchant_serial=" " (SELECT merchant_serial" " FROM merchant_instances" " WHERE merchant_id=$7)"); PREPARE (pg, "update_wired_by_coin_pub", - "WITH os AS" /* select orders affected by the coin */ - "(SELECT order_serial" - " FROM merchant_deposits" - " WHERE coin_pub=$1)" + "WITH affected_orders AS" /* select orders affected by the coin */ + "(SELECT mcon.order_serial" + " FROM merchant_deposits dep" + /* Next 2 joins ensure transfers exist in the first place */ + " JOIN merchant_deposit_to_transfer" + " USING (deposit_serial)" + " JOIN merchant_transfers mtrans" + " USING (credit_serial)" + " JOIN merchant_deposit_confirmations mcon" + " USING (deposit_confirmation_serial)" + " WHERE dep.coin_pub=$1)" "UPDATE merchant_contract_terms " " SET wired=TRUE " " WHERE order_serial IN " - " (SELECT order_serial FROM merchant_deposits" /* only orders for which NO un-wired coin exists*/ + " (SELECT order_serial" + " FROM merchant_deposit_confirmations dcon" + " JOIN affected_orders" + " USING (order_serial)" " WHERE NOT EXISTS " - " (SELECT order_serial FROM merchant_deposits" /* orders for which ANY un-wired coin exists */ - " JOIN os USING (order_serial)" /* filter early */ - " WHERE deposit_serial NOT IN" - " (SELECT deposit_serial " /* all coins associated with order that WERE wired */ - " FROM merchant_deposits " - " JOIN os USING (order_serial)" /* filter early */ - " JOIN merchant_deposit_to_transfer USING (deposit_serial)" - " JOIN merchant_transfers USING (credit_serial)" - " WHERE confirmed=TRUE)))"); + " (SELECT 1" + " FROM merchant_deposits dep" + " JOIN merchant_deposit_to_transfer" + " USING (deposit_serial)" + " JOIN merchant_transfers mtrans" + " USING (credit_serial)" + " WHERE dep.deposit_confirmation_serial = dcon.deposit_confirmation_serial" + " AND NOT mtrans.confirmed))"); RETRY: if (MAX_RETRIES < ++retries) @@ -175,9 +187,9 @@ RETRY: struct GNUNET_PQ_QueryParam params[] = { GNUNET_PQ_query_param_uint64 (&credit_serial), TALER_PQ_query_param_amount_with_currency (pg->conn, - &td->total_amount), + &td->total_amount), TALER_PQ_query_param_amount_with_currency (pg->conn, - &td->wire_fee), + &td->wire_fee), GNUNET_PQ_query_param_timestamp (&td->execution_time), GNUNET_PQ_query_param_auto_from_type (&td->exchange_sig), GNUNET_PQ_query_param_auto_from_type (&td->exchange_pub), @@ -219,9 +231,9 @@ RETRY: GNUNET_PQ_query_param_uint64 (&credit_serial), GNUNET_PQ_query_param_uint64 (&i64), TALER_PQ_query_param_amount_with_currency (pg->conn, - &d->coin_value), + &d->coin_value), TALER_PQ_query_param_amount_with_currency (pg->conn, - &d->coin_fee), /* deposit fee */ + &d->coin_fee), /* deposit fee */ GNUNET_PQ_query_param_auto_from_type (&d->coin_pub), GNUNET_PQ_query_param_auto_from_type (&d->h_contract_terms), GNUNET_PQ_query_param_string (instance_id), |