From a23a5cb7d0b22c1767cf8ac40a5913b436eb5027 Mon Sep 17 00:00:00 2001
From: Cyrille Berger <cyrille.berger@liu.se>
Date: Fri, 17 May 2024 23:15:42 +0200
Subject: [PATCH] always update table name, it could happen the table get
 dropped and recreated without proper propagation

---
 kDB/Repository/GraphsManager.cpp         |  5 ++---
 kDB/Repository/TriplesStore.cpp          | 24 +++++++++++++++++-------
 kDB/Repository/TriplesStore.h            |  1 +
 kDB/Repository/tests/TestTripleStore.cpp | 13 +++++++++++--
 4 files changed, 31 insertions(+), 12 deletions(-)

diff --git a/kDB/Repository/GraphsManager.cpp b/kDB/Repository/GraphsManager.cpp
index 1878eea5..0d4d32af 100644
--- a/kDB/Repository/GraphsManager.cpp
+++ b/kDB/Repository/GraphsManager.cpp
@@ -336,14 +336,13 @@ knowCore::ReturnVoid GraphsManager::reload()
     {
       tsd = d->tripleStores[name];
       Q_ASSERT(not tsd->name.isEmpty());
-      Q_ASSERT(not tsd->table.isEmpty());
     } else {
       tsd = QSharedPointer<TriplesStore::Definition>(new TriplesStore::Definition);
       tsd->name = name;
-      KNOWCORE_RETURN_VALUE_TRY_ASSIGN(tsd->table, r.value(i, 1).value<QString>());
       Q_ASSERT(not tsd->name.isEmpty());
-      Q_ASSERT(not tsd->table.isEmpty());
     }
+    KNOWCORE_RETURN_VALUE_TRY_ASSIGN(tsd->table, r.value(i, 1).value<QString>());
+    Q_ASSERT(not tsd->table.isEmpty());
     tripleStores[name] = tsd;
     QMutexLocker l(&tsd->mutex);
     TriplesStore::Options new_options(r.value<int>(i, 2).expectSuccess());
diff --git a/kDB/Repository/TriplesStore.cpp b/kDB/Repository/TriplesStore.cpp
index ab24a87c..7684cddc 100644
--- a/kDB/Repository/TriplesStore.cpp
+++ b/kDB/Repository/TriplesStore.cpp
@@ -285,18 +285,28 @@ knowCore::ReturnVoid TriplesStore::remove(const QList<knowRDF::Triple>& _triple,
 }
 
 QList< knowRDF::Triple > TriplesStore::triples() const
+{
+  return triples2().value();
+}
+
+knowCore::ReturnValue<QList<knowRDF::Triple>> TriplesStore::triples2() const
 {
   knowDBC::Query q = D()->connection.createSQLQuery("SELECT subject, predicate, object FROM " + D()->definition->table);
   knowDBC::Result r = q.execute();
-  
-  QList< knowRDF::Triple > triples;
-    
-  for(int i = 0; i < r.tuples(); ++i)
+
+  if(r)
   {
-    triples.append(DatabaseInterface::PostgreSQL::SQLInterface::getTriple(D()->connection, r, i, 0, 1, 2, false));
+    QList< knowRDF::Triple > triples;
+      
+    for(int i = 0; i < r.tuples(); ++i)
+    {
+      triples.append(DatabaseInterface::PostgreSQL::SQLInterface::getTriple(D()->connection, r, i, 0, 1, 2, false));
+    }
+    
+    return kCrvSuccess(triples);
+  } else {
+    return kCrvError(r.error());
   }
-  
-  return triples;
 }
 
 std::size_t TriplesStore::triplesCount() const
diff --git a/kDB/Repository/TriplesStore.h b/kDB/Repository/TriplesStore.h
index 9ee3bf9f..32342533 100644
--- a/kDB/Repository/TriplesStore.h
+++ b/kDB/Repository/TriplesStore.h
@@ -87,6 +87,7 @@ namespace kDB::Repository
      * @return the triples from the triple store. Equivalent to "SELECT ?x ?y ?z WHERE { ?x ?y ?z . };" query,
      */
     QList<knowRDF::Triple> triples() const;
+    knowCore::ReturnValue<QList<knowRDF::Triple>> triples2() const;
     
     /**
      * @return a random triple
diff --git a/kDB/Repository/tests/TestTripleStore.cpp b/kDB/Repository/tests/TestTripleStore.cpp
index d869daab..f24430bf 100644
--- a/kDB/Repository/tests/TestTripleStore.cpp
+++ b/kDB/Repository/tests/TestTripleStore.cpp
@@ -328,8 +328,6 @@ void TestTripleStore::testNotifications()
 
   KNOWCORE_TEST_WAIT_FOR(notifications_count == 2);
   QCOMPARE((int)notifications_count, 2);
-  KNOWCORE_TEST_WAIT_FOR(notifications_count == 3);
-  QCOMPARE((int)notifications_count, 2);
   
   interface.listen([&notifications_count](const QByteArray&) { ++notifications_count; });
 
@@ -421,6 +419,17 @@ void TestTripleStore::testDropping()
   KNOWCORE_TEST_WAIT_FOR(not c1.graphsManager()->hasTripleStore("a"_kCu));
   QVERIFY(not c1.graphsManager()->hasTripleStore("a"_kCu));
 
+  KNOWCORE_TEST_VERIFY_SUCCESS(c1.graphsManager()->createTriplesStore("b"_kCu));
+  for(int i = 0; i < 10; ++i)
+  {
+    KNOWCORE_TEST_VERIFY_SUCCESS_VOID(c2.graphsManager()->removeTripleStore("b"_kCu));
+    Repository::TriplesStore interface2 = KNOWCORE_TEST_VERIFY_SUCCESS(c2.graphsManager()->createTriplesStore("b"_kCu));
+    interface2.insert("a"_kCu, "b"_kCu, "c"_kCu);
+    Repository::TriplesStore interface1 = KNOWCORE_TEST_VERIFY_SUCCESS(c1.graphsManager()->getTriplesStore("b"_kCu));
+    KNOWCORE_TEST_WAIT_FOR(KNOWCORE_TEST_VERIFY_SUCCESS(c1.graphsManager()->getTriplesStore("b"_kCu)).triples2().success());
+    KNOWCORE_TEST_VERIFY_SUCCESS(KNOWCORE_TEST_VERIFY_SUCCESS(c1.graphsManager()->getTriplesStore("b"_kCu)).triples2());
+
+  }
 }
 
 
-- 
GitLab