From 8c96e5f46aaca4ca2a1593a6c57a24cc60a766ea Mon Sep 17 00:00:00 2001 From: Dan <14043624+delivrance@users.noreply.github.com> Date: Thu, 20 Jun 2019 03:31:37 +0200 Subject: [PATCH] Smarter session migration --- pyrogram/client/storage/file_storage.py | 68 ++++++++++++++----------- 1 file changed, 38 insertions(+), 30 deletions(-) diff --git a/pyrogram/client/storage/file_storage.py b/pyrogram/client/storage/file_storage.py index ee5000c5..f52a03a9 100644 --- a/pyrogram/client/storage/file_storage.py +++ b/pyrogram/client/storage/file_storage.py @@ -19,12 +19,9 @@ import base64 import json import logging -import os import sqlite3 from pathlib import Path -from sqlite3 import DatabaseError from threading import Lock -from typing import Union from .memory_storage import MemoryStorage @@ -43,25 +40,18 @@ class FileStorage(MemoryStorage): self.lock = Lock() # noinspection PyAttributeOutsideInit - def migrate_from_json(self, path: Union[str, Path]): - log.warning("JSON session storage detected! Pyrogram will now convert it into an SQLite session storage...") - - with open(path, encoding="utf-8") as f: - json_session = json.load(f) - - os.remove(path) - + def migrate_from_json(self, session_json: dict): self.open() - self.dc_id = json_session["dc_id"] - self.test_mode = json_session["test_mode"] - self.auth_key = base64.b64decode("".join(json_session["auth_key"])) - self.user_id = json_session["user_id"] - self.date = json_session.get("date", 0) - self.is_bot = json_session.get("is_bot", False) + self.dc_id = session_json["dc_id"] + self.test_mode = session_json["test_mode"] + self.auth_key = base64.b64decode("".join(session_json["auth_key"])) + self.user_id = session_json["user_id"] + self.date = session_json.get("date", 0) + self.is_bot = session_json.get("is_bot", False) - peers_by_id = json_session.get("peers_by_id", {}) - peers_by_phone = json_session.get("peers_by_phone", {}) + peers_by_id = session_json.get("peers_by_id", {}) + peers_by_phone = session_json.get("peers_by_phone", {}) peers = {} @@ -81,22 +71,40 @@ class FileStorage(MemoryStorage): # noinspection PyTypeChecker self.update_peers(peers.values()) - log.warning("Done! The session has been successfully converted from JSON to SQLite storage") - def open(self): - database_exists = os.path.isfile(self.database) + path = self.database + file_exists = path.is_file() + + if file_exists: + try: + with open(path, encoding="utf-8") as f: + session_json = json.load(f) + except ValueError: + pass + else: + log.warning("JSON session storage detected! Converting it into an SQLite session storage...") + + path.rename(path.name + ".OLD") + + log.warning('The old session file has been renamed to "{}.OLD"'.format(path.name)) + + self.migrate_from_json(session_json) + + log.warning("Done! The session has been successfully converted from JSON to SQLite storage") + + return + + if Path(path.name + ".OLD").is_file(): + log.warning('Old session file detected: "{}.OLD". You can remove this file now'.format(path.name)) self.conn = sqlite3.connect( - str(self.database), + path, timeout=1, check_same_thread=False ) - try: - if not database_exists: - self.create() + if not file_exists: + self.create() - with self.conn: - self.conn.execute("VACUUM") - except DatabaseError: - self.migrate_from_json(self.database) + with self.conn: + self.conn.execute("VACUUM")