From 055ca35e1d18699880a99f4e43b9aa886d03ea07 Mon Sep 17 00:00:00 2001 From: timotheyca Date: Wed, 5 Aug 2020 23:26:49 +0300 Subject: [PATCH] thread-safety and failing autoincrement --- v25/storage/dbstorage.py | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/v25/storage/dbstorage.py b/v25/storage/dbstorage.py index 1fd9eab..18a422b 100644 --- a/v25/storage/dbstorage.py +++ b/v25/storage/dbstorage.py @@ -1,7 +1,7 @@ from typing import Tuple, Optional, Iterable from nacl.bindings import crypto_sign_PUBLICKEYBYTES -from sqlalchemy import create_engine, LargeBinary, Column, REAL, BLOB, String, or_, and_, BigInteger +from sqlalchemy import create_engine, LargeBinary, Column, REAL, BLOB, String, or_, and_, ForeignKeyConstraint, Integer from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import sessionmaker, Query @@ -24,14 +24,19 @@ class MsgSgn(Base): class Msg(Base): __tablename__ = 'msgs' - sf = Column(LargeBinary(crypto_sign_PUBLICKEYBYTES), primary_key=True) - st = Column(LargeBinary(crypto_sign_PUBLICKEYBYTES), primary_key=True) - idn = Column(LargeBinary(NONCE_SIZE), primary_key=True) + oid = Column(Integer, autoincrement=True, primary_key=True) + sf = Column(LargeBinary(crypto_sign_PUBLICKEYBYTES)) + st = Column(LargeBinary(crypto_sign_PUBLICKEYBYTES)) + idn = Column(LargeBinary(NONCE_SIZE)) ts = Column(REAL, nullable=False, index=True) en = Column(LargeBinary(NONCE_SIZE), nullable=False) ec = Column(BLOB, nullable=False) flags = Column(String, nullable=False) - oid = Column(BigInteger, autoincrement=True, index=True, unique=True, nullable=False) + + __table_args__ = (ForeignKeyConstraint((sf, st, idn,), + (MsgSgn.sf, MsgSgn.st, MsgSgn.idn,), + ), + ) def sgn(self): return MsgSgn(sf=self.sf, st=self.st, idn=self.idn) @@ -124,7 +129,9 @@ class DBStorage(AbstractStorage): query = query.order_by(Msg.oid.desc()) if 'limit' in params: query = query.limit(params['limit']) - return map(Msg.to_message, query.from_self().order_by(Msg.oid)) + messages = map(Msg.to_message, list(query.from_self().order_by(Msg.oid))) + session.close() + return messages def flags(self, m: Message, flags: str): session = self.Session()