aboutsummaryrefslogtreecommitdiff
path: root/src_py/hatter/backend.py
diff options
context:
space:
mode:
Diffstat (limited to 'src_py/hatter/backend.py')
-rw-r--r--src_py/hatter/backend.py77
1 files changed, 69 insertions, 8 deletions
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])