summaryrefslogtreecommitdiff
path: root/src/exchangedb/procedures.sql
diff options
context:
space:
mode:
Diffstat (limited to 'src/exchangedb/procedures.sql')
-rw-r--r--src/exchangedb/procedures.sql103
1 files changed, 77 insertions, 26 deletions
diff --git a/src/exchangedb/procedures.sql b/src/exchangedb/procedures.sql
index 912a37dbc..e9075775c 100644
--- a/src/exchangedb/procedures.sql
+++ b/src/exchangedb/procedures.sql
@@ -1428,6 +1428,7 @@ CREATE OR REPLACE FUNCTION exchange_do_purse_deposit(
IN in_amount_without_fee_val INT8,
IN in_amount_without_fee_frac INT4,
IN in_reserve_expiration INT8,
+ IN in_now INT8,
OUT out_balance_ok BOOLEAN,
OUT out_conflict BOOLEAN)
LANGUAGE plpgsql
@@ -1443,6 +1444,8 @@ DECLARE
DECLARE
was_paid BOOLEAN;
DECLARE
+ my_in_reserve_quota BOOLEAN;
+DECLARE
my_reserve_pub BYTEA;
BEGIN
@@ -1548,9 +1551,11 @@ END IF;
SELECT
amount_with_fee_val
,amount_with_fee_frac
+ ,in_reserve_quota
INTO
my_amount_val
,my_amount_frac
+ ,my_in_reserve_quota
FROM exchange.purse_requests
WHERE (purse_pub=in_purse_pub)
AND ( ( ( (amount_with_fee_val <= balance_val)
@@ -1561,6 +1566,28 @@ THEN
RETURN;
END IF;
+-- Remember how this purse was finished.
+INSERT INTO purse_decision
+ (purse_pub
+ ,action_timestamp
+ ,refunded)
+VALUES
+ (in_purse_pub
+ ,in_now
+ ,FALSE);
+
+IF (my_in_reserve_quota)
+THEN
+ UPDATE reserves
+ SET purses_active=purses_active-1
+ WHERE reserve_pub IN
+ (SELECT reserve_pub
+ FROM exchange.purse_merges
+ WHERE purse_pub=my_purse_pub
+ LIMIT 1);
+END IF;
+
+
IF (0 != psi)
THEN
-- The taler-exchange-router will take care of this.
@@ -1606,11 +1633,6 @@ ELSE
WHERE reserve_pub=my_reserve_pub;
END IF;
- -- ... and mark purse as finished.
- -- FIXME: combine with UPDATE above?
- UPDATE purse_requests
- SET finished=true
- WHERE purse_pub=in_purse_pub;
END IF;
@@ -1644,7 +1666,7 @@ DECLARE
DECLARE
my_partner_serial_id INT8;
DECLARE
- my_finished BOOLEAN;
+ my_in_reserve_quota BOOLEAN;
BEGIN
IF in_partner_url IS NULL
@@ -1675,12 +1697,12 @@ SELECT amount_with_fee_val
,amount_with_fee_frac
,purse_fee_val
,purse_fee_frac
- ,finished
+ ,in_reserve_quota
INTO my_amount_val
,my_amount_frac
,my_purse_fee_val
,my_purse_fee_frac
- ,my_finished
+ ,my_in_reserve_quota
FROM exchange.purse_requests
WHERE purse_pub=in_purse_pub
AND balance_val >= amount_with_fee_val
@@ -1731,8 +1753,6 @@ THEN
END IF;
out_conflict=FALSE;
-ASSERT NOT my_finished, 'internal invariant failed';
-
-- Initialize reserve, if not yet exists.
INSERT INTO reserves
@@ -1745,8 +1765,26 @@ INSERT INTO reserves
,in_expiration_date)
ON CONFLICT DO NOTHING;
+-- Remember how this purse was finished.
+INSERT INTO purse_decision
+ (purse_pub
+ ,action_timestamp
+ ,refunded)
+VALUES
+ (in_purse_pub
+ ,in_merge_timestamp
+ ,FALSE);
-
+IF (my_in_reserve_quota)
+THEN
+ UPDATE reserves
+ SET purses_active=purses_active-1
+ WHERE reserve_pub IN
+ (SELECT reserve_pub
+ FROM exchange.purse_merges
+ WHERE purse_pub=my_purse_pub
+ LIMIT 1);
+END IF;
-- Store account merge signature.
INSERT INTO exchange.account_merges
@@ -1794,10 +1832,6 @@ ELSE
END
WHERE reserve_pub=in_reserve_pub;
- -- ... and mark purse as finished.
- UPDATE exchange.purse_requests
- SET finished=true
- WHERE purse_pub=in_purse_pub;
END IF;
@@ -1969,6 +2003,7 @@ END $$;
CREATE OR REPLACE FUNCTION exchange_do_expire_purse(
IN in_start_time INT8,
IN in_end_time INT8,
+ IN in_now INT8,
OUT out_found BOOLEAN)
LANGUAGE plpgsql
AS $$
@@ -1976,15 +2011,21 @@ DECLARE
my_purse_pub BYTEA;
DECLARE
my_deposit record;
+DECLARE
+ my_in_reserve_quota BOOLEAN;
BEGIN
+-- FIXME: we should probably do this in a loop
+-- and expire all at once, instead of one per query
SELECT purse_pub
+ ,in_reserve_quota
INTO my_purse_pub
+ ,my_in_reserve_quota
FROM exchange.purse_requests
WHERE (purse_expiration >= in_start_time) AND
(purse_expiration < in_end_time) AND
- (NOT finished) AND
- (NOT refunded)
+ purse_pub NOT IN (SELECT purse_pub
+ FROM purse_decision)
ORDER BY purse_expiration ASC
LIMIT 1;
out_found = FOUND;
@@ -1993,15 +2034,25 @@ THEN
RETURN;
END IF;
-UPDATE exchange.purse_requests
- SET refunded=TRUE,
- finished=TRUE
- WHERE purse_pub=my_purse_pub;
+INSERT INTO purse_decision
+ (purse_pub
+ ,action_timestamp
+ ,refunded)
+VALUES
+ (my_purse_pub
+ ,in_now
+ ,TRUE);
-INSERT INTO exchange.purse_refunds
- (purse_pub)
- VALUES
- (my_purse_pub);
+IF (my_in_reserve_quota)
+THEN
+ UPDATE reserves
+ SET purses_active=purses_active-1
+ WHERE reserve_pub IN
+ (SELECT reserve_pub
+ FROM exchange.purse_merges
+ WHERE purse_pub=my_purse_pub
+ LIMIT 1);
+END IF;
-- restore balance to each coin deposited into the purse
FOR my_deposit IN
@@ -2028,7 +2079,7 @@ LOOP
END LOOP;
END $$;
-COMMENT ON FUNCTION exchange_do_expire_purse(INT8,INT8)
+COMMENT ON FUNCTION exchange_do_expire_purse(INT8,INT8,INT8)
IS 'Finds an expired purse in the given time range and refunds the coins (if any).';