Changeset 955:d98b211d32fa


Ignore:
Timestamp:
05/12/19 07:18:47 (6 years ago)
Author:
István Váradi <ivaradi@…>
Branch:
python3
Phase:
public
Message:

Fixed pickling of PIREPs saved with Python 2 (re #347).

Location:
src/mlx
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • src/mlx/common.py

    r942 r955  
    3131
    3232    from gi.repository import GObject as gobject
     33
     34#-------------------------------------------------------------------------------
     35
     36def fixUnpickledValue(value):
     37    """Fix the given unpickled value.
     38
     39    It handles some basic data, like scalars, lists and tuples. If it
     40    encounters byte arrays, they are decoded as 'utf-8' strings."""
     41    if isinstance(value, bytes):
     42        return str(value, "utf-8")
     43    elif isinstance(value, list):
     44        return [fixUnpickledValue(v) for v in value]
     45    elif isinstance(value, tuple):
     46        return tuple([fixUnpickledValue(v) for v in value])
     47    else:
     48        return value
     49
     50#-------------------------------------------------------------------------------
     51
     52def fixUnpickled(state):
     53    """Fix the given unpickled state.
     54
     55    It checks keys and values, and if it encounters any byte arrays, they are
     56    decoded with the encoding 'utf-8'. It returns a new dictionary.
     57    """
     58    newDict = {}
     59    for (key, value) in iter(state.items()):
     60        newDict[fixUnpickledValue(key)] = fixUnpickledValue(value)
     61
     62    return newDict
  • src/mlx/pirep.py

    r919 r955  
    22from .util import utf2unicode
    33from .flight import Flight
     4from .common import fixUnpickled
    45
    56from . import const
     
    114115        try:
    115116            with open(path, "rb") as f:
    116                 pirep = pickle.load(f)
     117                pirep = pickle.load(f, fix_imports = True, encoding = "bytes")
    117118                if "numCrew" not in dir(pirep):
    118119                    pirep.numCrew = pirep.bookedFlight.numCrew
     
    412413
    413414        return ([], attrs)
     415
     416    def __setstate__(self, state):
     417        """Set the state from the given unpickled dictionary."""
     418        self.__dict__.update(fixUnpickled(state))
  • src/mlx/rpc.py

    r928 r955  
    22from . import rpccommon
    33
    4 from .common import MAVA_BASE_URL
     4from .common import MAVA_BASE_URL, fixUnpickled
    55
    66import jsonrpclib
     
    322322        print("foglalas_id=%s" % ("0" if self.id is None else self.id,), file=f)
    323323
     324    def __setstate__(self, state):
     325        """Set the state from the given unpickled dictionary."""
     326        self.__dict__.update(fixUnpickled(state))
     327
    324328#---------------------------------------------------------------------------------------
    325329
Note: See TracChangeset for help on using the changeset viewer.