From e7099bfb862b493f7f5d2bd7b65c0652af5e7753 Mon Sep 17 00:00:00 2001
From: Pierre-Antoine Rouby <pierre-antoine.rouby@inrae.fr>
Date: Tue, 4 Jul 2023 13:26:45 +0200
Subject: [PATCH] Profile: Fix profile id issues and profile index in reach.

---
 src/Model/Geometry/Profile.py    |  3 ++-
 src/Model/Geometry/ProfileXYZ.py | 27 +++++++++++++++------------
 src/Model/Geometry/Reach.py      | 15 +++++++++++++--
 3 files changed, 30 insertions(+), 15 deletions(-)

diff --git a/src/Model/Geometry/Profile.py b/src/Model/Geometry/Profile.py
index 93e2c8a8..4a1f5a5f 100644
--- a/src/Model/Geometry/Profile.py
+++ b/src/Model/Geometry/Profile.py
@@ -19,10 +19,11 @@ class Profile(object):
 
         if id == -1:
             self.id = Profile._id_cnt
-            Profile._id_cnt += 1
         else:
             self.id = id
 
+        Profile._id_cnt = max(self.id, Profile._id_cnt+1)
+
         self._num = int(num)
         self._code1 = int(code1)
         self._code2 = int(code2)
diff --git a/src/Model/Geometry/ProfileXYZ.py b/src/Model/Geometry/ProfileXYZ.py
index 9894cfef..d368b981 100644
--- a/src/Model/Geometry/ProfileXYZ.py
+++ b/src/Model/Geometry/ProfileXYZ.py
@@ -53,6 +53,7 @@ class ProfileXYZ(Profile, SQLSubModel):
         execute("""
           CREATE TABLE geometry_profileXYZ(
             id INTEGER NOT NULL PRIMARY KEY,
+            ind INTEGER NOT NULL,
             name TEXT,
             reach INTEGER NOT NULL,
             kp REAL NOT NULL,
@@ -76,18 +77,22 @@ class ProfileXYZ(Profile, SQLSubModel):
         reach = data["reach"]
 
         table = execute(
-            "SELECT id, name, kp, num, code1, code2 " +
+            "SELECT id, ind, name, kp, num, code1, code2 " +
             "FROM geometry_profileXYZ " +
             f"WHERE reach = {reach}"
         )
 
+        for _ in table:
+            profiles.append(None)
+
         for row in table:
             id = row[0]
-            name = row[1]
-            kp = row[2]
-            num = row[3]
-            code1 = row[4]
-            code2 = row[5]
+            ind = row[1]
+            name = row[2]
+            kp = row[3]
+            num = row[5]
+            code1 = row[5]
+            code2 = row[6]
 
             new = cls(
                 id=id, num = num,
@@ -100,28 +105,26 @@ class ProfileXYZ(Profile, SQLSubModel):
             data["profile"] = id
             new._points = PointXYZ._sql_load(execute, data)
 
-            profiles.append(new)
+            profiles[ind] = new
 
         return profiles
 
     def _sql_save(self, execute, data = None):
         ok = True
+        ind = data["ind"]
 
         sql = (
             "INSERT OR REPLACE INTO " +
-            "geometry_profileXYZ(id, name, reach, kp, num, code1, code2) "+
+            "geometry_profileXYZ(id, ind, name, reach, kp, num, code1, code2) "+
             "VALUES (" +
-            f"{self.id}, '{self._sql_format(self._name)}', " +
+            f"{self.id}, {ind}, '{self._sql_format(self._name)}', " +
             f"{self.reach.id}, {self.kp}, {self.num}, " +
             f"{self.code1}, {self.code1}" +
             ")"
         )
         execute(sql)
 
-        if data is None:
-            data = {}
         data["profile"] = self.id
-
         execute(f"DELETE FROM geometry_pointXYZ WHERE profile = {self.id}")
 
         ind = 0
diff --git a/src/Model/Geometry/Reach.py b/src/Model/Geometry/Reach.py
index c0140db9..fa72c8ec 100644
--- a/src/Model/Geometry/Reach.py
+++ b/src/Model/Geometry/Reach.py
@@ -51,9 +51,20 @@ class Reach(SQLSubModel):
         return new
 
     def _sql_save(self, execute, data = None):
-        objs = self._profiles
+        # Delete old data
+        execute(f"DELETE FROM geometry_profileXYZ")
+        execute(f"DELETE FROM geometry_pointXYZ")
 
-        return self._save_submodel(execute, objs, data)
+        if data is None:
+            data = {}
+
+        ind = 0
+        for profile in self._profiles:
+            data["ind"] = ind
+            profile._sql_save(execute, data)
+            ind += 1
+
+        return True
 
     def profile(self, i):
         """Returns profile at index i
-- 
GitLab