albs_analytics/build_analitycs/build_analytics/db.py

67 lines
2.5 KiB
Python
Raw Normal View History

2023-02-27 19:51:53 +00:00
from datetime import datetime
from typing import Union
import psycopg2
from .models.build_db import BuildDB
from .models.build_task_db import BuildTaskDB
from .models.db_config import DbConfig
class DB():
def __init__(self, config: DbConfig):
self.conf = config
def _get_conn(self):
conn = psycopg2.connect(database=self.conf.name,
host=self.conf.host,
user=self.conf.username,
password=self.conf.password,
port=self.conf.port)
return conn
def insert_update_build(self, build: BuildDB):
sql = f'''
INSERT INTO builds(id, url, created_at, finished_at)
VALUES (%s, %s, %s, %s)
ON CONFLICT (id) DO UPDATE SET
(url, created_at, finished_at) = (EXCLUDED.url, EXCLUDED.created_at, EXCLUDED.finished_at);
'''
with self._get_conn() as conn:
cur = conn.cursor()
cur.execute(sql, (build.id, build.url,
build.created_at, build.finished_at))
conn.commit()
def insert_update_buildtask(self, build_task: BuildTaskDB):
sql = f"""
INSERT INTO build_tasks(id, build_id, arch_id, started_at, finished_at, status_id)
VALUES (%s, %s, %s, %s, %s, %s)
ON CONFLICT (id) DO UPDATE SET
(id, build_id, arch_id, started_at, finished_at, status_id) = (EXCLUDED.ID, EXCLUDED.build_id, EXCLUDED.arch_id, EXCLUDED.started_at, EXCLUDED.finished_at, EXCLUDED.status_id)
"""
with self._get_conn() as conn:
cur = conn.cursor()
cur.execute(sql, (build_task.id, build_task.build_id, build_task.arch_id,
build_task.started_at, build_task.finished_at, build_task.status_id))
conn.commit()
def get_latest_build_id(self) -> Union[int, None]:
sql = "SELECT id from builds ORDER BY id DESC LIMIT 1;"
with self._get_conn() as conn:
cur = conn.cursor()
cur.execute(sql)
val = cur.fetchone()
if not val:
return None
return int(val[0])
def cleanup_builds(self, oldest_to_keep: datetime) -> int:
params = (int(oldest_to_keep.timestamp()),)
sql = "DELETE FROM builds WHERE created_at < %s;"
with self._get_conn() as conn:
cur = conn.cursor()
cur.execute(sql, params)
conn.commit()
return cur.rowcount