67 lines
2.5 KiB
Python
67 lines
2.5 KiB
Python
|
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
|