From 7e670497eb4a453918d25a5f17b1704d85ce8fa5 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Fri, 15 Mar 2019 14:49:56 +0530 Subject: [PATCH] Move pickle implementation into the serialize module And make it work on both py2 and py3. Note that unpickling of data between python major versions is not likely to work well. --- src/calibre/library/database.py | 7 ++++--- src/calibre/utils/serialize.py | 22 ++++++++++++++++++++++ 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/src/calibre/library/database.py b/src/calibre/library/database.py index dcebaae4e8..8c78324215 100644 --- a/src/calibre/library/database.py +++ b/src/calibre/library/database.py @@ -5,11 +5,12 @@ __copyright__ = '2008, Kovid Goyal ' Backend that implements storage of ebooks in an sqlite database. ''' import sqlite3 as sqlite -import datetime, re, cPickle, sre_constants +import datetime, re, sre_constants from zlib import compress, decompress from calibre.ebooks.metadata import MetaInformation from calibre.ebooks.metadata import string_to_authors +from calibre.utils.serialize import pickle_loads, pickle_dumps from calibre import isbytestring from polyglot.builtins import unicode_type @@ -1090,7 +1091,7 @@ ALTER TABLE books ADD COLUMN isbn TEXT DEFAULT "" COLLATE NOCASE; def conversion_options(self, id, format): data = self.conn.get('SELECT data FROM conversion_options WHERE book=? AND format=?', (id, format.upper()), all=False) if data: - return cPickle.loads(str(data)) + return pickle_loads(bytes(data)) return None def has_conversion_options(self, ids, format='PIPE'): @@ -1166,7 +1167,7 @@ ALTER TABLE books ADD COLUMN isbn TEXT DEFAULT "" COLLATE NOCASE; self.set_tags(id, val.split(','), append=False) def set_conversion_options(self, id, format, options): - data = sqlite.Binary(cPickle.dumps(options, -1)) + data = sqlite.Binary(pickle_dumps(options)) oid = self.conn.get('SELECT id FROM conversion_options WHERE book=? AND format=?', (id, format.upper()), all=False) if oid: self.conn.execute('UPDATE conversion_options SET data=? WHERE id=?', (data, oid)) diff --git a/src/calibre/utils/serialize.py b/src/calibre/utils/serialize.py index 16315b77ae..2b8bd1e7cc 100644 --- a/src/calibre/utils/serialize.py +++ b/src/calibre/utils/serialize.py @@ -5,6 +5,7 @@ from __future__ import absolute_import, division, print_function, unicode_literals from polyglot.builtins import unicode_type +from calibre.constants import ispy3 MSGPACK_MIME = 'application/x-msgpack' @@ -114,3 +115,24 @@ def msgpack_loads(dump): def json_loads(data): import json return json.loads(data, object_hook=json_decoder) + + +if ispy3: + + def pickle_dumps(data): + import pickle + return pickle.dumps(data, -1) + + def pickle_loads(dump): + import pickle + return pickle.loads(dump, encoding='utf-8') + +else: + + def pickle_dumps(data): + import cPickle as pickle + return pickle.dumps(data, -1) + + def pickle_loads(dump): + import cPickle as pickle + return pickle.loads(dump)