change db isolation level to READ UNCOMMITTED
This commit is contained in:
parent
bb01b26841
commit
530937858a
6 changed files with 33 additions and 18 deletions
|
@ -2,12 +2,11 @@ from typing import List, Union
|
|||
|
||||
from PIL import Image
|
||||
|
||||
from core.builtins import Plain, Image as BImage, confirm_command, Bot
|
||||
from core.builtins import Plain, Image as BImage, confirm_command, Bot, FetchTarget as FT, FetchedSession as FS
|
||||
from core.builtins.message import MessageSession as MS
|
||||
from core.builtins.message.chain import MessageChain
|
||||
from core.logger import Logger
|
||||
from core.types import Session, MsgInfo, FetchTarget as FT, \
|
||||
FetchedSession as FS, FinishedSession as FinS, AutoSession as AS, AutoSession
|
||||
from core.types import Session, MsgInfo, FinishedSession as FinS, AutoSession as AS, AutoSession
|
||||
|
||||
|
||||
class FinishedSession(FinS):
|
||||
|
@ -132,14 +131,6 @@ class Template(MS):
|
|||
|
||||
|
||||
class FetchedSession(FS):
|
||||
def __init__(self, targetFrom, targetId):
|
||||
self.target = MsgInfo(targetId=f'{targetFrom}|{targetId}',
|
||||
senderId=f'{targetFrom}|{targetId}',
|
||||
targetFrom=targetFrom,
|
||||
senderFrom=targetFrom,
|
||||
senderName='', clientName='TEST', messageId=0, replyId=None)
|
||||
self.session = Session(message=False, target=targetId, sender=targetId)
|
||||
self.parent = Template(self.target, self.session)
|
||||
|
||||
async def sendMessage(self, msgchain, disable_secret_check=False):
|
||||
"""
|
||||
|
@ -155,8 +146,8 @@ class FetchTarget(FT):
|
|||
name = 'TEST'
|
||||
|
||||
@staticmethod
|
||||
async def fetch_target(targetId) -> FetchedSession:
|
||||
return FetchedSession('TEST|Console', targetId)
|
||||
async def fetch_target(targetId, senderId=None) -> FetchedSession:
|
||||
return FetchedSession('TEST|Console', '0', 'TEST', '0')
|
||||
|
||||
@staticmethod
|
||||
async def post_message(module_name, message, user_list: List[FetchedSession] = None, i18n=False, **kwargs):
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
import asyncio
|
||||
import ujson as json
|
||||
|
||||
from core.logger import Logger
|
||||
from core.scheduler import Scheduler, IntervalTrigger
|
||||
from core.builtins import Bot
|
||||
from database import BotDBUtil
|
||||
|
@ -38,9 +39,11 @@ async def check_job_queue():
|
|||
_queue_tasks[tskid]['flag'].set()
|
||||
get_all = BotDBUtil.JobQueue.get_all(target_client=Bot.FetchTarget.name)
|
||||
for tsk in get_all:
|
||||
Logger.debug(f'Received job queue task {tsk.taskid}, action: {tsk.action}')
|
||||
args = json.loads(tsk.args)
|
||||
if tsk.action == 'validate_permission':
|
||||
fetch = await Bot.FetchTarget.fetch_target(tsk.args['target_id'], tsk.args['sender_id'])
|
||||
fetch = await Bot.FetchTarget.fetch_target(args['target_id'], args['sender_id'])
|
||||
if fetch:
|
||||
BotDBUtil.JobQueue.return_val(tsk, json.dumps({'value': True}))
|
||||
BotDBUtil.JobQueue.return_val(tsk, json.dumps({'value': await fetch.parent.checkPermission()}))
|
||||
|
||||
return await check_job_queue()
|
||||
|
|
|
@ -292,7 +292,7 @@ class FetchTarget:
|
|||
name = ''
|
||||
|
||||
@staticmethod
|
||||
async def fetch_target(targetId) -> FetchedSession:
|
||||
async def fetch_target(targetId, senderId=None) -> FetchedSession:
|
||||
"""
|
||||
尝试从数据库记录的对象ID中取得对象消息会话,实际此会话中的消息文本会被设为False(因为本来就没有)。
|
||||
"""
|
||||
|
|
|
@ -15,6 +15,7 @@ from core.logger import Logger
|
|||
from core.scheduler import Scheduler
|
||||
from core.utils.http import get_url
|
||||
from core.utils.ip import IP
|
||||
from core.queue import check_job_queue
|
||||
|
||||
|
||||
async def init_async() -> None:
|
||||
|
@ -29,6 +30,7 @@ async def init_async() -> None:
|
|||
await asyncio.gather(*gather_list)
|
||||
Scheduler.start()
|
||||
logging.getLogger('apscheduler.executors.default').setLevel(logging.WARNING)
|
||||
await asyncio.create_task(check_job_queue())
|
||||
await load_secret()
|
||||
|
||||
|
||||
|
|
|
@ -402,6 +402,11 @@ class BotDBUtil:
|
|||
def get(taskid: str) -> JobQueueTable:
|
||||
return session.query(JobQueueTable).filter_by(taskid=taskid).first()
|
||||
|
||||
@staticmethod
|
||||
@retry(stop=stop_after_attempt(3))
|
||||
def get_first(target_client: str) -> JobQueueTable:
|
||||
return session.query(JobQueueTable).filter_by(targetClient=target_client, hasDone=False).first()
|
||||
|
||||
@staticmethod
|
||||
@retry(stop=stop_after_attempt(3))
|
||||
def get_all(target_client: str) -> List[JobQueueTable]:
|
||||
|
@ -411,7 +416,7 @@ class BotDBUtil:
|
|||
@retry(stop=stop_after_attempt(3))
|
||||
@auto_rollback_error
|
||||
def return_val(query: JobQueueTable, value):
|
||||
query.value = json.dumps(value)
|
||||
query.returnVal = json.dumps(value)
|
||||
query.hasDone = True
|
||||
session.commit()
|
||||
session.expire_all()
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
from sqlalchemy import create_engine
|
||||
from sqlalchemy.ext.asyncio import create_async_engine, async_sessionmaker
|
||||
from sqlalchemy.orm import sessionmaker
|
||||
|
||||
from config import Config
|
||||
|
@ -9,7 +10,7 @@ DB_LINK = Config('db_path')
|
|||
|
||||
class DBSession:
|
||||
def __init__(self):
|
||||
self.engine = engine = create_engine(DB_LINK)
|
||||
self.engine = create_engine(DB_LINK, isolation_level="READ UNCOMMITTED")
|
||||
self.Session = sessionmaker()
|
||||
self.Session.configure(bind=self.engine)
|
||||
|
||||
|
@ -21,4 +22,17 @@ class DBSession:
|
|||
Base.metadata.create_all(bind=self.engine, checkfirst=True)
|
||||
|
||||
|
||||
class AsyncDBSession:
|
||||
def __init__(self):
|
||||
self.engine = create_async_engine(DB_LINK, isolation_level="READ UNCOMMITTED")
|
||||
self.Session = async_sessionmaker()
|
||||
self.Session.configure(bind=self.engine)
|
||||
|
||||
async def session(self):
|
||||
return self.Session()
|
||||
|
||||
def create(self):
|
||||
Base.metadata.create_all(bind=self.engine, checkfirst=True)
|
||||
|
||||
|
||||
Session = DBSession()
|
||||
|
|
Reference in a new issue