diff options
| author | Vosjedev <vosje@vosjedev.net> | 2025-11-02 13:56:16 +0100 |
|---|---|---|
| committer | Vosjedev <vosje@vosjedev.net> | 2025-11-02 13:56:16 +0100 |
| commit | 60749b5099a8ba1d63e8cc313c451c8a4001a078 (patch) | |
| tree | fc3aef71225a0cd8317efd4147b9d345378068d0 /src/acit/types.py | |
| parent | 29989aface3276d36851c8601ea599ffbeaac471 (diff) | |
| download | acit-60749b5099a8ba1d63e8cc313c451c8a4001a078.tar.gz acit-60749b5099a8ba1d63e8cc313c451c8a4001a078.tar.bz2 acit-60749b5099a8ba1d63e8cc313c451c8a4001a078.tar.xz | |
Too much (I tried to split it up but it won't work)
Diffstat (limited to 'src/acit/types.py')
| -rw-r--r-- | src/acit/types.py | 133 |
1 files changed, 112 insertions, 21 deletions
diff --git a/src/acit/types.py b/src/acit/types.py index 2719590..4c84f26 100644 --- a/src/acit/types.py +++ b/src/acit/types.py @@ -1,8 +1,10 @@ -from .db import DBPoolManager +from threading import RLock +from datetime import datetime, timedelta import cherrypy +from .db import DBPoolManager BUGSTATUS=["OPEN", "CLOSED", "UNCONF", "REJECT", "UPSTRM"] BUGTYPES=["BUG", "DISCUS", "PATCH"] @@ -13,15 +15,16 @@ class Site(): cherrypy.engine.subscribe("db-started",self.on_db_connect) self.bugcache={} + self.last_tracker_update=datetime.fromtimestamp(0) + self.tracker_update_lock=RLock() def on_db_connect(self): + cherrypy.log("Setting up database",context="SITE") with self.dbpool.get_connection() as conn, conn.cursor() as cur: cur.execute( "CREATE TABLE IF NOT EXISTS trackers (" - "name VARCHAR(80)," - "category VARCHAR(80)," - "homepage VARCHAR(1024)," - "readme_url VARCHAR(1024)" + "name VARCHAR(80) PRIMARY KEY," + "homepage VARCHAR(1024)" ")" ) @@ -44,7 +47,77 @@ class Site(): ")" ) - def getbug(self,tracker:str,bugid): + #cur.execute( + # "CREATE TABLE IF NOT EXISTS accounts (" + # "email VARCHAR(80)," + # "hash VARCHAR(80)," + # )# TODO + + conn.commit() + + self.update_all_bugpages(conn,cur) + + + def update_all_bugpages(self,conn,cur,trackerfilter=None): + if trackerfilter: + cherrypy.engine.publish("regen",trackerfilter,None) + else: + cur.execute("SELECT name FROM trackers") + for [tracker] in cur: + cherrypy.engine.publish("regen",tracker,None) + + cur.execute("SELECT tracker,bugid FROM bugs") + for [tracker,bugid] in cur: + if trackerfilter and not trackerfilter==tracker: + continue + cherrypy.engine.publish("regen",tracker,bugid) + + + def update_trackers(self,force=False): + from os import getenv + import subprocess + + def log(msg,traceback=False): + cherrypy.log(msg=msg,traceback=traceback,context="REFRESH") + + with self.tracker_update_lock: + if not force and self.last_tracker_update+timedelta(minutes=5)>datetime.now(): + return + log("Updating trackerlist") + try: + with self.dbpool.get_connection() as conn, conn.cursor() as cur: + script=getenv("ACIT_LIST_TRACKERS","/usr/lib/acit-list-trackers") + proc=subprocess.run(script,capture_output=True) + + if proc.stderr: + log("Refresh script generated STDERR:") + log(proc.stderr) + + rows=proc.stdout.decode().split("\n") + for row in rows: + if row: # skip empty lines + data=row.split("\t") + + if not len(data)==2: + log("Error processing line:\n> %s\nWeird value count (expected 2)."%row) + continue + + name,homepage=data + + log(name) + + cur.execute("REPLACE INTO trackers (name,homepage) VALUES (?,?)",(name,homepage)) + conn.commit() + + self.update_all_bugpages(conn,cur,trackerfilter=name) + + self.last_tracker_update=datetime.now() + + except Exception: + cherrypy.log("Error refreshing trackers using script.",traceback=True,context="SITE") + + + def getbug(self,tracker:str,bugid:int): # make sure bug exists with self.dbpool.get_connection() as conn, conn.cursor() as cur: cur.execute("SELECT 1 FROM bugs WHERE tracker=? AND bugid=? LIMIT 1",(tracker,bugid)) @@ -64,17 +137,34 @@ class Site(): if not bugtype in BUGTYPES: raise ValueError("Bugtype illegal") with self.dbpool.get_connection() as conn, conn.cursor() as cur: - cur.execute("SELECT TOP 1 bugid FROM bugs WHERE tracker=? SORT BY bugid DESC",(tracker,)) + cur.execute("SELECT bugid FROM bugs WHERE tracker=? ORDER BY bugid DESC LIMIT 1",(tracker,)) nr=cur.fetchone() if not nr: nr=0 + else: + nr=nr[0] nr+=1 - cur.execute("INSERT INTO bugs VALUES (?,?)",(tracker,nr,"","","OPEN",bugtype)) + cur.execute("INSERT INTO bugs VALUES (?,?,?,?,?,?)",(tracker,nr,"","","OPEN",bugtype)) + conn.commit() return self.getbug(tracker=tracker,bugid=nr) - + def findtrackers(self,query:str): + self.update_trackers() + with self.dbpool.get_connection() as conn, conn.cursor() as cur: + cur.execute("SELECT name FROM trackers") + trackers:list[str]=[ value[0] for value in cur.fetchall() ] + results=[] + for tracker in trackers: + if tracker==query: + return [tracker] + else: + if tracker.endswith(query): + results.append(tracker) + return results + + class Bug(): def __init__(self,site:Site,tracker:str,bugid:int): @@ -82,7 +172,7 @@ class Bug(): self.tracker=tracker self.bugid=bugid with self.site.dbpool.get_connection() as conn, conn.cursor() as cur: - cur.execute("SELECT (subject,description,status,type) FROM bugs WHERE tracker=? AND bugid=? LIMIT 1",(tracker,bugid)) + cur.execute("SELECT subject,description,status,type FROM bugs WHERE tracker=? AND bugid=? LIMIT 1",(tracker,bugid)) data=cur.fetchone() if not data: raise ValueError("Bug %s#%d does not exists!"%(tracker,bugid)) @@ -112,6 +202,7 @@ class Bug(): with self.site.dbpool.get_connection() as conn, conn.cursor() as cur: cur.execute("UPDATE bugs SET subject=? WHERE tracker=? AND bugid=?",(value,self.tracker,self.bugid)) + conn.commit() self._cache["subject"]=value @property @@ -126,6 +217,7 @@ class Bug(): with self.site.dbpool.get_connection() as conn, conn.cursor() as cur: cur.execute("UPDATE bugs SET description=? WHERE tracker=? AND bugid=?",(value,self.tracker,self.bugid)) + conn.commit() self._cache["description"]=value @property @@ -140,6 +232,7 @@ class Bug(): with self.site.dbpool.get_connection() as conn, conn.cursor() as cur: cur.execute("UPDATE bugs SET status=? WHERE tracker=? AND bugid=?",(value,self.tracker,self.bugid)) + conn.commit() self._cache["status"]=value @property @@ -154,6 +247,7 @@ class Bug(): with self.site.dbpool.get_connection() as conn, conn.cursor() as cur: cur.execute("UPDATE bugs SET type=? WHERE tracker=? AND bugid=?",(value,self.tracker,self.bugid)) + conn.commit() self._cache["type"]=value @property @@ -164,15 +258,18 @@ class Bug(): """ with self.site.dbpool.get_connection() as conn, conn.cursor() as cur: cur.execute("SELECT email FROM subscribers WHERE tracker=? AND bugid=?",(self.tracker,self.bugid)) + conn.commit() return [ value[0] for value in cur ] def addsubscriber(self,email): with self.site.dbpool.get_connection() as conn, conn.cursor() as cur: cur.execute("INSERT INTO subscribers VALUES (?,?,?)",(self.tracker,self.bugid,email)) + conn.commit() def rmsubscriber(self,email): with self.site.dbpool.get_connection() as conn, conn.cursor() as cur: cur.execute("DELETE FROM subscribers WHERE tracker=? AND bugid=? AND email=?)",(self.tracker,self.bugid,email)) + conn.commit() class Tracker(): @@ -180,7 +277,7 @@ class Tracker(): self.site=site self.tracker=tracker with self.site.dbpool.get_connection() as conn, conn.cursor() as cur: - cur.execute("SELECT (name,category,homepage,readme) FROM trackers WHERE name=? LIMIT 1",(tracker,)) + cur.execute("SELECT name,homepage FROM trackers WHERE name=? LIMIT 1",(tracker,)) data=cur.fetchone() if not data: raise ValueError("Tracker %s does not exists!"%tracker) @@ -195,18 +292,9 @@ class Tracker(): # NOTE: this is a lot of repeated code, maybe we can rewrite this into a __setattr__ and __getattribute__ method? @property def name(self): - "The name of this tracker" + "The name of this tracker. readonly, changing a tracker's name randomly seriously messes with the design." return self._cache["name"] - @name.setter - def name(self,value): - if len(value)>80: - raise ValueError("Subject length not allowed to be higher than 80, this is %d"%len(value)) - - with self.site.dbpool.get_connection() as conn, conn.cursor() as cur: - cur.execute("UPDATE trackers SET name=? WHERE tracker=? AND bugid=?",(value,self.tracker,self.bugid)) - self._cache["name"]=value - @property def category(self): "The category of this tracker" @@ -219,6 +307,7 @@ class Tracker(): with self.site.dbpool.get_connection() as conn, conn.cursor() as cur: cur.execute("UPDATE trackers SET category=? WHERE tracker=? AND bugid=?",(value,self.tracker,self.bugid)) + conn.commit() self._cache["category"]=value @property @@ -233,6 +322,7 @@ class Tracker(): with self.site.dbpool.get_connection() as conn, conn.cursor() as cur: cur.execute("UPDATE trackers SET homepage=? WHERE tracker=? AND bugid=?",(value,self.tracker,self.bugid)) + conn.commit() self._cache["homepage"]=value @property @@ -247,4 +337,5 @@ class Tracker(): with self.site.dbpool.get_connection() as conn, conn.cursor() as cur: cur.execute("UPDATE trackers SET readme_url=? WHERE tracker=? AND bugid=?",(value,self.tracker,self.bugid)) + conn.commit() self._cache["readme_url"]=value |
