diff --git a/src/Model/Geometry/PointXYZ.py b/src/Model/Geometry/PointXYZ.py index 4b49a0f7..83e1f8f2 100644 --- a/src/Model/Geometry/PointXYZ.py +++ b/src/Model/Geometry/PointXYZ.py @@ -27,10 +27,13 @@ from Model.Geometry.Point import Point class PointXYZ(Point, SQLSubModel): _sub_classes = [] - def __init__(self, x: float = 0.0, y: float = 0.0, z: float = 0.0, + def __init__(self, id: int = -1, + x: float = 0.0, y: float = 0.0, z: float = 0.0, name: str = "", profile=None, status=None): super(PointXYZ, self).__init__( - name=name, profile=profile, status=status) + id=id + name=name, profile=profile, status=status + ) self._x = float(x) self._y = float(y) @@ -76,7 +79,6 @@ class PointXYZ(Point, SQLSubModel): return cls._update_submodel(execute, version, data) - @classmethod def _db_update_to_0_1_0(cls, execute, data): table = "geometry_pointXYZ" @@ -102,15 +104,16 @@ class PointXYZ(Point, SQLSubModel): profile = data["profile"] table = execute( - "SELECT name, x, y, z, sl " + + "SELECT pamhyr_id, name, x, y, z, sl " + "FROM geometry_pointXYZ " + - f"WHERE profile = {profile.id} " + + f"WHERE profile = {profile.pamhyr_id} " + "ORDER BY ind ASC" ) for row in table: it = iter(row) + pid = next(it) name = next(it) x = next(it) y = next(it) @@ -118,6 +121,7 @@ class PointXYZ(Point, SQLSubModel): sl = next(it) new = cls( + id=pid, name=name, x=x, y=y, z=z, profile=profile, @@ -129,7 +133,7 @@ class PointXYZ(Point, SQLSubModel): else: new._sl = next( filter( - lambda s: s.id == sl, + lambda s: s.pamhyr_id == sl, data["sediment_layers_list"].sediment_layers ) ) @@ -140,12 +144,14 @@ class PointXYZ(Point, SQLSubModel): profile = data["profile"] ind = data["ind"] - sl = self._sl.id if self._sl is not None else -1 + sl = self._sl.pamhyr_id if self._sl is not None else -1 execute( "INSERT INTO " + - "geometry_pointXYZ(ind, name, x, y, z, profile, sl) " + + "geometry_pointXYZ(pamhyr_id, ind, name, " + + "x, y, z, profile, sl) " + "VALUES (" + + f"{self.pamhyr_id}, " + f"{ind}, '{self._db_format(self._name)}', " + f"{self.x}, {self.y}, {self.z}, " + f"{profile.pamhyr_id}, {sl}" + diff --git a/src/Model/HydraulicStructures/Basic/HydraulicStructures.py b/src/Model/HydraulicStructures/Basic/HydraulicStructures.py index 20bffa5c..224be92f 100644 --- a/src/Model/HydraulicStructures/Basic/HydraulicStructures.py +++ b/src/Model/HydraulicStructures/Basic/HydraulicStructures.py @@ -38,32 +38,28 @@ class BasicHS(SQLSubModel): def __init__(self, id: int = -1, name: str = "", status=None): - super(BasicHS, self).__init__() + super(BasicHS, self).__init__(id) self._status = status - if id == -1: - self.id = BasicHS._id_cnt - else: - self.id = id - self._name = name self._type = "" self._enabled = True self._data = [] - BasicHS._id_cnt = max(BasicHS._id_cnt + 1, self.id) - @classmethod def _db_create(cls, execute): - execute(""" - CREATE TABLE hydraulic_structures_basic( - id INTEGER NOT NULL PRIMARY KEY, + execute(f""" + CREATE TABLE hydraulic_structures_basic{ext} ( + {cls.create_db_add_pamhyr_id()}, name TEXT NOT NULL, type TEXT NOT NULL, enabled BOOLEAN NOT NULL, hs INTEGER, - FOREIGN KEY(hs) REFERENCES hydraulic_structures(id) + FOREIGN KEY(hs) REFERENCES hydraulic_structures(pamhyr_id), + {Scenario.create_db_add_scenario()}, + {Scenario.create_db_add_scenario_fk()}, + PRIMARY KEY(pamhyr_id, scenario) ) """) @@ -76,8 +72,29 @@ class BasicHS(SQLSubModel): if int(release) < 6: cls._db_create(execute) + cls._db_update_to_0_1_0(execute, data) + return cls._update_submodel(execute, version, data) + @classmethod + def _db_update_to_0_1_0(cls, execute, data): + table = "hydraulic_structures_basic" + + cls.update_db_add_pamhyr_id(execute, table, data) + Scenario.update_db_add_scenario(execute, table) + + cls._db_create(execute, ext="_tmp") + + execute( + f"INSERT INTO {table}_tmp " + + "(pamhyr_id, name, type, enabled, hs, scenario) " + + "SELECT pamhyr_id, name, type, enabled, hs, scenario " + + f"FROM {table}" + ) + + execute(f"DROP TABLE {table}") + execute(f"ALTER TABLE {table}_tmp RENAME TO {table}") + @classmethod def _get_ctor_from_type(cls, t): from Model.HydraulicStructures.Basic.Types import ( @@ -96,21 +113,23 @@ class BasicHS(SQLSubModel): new = [] table = execute( - "SELECT id, name, type, enabled, hs " + + "SELECT pamhyr_id, name, type, enabled, hs " + "FROM hydraulic_structures_basic " + f"WHERE hs = {data['hs_id']} " ) for row in table: - bhs_id = row[0] - name = row[1] - type = row[2] - enabled = (row[3] == 1) - hs_id = row[4] + it = iter(row) + + bhs_pid = next(it) + name = next(it) + type = next(it) + enabled = (next(it) == 1) + hs_id = next(it) ctor = cls._get_ctor_from_type(type) bhs = ctor( - id=bhs_id, + id=bhs_pid, name=name, status=data['status'] ) @@ -131,9 +150,9 @@ class BasicHS(SQLSubModel): sql = ( "INSERT INTO " + - "hydraulic_structures_basic(id, name, type, enabled, hs) " + + "hydraulic_structures_basic(pamhyr_id, name, type, enabled, hs) " + "VALUES (" + - f"{self.id}, " + + f"{self.pamhyr_id}, " + f"'{self._db_format(self._name)}', " + f"'{self._db_format(self._type)}', " + f"{self._db_format(self.enabled)}, " + @@ -142,10 +161,10 @@ class BasicHS(SQLSubModel): ) execute(sql) - data['bhs_id'] = self.id + data['bhs_id'] = self.pamhyr_id execute( "DELETE FROM hydraulic_structures_basic_value " + - f"WHERE bhs = {self.id}" + f"WHERE bhs = {self.pamhyr_id}" ) for values in self._data: @@ -159,7 +178,7 @@ class BasicHS(SQLSubModel): @property def name(self): if self._name == "": - return f"{self._type}{self.id + 1}" + return f"{self._type} #{self.pamhyr_id}" return self._name diff --git a/src/Model/HydraulicStructures/Basic/Value.py b/src/Model/HydraulicStructures/Basic/Value.py index effb3ece..c4a01db1 100644 --- a/src/Model/HydraulicStructures/Basic/Value.py +++ b/src/Model/HydraulicStructures/Basic/Value.py @@ -23,9 +23,10 @@ class BHSValue(SQLSubModel): _sub_classes = [] _id_cnt = 0 - def __init__(self, name: str = "", type=float, value=0.0, + def __init__(self, id: int = -1, name: str = "", + type=float, value=0.0, status=None): - super(BHSValue, self).__init__() + super(BHSValue, self).__init__(id) self._status = status @@ -34,15 +35,18 @@ class BHSValue(SQLSubModel): self._value = type(value) @classmethod - def _db_create(cls, execute): - execute(""" - CREATE TABLE hydraulic_structures_basic_value( - id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, + def _db_create(cls, execute, ext=""): + execute(f""" + CREATE TABLE hydraulic_structures_basic_value{ext} ( + {cls.create_db_add_pamhyr_id()}, name TEXT NOT NULL, type TEXT NOT NULL, value TEXT NOT NULL, bhs INTEGER, - FOREIGN KEY(bhs) REFERENCES hydraulic_structures_basic(id) + FOREIGN KEY(bhs) REFERENCES hydraulic_structures_basic(id), + {Scenario.create_db_add_scenario()}, + {Scenario.create_db_add_scenario_fk()}, + PRIMARY KEY(pamhyr_id, scenario) ) """) @@ -55,7 +59,28 @@ class BHSValue(SQLSubModel): if int(release) < 6: cls._db_create(execute) - return True + cls._db_update_to_0_1_0(execute, data) + + return cls._update_submodel(execute, version, data) + + @classmethod + def _db_update_to_0_1_0(cls, execute, data): + table = "hydraulic_structures_basic_value" + + cls.update_db_add_pamhyr_id(execute, table, data) + Scenario.update_db_add_scenario(execute, table) + + cls._db_create(execute, ext="_tmp") + + execute( + f"INSERT INTO {table}_tmp " + + "(pamhyr_id, name, type, value, bhs, scenario) " + + "SELECT pamhyr_id, name, type, value, bhs, scenario " + + f"FROM {table}" + ) + + execute(f"DROP TABLE {table}") + execute(f"ALTER TABLE {table}_tmp RENAME TO {table}") @classmethod def _str_to_type(cls, type): @@ -89,20 +114,22 @@ class BHSValue(SQLSubModel): bhs_id = data["bhs_id"] table = execute( - "SELECT name, type, value " + + "SELECT pamhyr_id, name, type, value " + "FROM hydraulic_structures_basic_value " + f"WHERE bhs = '{bhs_id}'" ) for row in table: - name = row[0] - type = cls._str_to_type(row[1]) - value = row[2] + it = iter(row) + + pid = next(it) + name = next(it) + type = cls._str_to_type(next(it)) + value = next(it) val = cls( - name=name, - type=type, - value=value, + id=pid, name=name, + type=type, value=value, status=data['status'] ) @@ -113,17 +140,18 @@ class BHSValue(SQLSubModel): def _db_save(self, execute, data=None): bhs_id = data["bhs_id"] - sql = ( + execute( "INSERT INTO " + - "hydraulic_structures_basic_value(name, type, value, bhs) " + + "hydraulic_structures_basic_value" + + "(pamhyr_id, name, type, value, bhs) " + "VALUES (" + + f"{self._pamhyr_id}, " + f"'{self._db_format(self._name)}', " + f"'{self._db_format(self._type_to_str(self._type))}', " + f"'{self._db_format(self._value)}', " + f"{bhs_id}" + ")" ) - execute(sql) return True diff --git a/src/Model/HydraulicStructures/HydraulicStructures.py b/src/Model/HydraulicStructures/HydraulicStructures.py index 2262af0a..2637a34b 100644 --- a/src/Model/HydraulicStructures/HydraulicStructures.py +++ b/src/Model/HydraulicStructures/HydraulicStructures.py @@ -40,15 +40,10 @@ class HydraulicStructure(SQLSubModel): def __init__(self, id: int = -1, name: str = "", status=None): - super(HydraulicStructure, self).__init__() + super(HydraulicStructure, self).__init__(id) self._status = status - if id == -1: - self.id = HydraulicStructure._id_cnt - else: - self.id = id - self._name = name self._input_rk = None self._output_rk = None @@ -57,24 +52,22 @@ class HydraulicStructure(SQLSubModel): self._enabled = True self._data = [] - HydraulicStructure._id_cnt = max( - HydraulicStructure._id_cnt + 1, - self.id - ) - @classmethod - def _db_create(cls, execute): - execute(""" - CREATE TABLE hydraulic_structures( - id INTEGER NOT NULL PRIMARY KEY, + def _db_create(cls, execute, ext=""): + execute(f""" + CREATE TABLE hydraulic_structures{ext} ( + {cls.create_db_add_pamhyr_id()}, name TEXT NOT NULL, enabled BOOLEAN NOT NULL, input_rk REAL NOT NULL, output_rk REAL NOT NULL, input_reach INTEGER, output_reach INTEGER, - FOREIGN KEY(input_reach) REFERENCES river_reach(id), - FOREIGN KEY(output_reach) REFERENCES river_reach(id) + FOREIGN KEY(input_reach) REFERENCES river_reach(pamhyr_id), + FOREIGN KEY(output_reach) REFERENCES river_reach(pamhyr_id), + {Scenario.create_db_add_scenario()}, + {Scenario.create_db_add_scenario_fk()}, + PRIMARY KEY(pamhyr_id, scenario) ) """) @@ -103,17 +96,40 @@ class HydraulicStructure(SQLSubModel): """ ) + cls._db_update_to_0_1_0(execute, data) + return cls._update_submodel(execute, version, data) + @classmethod + def _db_update_to_0_1_0(cls, execute, data): + table = "hydraulic_structures" + + cls.update_db_add_pamhyr_id(execute, table, data) + Scenario.update_db_add_scenario(execute, table) + + cls._db_create(execute, ext="_tmp") + + execute( + f"INSERT INTO {table}_tmp " + + "(pamhyr_id, name, enabled, input_rk, output_rk, " + + "input_reach, output_reach, scenario) " + + "SELECT pamhyr_id, name, enabled, input_rk, output_rk, " + + "input_reach, output_reach, scenario " + + f"FROM {table}" + ) + + execute(f"DROP TABLE {table}") + execute(f"ALTER TABLE {table}_tmp RENAME TO {table}") + @classmethod def _db_load(cls, execute, data=None): new = [] table = execute( - "SELECT id, name, enabled, " + + "SELECT pamhyr_id, name, enabled, " + "input_rk, output_rk, " + "input_reach, output_reach " + - "FROM hydraulic_structures " + "FROM hydraulic_structures" ) for row in table: @@ -154,15 +170,18 @@ class HydraulicStructure(SQLSubModel): return new def _db_save(self, execute, data=None): - execute(f"DELETE FROM hydraulic_structures WHERE id = {self.id}") + execute( + "DELETE FROM hydraulic_structures " + + f"WHERE pamhyr_id = {self.pamhyr_id}" + ) input_reach_id = -1 if self._input_reach is not None: - input_reach_id = self._input_reach.id + input_reach_id = self._input_reach.pamhyr_id output_reach_id = -1 if self._output_reach is not None: - output_reach_id = self._output_reach.id + output_reach_id = self._output_reach.pamhyr_id input_rk = -1 if self.input_rk is not None: @@ -172,25 +191,24 @@ class HydraulicStructure(SQLSubModel): if self.output_rk is not None: output_rk = self.output_rk - sql = ( + execute( "INSERT INTO " + "hydraulic_structures(" + - " id, name, enabled, input_rk, output_rk, " + + " pamhyr_id, name, enabled, input_rk, output_rk, " + " input_reach, output_reach" + ") " + "VALUES (" + - f"{self.id}, '{self._db_format(self._name)}', " + + f"{self.pamhyr_id}, '{self._db_format(self._name)}', " + f"{self._db_format(self.enabled)}, " + f"{input_rk}, {output_rk}, " + f"{input_reach_id}, {output_reach_id}" + ")" ) - execute(sql) - data['hs_id'] = self.id + data['hs_id'] = self.pamhyr_id execute( "DELETE FROM hydraulic_structures_basic " + - f"WHERE hs = {self.id}" + f"WHERE hs = {self.pamhyr_id}" ) for basic in self._data: @@ -204,7 +222,7 @@ class HydraulicStructure(SQLSubModel): @property def name(self): if self._name == "": - return f"HS{self.id + 1}" + return f"HS #{self.pamhyr_id}" return self._name