diff --git a/src/Model/REPLine/REPLine.py b/src/Model/REPLine/REPLine.py index 2f6867d8..0388d320 100644 --- a/src/Model/REPLine/REPLine.py +++ b/src/Model/REPLine/REPLine.py @@ -30,8 +30,11 @@ class REPLine(SQLSubModel): def __init__(self, id: int = -1, enabled=True, name="", line="", solvers=set(), - status=None): - super(REPLine, self).__init__(id) + status=None, owner_scenario=-1): + super(REPLine, self).__init__( + id, status=status, + owner_scenario=owner_scenario + ) self._status = status @@ -111,6 +114,7 @@ class REPLine(SQLSubModel): CREATE TABLE rep_lines{ext} ( {cls.create_db_add_pamhyr_id()}, enabled BOOLEAN NOT NULL, + deleted BOOLEAN NOT NULL DEFAULT FALSE, name TEXT NOT NULL, line TEXT NOT NULL, solvers TEXT NOT NULL, @@ -132,6 +136,13 @@ class REPLine(SQLSubModel): else: cls._db_update_to_0_0_14(execute, data) + if major == "0" and minor == "1": + if release < 2: + execute( + "ALTER TABLE rep_lines " + + "ADD COLUMN deleted BOOLEAN NOT NULL DEFAULT FALSE" + ) + return True @classmethod @@ -155,10 +166,18 @@ class REPLine(SQLSubModel): @classmethod def _db_load(cls, execute, data=None): new = [] + scenario = data["scenario"] + loaded = data['loaded_pid'] + + if scenario is None: + return new table = execute( - "SELECT pamhyr_id, enabled, name, line, solvers " + - "FROM rep_lines" + "SELECT pamhyr_id, enabled, deleted, name, line, "+ + "solvers, scenario " + + "FROM rep_lines " + + f"WHERE scenario = {scenario.id} " + + f"AND pamhyr_id NOT IN ({', '.join(map(str, loaded))})" ) for row in table: @@ -166,32 +185,47 @@ class REPLine(SQLSubModel): id = next(it) enabled = (next(it) == 1) + deleted = (next(it) == 1) name = next(it) line = next(it) solvers = set(next(it).split(";;")) + owner_scenario = next(it) f = cls( - id=id, enabled=enabled, name=name, line=line, - solvers=solvers, status=data['status'] + id=id, enabled=enabled, + name=name, line=line, solvers=solvers, + status=data['status'], owner_scenario=owner_scenario ) + if deleted: + f.set_as_deleted() + loaded.add(id) new.append(f) + data["scenario"] = scenario.parent + new += cls._db_load(execute, data) + data["scenario"] = scenario + return new def _db_save(self, execute, data=None): + if not self.must_be_saved(): + return True + solvers = ";;".join(self._solvers) - sql = ( + execute( "INSERT INTO " + - "rep_lines(pamhyr_id, enabled, name, line, solvers) " + + "rep_lines(pamhyr_id, enabled, deleted, " + + "name, line, solvers, scenario) " + "VALUES (" + f"{self._pamhyr_id}, {self._enabled}, " + + f"{self._db_format(self.is_deleted())}, " + f"'{self._db_format(self._name)}', " + f"'{self._db_format(self._line)}', " + - f"'{self._db_format(solvers)}'" + + f"'{self._db_format(solvers)}', " + + f"{self._status.scenario_id}" + ")" ) - execute(sql) return True diff --git a/src/Model/REPLine/REPLineList.py b/src/Model/REPLine/REPLineList.py index bbed40dc..5a570ea8 100644 --- a/src/Model/REPLine/REPLineList.py +++ b/src/Model/REPLine/REPLineList.py @@ -19,7 +19,7 @@ from tools import trace, timer from Model.Except import NotImplementedMethodeError -from Model.Tools.PamhyrList import PamhyrModelList +from Model.Tools.PamhyrListExt import PamhyrModelList from Model.REPLine.REPLine import REPLine @@ -38,7 +38,10 @@ class REPLineList(PamhyrModelList): ok = True # Delete previous data - execute("DELETE FROM rep_lines") + execute( + "DELETE FROM rep_lines " + + f"WHERE scenario = {self._status.scenario_id}" + ) for af in self._lst: ok &= af._db_save(execute, data)