From 4fafac0f069b7f3683fc7369e9bfea1b54438ac3 Mon Sep 17 00:00:00 2001 From: "bozo.kopic" Date: Sat, 26 Mar 2022 00:18:26 +0100 Subject: WIP server --- src_py/hatter/backend.py | 77 +++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 69 insertions(+), 8 deletions(-) (limited to 'src_py/hatter/backend.py') diff --git a/src_py/hatter/backend.py b/src_py/hatter/backend.py index e89a867..dd6a4f7 100644 --- a/src_py/hatter/backend.py +++ b/src_py/hatter/backend.py @@ -1,4 +1,5 @@ from pathlib import Path +import sqlite3 import typing from hat import aio @@ -41,33 +42,93 @@ class Backend(aio.Resource): self._executor, _ext_get_commit, self._db, repo, commit_hash) async def update_commit(self, commit: common.Commit): - return await self._async_group.spawn( + await self._async_group.spawn( self._executor, _ext_update_commit, self._db, commit) async def remove_commit(self, commit: common.Commit): - return await self.async_group.spawn( + await self.async_group.spawn( self._executor, _ext_remove_commit, self._db, commit) def _ext_create(db_path): - pass + db_path.parent.mkdir(exist_ok=True) + db = sqlite3.connect(f'file:{db_path}?nolock=1', + uri=True, + isolation_level=None, + detect_types=sqlite3.PARSE_DECLTYPES) + + try: + db.executescript(r""" + PRAGMA journal_mode = OFF; + CREATE TABLE IF NOT EXISTS commits ( + repo TEXT, + hash TEXT, + change INTEGER, + status INTEGER, + output TEXT, + PRIMARY KEY (repo, hash) ON CONFLICT REPLACE + ); + CREATE INDEX IF NOT EXISTS commits_change_index ON commits ( + change + )""") + + except Exception: + db.close() + raise + + return db def _ext_close(db): - pass + db.close() def _ext_get_commits(db, repo, statuses, order): - return [] + cmd = "SELECT * FROM commits" + where = [] + if repo: + where.append("repo = :repo") + if statuses: + status_values = (str(status.value) for status in statuses) + where.append(f"status IN ({', '.join(status_values)})") + if where: + cmd += f" WHERE {' AND '.join(where)}" + cmd += f" ORDER BY change {order.value}" + args = {'repo': repo} + cur = db.execute(cmd, args) + return [_commit_from_row(row) for row in cur] def _ext_get_commit(db, repo, commit_hash): - pass + cmd = "SELECT * FROM commits WHERE repo = :repo AND hash = :hash" + args = {'repo': repo, + 'hash': commit_hash} + cur = db.execute(cmd, args) + row = cur.fetchone() + return _commit_from_row(row) if row else None def _ext_update_commit(db, commit): - pass + cmd = ("INSERT OR REPLACE INTO commits VALUES " + "(:repo, :hash, :change, :status, :output)") + args = {'repo': commit.repo, + 'hash': commit.hash, + 'change': commit.change, + 'status': commit.status.value, + 'output': commit.output} + db.execute(cmd, args) def _ext_remove_commit(db, commit): - pass + cmd = "DELETE FROM commits WHERE repo = :repo AND hash = :hash" + args = {'repo': commit.repo, + 'hash': commit.hash} + db.execute(cmd, args) + + +def _commit_from_row(row): + return common.Commit(repo=row[0], + hash=row[1], + change=row[2], + status=common.Status(row[3]), + output=row[4]) -- cgit v1.2.3-70-g09d2