emmental/db/objects.py
Anna Schumaker 3753b0ad60 db: Add a Tag object
Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
2021-08-23 13:12:02 -04:00

79 lines
2.2 KiB
Python

# 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