can't blindly decode() a pickle, need to store as bytes
authorThierry Parmentelat <thierry.parmentelat@inria.fr>
Wed, 2 Jan 2019 16:56:12 +0000 (17:56 +0100)
committerThierry Parmentelat <thierry.parmentelat@inria.fr>
Wed, 2 Jan 2019 16:56:12 +0000 (17:56 +0100)
database.py
tools.py

index 04367f6..a7099bc 100644 (file)
@@ -186,7 +186,7 @@ It proceeds to handle dump requests forever."""
             db_lock.release()
             try:
                 tools.write_file(
             db_lock.release()
             try:
                 tools.write_file(
-                    DB_FILE, lambda f: f.write(db_pickle.decode()))
+                    DB_FILE, lambda f: f.write(db_pickle), binary=True)
                 logger.log_database(db)
             except:
                 logger.log_exc("database.start: failed to pickle/dump")
                 logger.log_database(db)
             except:
                 logger.log_exc("database.start: failed to pickle/dump")
index d8f216e..0d8fe95 100644 (file)
--- a/tools.py
+++ b/tools.py
@@ -154,13 +154,14 @@ using <do_write> to write that file, and then renaming the temporary file.
     shutil.move(write_temp_file(do_write, **kw_args), filename)
 
 
     shutil.move(write_temp_file(do_write, **kw_args), filename)
 
 
-def write_temp_file(do_write, mode=None, uidgid=None):
+def write_temp_file(do_write, mode=None, uidgid=None, binary=False):
     fd, temporary_filename = tempfile.mkstemp()
     if mode:
         os.chmod(temporary_filename, mode)
     if uidgid:
         os.chown(temporary_filename, *uidgid)
     fd, temporary_filename = tempfile.mkstemp()
     if mode:
         os.chmod(temporary_filename, mode)
     if uidgid:
         os.chown(temporary_filename, *uidgid)
-    f = os.fdopen(fd, 'w')
+    open_mode = 'wb' if binary else 'w'
+    f = os.fdopen(fd, open_mode)
     try:
         do_write(f)
     finally:
     try:
         do_write(f)
     finally: