diff options
| 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 | 
| commit | 6dedca0fa36bd30bbeb26be012ce3ac9d967065a (patch) | |
| tree | bd87d5ee2b4f7309e552928bf68e10e84c32c2b1 | |
| parent | a1dae0199f3bc3e9f66fc1375c652c6f99b26b2c (diff) | |
taler_amount type introduced in reserves table and corresponding functionsnew-amount
- 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.sql | 36 | ||||
| -rw-r--r-- | src/exchangedb/exchange_do_batch_withdraw.sql | 48 | ||||
| -rw-r--r-- | src/exchangedb/exchange_do_batch_withdraw_insert.sql | 9 | ||||
| -rw-r--r-- | src/exchangedb/exchange_do_gc.sql | 3 | ||||
| -rw-r--r-- | src/exchangedb/exchange_do_history_request.sql | 71 | ||||
| -rw-r--r-- | src/exchangedb/exchange_do_purse_deposit.sql | 40 | ||||
| -rw-r--r-- | src/exchangedb/exchange_do_purse_merge.sql | 35 | ||||
| -rw-r--r-- | src/exchangedb/exchange_do_recoup_to_reserve.sql | 36 | ||||
| -rw-r--r-- | src/exchangedb/exchange_do_reserve_open.sql | 46 | ||||
| -rw-r--r-- | src/exchangedb/exchange_do_reserve_purse.sql | 14 | ||||
| -rw-r--r-- | src/exchangedb/exchange_do_reserves_in_insert.sql | 14 | ||||
| -rw-r--r-- | src/exchangedb/exchange_do_withdraw.sql | 47 | ||||
| -rw-r--r-- | src/exchangedb/pg_do_batch_withdraw.c | 5 | ||||
| -rw-r--r-- | src/exchangedb/pg_do_purse_deposit.c | 10 | ||||
| -rw-r--r-- | src/exchangedb/pg_do_reserve_open.c | 21 | ||||
| -rw-r--r-- | src/exchangedb/pg_do_reserve_purse.c | 9 | ||||
| -rw-r--r-- | src/exchangedb/pg_get_expired_reserves.c | 2 | ||||
| -rw-r--r-- | src/exchangedb/pg_insert_history_request.c | 5 | 
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 756c0085..184a3e49 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 ba364dda..b896e04f 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 b580f6fb..fd00754a 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 07cbeb42..75dd120d 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 7eb368ef..5cd15bc6 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 5e9f71bb..45bdcdf6 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 85bae999..9780c016 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 72942e8c..71c1d51b 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 d97b4449..7aca78b8 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 abe5a749..43d4c91a 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 e7018e51..fcf8ef4c 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 d0d98867..60a63e67 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 45b1d322..8e118a99 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 ba6f03c1..3ac3cfbf 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 542d1f46..cdc42964 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 b0859417..6e05a5ab 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 d94a9305..852d1780 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 ab3f3913..63a175de 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,  | 
