From 269b5cf537c66ba1cb922ee328ae4b0fdfd58163 Mon Sep 17 00:00:00 2001 From: Richard Bronkhorst Date: Tue, 11 Jul 2023 07:17:13 +0200 Subject: [PATCH] Update api.py, base.py and two other files --- nullptr/api.py | 1 - nullptr/models/base.py | 12 ++---------- nullptr/models/waypoint.py | 3 ++- nullptr/store.py | 27 ++++++++++++++++++++++++--- 4 files changed, 28 insertions(+), 15 deletions(-) diff --git a/nullptr/api.py b/nullptr/api.py index 2ac1828..052ace4 100644 --- a/nullptr/api.py +++ b/nullptr/api.py @@ -92,7 +92,6 @@ class Api: def marketplace(self, waypoint): system = waypoint.system - print(f'systems/{system}/waypoints/{waypoint}/market') data = self.request('get', f'systems/{system}/waypoints/{waypoint}/market') return self.store.update(Marketplace, data) diff --git a/nullptr/models/base.py b/nullptr/models/base.py index 5d359b3..4efd2e5 100644 --- a/nullptr/models/base.py +++ b/nullptr/models/base.py @@ -6,14 +6,14 @@ class Reference: self.typ = typ self.symbol = symbol self.store = store - + @classmethod def create(cls, obj): o = cls(type(obj), obj.symbol, obj.store) return o def resolve(self): - self.store.get(self.typ, self.symbol) + return self.store.get(self.typ, self.symbol) def __repr__(self): return f'*REF*{self.symbol}.{self.typ.ext()}' @@ -80,14 +80,6 @@ class Base: self.disable_dirty = True self.__dict__.update(d) self.disable_dirty = False - - def __getstate__(self): - r = {} - for k,v in self.__dict__.items(): - if k in ['store','file_offset', 'disable_dirty', 'file_offset']: - continue - r[k] = deepcopy(v) - return r def type(self): return self.__class__.__name__ diff --git a/nullptr/models/waypoint.py b/nullptr/models/waypoint.py index fc12e26..152c187 100644 --- a/nullptr/models/waypoint.py +++ b/nullptr/models/waypoint.py @@ -21,7 +21,8 @@ class Waypoint(Base): def set_system(self): parts = self.symbol.split('-') system_str = f'{parts[0]}-{parts[1]}' - self.system = self.store.get(System, system_str, create=True) + system = self.store.get(System, system_str, create=True) + self.system = system @classmethod def ext(self): diff --git a/nullptr/store.py b/nullptr/store.py index c549d1f..e581c47 100644 --- a/nullptr/store.py +++ b/nullptr/store.py @@ -8,7 +8,23 @@ from time import time import pickle from struct import unpack, pack from functools import partial +from io import BytesIO +class StorePickler(pickle.Pickler): + def persistent_id(self, obj): + return "STORE" if type(obj) == Store else None + +class StoreUnpickler(pickle.Unpickler): + def __init__(self, stream, store): + self.store = store + super().__init__(stream) + + def persistent_load(self, pers_id): + if pers_id == "STORE": + return self.store + raise pickle.UnpicklingError("I don know the persid!") + + class ChunkHeader: def __init__(self): self.in_use = True @@ -61,10 +77,15 @@ class Store: self.dirty_objects.add(obj) def dump_object(self, obj): - return pickle.dumps(obj) + buf = BytesIO() + p = StorePickler(buf) + p.dump(obj) + return buf.getvalue() def load_object(self, data, offset): - obj = pickle.loads(data) + buf = BytesIO(data) + p = StoreUnpickler(buf, self) + obj = p.load() obj.file_offset = offset obj.disable_dirty = False self.hold(obj) @@ -91,7 +112,7 @@ class Store: slack = sz * self.slack slack = min(slack, self.slack_max) slack = max(slack, self.slack_min) - sz += slack + sz += int(slack) self.fil.seek(0, 2) offset = self.fil.tell() h = ChunkHeader()