hugvey/hugvey/variablestore.py

61 lines
2.0 KiB
Python

import sqlite3
import asyncio
import logging
mainLogger = logging.getLogger("hugvey")
logger = mainLogger.getChild("variableStore")
class Variable:
def __init__(self, name: str, value: str, hugveyId: int):
self.name = name
self.value = value
self.hugveyId = hugveyId
class VariableStore:
def __init__(self, db_filename):
self.conn = sqlite3.connect(db_filename, check_same_thread=False)
# make sure the table exits.
createSqls = ["""
CREATE TABLE IF NOT EXISTS `variables` (
`name` VARCHAR(255),
`hugvey` INTEGER,
`createdAt` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
`val` VARCHAR(1024)
);
""",
"""
CREATE INDEX IF NOT EXISTS `name_time` ON `variables` (
`name`,
`createdAt` DESC
);
"""]
cur = self.conn.cursor()
for sql in createSqls:
cur.execute(sql)
self.conn.commit()
self.q = asyncio.Queue()
def addVariable(self, name, value, hugveyId):
logger.debug(f"Queing storing of {name} for {hugveyId}")
self.q.put_nowait(Variable(name, value, hugveyId))
async def queueProcessor(self):
while True:
#: :var v: Variable
v = await self.q.get()
c = self.conn.cursor()
logger.info(f"Store variable {v.name} for {v.hugveyId}: '{v.value}'")
c.execute("INSERT INTO variables (name, hugvey, createdAt, val) VALUES (?,?, current_timestamp,?)", (v.name, v.hugveyId, v.value))
self.conn.commit()
c.close()
def getLastOfName(self, name, n = 10):
cur = self.conn.cursor()
logging.debug(f"Get last {n} stored variables of {name}")
cur.execute("SELECT val FROM variables WHERE name = ? ORDER BY createdAt DESC LIMIT ?", (name, n))
values = [v[0] for v in cur.fetchall()]
cur.close()
return values