Skip to content

Commit

Permalink
fixes und improvments
Browse files Browse the repository at this point in the history
Added different methods of serializing (picle or json)
Added some try-exept instructions
Fixed deserializing function
  • Loading branch information
sashaferrum committed Sep 22, 2023
1 parent d220c94 commit d2999bd
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 6 deletions.
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -150,3 +150,5 @@ cython_debug/
# and can be added to the global gitignore or merged into this file. For a more nuclear
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
#.idea/

fsm_starage.db
40 changes: 34 additions & 6 deletions aiogram_sqlite_storage/sqlitestore.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,18 +4,26 @@

import sqlite3
import pickle
import json

import logging
logger = logging.getLogger(__name__)


class SQLStorage(BaseStorage):

def __init__(self, db_path: str = 'fsm_starage.db') -> None:
def __init__(self, db_path: str = 'fsm_starage.db', serializing_method: str = 'picle') -> None:
"""
You can point a database path. It will be 'fsm_storage.db' for default.
It's possible to choose srtializing method: 'pickle' (default) or 'json'. If you hange serializing method, you shoud delete existing database, and start a new one.
"""
self.db_path = db_path
self.ser_m = serializing_method

if self.ser_m != 'picle' and self.ser_m != 'json':
logger.warning(f"'{self.ser_m}' is unknown serializing method! A 'picle' will be used.")
self.ser_m = 'picle'

try:
self.con = sqlite3.connect(self.db_path)
self.con.execute("CREATE TABLE IF NOT EXISTS fsm_data (key TEXT PRIMARY KEY, state TEXT, data TEXT)")
Expand All @@ -33,18 +41,38 @@ def _key(self, key:StorageKey) -> str:
return s


def _ser(self, arg) -> str:
def _ser(self, obj) -> str:
"""
Serialize object
"""
return pickle.dumps(arg)
try:
match self.ser_m:
case 'picle':
return pickle.dumps(obj)
case 'json':
return json.dumps(obj)
case _:
return pickle.dumps(obj)
except Exception as e:
logger.error(f'Serializing error! {e}')
return None


def _dsr(self, s:str):
def _dsr(self, string:str) -> object:
"""
Deserialize object
"""
return pickle.loads(s)
try:
match self.ser_m:
case 'picle':
return pickle.loads(string)
case 'json':
return json.loads(string)
case _:
return pickle.loads(string)
except Exception as e:
logger.error(f'Deserializing error! Probably, unsupported serializing method was used. {e}')
return None


async def set_state(self, key: StorageKey, state: State = None) -> None:
Expand Down Expand Up @@ -122,7 +150,7 @@ async def get_data(self, key: StorageKey) -> Dict[str, Any]:

if s_data:
if s_data[0]:
return self._dsr(s_data)
return self._dsr(s_data[0])
else:
return None
else:
Expand Down

0 comments on commit d2999bd

Please sign in to comment.