67 lines
2.2 KiB
Python
67 lines
2.2 KiB
Python
import dataset
|
|
|
|
from snek.system.service import BaseService
|
|
|
|
|
|
class DBService(BaseService):
|
|
|
|
async def get_db(self, user_uid):
|
|
|
|
home_folder = await self.app.services.user.get_home_folder(user_uid)
|
|
home_folder.mkdir(parents=True, exist_ok=True)
|
|
db_path = home_folder.joinpath("snek/user.db")
|
|
db_path.parent.mkdir(parents=True, exist_ok=True)
|
|
return dataset.connect("sqlite:///" + str(db_path))
|
|
|
|
async def insert(self, user_uid, table_name, values):
|
|
db = await self.get_db(user_uid)
|
|
return db[table_name].insert(values)
|
|
|
|
async def update(self, user_uid, table_name, values, filters):
|
|
db = await self.get_db(user_uid)
|
|
if not filters:
|
|
filters = {}
|
|
if not values:
|
|
return False
|
|
return db[table_name].update(values, filters)
|
|
|
|
async def upsert(self, user_uid, table_name, values, keys):
|
|
db = await self.get_db(user_uid)
|
|
return db[table_name].upsert(values, keys)
|
|
|
|
async def find(self, user_uid, table_name, kwargs):
|
|
db = await self.get_db(user_uid)
|
|
kwargs["_limit"] = kwargs.get("_limit", 30)
|
|
return [dict(row) for row in db[table_name].find(**kwargs)]
|
|
|
|
async def get(self, user_uid, table_name, filters):
|
|
db = await self.get_db(user_uid)
|
|
if not filters:
|
|
filters = {}
|
|
try:
|
|
return dict(db[table_name].find_one(**filters))
|
|
except ValueError:
|
|
return None
|
|
|
|
async def delete(self, user_uid, table_name, filters):
|
|
db = await self.get_db(user_uid)
|
|
if not filters:
|
|
filters = {}
|
|
return db[table_name].delete(**filters)
|
|
|
|
async def query(self, sql, values):
|
|
db = await self.app.db
|
|
return [dict(row) for row in db.query(sql, values or {})]
|
|
|
|
async def exists(self, user_uid, table_name, filters):
|
|
db = await self.get_db(user_uid)
|
|
if not filters:
|
|
filters = {}
|
|
return bool(db[table_name].find_one(**filters))
|
|
|
|
async def count(self, user_uid, table_name, filters):
|
|
db = await self.get_db(user_uid)
|
|
if not filters:
|
|
filters = {}
|
|
return db[table_name].count(**filters)
|