merchant

Merchant backend to process payments, run by merchants
Log | Files | Refs | Submodules | README | LICENSE

commit 8c00b38fb8bdbe3628c6566a811dc738ce90ad1f
parent 36cd7f60c1f747a8698578c2436062b4057fb7c7
Author: Christian Grothoff <grothoff@gnunet.org>
Date:   Sat, 22 Mar 2025 14:08:41 +0100

-misc bug fixes

Diffstat:
Msrc/backenddb/pg_statistics_examples.sql | 15++++++++++++---
Msrc/backenddb/pg_statistics_helpers.sql | 64++++++++++++++++++++++++++++++++--------------------------------
2 files changed, 44 insertions(+), 35 deletions(-)

diff --git a/src/backenddb/pg_statistics_examples.sql b/src/backenddb/pg_statistics_examples.sql @@ -22,9 +22,9 @@ BEGIN; -- Check patch versioning is in place. -SELECT _v.register_patch('example-statistics-0001', NULL, NULL); +-- SELECT _v.register_patch('example-statistics-0001', NULL, NULL); -CREATE SCHEMA example_statistics; +-- CREATE SCHEMA example_statistics; SET search_path TO example_statistics,merchant; @@ -155,5 +155,14 @@ CREATE TRIGGER merchant_products_on_sold ON merchant_inventory FOR EACH ROW EXECUTE FUNCTION merchant_products_sold_statistics_trigger(); +call merchant_do_bump_number_stat ('products-sold'::text, 6, CURRENT_TIMESTAMP(0)::TIMESTAMP, 1); -COMMIT; +call merchant_do_bump_amount_stat ('deposits'::text, 6, CURRENT_TIMESTAMP(0)::TIMESTAMP, (2,2,'EUR')::taler_amount_currency); + +select * from merchant_statistic_interval_number_get ('deposits', 'default'); + +select * from merchant_statistic_interval_amount_get ('deposits', 'default'); + + + +ROLLBACK; diff --git a/src/backenddb/pg_statistics_helpers.sql b/src/backenddb/pg_statistics_helpers.sql @@ -20,7 +20,7 @@ CREATE OR REPLACE FUNCTION interval_to_start ( IN in_timestamp TIMESTAMP, IN in_range statistic_range, OUT out_bucket_start INT8 -) +) LANGUAGE plpgsql AS $$ BEGIN @@ -414,15 +414,6 @@ DECLARE my_delta INT8; my_meta INT8; my_instance_id INT8; - my_curs CURSOR (meta_serial_id INT8,instid INT8,range INT8,min_serial INT8) FOR - SELECT nevent_serial_id - ,delta - FROM merchant_statistic_counter_event - WHERE imeta_serial_id = meta_serial_id - AND merchant_serial = instid - AND slot < my_time - range - AND imeta_serial_id >= min_serial - ORDER BY slot ASC; my_rec RECORD; my_irec RECORD; my_i INT; @@ -465,17 +456,20 @@ BEGIN my_max_serial = my_irec.event_delimiter; my_rval.rvalue = my_rval.rvalue + my_irec.cumulative_number; - my_delta = 0; - OPEN my_curs (meta_serial_id := my_meta, range := my_range, instid := my_instance_id, min_serial := my_max_serial); - LOOP - FETCH NEXT FROM my_curs INTO my_irec; - EXIT WHEN NOT FOUND; - my_delta = my_delta + my_irec.delta; - my_max_serial = my_irec.nevent_serial_id; - END LOOP; + -- Check if we have events that left the applicable range + SELECT MAX(nevent_serial_id) AS max_serial_id + ,SUM(delta) AS delta_sum + INTO my_irec + FROM merchant_statistic_counter_event + WHERE imeta_serial_id = my_meta + AND merchant_serial = my_instance_id + AND slot < my_time - my_range + AND imeta_serial_id >= my_max_serial; - IF (0 != my_delta) + IF FOUND AND my_irec.delta_sum IS NOT NULL THEN + my_delta = my_irec.delta_sum; + my_max_serial = my_irec.max_serial_id; -- remove expired events from the sum of the current slot my_rval.rvalue = my_rval.rvalue - my_delta; UPDATE merchant_statistic_interval_counter @@ -490,7 +484,7 @@ BEGIN UPDATE merchant_statistic_interval_counter SET cumulative_number = cumulative_number + my_delta WHERE imeta_serial_id = my_meta - AND merchant_serial = in_merchant_serial + AND merchant_serial = my_instance_id AND range=my_ranges[my_i+1]; IF NOT FOUND THEN @@ -505,7 +499,7 @@ BEGIN ,my_instance_id ,my_ranges[my_i+1] ,my_max_serial - ,in_delta); + ,my_delta); END IF; ELSE -- events are obsolete, delete them @@ -515,10 +509,11 @@ BEGIN AND slot < my_time - my_range; END IF; END IF; - - my_rval.range = my_range; - RETURN NEXT my_rval; - CLOSE my_curs; + IF my_max_serial IS NOT NULL + THEN + my_rval.range = my_range; + RETURN NEXT my_rval; + END IF; END LOOP; END $$; @@ -605,6 +600,7 @@ BEGIN my_rval.rvalue.val = (my_rval.rvalue).val + 1; END IF; + -- Check if we have events that left the applicable range SELECT MAX(aevent_serial_id) AS max_serial_id ,SUM(delta_value) AS value_sum ,SUM(delta_frac) AS frac_sum @@ -616,11 +612,11 @@ BEGIN AND slot < my_time - my_range AND imeta_serial_id > my_max_serial; - IF FOUND + IF FOUND AND my_jrec.value_sum IS NOT NULL THEN - -- Normalize my_delta first - my_delta_value = my_delta_value + my_delta_frac / 100000000; - my_delta_frac = my_delta_frac % 100000000; + -- Normalize sum first + my_delta_value = my_jrec.value_sum + my_jrec.frac_sum / 100000000; + my_delta_frac = my_jrec.frac_sum % 100000000; -- remove expired events from the sum of the current slot my_rval.rvalue.val = (my_rval.rvalue).val - my_delta_value; IF ((my_rval.rvalue).frac > my_delta_frac) @@ -693,10 +689,13 @@ BEGIN AND instance_id = my_instance_id AND slot < my_time - my_range; END IF; - END IF; + END IF; - my_rval.range = my_range; - RETURN NEXT my_val; + IF my_max_serial IS NOT NULL + THEN + my_rval.range = my_range; + RETURN NEXT my_rval; + END IF; END LOOP; -- over my_ranges END LOOP; -- over my_currency END $$; @@ -936,3 +935,4 @@ END $$; COMMENT ON PROCEDURE merchant_statistic_bucket_gc IS 'Performs garbage collection of the merchant_statistic_bucket_counter and merchant_statistic_bucket_amount tables'; +