浏览代码

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 8 年之前
父节点
当前提交
b026499f60
共有 1 个文件被更改,包括 38 次插入21 次删除
  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;
 }
 
 //------------------------------------------------------------------------------