From 2ff7165becd826dbaefc5102c3cc699c0eea8da6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20Pant=C5=AF=C4=8Dek?= Date: Sat, 12 Jul 2025 15:55:06 +0200 Subject: [PATCH 1/8] gui: pass database configuration as command-line options --- brmbar3/brmbar-gui-qt4.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/brmbar3/brmbar-gui-qt4.py b/brmbar3/brmbar-gui-qt4.py index 9ca11d0..fca7f03 100755 --- a/brmbar3/brmbar-gui-qt4.py +++ b/brmbar3/brmbar-gui-qt4.py @@ -9,6 +9,8 @@ from brmbar import Database import brmbar +import argparse + # User credit balance limit; sale will fail when balance is below this limit. LIMIT_BALANCE = -200 # When below this credit balance, an alert hook script (see below) is run. @@ -224,6 +226,23 @@ class ShopAdapter(QtCore.QObject): db.commit() return balance +parser = argparse.ArgumentParser() +parser.add_argument("--dbname", help="Database name", type=str) +parser.add_argument("--dbuser", help="Database user", type=str) +parser.add_argument("--dbhost", help="Database host", type=str) +parser.add_argument("--dbpass", help="Database user password", type=str) +args = parser.parse_args() +argdbname = args.dbname +argdbuser = args.dbuser +argdbhost = args.dbhost +argdbpass = args.dbpass + +db = Database.Database( + "dbname={0} user={1} host={2} password={3}".format( + argdbname,argdbuser,argdbhost,argdbpass + ) +) + db = Database.Database("dbname=brmbar") shop = brmbar.Shop.new_with_defaults(db) currency = shop.currency From 4c65f7007901ae2d595814f7e7e11f59eb0f604a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20Pant=C5=AF=C4=8Dek?= Date: Sat, 12 Jul 2025 15:57:41 +0200 Subject: [PATCH 2/8] gui: remove old db initialization --- brmbar3/brmbar-gui-qt4.py | 1 - 1 file changed, 1 deletion(-) diff --git a/brmbar3/brmbar-gui-qt4.py b/brmbar3/brmbar-gui-qt4.py index fca7f03..f6027dc 100755 --- a/brmbar3/brmbar-gui-qt4.py +++ b/brmbar3/brmbar-gui-qt4.py @@ -243,7 +243,6 @@ db = Database.Database( ) ) -db = Database.Database("dbname=brmbar") shop = brmbar.Shop.new_with_defaults(db) currency = shop.currency db.commit() From 70c46bd95093e7217bbc4da16d30bd189c54006f Mon Sep 17 00:00:00 2001 From: TMA Date: Sat, 26 Jul 2025 15:15:03 +0200 Subject: [PATCH 3/8] log all sql statements --- brmbar3/brmbar/Database.py | 1 + 1 file changed, 1 insertion(+) diff --git a/brmbar3/brmbar/Database.py b/brmbar3/brmbar/Database.py index b70687c..5b844dd 100644 --- a/brmbar3/brmbar/Database.py +++ b/brmbar3/brmbar/Database.py @@ -35,6 +35,7 @@ class Database: def _execute(self, cur, query, attrs, level=1): """execute a query, and in case of OperationalError (db restart) reconnect to database. Recurses with increasig pause between tries""" + logger.debug("SQL: (%s) @%s" % (query, time.strftime("%Y%m%d %a %I:%m %p"))) try: if attrs is None: cur.execute(query) From c04d4a1f8e6add5beb3236bc37c88b4310b14e60 Mon Sep 17 00:00:00 2001 From: TMA Date: Sat, 26 Jul 2025 15:50:10 +0200 Subject: [PATCH 4/8] 0024: propagate errors in find_*_rate --- brmbar3/schema/0024-find-rates-fix.sql | 89 ++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 brmbar3/schema/0024-find-rates-fix.sql diff --git a/brmbar3/schema/0024-find-rates-fix.sql b/brmbar3/schema/0024-find-rates-fix.sql new file mode 100644 index 0000000..8dae7d8 --- /dev/null +++ b/brmbar3/schema/0024-find-rates-fix.sql @@ -0,0 +1,89 @@ +-- +-- 0024-find-rates-fix.sql +-- +-- #23 - fix stored functions find_buy_rate and find_sell_rate +-- +-- ISC License +-- +-- Copyright 2023-2025 Brmlab, z.s. +-- TMA +-- +-- Permission to use, copy, modify, and/or distribute this software +-- for any purpose with or without fee is hereby granted, provided +-- that the above copyright notice and this permission notice appear +-- in all copies. +-- +-- THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL +-- WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED +-- WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE +-- AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR +-- CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +-- OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, +-- NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN +-- CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +-- + +-- To require fully-qualified names +SELECT pg_catalog.set_config('search_path', '', false); + +DO $upgrade_block$ +BEGIN + +IF brmbar_privileged.has_exact_schema_version(23) THEN + +CREATE OR REPLACE FUNCTION public.find_buy_rate( + IN i_item_currency_id public.accounts.id%TYPE, + IN i_other_currency_id public.accounts.id%TYPE +) RETURNS NUMERIC +LANGUAGE plpgsql +AS $$ +DECLARE + v_rate public.exchange_rates.rate%TYPE; + v_rate_dir public.exchange_rates.rate_dir%TYPE; +BEGIN + SELECT rate, rate_dir INTO STRICT v_rate, v_rate_dir FROM public.exchange_rates WHERE target = i_item_currency_id AND source = i_other_currency_id AND valid_since <= NOW() ORDER BY valid_since DESC LIMIT 1; + IF v_rate_dir = 'target_to_source'::public.exchange_rate_direction THEN + RETURN v_rate; + ELSE + RETURN 1/v_rate; + END IF; + /* propagate error +EXCEPTION + WHEN NO_DATA_FOUND THEN + RETURN -1; + */ +END; +$$; + +-- return negative number on rate not found +CREATE OR REPLACE FUNCTION public.find_sell_rate( + IN i_item_currency_id public.accounts.id%TYPE, + IN i_other_currency_id public.accounts.id%TYPE +) RETURNS NUMERIC +LANGUAGE plpgsql +AS $$ +DECLARE + v_rate public.exchange_rates.rate%TYPE; + v_rate_dir public.exchange_rates.rate_dir%TYPE; +BEGIN + SELECT rate, rate_dir INTO STRICT v_rate, v_rate_dir FROM public.exchange_rates WHERE target = i_other_currency_id AND source = i_item_currency_id AND valid_since <= NOW() ORDER BY valid_since DESC LIMIT 1; + IF v_rate_dir = 'source_to_target'::public.exchange_rate_direction THEN + RETURN v_rate; + ELSE + RETURN 1/v_rate; + END IF; + /* propagate error +EXCEPTION + WHEN NO_DATA_FOUND THEN + RETURN -1; + */ +END; +$$; + +PERFORM brmbar_privileged.upgrade_schema_version_to(24); +END IF; + +END; +$upgrade_block$; + +-- vim: set ft=plsql : From c17aa9966695955830846bb84db697f1f166a7ec Mon Sep 17 00:00:00 2001 From: TMA Date: Sat, 26 Jul 2025 16:02:47 +0200 Subject: [PATCH 5/8] 0024: drop old versions before installing new ones --- brmbar3/schema/0024-find-rates-fix.sql | 3 +++ 1 file changed, 3 insertions(+) diff --git a/brmbar3/schema/0024-find-rates-fix.sql b/brmbar3/schema/0024-find-rates-fix.sql index 8dae7d8..a196873 100644 --- a/brmbar3/schema/0024-find-rates-fix.sql +++ b/brmbar3/schema/0024-find-rates-fix.sql @@ -31,6 +31,9 @@ BEGIN IF brmbar_privileged.has_exact_schema_version(23) THEN +DROP FUNCTION IF EXISTS public.find_buy_rate(integer,integer); +DROP FUNCTION IF EXISTS public.find_sell_rate(integer,integer); + CREATE OR REPLACE FUNCTION public.find_buy_rate( IN i_item_currency_id public.accounts.id%TYPE, IN i_other_currency_id public.accounts.id%TYPE From 9afef5bce272f41dc00e4b1d33cc70bd7cdac6ed Mon Sep 17 00:00:00 2001 From: TMA Date: Sat, 26 Jul 2025 16:57:30 +0200 Subject: [PATCH 6/8] maybe make something faster --- brmbar3/brmbar/Shop.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/brmbar3/brmbar/Shop.py b/brmbar3/brmbar/Shop.py index b32f5bb..a2ef1d1 100644 --- a/brmbar3/brmbar/Shop.py +++ b/brmbar3/brmbar/Shop.py @@ -198,12 +198,13 @@ class Shop: """list all accounts (people or items, as per acctype)""" accts = [] cur = self.db.execute_and_fetchall( - "SELECT id FROM accounts WHERE acctype = %s AND name ILIKE %s ORDER BY name ASC", + "SELECT a.id, a.name aname, a.currency, a.acctype, c.name cname FROM accounts a JOIN currencies c ON c.id=a.currency WHERE a.acctype = %s AND a.name ILIKE %s ORDER BY a.name ASC", [acctype, like_str], ) # FIXME: sanitize input like_str ^ for inventory in cur: - accts += [Account.load(self.db, id=inventory[0])] + curr = Currency(db=self.db, id=inventory[2], name=inventory[4]); + accts += [Account(self.db, id=inventory[0], name=inventory[1], currency=curr, acctype=inventory[3])] return accts def fix_inventory(self, item, amount): From 54c687edf3a5b64c11053a690eeed1f8875136d6 Mon Sep 17 00:00:00 2001 From: TMA Date: Sat, 26 Jul 2025 17:12:50 +0200 Subject: [PATCH 7/8] disable slowdown in management for now --- brmbar3/brmbar-gui-qt4.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/brmbar3/brmbar-gui-qt4.py b/brmbar3/brmbar-gui-qt4.py index cb8fa46..4eb668c 100755 --- a/brmbar3/brmbar-gui-qt4.py +++ b/brmbar3/brmbar-gui-qt4.py @@ -168,21 +168,25 @@ class ShopAdapter(QtCore.QObject): @QtCore.Slot(result='QVariant') def balance_cash(self): + return "N/A" balance = shop.cash.balance_str() db.commit() return balance @QtCore.Slot(result='QVariant') def balance_profit(self): + return "N/A" balance = shop.profits.balance_str() db.commit() return balance @QtCore.Slot(result='QVariant') def balance_inventory(self): + return "N/A" balance = shop.inventory_balance_str() db.commit() return balance @QtCore.Slot(result='QVariant') def balance_credit(self): + return "N/A" balance = shop.credit_negbalance_str() db.commit() return balance From 1d9a2e9facb5b35a996015feb10ee864f95b3f3a Mon Sep 17 00:00:00 2001 From: TMA Date: Sat, 26 Jul 2025 18:26:59 +0200 Subject: [PATCH 8/8] Fix buy rate updating --- brmbar3/brmbar/Currency.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/brmbar3/brmbar/Currency.py b/brmbar3/brmbar/Currency.py index 3033287..61d6a75 100644 --- a/brmbar3/brmbar/Currency.py +++ b/brmbar3/brmbar/Currency.py @@ -130,5 +130,5 @@ class Currency: def update_buy_rate(self, source, rate): self.db.execute( "SELECT public.update_currency_buy_rate(%s, %s, %s)", - [source.id, self.id, rate], + [self.id, source.id, rate], )