From b3d9b3709dd00e2fd55d42b227425425bf8a9fac Mon Sep 17 00:00:00 2001 From: Benjamin Dauvergne Date: Thu, 15 Sep 2022 12:25:15 +0200 Subject: [PATCH] sql: load Evolution.parts lazily from database (#69109) --- wcs/sql.py | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 62 insertions(+), 1 deletion(-) diff --git a/wcs/sql.py b/wcs/sql.py index 03fe92ec3..c56b9b4ee 100644 --- a/wcs/sql.py +++ b/wcs/sql.py @@ -102,6 +102,67 @@ def like_escape(value): return value +class LazyPickleList(list): + def __init__(self, dump): + self.dump = dump + + def _load(self): + try: + dump = super().__getattribute__('dump') + except AttributeError: + pass + else: + super().__setitem__(slice(0), pickle.loads(dump)) + del self.dump + + def __getattribute__(self, name): + super().__getattribute__('_load')() + return super().__getattribute__(name) + + def __bool__(self): + self._load() + return bool(len(self)) + + def __iter__(self): + self._load() + return super().__iter__() + + def __len__(self): + self._load() + return super().__len__() + + def __reversed__(self): + self._load() + return super().__reversed__() + + def __str__(self): + self._load() + return super().__str__() + + def __getitem__(self, index): + self._load() + return super().__getitem__(index) + + def __setitem__(self, index, value): + self._load() + return super().__setitem__(index, value) + + def __delitem__(self, index): + self._load() + return super().__delitem__(index) + + def __iadd__(self, values): + self._load() + return super().__add__(values) + + def __contains__(self, value): + self._load() + return super().__contains__(value) + + def __reduce__(self): + return (list, (), None, iter(self)) + + def pickle_loads(value): if hasattr(value, 'tobytes'): value = value.tobytes() @@ -2574,7 +2635,7 @@ class SqlDataMixin(SqlMixin): if o.time: o.time = o.time.timetuple() if row[6]: - o.parts = pickle_loads(row[6]) + o.parts = LazyPickleList(row[6]) return o def set_evolution(self, value): -- 2.37.2