# Copyright 2021 (c) Anna Schumaker. import sqlite3 from gi.repository import GObject from . import execute class Row(GObject.GObject): def __init__(self, rowid): GObject.GObject.__init__(self) self.rowid = rowid def __eq__(self, rhs): return self.rowid == rhs.rowid def __int__(self): return self.rowid def do_get_column(self, column): raise NotImplementedError def get_column(self, column): return self.do_get_column(column).fetchone()[column] class Tag(Row): def __gt__(self, rhs): return self.sort > rhs.sort def __lt__(self, rhs): return self.sort < rhs.sort def __str__(self): return self.name @GObject.Property def name(self): return self.get_column("name") @GObject.Property def sort(self): return self.get_column("sort") class Table(GObject.GObject): def __init__(self, name, type): GObject.GObject.__init__(self) self.table_name = name self.table_type = type self.do_create() def __getitem__(self, rowid): return self.get(rowid) def do_create(self): raise NotImplementedError def do_delete(self, obj): raise NotImplementedError def do_insert(self, *args): raise NotImplementedError def do_get(self, rowid): raise NotImplementedError def do_lookup(self, *args): raise NotImplementedError def insert(self, *args): cursor = self.do_insert(*args) object = self.table_type(cursor.lastrowid) self.emit("row-inserted", object) return object def delete(self, obj): self.emit("row-deleted", obj) self.do_delete(obj) def find(self, *args): if object := self.lookup(*args): return object return self.insert(*args) def get(self, rowid): row = self.do_get(rowid).fetchone() return self.table_type(row[0]) if row else None def lookup(self, *args): row = self.do_lookup(*args).fetchone() return self.table_type(row[0]) if row else None def drop(self): execute(f"DROP TABLE {self.table_name}") @GObject.Signal(arg_types=(Row,)) def row_inserted(self, row): pass @GObject.Signal(arg_types=(Row,)) def row_deleted(self, row): pass