0ptr/nullptr/store.py
2023-06-12 14:32:58 +02:00

96 lines
2.3 KiB
Python

from nullptr.models.base import Base
from nullptr.models.waypoint import Waypoint
from nullptr.models.sector import Sector
from nullptr.models.system import System
from nullptr.models.agent import Agent
from os.path import isfile, dirname, isdir
import os
import json
from .util import *
from time import time
class Store:
def __init__(self, data_dir):
self.data_dir = data_dir
self.data = {}
self.dirty_objects = set()
def dirty(self, obj):
self.dirty_objects.add(obj)
def path(self, obj):
return os.path.join(self.data_dir, obj.path())
def load(self, obj):
path = self.path(obj)
if not isfile(path):
return obj
with open(path) as f:
data = json.load(f)
data['store'] = self
obj.__dict__ = data
def get_file(self, typ, path):
if not isfile(path):
print(path)
return None
with open(path) as f:
data = json.load(f)
symbol = mg(data, 'symbol')
oid = f'{symbol}.{typ.ext()}'
if oid in self.data:
return self.data[oid]
obj = typ(symbol, self)
self.load(obj)
self.data[oid] = obj
return obj
def store(self, obj):
path = self.path(obj)
path_dir = dirname(path)
data = obj.dict()
if not isdir(path_dir):
os.makedirs(path_dir, exist_ok=True)
with open(path, 'w') as f:
json.dump(data, f, indent=2)
def get(self, typ, symbol):
oid = f'{symbol}.{typ.ext()}'
if oid in self.data:
return self.data[oid]
obj = typ(symbol, self)
self.load(obj)
self.data[oid] = obj
return obj
def update(self, typ, symbol, data):
obj = self.get(typ, symbol)
obj.update(data)
return obj
def update_list(self, typ, lst):
return [self.update(typ, mg(d, 'symbol'), d) for d in lst]
def all(self, path, typ, recursive=False):
if hasattr(path, 'path'):
path = path.path()
path = os.path.join(self.data_dir, path)
if not isdir(path):
return
ext = '.' + typ.ext()
for fil in list_files(path, recursive):
if not fil.endswith(ext):
continue
yield self.get_file(typ, fil)
def flush(self):
it = 0
start_time = time()
for obj in self.dirty_objects:
it += 1
self.store(obj)
self.dirty_objects = set()
dur = time() - start_time
# print(f'flush done {it} items {dur:.2f}')