Explorar o código

BUG: ctkDICOMDatabase: Update TagCache initialization to fix startup error

This commit updates "tagCacheExists()" to avoid executing query if no
table exists.

Without any existing database, error reported at Slicer startup was
the following:

```
SQL failed
 Bad SQL: SELECT * FROM TagCache LIMIT 1
Error text: No query Unable to fetch row
TagCacheDatabase NOT verified based on table check!

SQL failed
 Bad SQL: SELECT * FROM TagCache LIMIT 1
Error text: No query Unable to fetch row
TagCacheDatabase NOT verified based on table check!
```
Jean-Christophe Fillion-Robin %!s(int64=8) %!d(string=hai) anos
pai
achega
b026499f60
Modificáronse 1 ficheiros con 38 adicións e 21 borrados
  1. 38 21
      Libs/DICOM/Core/ctkDICOMDatabase.cpp

+ 38 - 21
Libs/DICOM/Core/ctkDICOMDatabase.cpp

@@ -141,6 +141,7 @@ public:
   QSqlDatabase TagCacheDatabase;
   QString TagCacheDatabaseFilename;
   QStringList TagsToPrecache;
+  bool openTagCacheDatabase();
   void precacheTags( const QString sopInstanceUID );
 
   int insertPatient(const ctkDICOMItem& ctkDataset);
@@ -332,8 +333,6 @@ void ctkDICOMDatabase::openDatabase(const QString databaseFile, const QString& c
     }
 }
 
-
-
 //------------------------------------------------------------------------------
 // ctkDICOMDatabase methods
 
@@ -1259,6 +1258,32 @@ const QStringList ctkDICOMDatabase::tagsToPrecache()
 }
 
 //------------------------------------------------------------------------------
+bool ctkDICOMDatabasePrivate::openTagCacheDatabase()
+{
+  // try to open the database if it's not already open
+  if ( this->TagCacheDatabase.isOpen() )
+    {
+    return true;
+    }
+  this->TagCacheDatabase = QSqlDatabase::addDatabase(
+        "QSQLITE", this->Database.connectionName() + "TagCache");
+  this->TagCacheDatabase.setDatabaseName(this->TagCacheDatabaseFilename);
+  if ( !this->TagCacheDatabase.open() )
+    {
+    qDebug() << "TagCacheDatabase would not open!\n";
+    qDebug() << "TagCacheDatabaseFilename is: " << this->TagCacheDatabaseFilename << "\n";
+    return false;
+    }
+
+  // Disable synchronous writing to make modifications faster
+  QSqlQuery pragmaSyncQuery(this->TagCacheDatabase);
+  pragmaSyncQuery.exec("PRAGMA synchronous = OFF");
+  pragmaSyncQuery.finish();
+
+  return true;
+}
+
+//------------------------------------------------------------------------------
 void ctkDICOMDatabasePrivate::precacheTags( const QString sopInstanceUID )
 {
   Q_Q(ctkDICOMDatabase);
@@ -1707,23 +1732,14 @@ bool ctkDICOMDatabase::tagCacheExists()
     return true;
     }
 
-  // try to open the database if it's not already open
-  if ( !(d->TagCacheDatabase.isOpen()) )
+  if (!d->openTagCacheDatabase())
     {
-    d->TagCacheDatabase = QSqlDatabase::addDatabase("QSQLITE", d->Database.connectionName() + "TagCache");
-    d->TagCacheDatabase.setDatabaseName(d->TagCacheDatabaseFilename);
-    if ( !(d->TagCacheDatabase.open()) )
-      {
-      qDebug() << "TagCacheDatabase would not open!\n";
-      qDebug() << "TagCacheDatabaseFilename is: " << d->TagCacheDatabaseFilename << "\n";
-      return false;
-      }
-
-    //Disable synchronous writing to make modifications faster
-    QSqlQuery pragmaSyncQuery(d->TagCacheDatabase);
-    pragmaSyncQuery.exec("PRAGMA synchronous = OFF");
-    pragmaSyncQuery.finish();
+    return false;
+    }
 
+  if (d->TagCacheDatabase.tables().count() == 0)
+    {
+    return false;
     }
 
   // check that the table exists
@@ -1759,12 +1775,13 @@ bool ctkDICOMDatabase::initializeTagCache()
   createCacheTable.prepare(
     "CREATE TABLE TagCache (SOPInstanceUID, Tag, Value, PRIMARY KEY (SOPInstanceUID, Tag))" );
   bool success = d->loggedExec(createCacheTable);
-  if (success)
+  if (!success)
     {
-    d->TagCacheVerified = true;
-    return true;
+    return false;
     }
-  return false;
+
+  d->TagCacheVerified = true;
+  return true;
 }
 
 //------------------------------------------------------------------------------