diff --git a/src/exchangedb/exchange_do_age_withdraw.sql b/src/exchangedb/exchange_do_age_withdraw.sql index 756c00851..184a3e49a 100644 --- a/src/exchangedb/exchange_do_age_withdraw.sql +++ b/src/exchangedb/exchange_do_age_withdraw.sql @@ -36,10 +36,9 @@ CREATE OR REPLACE FUNCTION exchange_do_age_withdraw( LANGUAGE plpgsql AS $$ DECLARE - reserve_gc INT8; + reserve RECORD; difference RECORD; balance taler_amount; - new_balance taler_amount; not_before date; earliest_date date; BEGIN @@ -49,15 +48,8 @@ BEGIN -- reserves_in by reserve_pub (SELECT) -- wire_targets by wire_target_h_payto -SELECT - current_balance - ,gc_date - ,birthday - INTO - balance.val - ,balance.frac - ,reserve_gc - ,reserve_birthday +SELECT * + INTO reserve FROM exchange.reserves WHERE reserves.reserve_pub=rpub; @@ -74,10 +66,13 @@ END IF; reserve_found = TRUE; conflict=FALSE; -- not really yet determined +balance = reserve.current_balance; +reserve_birthday = reserve.birthday; + -- Check age requirements -IF (reserve_birthday <> 0) +IF (reserve.birthday <> 0) THEN - not_before=date '1970-01-01' + reserve_birthday; + not_before=date '1970-01-01' + reserve.birthday; earliest_date = current_date - make_interval(maximum_age_committed); -- -- 1970-01-01 + birthday == not_before now @@ -103,12 +98,9 @@ required_age=0; -- Check reserve balance is sufficient. SELECT * -INTO - difference -FROM - amount_left_minus_right( - balance - ,amount_with_fee); +INTO difference +FROM amount_left_minus_right(balance + ,amount_with_fee); balance_ok = difference.ok; @@ -117,15 +109,15 @@ THEN RETURN; END IF; -new_balance = difference.diff; +balance = difference.diff; -- Calculate new expiration dates. -min_reserve_gc=GREATEST(min_reserve_gc,reserve_gc); +min_reserve_gc=GREATEST(min_reserve_gc,reserve.gc_date); -- Update reserve balance. UPDATE reserves SET gc_date=min_reserve_gc - ,current_balance=new_balance + ,current_balance=balance WHERE reserves.reserve_pub=rpub; diff --git a/src/exchangedb/exchange_do_batch_withdraw.sql b/src/exchangedb/exchange_do_batch_withdraw.sql index ba364ddae..b896e04f2 100644 --- a/src/exchangedb/exchange_do_batch_withdraw.sql +++ b/src/exchangedb/exchange_do_batch_withdraw.sql @@ -30,9 +30,8 @@ CREATE OR REPLACE FUNCTION exchange_do_batch_withdraw( LANGUAGE plpgsql AS $$ DECLARE - reserve_gc INT8; - reserve taler_amount; - reserve_birthday INT4; + reserve RECORD; + balance taler_amount; not_before date; BEGIN -- Shards: reserves by reserve_pub (SELECT) @@ -42,18 +41,8 @@ BEGIN -- wire_targets by wire_target_h_payto -SELECT - current_balance.val - ,current_balance.frac - ,gc_date - ,birthday - ,reserve_uuid - INTO - reserve.val - ,reserve.frac - ,reserve_gc - ,reserve_birthday - ,ruuid +SELECT * + INTO reserve FROM exchange.reserves WHERE reserves.reserve_pub=rpub; @@ -68,9 +57,10 @@ THEN RETURN; END IF; +ruuid = reserve.reserve_uuid; -- Check if age requirements are present -IF ((NOT do_age_check) OR (reserve_birthday = 0)) +IF ((NOT do_age_check) OR (reserve.birthday = 0)) THEN age_ok = TRUE; allowed_maximum_age = -1; @@ -80,7 +70,7 @@ ELSE -- birthday set (reserve_birthday != 0), but the client called the -- batch-withdraw endpoint instead of the age-withdraw endpoint, which it -- should have. - not_before=date '1970-01-01' + reserve_birthday; + not_before=date '1970-01-01' + reserve.birthday; allowed_maximum_age = extract(year from age(current_date, not_before)); reserve_found=TRUE; @@ -89,22 +79,24 @@ ELSE RETURN; END IF; +balance = reserve.current_balance; + -- Check reserve balance is sufficient. -IF (reserve.val > amount.val) +IF (balance.val > amount.val) THEN - IF (reserve.frac >= amount.frac) + IF (balance.frac >= amount.frac) THEN - reserve.val=reserve.val - amount.val; - reserve.frac=reserve.frac - amount.frac; + balance.val=balance.val - amount.val; + balance.frac=balance.frac - amount.frac; ELSE - reserve.val=reserve.val - amount.val - 1; - reserve.frac=reserve.frac + 100000000 - amount.frac; + balance.val=balance.val - amount.val - 1; + balance.frac=balance.frac + 100000000 - amount.frac; END IF; ELSE - IF (reserve.val = amount.val) AND (reserve.frac >= amount.frac) + IF (balance.val = amount.val) AND (balance.frac >= amount.frac) THEN - reserve.val=0; - reserve.frac=reserve.frac - amount.frac; + balance.val=0; + balance.frac=balance.frac - amount.frac; ELSE balance_ok=FALSE; RETURN; @@ -112,12 +104,12 @@ ELSE END IF; -- Calculate new expiration dates. -min_reserve_gc=GREATEST(min_reserve_gc,reserve_gc); +min_reserve_gc=GREATEST(min_reserve_gc,reserve.gc_date); -- Update reserve balance. UPDATE reserves SET gc_date=min_reserve_gc - ,current_balance=reserve + ,current_balance=balance WHERE reserves.reserve_pub=rpub; diff --git a/src/exchangedb/exchange_do_batch_withdraw_insert.sql b/src/exchangedb/exchange_do_batch_withdraw_insert.sql index b580f6fb7..fd00754ad 100644 --- a/src/exchangedb/exchange_do_batch_withdraw_insert.sql +++ b/src/exchangedb/exchange_do_batch_withdraw_insert.sql @@ -16,8 +16,7 @@ CREATE OR REPLACE FUNCTION exchange_do_batch_withdraw_insert( IN cs_nonce BYTEA, - IN amount_val INT8, - IN amount_frac INT4, + IN amount taler_amount, IN h_denom_pub BYTEA, -- FIXME: denom_serials should really be a parameter to this FUNCTION. IN ruuid INT8, IN reserve_sig BYTEA, @@ -74,8 +73,8 @@ VALUES ,ruuid ,reserve_sig ,now - ,amount_val - ,amount_frac) + ,amount.val + ,amount.frac) ON CONFLICT DO NOTHING; IF NOT FOUND @@ -119,6 +118,6 @@ END IF; END $$; -COMMENT ON FUNCTION exchange_do_batch_withdraw_insert(BYTEA, INT8, INT4, BYTEA, INT8, BYTEA, BYTEA, BYTEA, INT8) +COMMENT ON FUNCTION exchange_do_batch_withdraw_insert(BYTEA, taler_amount, BYTEA, INT8, BYTEA, BYTEA, BYTEA, INT8) IS 'Stores information about a planchet for a batch withdraw operation. Checks if the planchet already exists, and in that case indicates a conflict'; diff --git a/src/exchangedb/exchange_do_gc.sql b/src/exchangedb/exchange_do_gc.sql index 07cbeb42b..75dd120d7 100644 --- a/src/exchangedb/exchange_do_gc.sql +++ b/src/exchangedb/exchange_do_gc.sql @@ -37,8 +37,7 @@ DELETE FROM exchange.wire_fee -- TODO: use closing fee as threshold? DELETE FROM exchange.reserves WHERE gc_date < in_now - AND current_balance.val = 0 - AND current_balance.frac = 0; + AND current_balance = (0, 0); SELECT reserve_out_serial_id diff --git a/src/exchangedb/exchange_do_history_request.sql b/src/exchangedb/exchange_do_history_request.sql index 7eb368ef3..5cd15bc62 100644 --- a/src/exchangedb/exchange_do_history_request.sql +++ b/src/exchangedb/exchange_do_history_request.sql @@ -19,12 +19,15 @@ CREATE OR REPLACE FUNCTION exchange_do_history_request( IN in_reserve_pub BYTEA, IN in_reserve_sig BYTEA, IN in_request_timestamp INT8, - IN in_history_fee_val INT8, - IN in_history_fee_frac INT4, + IN in_history_fee taler_amount, OUT out_balance_ok BOOLEAN, OUT out_idempotent BOOLEAN) LANGUAGE plpgsql AS $$ +DECLARE + reserve RECORD; + balance taler_amount; + new_balance taler_amount; BEGIN -- Insert and check for idempotency. @@ -38,8 +41,8 @@ BEGIN (in_reserve_pub ,in_request_timestamp ,in_reserve_sig - ,in_history_fee_val - ,in_history_fee_frac) + ,in_history_fee.val + ,in_history_fee.frac) ON CONFLICT DO NOTHING; IF NOT FOUND @@ -51,35 +54,51 @@ BEGIN out_idempotent=FALSE; - -- Update reserve balance. - UPDATE exchange.reserves - SET - current_balance.frac=current_balance.frac-in_history_fee_frac - + CASE - WHEN current_balance.frac < in_history_fee_frac - THEN 100000000 - ELSE 0 - END, - current_balance.val=current_balance.val-in_history_fee_val - - CASE - WHEN current_balance.frac < in_history_fee_frac - THEN 1 - ELSE 0 - END - WHERE - reserve_pub=in_reserve_pub - AND ( (current_balance.val > in_history_fee_val) OR - ( (current_balance.frac >= in_history_fee_frac) AND - (current_balance.val >= in_history_fee_val) ) ); + SELECT * + INTO reserve + FROM exchange.reserves + WHERE reserve_pub=in_reserve_pub; IF NOT FOUND THEN - -- Either reserve does not exist, or balance insufficient. - -- Both we treat the same here as balance insufficient. + -- Reserve does not exist, we treat it the same here + -- as balance insufficient. out_balance_ok=FALSE; RETURN; END IF; + balance = reserve.current_balance; + + -- check balance + IF ( (balance.val <= in_history_fee.val) AND + ( (balance.frac < in_history_fee.frac) OR + (balance.val < in_history_fee.val) ) ) + THEN + out_balance_ok=FALSE; + RETURN; + END IF; + + new_balance.frac=balance.frac-in_history_fee.frac + + CASE + WHEN balance.frac < in_history_fee.frac + THEN 100000000 + ELSE 0 + END; + new_balance.val=balance.val-in_history_fee.val + - CASE + WHEN balance.frac < in_history_fee.frac + THEN 1 + ELSE 0 + END; + + -- Update reserve balance. + UPDATE exchange.reserves + SET current_balance=new_balance + WHERE reserve_pub=in_reserve_pub; + + ASSERT FOUND, 'reserve suddenly disappeared'; + out_balance_ok=TRUE; + END $$; diff --git a/src/exchangedb/exchange_do_purse_deposit.sql b/src/exchangedb/exchange_do_purse_deposit.sql index 5e9f71bb5..45bdcdf68 100644 --- a/src/exchangedb/exchange_do_purse_deposit.sql +++ b/src/exchangedb/exchange_do_purse_deposit.sql @@ -17,12 +17,10 @@ CREATE OR REPLACE FUNCTION exchange_do_purse_deposit( IN in_partner_id INT8, IN in_purse_pub BYTEA, - IN in_amount_with_fee_val INT8, - IN in_amount_with_fee_frac INT4, + IN in_amount_with_fee taler_amount, IN in_coin_pub BYTEA, IN in_coin_sig BYTEA, - IN in_amount_without_fee_val INT8, - IN in_amount_without_fee_frac INT4, + IN in_amount_without_fee taler_amount, IN in_reserve_expiration INT8, IN in_now INT8, OUT out_balance_ok BOOLEAN, @@ -51,8 +49,8 @@ INSERT INTO exchange.purse_deposits (in_partner_id ,in_purse_pub ,in_coin_pub - ,in_amount_with_fee_val - ,in_amount_with_fee_frac + ,in_amount_with_fee.val + ,in_amount_with_fee.frac ,in_coin_sig) ON CONFLICT DO NOTHING; @@ -100,22 +98,22 @@ END IF; -- Check and update balance of the coin. UPDATE known_coins SET - remaining_frac=remaining_frac-in_amount_with_fee_frac + remaining_frac=remaining_frac-in_amount_with_fee.frac + CASE - WHEN remaining_frac < in_amount_with_fee_frac + WHEN remaining_frac < in_amount_with_fee.frac THEN 100000000 ELSE 0 END, - remaining_val=remaining_val-in_amount_with_fee_val + remaining_val=remaining_val-in_amount_with_fee.val - CASE - WHEN remaining_frac < in_amount_with_fee_frac + WHEN remaining_frac < in_amount_with_fee.frac THEN 1 ELSE 0 END WHERE coin_pub=in_coin_pub - AND ( (remaining_val > in_amount_with_fee_val) OR - ( (remaining_frac >= in_amount_with_fee_frac) AND - (remaining_val >= in_amount_with_fee_val) ) ); + AND ( (remaining_val > in_amount_with_fee.val) OR + ( (remaining_frac >= in_amount_with_fee.frac) AND + (remaining_val >= in_amount_with_fee.val) ) ); IF NOT FOUND THEN @@ -130,15 +128,15 @@ END IF; -- Credit the purse. UPDATE purse_requests SET - balance_frac=balance_frac+in_amount_without_fee_frac + balance_frac=balance_frac+in_amount_without_fee.frac - CASE - WHEN balance_frac+in_amount_without_fee_frac >= 100000000 + WHEN balance_frac+in_amount_without_fee.frac >= 100000000 THEN 100000000 ELSE 0 END, - balance_val=balance_val+in_amount_without_fee_val + balance_val=balance_val+in_amount_without_fee.val + CASE - WHEN balance_frac+in_amount_without_fee_frac >= 100000000 + WHEN balance_frac+in_amount_without_fee.frac >= 100000000 THEN 1 ELSE 0 END @@ -239,15 +237,15 @@ ELSE -- Reserve existed, thus UPDATE instead of INSERT. UPDATE reserves SET - current_balance.frac=current_balance.frac+my_amount.frac + current_balance.frac=(current_balance).frac+my_amount.frac - CASE - WHEN current_balance.frac + my_amount.frac >= 100000000 + WHEN (current_balance).frac + my_amount.frac >= 100000000 THEN 100000000 ELSE 0 END - ,current_balance.val=current.balance_val+my_amount.val + ,current_balance.val=(current_balance).val+my_amount.val + CASE - WHEN current_balance.frac + my_amount.frac >= 100000000 + WHEN (current_balance).frac + my_amount.frac >= 100000000 THEN 1 ELSE 0 END diff --git a/src/exchangedb/exchange_do_purse_merge.sql b/src/exchangedb/exchange_do_purse_merge.sql index 85bae999f..9780c016c 100644 --- a/src/exchangedb/exchange_do_purse_merge.sql +++ b/src/exchangedb/exchange_do_purse_merge.sql @@ -33,6 +33,8 @@ DECLARE my_purse_fee taler_amount; my_partner_serial_id INT8; my_in_reserve_quota BOOLEAN; + reserve RECORD; + balance taler_amount; BEGIN @@ -195,20 +197,27 @@ ELSE my_amount.val = my_amount.val + my_amount.frac / 100000000; my_amount.frac = my_amount.frac % 100000000; + SELECT * + INTO reserve + FROM exchange.reserves + WHERE reserve_pub=in_reserve_pub; + + balance = reserve.current_balance; + balance.frac=balance.frac+my_amount.frac + - CASE + WHEN balance.frac + my_amount.frac >= 100000000 + THEN 100000000 + ELSE 0 + END; + balance.val=balance.val+my_amount.val + + CASE + WHEN balance.frac + my_amount.frac >= 100000000 + THEN 1 + ELSE 0 + END; + UPDATE exchange.reserves - SET - current_balance.frac=current_balance.frac+my_amount.frac - - CASE - WHEN current_balance.frac + my_amount.frac >= 100000000 - THEN 100000000 - ELSE 0 - END, - current_balance.val=current.balance_val+my.amount_val - + CASE - WHEN current_balance.frac + my_amount.frac >= 100000000 - THEN 1 - ELSE 0 - END + SET current_balance=balance WHERE reserve_pub=in_reserve_pub; END IF; diff --git a/src/exchangedb/exchange_do_recoup_to_reserve.sql b/src/exchangedb/exchange_do_recoup_to_reserve.sql index 72942e8c5..71c1d51b9 100644 --- a/src/exchangedb/exchange_do_recoup_to_reserve.sql +++ b/src/exchangedb/exchange_do_recoup_to_reserve.sql @@ -32,6 +32,9 @@ LANGUAGE plpgsql AS $$ DECLARE tmp taler_amount; -- amount recouped + balance taler_amount; -- current balance of the reserve + new_balance taler_amount; -- new balance of the reserve + reserve RECORD; BEGIN -- Shards: SELECT known_coins (by coin_pub) -- SELECT recoup (by coin_pub) @@ -81,22 +84,31 @@ UPDATE known_coins ,remaining_val=0 WHERE coin_pub=in_coin_pub; +-- Get current balance +SELECT * + INTO reserve + FROM reserves + WHERE reserve_pub=in_reserve_pub; + +balance = reserve.current_balance; +new_balance.frac=balance.frac+tmp.frac + - CASE + WHEN balance.frac+tmp.frac >= 100000000 + THEN 100000000 + ELSE 0 + END; + +new_balance.val=balance.val+tmp.val + + CASE + WHEN balance.frac+tmp.frac >= 100000000 + THEN 1 + ELSE 0 + END; -- Credit the reserve and update reserve timers. UPDATE reserves SET - current_balance.frac=current_balance.frac+tmp.frac - - CASE - WHEN current_balance.frac+tmp.frac >= 100000000 - THEN 100000000 - ELSE 0 - END, - current_balance.val=current_balance.val+tmp.val - + CASE - WHEN current_balance.frac+tmp.frac >= 100000000 - THEN 1 - ELSE 0 - END, + current_balance = new_balance, gc_date=GREATEST(gc_date, in_reserve_gc), expiration_date=GREATEST(expiration_date, in_reserve_expiration) WHERE reserve_pub=in_reserve_pub; diff --git a/src/exchangedb/exchange_do_reserve_open.sql b/src/exchangedb/exchange_do_reserve_open.sql index d97b44496..7aca78b8c 100644 --- a/src/exchangedb/exchange_do_reserve_open.sql +++ b/src/exchangedb/exchange_do_reserve_open.sql @@ -37,25 +37,15 @@ DECLARE my_years_tmp INT4; my_years INT4; my_needs_update BOOL; - my_purses_allowed INT8; my_expiration_date INT8; - my_reserve_expiration INT8; + reserve RECORD; BEGIN -- FIXME: use SELECT FOR UPDATE? -SELECT - purses_allowed - ,expiration_date - ,current_balance.val - ,current_balance.frac -INTO - my_purses_allowed - ,my_reserve_expiration - ,my_balance.val - ,my_balance.frac -FROM reserves -WHERE - reserve_pub=in_reserve_pub; +SELECT * + INTO reserve + FROM reserves + WHERE reserve_pub=in_reserve_pub; IF NOT FOUND THEN @@ -64,12 +54,14 @@ THEN RETURN; END IF; +my_balance = reserve.current_balance; + -- Do not allow expiration time to start in the past already -IF (my_reserve_expiration < in_now) +IF (reserve.expiration_date < in_now) THEN my_expiration_date = in_now; ELSE - my_expiration_date = my_reserve_expiration; + my_expiration_date = reserve.expiration_date; END IF; my_cost.val = 0; @@ -81,18 +73,18 @@ my_years = 0; IF (my_expiration_date < in_desired_expiration) THEN my_years = (31535999999999 + in_desired_expiration - my_expiration_date) / 31536000000000; - my_purses_allowed = in_default_purse_limit; + reserve.purses_allowed = in_default_purse_limit; my_expiration_date = my_expiration_date + 31536000000000 * my_years; END IF; -- Increase years based on purses requested -IF (my_purses_allowed < in_min_purse_limit) +IF (reserve.purses_allowed < in_min_purse_limit) THEN my_years = (31535999999999 + in_desired_expiration - in_now) / 31536000000000; my_expiration_date = in_now + 31536000000000 * my_years; - my_years_tmp = (in_min_purse_limit + in_default_purse_limit - my_purses_allowed - 1) / in_default_purse_limit; + my_years_tmp = (in_min_purse_limit + in_default_purse_limit - reserve.purses_allowed - 1) / in_default_purse_limit; my_years = my_years + my_years_tmp; - my_purses_allowed = my_purses_allowed + (in_default_purse_limit * my_years_tmp); + reserve.purses_allowed = reserve.purses_allowed + (in_default_purse_limit * my_years_tmp); END IF; @@ -118,7 +110,7 @@ END IF; -- check if we actually have something to do IF NOT my_needs_update THEN - out_final_expiration = my_reserve_expiration; + out_final_expiration = reserve.expiration_date; out_open_cost.val = 0; out_open_cost.frac = 0; out_no_funds=FALSE; @@ -136,7 +128,7 @@ THEN out_no_funds=FALSE; -- We must return a failure, which is indicated by -- the expiration being below the desired expiration. - IF (my_reserve_expiration >= in_desired_expiration) + IF (reserve.expiration_date >= in_desired_expiration) THEN -- This case is relevant especially if the purse -- count was to be increased and the payment was @@ -144,7 +136,7 @@ THEN RAISE NOTICE 'forcing low expiration time'; out_final_expiration = 0; ELSE - out_final_expiration = my_reserve_expiration; + out_final_expiration = reserve.expiration_date; END IF; RAISE NOTICE 'amount paid too low'; RETURN; @@ -167,7 +159,7 @@ ELSE my_balance.val=0; my_balance.frac=my_balance.frac - in_reserve_payment.frac; ELSE - out_final_expiration = my_reserve_expiration; + out_final_expiration = reserve.expiration_date; out_open_cost.val = my_cost.val; out_open_cost.frac = my_cost.frac; out_no_funds=TRUE; @@ -178,9 +170,9 @@ END IF; UPDATE reserves SET current_balance=my_balance - ,gc_date=my_reserve_expiration + in_reserve_gc_delay + ,gc_date=reserve.expiration_date + in_reserve_gc_delay ,expiration_date=my_expiration_date - ,purses_allowed=my_purses_allowed + ,purses_allowed=reserve.purses_allowed WHERE reserve_pub=in_reserve_pub; diff --git a/src/exchangedb/exchange_do_reserve_purse.sql b/src/exchangedb/exchange_do_reserve_purse.sql index abe5a749f..43d4c91a8 100644 --- a/src/exchangedb/exchange_do_reserve_purse.sql +++ b/src/exchangedb/exchange_do_reserve_purse.sql @@ -117,22 +117,22 @@ ELSE ELSE UPDATE exchange.reserves SET - current_balance.frac=current_balance.frac-in_purse_fee.frac + current_balance.frac=(current_balance).frac-in_purse_fee.frac + CASE - WHEN current_balance.frac < in_purse_fee.frac + WHEN (current_balance).frac < in_purse_fee.frac THEN 100000000 ELSE 0 END, - current_balance.val=current_balance.val-in_purse_fee.val + current_balance.val=(current_balance).val-in_purse_fee.val - CASE - WHEN current_balance.frac < in_purse_fee.frac + WHEN (current_balance).frac < in_purse_fee.frac THEN 1 ELSE 0 END WHERE reserve_pub=in_reserve_pub - AND ( (current_balance.val > in_purse_fee.val) OR - ( (current_balance.frac >= in_purse_fee.frac) AND - (current_balance.val >= in_purse_fee.val) ) ); + AND ( ((current_balance).val > in_purse_fee.val) OR + ( ((current_balance).frac >= in_purse_fee.frac) AND + ((current_balance).val >= in_purse_fee.val) ) ); IF NOT FOUND THEN out_no_funds=TRUE; diff --git a/src/exchangedb/exchange_do_reserves_in_insert.sql b/src/exchangedb/exchange_do_reserves_in_insert.sql index e7018e512..fcf8ef4c4 100644 --- a/src/exchangedb/exchange_do_reserves_in_insert.sql +++ b/src/exchangedb/exchange_do_reserves_in_insert.sql @@ -109,11 +109,8 @@ LANGUAGE plpgsql AS $$ DECLARE curs_reserve_exist REFCURSOR; -DECLARE k INT8; -DECLARE curs_transaction_exist REFCURSOR; -DECLARE i RECORD; BEGIN transaction_duplicate0 = TRUE; @@ -295,11 +292,8 @@ LANGUAGE plpgsql AS $$ DECLARE curs_reserve_exist REFCURSOR; -DECLARE k INT8; -DECLARE curs_transaction_exist REFCURSOR; -DECLARE i RECORD; BEGIN transaction_duplicate0=TRUE; @@ -587,13 +581,9 @@ LANGUAGE plpgsql AS $$ DECLARE curs_reserve_exist REFCURSOR; -DECLARE k INT8; -DECLARE curs_transaction_exist REFCURSOR; -DECLARE i RECORD; -DECLARE r RECORD; BEGIN @@ -949,13 +939,9 @@ LANGUAGE plpgsql AS $$ DECLARE curs REFCURSOR; -DECLARE conflict BOOL; -DECLARE dup BOOL; -DECLARE uuid INT8; -DECLARE i RECORD; BEGIN diff --git a/src/exchangedb/exchange_do_withdraw.sql b/src/exchangedb/exchange_do_withdraw.sql index d0d98867e..60a63e674 100644 --- a/src/exchangedb/exchange_do_withdraw.sql +++ b/src/exchangedb/exchange_do_withdraw.sql @@ -35,10 +35,9 @@ CREATE OR REPLACE FUNCTION exchange_do_withdraw( LANGUAGE plpgsql AS $$ DECLARE - reserve_gc INT8; + reserve RECORD; denom_serial INT8; - reserve taler_amount; - reserve_birthday INT4; + balance taler_amount; not_before date; BEGIN -- Shards: reserves by reserve_pub (SELECT) @@ -65,17 +64,8 @@ THEN END IF; -SELECT - current_balance - ,gc_date - ,birthday - ,reserve_uuid - INTO - reserve.val - ,reserve.frac - ,reserve_gc - ,reserve_birthday - ,ruuid +SELECT * + INTO reserve FROM exchange.reserves WHERE reserves.reserve_pub=rpub; @@ -91,8 +81,11 @@ THEN RETURN; END IF; +balance = reserve.current_balance; +ruuid = reserve.reserve_uuid; + -- Check if age requirements are present -IF ((NOT do_age_check) OR (reserve_birthday = 0)) +IF ((NOT do_age_check) OR (reserve.birthday = 0)) THEN age_ok = TRUE; allowed_maximum_age = -1; @@ -102,7 +95,7 @@ ELSE -- birthday set (reserve_birthday != 0), but the client called the -- batch-withdraw endpoint instead of the age-withdraw endpoint, which it -- should have. - not_before=date '1970-01-01' + reserve_birthday; + not_before=date '1970-01-01' + reserve.birthday; allowed_maximum_age = extract(year from age(current_date, not_before)); reserve_found=TRUE; @@ -144,21 +137,21 @@ THEN END IF; -- Check reserve balance is sufficient. -IF (reserve.val > amount.val) +IF (balance.val > amount.val) THEN - IF (reserve.frac >= amount.frac) + IF (balance.frac >= amount.frac) THEN - reserve.val=reserve.val - amount.val; - reserve.frac=reserve.frac - amount.frac; + balance.val=balance.val - amount.val; + balance.frac=balance.frac - amount.frac; ELSE - reserve.val=reserve.val - amount.val - 1; - reserve.frac=reserve.frac + 100000000 - amount.frac; + balance.val=balance.val - amount.val - 1; + balance.frac=balance.frac + 100000000 - amount.frac; END IF; ELSE - IF (reserve.val = amount.val) AND (reserve.frac >= amount.frac) + IF (balance.val = amount.val) AND (balance.frac >= amount.frac) THEN - reserve.val=0; - reserve.frac=reserve.frac - amount.frac; + balance.val=0; + balance.frac=balance.frac - amount.frac; ELSE reserve_found=TRUE; nonce_ok=TRUE; -- we do not really know @@ -168,12 +161,12 @@ ELSE END IF; -- Calculate new expiration dates. -min_reserve_gc=GREATEST(min_reserve_gc,reserve_gc); +min_reserve_gc=GREATEST(min_reserve_gc,reserve.gc_date); -- Update reserve balance. UPDATE reserves SET gc_date=min_reserve_gc - ,current_balance=reserve + ,current_balance=balance WHERE reserves.reserve_pub=rpub; diff --git a/src/exchangedb/pg_do_batch_withdraw.c b/src/exchangedb/pg_do_batch_withdraw.c index 45b1d3229..8e118a99b 100644 --- a/src/exchangedb/pg_do_batch_withdraw.c +++ b/src/exchangedb/pg_do_batch_withdraw.c @@ -43,7 +43,8 @@ TEH_PG_do_batch_withdraw ( struct PostgresClosure *pg = cls; struct GNUNET_TIME_Timestamp gc; struct GNUNET_PQ_QueryParam params[] = { - TALER_PQ_query_param_amount (amount), + TALER_PQ_query_param_amount_tuple (pg->conn, + amount), GNUNET_PQ_query_param_auto_from_type (reserve_pub), GNUNET_PQ_query_param_timestamp (&now), GNUNET_PQ_query_param_timestamp (&gc), @@ -80,7 +81,7 @@ TEH_PG_do_batch_withdraw ( ",allowed_maximum_age" ",ruuid" " FROM exchange_do_batch_withdraw" - " ($1,$2,$3,$4,$5,$6);"); + " ($1,$2,$3,$4,$5);"); return GNUNET_PQ_eval_prepared_singleton_select (pg->conn, "call_batch_withdraw", params, diff --git a/src/exchangedb/pg_do_purse_deposit.c b/src/exchangedb/pg_do_purse_deposit.c index ba6f03c11..3ac3cfbfc 100644 --- a/src/exchangedb/pg_do_purse_deposit.c +++ b/src/exchangedb/pg_do_purse_deposit.c @@ -47,10 +47,14 @@ TEH_PG_do_purse_deposit ( ? GNUNET_PQ_query_param_null () : GNUNET_PQ_query_param_uint64 (&partner_id), GNUNET_PQ_query_param_auto_from_type (purse_pub), - TALER_PQ_query_param_amount (amount), + TALER_PQ_query_param_amount_tuple ( + pg->conn, + amount), GNUNET_PQ_query_param_auto_from_type (coin_pub), GNUNET_PQ_query_param_auto_from_type (coin_sig), - TALER_PQ_query_param_amount (amount_minus_fee), + TALER_PQ_query_param_amount_tuple ( + pg->conn, + amount_minus_fee), GNUNET_PQ_query_param_timestamp (&reserve_expiration), GNUNET_PQ_query_param_timestamp (&now), GNUNET_PQ_query_param_end @@ -77,7 +81,7 @@ TEH_PG_do_purse_deposit ( ",out_conflict AS conflict" ",out_late AS too_late" " FROM exchange_do_purse_deposit" - " ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10);"); + " ($1,$2,$3,$4,$5,$6,$7,$8);"); return GNUNET_PQ_eval_prepared_singleton_select (pg->conn, "call_purse_deposit", diff --git a/src/exchangedb/pg_do_reserve_open.c b/src/exchangedb/pg_do_reserve_open.c index 542d1f468..cdc42964c 100644 --- a/src/exchangedb/pg_do_reserve_open.c +++ b/src/exchangedb/pg_do_reserve_open.c @@ -44,20 +44,26 @@ TEH_PG_do_reserve_open ( struct PostgresClosure *pg = cls; struct GNUNET_PQ_QueryParam params[] = { GNUNET_PQ_query_param_auto_from_type (reserve_pub), - TALER_PQ_query_param_amount (total_paid), - TALER_PQ_query_param_amount (reserve_payment), + TALER_PQ_query_param_amount_tuple ( + pg->conn, + total_paid), + TALER_PQ_query_param_amount_tuple ( + pg->conn, + reserve_payment), GNUNET_PQ_query_param_uint32 (&min_purse_limit), GNUNET_PQ_query_param_uint32 (&pg->def_purse_limit), GNUNET_PQ_query_param_auto_from_type (reserve_sig), GNUNET_PQ_query_param_timestamp (&desired_expiration), GNUNET_PQ_query_param_relative_time (&pg->legal_reserve_expiration_time), GNUNET_PQ_query_param_timestamp (&now), - TALER_PQ_query_param_amount (open_fee), + TALER_PQ_query_param_amount_tuple (pg->conn, + open_fee), GNUNET_PQ_query_param_end }; struct GNUNET_PQ_ResultSpec rs[] = { - TALER_PQ_RESULT_SPEC_AMOUNT ("out_open_cost", - open_cost), + TALER_PQ_result_spec_amount_tuple ("out_open_cost", + pg->currency, + open_cost), GNUNET_PQ_result_spec_timestamp ("out_final_expiration", final_expiration), GNUNET_PQ_result_spec_bool ("out_no_funds", @@ -68,12 +74,11 @@ TEH_PG_do_reserve_open ( PREPARE (pg, "do_reserve_open", "SELECT " - " out_open_cost_val" - ",out_open_cost_frac" + " out_open_cost" ",out_final_expiration" ",out_no_funds" " FROM exchange_do_reserve_open" - " ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13);"); + " ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10);"); return GNUNET_PQ_eval_prepared_singleton_select (pg->conn, "do_reserve_open", params, diff --git a/src/exchangedb/pg_do_reserve_purse.c b/src/exchangedb/pg_do_reserve_purse.c index b08594175..6e05a5ab0 100644 --- a/src/exchangedb/pg_do_reserve_purse.c +++ b/src/exchangedb/pg_do_reserve_purse.c @@ -74,9 +74,10 @@ TEH_PG_do_reserve_purse ( GNUNET_PQ_query_param_timestamp (&reserve_gc), GNUNET_PQ_query_param_auto_from_type (reserve_sig), GNUNET_PQ_query_param_bool (NULL == purse_fee), - TALER_PQ_query_param_amount (NULL == purse_fee - ? &zero_fee - : purse_fee), + TALER_PQ_query_param_amount_tuple (pg->conn, + NULL == purse_fee + ? &zero_fee + : purse_fee), GNUNET_PQ_query_param_auto_from_type (reserve_pub), GNUNET_PQ_query_param_auto_from_type (&h_payto), GNUNET_PQ_query_param_end @@ -111,7 +112,7 @@ TEH_PG_do_reserve_purse ( ",out_no_reserve AS no_reserve" ",out_conflict AS conflict" " FROM exchange_do_reserve_purse" - " ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11);"); + " ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10);"); return GNUNET_PQ_eval_prepared_singleton_select (pg->conn, "call_reserve_purse", diff --git a/src/exchangedb/pg_get_expired_reserves.c b/src/exchangedb/pg_get_expired_reserves.c index d94a9305d..852d1780a 100644 --- a/src/exchangedb/pg_get_expired_reserves.c +++ b/src/exchangedb/pg_get_expired_reserves.c @@ -138,7 +138,7 @@ TEH_PG_get_expired_reserves (void *cls, " SELECT * " " FROM reserves " " WHERE expiration_date <= $1 " - " AND (current_balance.val != 0 OR current_balance.frac != 0) " + " AND ((current_balance).val != 0 OR (current_balance).frac != 0) " " ORDER BY expiration_date ASC " " LIMIT 1 " ") " diff --git a/src/exchangedb/pg_insert_history_request.c b/src/exchangedb/pg_insert_history_request.c index ab3f39133..63a175de9 100644 --- a/src/exchangedb/pg_insert_history_request.c +++ b/src/exchangedb/pg_insert_history_request.c @@ -41,7 +41,8 @@ TEH_PG_insert_history_request ( GNUNET_PQ_query_param_auto_from_type (reserve_pub), GNUNET_PQ_query_param_auto_from_type (reserve_sig), GNUNET_PQ_query_param_timestamp (&request_timestamp), - TALER_PQ_query_param_amount (history_fee), + TALER_PQ_query_param_amount_tuple (pg->conn, + history_fee), GNUNET_PQ_query_param_end }; struct GNUNET_PQ_ResultSpec rs[] = { @@ -58,7 +59,7 @@ TEH_PG_insert_history_request ( " out_balance_ok AS balance_ok" " ,out_idempotent AS idempotent" " FROM exchange_do_history_request" - " ($1, $2, $3, $4, $5)"); + " ($1, $2, $3, $4)"); return GNUNET_PQ_eval_prepared_singleton_select (pg->conn, "call_history_request", params,