Get rid of safe_pickle

Dont need it since we were only storing binary strings anyway
This commit is contained in:
Kovid Goyal 2018-03-07 12:26:01 +05:30
parent e861c5b61a
commit 9adc3b0ffb
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
3 changed files with 31 additions and 1514 deletions

View File

@ -8,7 +8,7 @@ __copyright__ = '2011, Kovid Goyal <kovid@kovidgoyal.net>'
__docformat__ = 'restructuredtext en' __docformat__ = 'restructuredtext en'
# Imports {{{ # Imports {{{
import os, shutil, uuid, json, glob, time, cPickle, hashlib, errno, sys import os, shutil, uuid, json, glob, time, hashlib, errno, sys
from functools import partial from functools import partial
import apsw import apsw
@ -23,6 +23,7 @@ from calibre.db.delete_service import delete_service
from calibre.db.errors import NoSuchFormat from calibre.db.errors import NoSuchFormat
from calibre.library.field_metadata import FieldMetadata from calibre.library.field_metadata import FieldMetadata
from calibre.ebooks.metadata import title_sort, author_to_author_sort from calibre.ebooks.metadata import title_sort, author_to_author_sort
from calibre.utils import pickle_binary_string, unpickle_binary_string
from calibre.utils.icu import sort_key from calibre.utils.icu import sort_key
from calibre.utils.config import to_json, from_json, prefs, tweaks from calibre.utils.config import to_json, from_json, prefs, tweaks
from calibre.utils.date import utcfromtimestamp, parse_date from calibre.utils.date import utcfromtimestamp, parse_date
@ -35,7 +36,6 @@ from calibre.utils.formatter_functions import (load_user_template_functions,
unload_user_template_functions, unload_user_template_functions,
compile_user_template_functions, compile_user_template_functions,
formatter_functions) formatter_functions)
import calibre.utils.safe_pickle as safe_pickle
from calibre.db.tables import (OneToOneTable, ManyToOneTable, ManyToManyTable, from calibre.db.tables import (OneToOneTable, ManyToOneTable, ManyToManyTable,
SizeTable, FormatsTable, AuthorsTable, IdentifiersTable, PathTable, SizeTable, FormatsTable, AuthorsTable, IdentifiersTable, PathTable,
CompositeTable, UUIDTable, RatingTable) CompositeTable, UUIDTable, RatingTable)
@ -1695,11 +1695,7 @@ class DB(object):
def conversion_options(self, book_id, fmt): def conversion_options(self, book_id, fmt):
for (data,) in self.conn.get('SELECT data FROM conversion_options WHERE book=? AND format=?', (book_id, fmt.upper())): for (data,) in self.conn.get('SELECT data FROM conversion_options WHERE book=? AND format=?', (book_id, fmt.upper())):
if data: if data:
try: return unpickle_binary_string(bytes(data))
return safe_pickle.loads(bytes(data))
except Exception:
import traceback
traceback.print_exc()
def has_conversion_options(self, ids, fmt='PIPE'): def has_conversion_options(self, ids, fmt='PIPE'):
ids = frozenset(ids) ids = frozenset(ids)
@ -1716,7 +1712,8 @@ class DB(object):
[(book_id, fmt.upper()) for book_id in book_ids]) [(book_id, fmt.upper()) for book_id in book_ids])
def set_conversion_options(self, options, fmt): def set_conversion_options(self, options, fmt):
options = [(book_id, fmt.upper(), buffer(cPickle.dumps(data, -1))) for book_id, data in options.iteritems()] options = [(book_id, fmt.upper(), buffer(pickle_binary_string(data.encode('utf-8') if isinstance(data, unicode) else data)))
for book_id, data in options.iteritems()]
self.executemany('INSERT OR REPLACE INTO conversion_options(book,format,data) VALUES (?,?,?)', options) self.executemany('INSERT OR REPLACE INTO conversion_options(book,format,data) VALUES (?,?,?)', options)
def get_top_level_move_items(self, all_paths): def get_top_level_move_items(self, all_paths):

View File

@ -24,3 +24,29 @@ def join_with_timeout(q, timeout=2):
finally: finally:
q.all_tasks_done.release() q.all_tasks_done.release()
def unpickle_binary_string(data):
# Maintains compatibility with python's pickle module protocol version 2
import struct
from pickle import PROTO, SHORT_BINSTRING, BINSTRING
if data.startswith(PROTO + b'\x02'):
offset = 2
which = data[offset]
offset += 1
if which == BINSTRING:
sz, = struct.unpack_from(b'<i', data, offset)
offset += struct.calcsize(b'<i')
elif which == SHORT_BINSTRING:
sz = ord(data[offset])
offset += 1
else:
return
return data[offset:offset + sz]
def pickle_binary_string(data):
# Maintains compatibility with python's pickle module protocol version 2
import struct
from pickle import PROTO, BINSTRING
data = bytes(data)
return PROTO + b'\x1b' + BINSTRING + struct.pack(b'<i', len(data)) + data

File diff suppressed because it is too large Load Diff