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.
This commit is contained in:
Kovid Goyal 2019-03-15 14:49:56 +05:30
parent 6ad782cb29
commit 7e670497eb
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
2 changed files with 26 additions and 3 deletions

View File

@ -5,11 +5,12 @@ __copyright__ = '2008, Kovid Goyal <kovid at kovidgoyal.net>'
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))

View File

@ -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)