aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorÖzgür Kesim <oec-taler@kesim.org>2023-07-28 23:27:02 +0200
committerÖzgür Kesim <oec-taler@kesim.org>2023-07-28 23:27:02 +0200
commit6dedca0fa36bd30bbeb26be012ce3ac9d967065a (patch)
treebd87d5ee2b4f7309e552928bf68e10e84c32c2b1
parenta1dae0199f3bc3e9f66fc1375c652c6f99b26b2c (diff)
taler_amount type introduced in reserves table and corresponding functions
- current_balance is now a taler_amount - all C-functions, SQL-statements and stored procedures adjusted accordingly. => make check passes all tests in testing.
-rw-r--r--src/exchangedb/exchange_do_age_withdraw.sql36
-rw-r--r--src/exchangedb/exchange_do_batch_withdraw.sql48
-rw-r--r--src/exchangedb/exchange_do_batch_withdraw_insert.sql9
-rw-r--r--src/exchangedb/exchange_do_gc.sql3
-rw-r--r--src/exchangedb/exchange_do_history_request.sql71
-rw-r--r--src/exchangedb/exchange_do_purse_deposit.sql40
-rw-r--r--src/exchangedb/exchange_do_purse_merge.sql35
-rw-r--r--src/exchangedb/exchange_do_recoup_to_reserve.sql36
-rw-r--r--src/exchangedb/exchange_do_reserve_open.sql46
-rw-r--r--src/exchangedb/exchange_do_reserve_purse.sql14
-rw-r--r--src/exchangedb/exchange_do_reserves_in_insert.sql14
-rw-r--r--src/exchangedb/exchange_do_withdraw.sql47
-rw-r--r--src/exchangedb/pg_do_batch_withdraw.c5
-rw-r--r--src/exchangedb/pg_do_purse_deposit.c10
-rw-r--r--src/exchangedb/pg_do_reserve_open.c21
-rw-r--r--src/exchangedb/pg_do_reserve_purse.c9
-rw-r--r--src/exchangedb/pg_get_expired_reserves.c2
-rw-r--r--src/exchangedb/pg_insert_history_request.c5
18 files changed, 227 insertions, 224 deletions
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,