Update.
This commit is contained in:
parent
44ac1d2bfa
commit
dd108c2004
src/snek
@ -13,7 +13,7 @@ from snek.service.user_property import UserPropertyService
|
|||||||
from snek.service.util import UtilService
|
from snek.service.util import UtilService
|
||||||
from snek.service.repository import RepositoryService
|
from snek.service.repository import RepositoryService
|
||||||
from snek.system.object import Object
|
from snek.system.object import Object
|
||||||
|
from snek.service.db import DBService
|
||||||
|
|
||||||
@functools.cache
|
@functools.cache
|
||||||
def get_services(app):
|
def get_services(app):
|
||||||
@ -31,6 +31,7 @@ def get_services(app):
|
|||||||
"drive_item": DriveItemService(app=app),
|
"drive_item": DriveItemService(app=app),
|
||||||
"user_property": UserPropertyService(app=app),
|
"user_property": UserPropertyService(app=app),
|
||||||
"repository": RepositoryService(app=app),
|
"repository": RepositoryService(app=app),
|
||||||
|
"db": DBService(app=app),
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
71
src/snek/service/db.py
Normal file
71
src/snek/service/db.py
Normal file
@ -0,0 +1,71 @@
|
|||||||
|
from snek.system.service import BaseService
|
||||||
|
import dataset
|
||||||
|
import uuid
|
||||||
|
|
||||||
|
from datetime import datetime
|
||||||
|
|
||||||
|
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)
|
@ -26,6 +26,31 @@ class RPCView(BaseView):
|
|||||||
self.services = self.app.services
|
self.services = self.app.services
|
||||||
self.ws = ws
|
self.ws = ws
|
||||||
|
|
||||||
|
async def db_insert(self, table_name, record):
|
||||||
|
self._require_login()
|
||||||
|
|
||||||
|
return await self.services.db.insert(self.user_uid, table_name, record)
|
||||||
|
async def db_update(self, table_name, record):
|
||||||
|
self._require_login()
|
||||||
|
return await self.services.db.update(self.user_uid, table_name, record)
|
||||||
|
async def db_delete(self, table_name, record):
|
||||||
|
self._require_login()
|
||||||
|
return await self.services.db.delete(self.user_uid, table_name, record)
|
||||||
|
async def db_get(self, table_name, record):
|
||||||
|
self._require_login()
|
||||||
|
return await self.services.db.get(self.user_uid, table_name, record)
|
||||||
|
async def db_find(self, table_name, record):
|
||||||
|
self._require_login()
|
||||||
|
return await self.services.db.find(self.user_uid, table_name, record)
|
||||||
|
async def db_upsert(self, table_name, record,keys):
|
||||||
|
self._require_login()
|
||||||
|
return await self.services.db.upsert(self.user_uid, table_name, record,keys)
|
||||||
|
|
||||||
|
async def db_query(self, table_name, args):
|
||||||
|
self._require_login()
|
||||||
|
return await self.services.db.query(self.user_uid, table_name, sql, args)
|
||||||
|
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def user_uid(self):
|
def user_uid(self):
|
||||||
return self.view.session.get("uid")
|
return self.view.session.get("uid")
|
||||||
|
Loading…
Reference in New Issue
Block a user