Bläddra i källkod

Refactoring: merged ctkDICOM class in ctkDICOMDatabase

Marco Nolden 14 år sedan
förälder
incheckning
76f221594e

+ 21 - 20
Applications/ctkDICOM/ctkDICOMMain.cpp

@@ -28,7 +28,7 @@
 #include <ctkDICOMQueryRetrieveWidget.h>
 
 // ctkDICOMCore includes
-#include "ctkDICOM.h"
+#include "ctkDICOMDatabase.h"
 #include "ctkDICOMModel.h"
 
 // Logger
@@ -79,28 +79,29 @@ int main(int argc, char** argv)
 
   QString databaseFileName = databaseDirectory + QString("/ctkDICOM.sql");
 
-  ctkDICOM myCTK;
-  try { myCTK.openDatabase( databaseFileName ); }
-  catch (std::exception e)
+  try
   {
-    std::cerr << "Database error: " << qPrintable(myCTK.GetLastError()) << "\n";
-    myCTK.closeDatabase();
-    return EXIT_FAILURE;
-  }
+    ctkDICOMDatabase myCTK( databaseFileName );
 
-  ctkDICOMModel model;
-  model.setDatabase(myCTK.database());
-  
-  ctkDICOMQueryRetrieveWidget queryRetrieve;
-  QTreeView *treeView = queryRetrieve.findChild<QTreeView *>("treeView");
-  if (!treeView)
+    ctkDICOMModel model;
+    model.setDatabase(myCTK.database());
+
+    ctkDICOMQueryRetrieveWidget queryRetrieve;
+    QTreeView *treeView = queryRetrieve.findChild<QTreeView *>("treeView");
+    if (!treeView)
+    {
+      std::cerr << "Could not access tree view from QueryRetrieve widget\n";
+      return EXIT_FAILURE;
+    }
+    treeView->setModel(&model);
+
+    queryRetrieve.show();
+    queryRetrieve.raise();
+    return app.exec();
+  }
+  catch (std::exception e)
   {
-    std::cerr << "Could not access tree view from QueryRetrieve widget\n";
+    std::cerr << "Database error: " << e.what() << "\n";
     return EXIT_FAILURE;
   }
-  treeView->setModel(&model);
-
-  queryRetrieve.show();
-  queryRetrieve.raise();
-  return app.exec();
 }

+ 2 - 2
Applications/ctkDICOMIndexer/ctkDICOMIndexerMain.cpp

@@ -25,7 +25,7 @@
 
 // CTK includes
 #include <ctkDICOMIndexer.h>
-#include <ctkDICOM.h>
+#include <ctkDICOMDatabase.h>
 
 // STD includes
 #include <cstdlib>
@@ -63,7 +63,7 @@ int main(int argc, char** argv)
   QTextStream out(stdout);
 
   ctkDICOMIndexer idx;
-  ctkDICOM myCTK;
+  ctkDICOMDatabase myCTK;
 
 
   try

+ 3 - 3
Applications/ctkDICOMQuery/ctkDICOMQueryMain.cpp

@@ -39,7 +39,7 @@
 
 // CTK includes
 #include <ctkDICOMQuery.h>
-#include <ctkDICOM.h>
+#include <ctkDICOMDatabase.h>
 #include "ctkLogger.h"
 
 // STD includes
@@ -73,7 +73,7 @@ int main(int argc, char** argv)
   QCoreApplication app(argc, argv);
   QTextStream out(stdout);
 
-  ctkDICOM myCTK;
+  ctkDICOMDatabase myCTK;
   logger.debug ( "Opening database " + QString ( argv[1] ) );
   myCTK.openDatabase ( argv[1] );
   logger.debug ( "Last error: " + myCTK.GetLastError() );
@@ -105,7 +105,7 @@ int main(int argc, char** argv)
 
   try
     {
-    query.query ( myCTK.database() );
+    query.query ( myCTK );
     }
   catch (std::exception e)
   {

+ 1 - 1
Applications/ctkDICOMRetrieve/ctkDICOMRetrieveMain.cpp

@@ -24,7 +24,7 @@
 
 // CTK includes
 #include <ctkDICOMRetrieve.h>
-#include <ctkDICOM.h>
+#include <ctkDICOMDatabase.h>
 #include "ctkLogger.h"
 
 // STD includes

+ 2 - 2
Applications/ctkDICOMViewer/ctkDICOMViewerMain.cpp

@@ -28,7 +28,7 @@
 #include <ctkDICOMAppWidget.h>
 
 // ctkDICOMCore includes
-#include "ctkDICOM.h"
+#include "ctkDICOMDatabase.h"
 #include "ctkDICOMModel.h"
 
 // Logger
@@ -78,7 +78,7 @@ int main(int argc, char** argv)
 
   QString databaseFileName = databaseDirectory + QString("/ctkDICOM.sql");
 
-  ctkDICOM myCTK;
+  ctkDICOMDatabase myCTK;
   try { myCTK.openDatabase( databaseFileName ); }
   catch (std::exception e)
   {

+ 0 - 3
Libs/DICOM/Core/CMakeLists.txt

@@ -9,8 +9,6 @@ SET(KIT_export_directive "CTK_DICOM_CORE_EXPORT")
   
 # Source files
 SET(KIT_SRCS
-  ctkDICOM.cpp
-  ctkDICOM.h
   ctkDICOMIndexer.cpp
   ctkDICOMIndexer.h
   ctkDICOMDatabase.cpp
@@ -25,7 +23,6 @@ SET(KIT_SRCS
 
 # Headers that should run through moc
 SET(KIT_MOC_SRCS
-  ctkDICOM.h
   ctkDICOMDatabase.h
   ctkDICOMModel.h
   ctkDICOMQuery.h

+ 33 - 33
Libs/DICOM/Core/Testing/Cpp/ctkDICOMModelTest1.cpp

@@ -7,7 +7,7 @@
 #include <QSqlQuery>
 
 // ctkDICOMCore includes
-#include "ctkDICOM.h"
+#include "ctkDICOMDatabase.h"
 #include "ctkDICOMModel.h"
 #include "ctkModelTester.h"
 
@@ -30,21 +30,14 @@ int ctkDICOMModelTest1( int argc, char * argv [] )
     return EXIT_FAILURE;
     }
   
-  ctkDICOM myCTK;
   try
   {
-    myCTK.openDatabase( argv[1] );
-  }
-  catch (std::exception e)
-  {
-    std::cerr << "Error when opening the data base file: " << argv[1] 
-              << " error: " << e.what();
-    return EXIT_FAILURE;
-  }
-  if (!myCTK.initializeDatabase(argv[2]))
+    ctkDICOMDatabase myCTK( argv[1] );
+
+    if (!myCTK.initializeDatabase(argv[2]))
     {
-    std::cerr << "Error when initializing the data base: " << argv[2] 
-              << " error: " << myCTK.GetLastError().toStdString();
+      std::cerr << "Error when initializing the data base: " << argv[2]
+          << " error: " << myCTK.GetLastError().toStdString();
     }
     /*
   QSqlQuery toto("SELECT PatientsName as 'Name tt' FROM Patients ORDER BY \"Name tt\" ASC", myCTK.database());
@@ -60,29 +53,36 @@ int ctkDICOMModelTest1( int argc, char * argv [] )
   qDebug() << "tutu: " << tutu.seek(0) << myCTK.GetLastError();
   */
 
-  ctkModelTester tester;
-  tester.setNestedInserts(true);
-  tester.setThrowOnError(false);
-  ctkDICOMModel model;
-  tester.setModel(&model);
+    ctkModelTester tester;
+    tester.setNestedInserts(true);
+    tester.setThrowOnError(false);
+    ctkDICOMModel model;
+    tester.setModel(&model);
 
-  model.setDatabase(myCTK.database());
-  
-  model.setDatabase(QSqlDatabase());
- 
-  model.setDatabase(myCTK.database());
+    model.setDatabase(myCTK.database());
 
-  QTreeView viewer;
-  viewer.setModel(&model);
-  viewer.setSortingEnabled(true);
+    model.setDatabase(QSqlDatabase());
 
-  model.rowCount();
-  qDebug() << model.rowCount() << model.columnCount();
-  qDebug() << model.index(0,0);
-  viewer.show();
-  if (argc > 3 && QString(argv[3]) == "-I")
+    model.setDatabase(myCTK.database());
+
+    QTreeView viewer;
+    viewer.setModel(&model);
+    viewer.setSortingEnabled(true);
+
+    model.rowCount();
+    qDebug() << model.rowCount() << model.columnCount();
+    qDebug() << model.index(0,0);
+    viewer.show();
+    if (argc > 3 && QString(argv[3]) == "-I")
     {
-    return app.exec();
+      return app.exec();
     }
-  return EXIT_SUCCESS;
+    return EXIT_SUCCESS;
+  }
+  catch (std::exception e)
+  {
+    std::cerr << "Error when opening the data base file: " << argv[1]
+        << " error: " << e.what();
+    return EXIT_FAILURE;
+  }
 }

+ 2 - 3
Libs/DICOM/Core/Testing/Cpp/ctkDICOMTest1.cpp

@@ -4,7 +4,7 @@
 #include <QApplication>
 
 // ctkDICOMCore includes
-#include "ctkDICOM.h"
+#include "ctkDICOMDatabase.h"
 
 // STD includes
 #include <iostream>
@@ -14,10 +14,9 @@ int ctkDICOMTest1(int argc, char * argv []) {
   
   QApplication app(argc, argv);
   QTextStream out(stdout);
-  ctkDICOM myCTK;
   try
   {
-    myCTK.openDatabase( argv[1]);
+    ctkDICOMDatabase myCTK( argv[1] );
     out << "open db success\n";
     /// make sure it is empty and properly initialized
     if (! myCTK.initializeDatabase() ) {

+ 0 - 145
Libs/DICOM/Core/ctkDICOM.cpp

@@ -1,145 +0,0 @@
-/*=========================================================================
-
-  Library:   CTK
-
-  Copyright (c) Kitware Inc.
-
-  Licensed under the Apache License, Version 2.0 (the "License");
-  you may not use this file except in compliance with the License.
-  You may obtain a copy of the License at
-
-      http://www.commontk.org/LICENSE
-
-  Unless required by applicable law or agreed to in writing, software
-  distributed under the License is distributed on an "AS IS" BASIS,
-  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  See the License for the specific language governing permissions and
-  limitations under the License.
-
-=========================================================================*/
-
-// Qt includes
-#include <QDebug>
-#include <QSqlDatabase>
-#include <QSqlError>
-#include <QSqlQuery>
-#include <QFile>
-#include <QStringList>
-
-// ctkDICOMCore includes
-#include "ctkDICOM.h"
-
-// STD includes
-#include <iostream>
-#include <stdexcept>
-
-//----------------------------------------------------------------------------
-class ctkDICOMPrivate
-{
-public:
-  ctkDICOMPrivate(); 
-  bool executeScript(const QString& script);
-
-  QSqlDatabase  Database;
-  QString       DatabaseFileName;
-  QString       LastError;
-};
-
-//----------------------------------------------------------------------------
-// ctkDICOMPrivate methods
-
-//------------------------------------------------------------------------------
-ctkDICOMPrivate::ctkDICOMPrivate()
-{
-}
-
-//----------------------------------------------------------------------------
-// ctkDICOMWidget methods
-
-//------------------------------------------------------------------------------
-ctkDICOM::ctkDICOM(QObject* _parent): Superclass(_parent), d_ptr(new ctkDICOMPrivate)
-{
-}
-
-//----------------------------------------------------------------------------
-ctkDICOM::~ctkDICOM()
-{
-}
-
-//----------------------------------------------------------------------------
-void ctkDICOM::openDatabase(const QString& databaseFileName)
-{
-  Q_D(ctkDICOM);
-  d->Database = QSqlDatabase::addDatabase("QSQLITE","DICOM-DB");
-  d->Database.setDatabaseName(databaseFileName);
-  if ( ! (d->Database.open()) )
-    {
-    d->LastError = d->Database.lastError().text();
-    throw std::runtime_error(qPrintable(d->LastError));
-    }
-  if ( d->Database.tables().empty() ) 
-    {
-    initializeDatabase();
-    }
-}
-
-//------------------------------------------------------------------------------
-const QString& ctkDICOM::GetLastError() const {
-  Q_D(const ctkDICOM);
-  return d->LastError; 
-}
-
-//------------------------------------------------------------------------------
-const QSqlDatabase& ctkDICOM::database() const {
-  Q_D(const ctkDICOM);
-  return d->Database;
-}
-
-//------------------------------------------------------------------------------
-bool ctkDICOMPrivate::executeScript(const QString& script) {
-  QFile scriptFile(script);
-  scriptFile.open(QIODevice::ReadOnly);
-  if  ( !scriptFile.isOpen() )
-    {
-    qDebug() << "Script file " << script << " could not be opened!\n";
-    return false;
-    }
-
-  QString sqlCommands( QTextStream(&scriptFile).readAll() );
-  sqlCommands.replace( '\n', ' ' );
-  sqlCommands.replace("; ", ";\n");
-
-  QStringList sqlCommandsLines = sqlCommands.split('\n');
-
-  QSqlQuery query(Database);
-
-  for (QStringList::iterator it = sqlCommandsLines.begin(); it != sqlCommandsLines.end()-1; ++it)
-  {
-    if (! (*it).startsWith("--") )
-      {
-      qDebug() << *it << "\n";
-      query.exec(*it);
-      if (query.lastError().type())
-        {
-        qDebug() << "There was an error during execution of the statement: " << (*it);
-        qDebug() << "Error message: " << query.lastError().text();
-        return false;
-        }
-      }
-  }
-  return true;
-}
-
-//------------------------------------------------------------------------------
-bool ctkDICOM::initializeDatabase(const char* sqlFileName)
-{
-  Q_D(ctkDICOM);
-  return d->executeScript(sqlFileName);
-}
-
-//------------------------------------------------------------------------------
-void ctkDICOM::closeDatabase()
-{
-  Q_D(ctkDICOM);
-  d->Database.close();
-}

+ 0 - 64
Libs/DICOM/Core/ctkDICOM.h

@@ -1,64 +0,0 @@
-/*=========================================================================
-
-  Library:   CTK
-
-  Copyright (c) Kitware Inc.
-
-  Licensed under the Apache License, Version 2.0 (the "License");
-  you may not use this file except in compliance with the License.
-  You may obtain a copy of the License at
-
-      http://www.commontk.org/LICENSE
-
-  Unless required by applicable law or agreed to in writing, software
-  distributed under the License is distributed on an "AS IS" BASIS,
-  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  See the License for the specific language governing permissions and
-  limitations under the License.
-
-=========================================================================*/
-
-#ifndef __ctkDICOM_h
-#define __ctkDICOM_h
-
-// Qt includes 
-#include <QObject>
-#include <QSqlDatabase>
-
-#include "ctkDICOMCoreExport.h"
-
-class ctkDICOMPrivate;
-class CTK_DICOM_CORE_EXPORT ctkDICOM : public QObject
-{
-  Q_OBJECT
-public:
-  typedef QObject Superclass;
-  explicit ctkDICOM(QObject* parent = 0);
-  virtual ~ctkDICOM();
-  
-  ///
-  /// open the SQLite database in @param file. If the file does not
-  /// exist, a new database is created and initialized with the
-  /// default schema
-  virtual void openDatabase(const QString& file);
-
-  const QSqlDatabase& database() const;
-  const QString& GetLastError() const; 
-  
-  ///
-  /// close the database. It must not be used afterwards.
-  void closeDatabase();  
-  ///
-  /// delete all data and reinitialize the database.
-  bool initializeDatabase(const char* schemaFile = ":/dicom/dicom-schema.sql");
-
-protected:
-  QScopedPointer<ctkDICOMPrivate> d_ptr;
-
-private:
-  Q_DECLARE_PRIVATE(ctkDICOM);
-  Q_DISABLE_COPY(ctkDICOM);
-
-};
-
-#endif

+ 110 - 15
Libs/DICOM/Core/ctkDICOMDatabase.cpp

@@ -18,6 +18,8 @@
 
 =========================================================================*/
 
+#include <stdexcept>
+
 // Qt includes
 #include <QSqlQuery>
 #include <QSqlRecord>
@@ -56,19 +58,35 @@ static ctkLogger logger("org.commontk.dicom.DICOMDatabase" );
 //------------------------------------------------------------------------------
 class ctkDICOMDatabasePrivate
 {
+  Q_DECLARE_PUBLIC(ctkDICOMDatabase);
+protected:
+  ctkDICOMDatabase* const q_ptr;
+
 public:
-  ctkDICOMDatabasePrivate();
+  ctkDICOMDatabasePrivate(ctkDICOMDatabase&);
   ~ctkDICOMDatabasePrivate();
-  QSqlDatabase db;
+  void init(QString databaseFile);
+  bool executeScript(const QString script);
 
+  QString      DatabaseFileName;
+  QString      LastError;
+  QSqlDatabase Database;
 };
 
 //------------------------------------------------------------------------------
 // ctkDICOMDatabasePrivate methods
 
 //------------------------------------------------------------------------------
-ctkDICOMDatabasePrivate::ctkDICOMDatabasePrivate()
+ctkDICOMDatabasePrivate::ctkDICOMDatabasePrivate(ctkDICOMDatabase& o): q_ptr(&o)
+{
+
+}
+
+//------------------------------------------------------------------------------
+void ctkDICOMDatabasePrivate::init(QString databaseFilename)
 {
+  Q_Q(ctkDICOMDatabase);
+  q->openDatabase(databaseFilename);
 }
 
 //------------------------------------------------------------------------------
@@ -77,11 +95,37 @@ ctkDICOMDatabasePrivate::~ctkDICOMDatabasePrivate()
 }
 
 //------------------------------------------------------------------------------
+void ctkDICOMDatabase::openDatabase(const QString databaseFile)
+{
+  Q_D(ctkDICOMDatabase);
+  d->Database = QSqlDatabase::addDatabase("QSQLITE","DICOM-DB");
+  d->Database.setDatabaseName(databaseFile);
+  if ( ! (d->Database.open()) )
+    {
+    d->LastError = d->Database.lastError().text();
+    throw std::runtime_error(qPrintable(d->LastError));
+    }
+  if ( d->Database.tables().empty() )
+    {
+      initializeDatabase();
+    }
+}
+
+
+
+//------------------------------------------------------------------------------
 // ctkDICOMDatabase methods
 
 //------------------------------------------------------------------------------
+ctkDICOMDatabase::ctkDICOMDatabase(QString databaseFile)
+   : d_ptr(new ctkDICOMDatabasePrivate(*this))
+{
+  Q_D(ctkDICOMDatabase);
+  d->init(databaseFile);
+}
+
 ctkDICOMDatabase::ctkDICOMDatabase()
-   : d_ptr(new ctkDICOMDatabasePrivate)
+   : d_ptr(new ctkDICOMDatabasePrivate(*this))
 {
 }
 
@@ -90,16 +134,67 @@ ctkDICOMDatabase::~ctkDICOMDatabase()
 {
 }
 
+//----------------------------------------------------------------------------
+
 //------------------------------------------------------------------------------
-void ctkDICOMDatabase::setDatabase ( QSqlDatabase database ) {
-  Q_D(ctkDICOMDatabase);
-  d->db = database;
+const QString& ctkDICOMDatabase::GetLastError() const {
+  Q_D(const ctkDICOMDatabase);
+  return d->LastError;
 }
 
 //------------------------------------------------------------------------------
-const QSqlDatabase& ctkDICOMDatabase::database () const {
+const QSqlDatabase& ctkDICOMDatabase::database() const {
   Q_D(const ctkDICOMDatabase);
-  return d->db;
+  return d->Database;
+}
+
+//------------------------------------------------------------------------------
+bool ctkDICOMDatabasePrivate::executeScript(const QString script) {
+  QFile scriptFile(script);
+  scriptFile.open(QIODevice::ReadOnly);
+  if  ( !scriptFile.isOpen() )
+    {
+    qDebug() << "Script file " << script << " could not be opened!\n";
+    return false;
+    }
+
+  QString sqlCommands( QTextStream(&scriptFile).readAll() );
+  sqlCommands.replace( '\n', ' ' );
+  sqlCommands.replace("; ", ";\n");
+
+  QStringList sqlCommandsLines = sqlCommands.split('\n');
+
+  QSqlQuery query(Database);
+
+  for (QStringList::iterator it = sqlCommandsLines.begin(); it != sqlCommandsLines.end()-1; ++it)
+  {
+    if (! (*it).startsWith("--") )
+      {
+      qDebug() << *it << "\n";
+      query.exec(*it);
+      if (query.lastError().type())
+        {
+        qDebug() << "There was an error during execution of the statement: " << (*it);
+        qDebug() << "Error message: " << query.lastError().text();
+        return false;
+        }
+      }
+  }
+  return true;
+}
+
+//------------------------------------------------------------------------------
+bool ctkDICOMDatabase::initializeDatabase(const char* sqlFileName)
+{
+  Q_D(ctkDICOMDatabase);
+  return d->executeScript(sqlFileName);
+}
+
+//------------------------------------------------------------------------------
+void ctkDICOMDatabase::closeDatabase()
+{
+  Q_D(ctkDICOMDatabase);
+  d->Database.close();
 }
 
 //------------------------------------------------------------------------------
@@ -112,7 +207,7 @@ void ctkDICOMDatabase::insert ( DcmDataset *dataset, QString filename ) {
   Q_D(ctkDICOMDatabase);
 
   // Check to see if the file has already been loaded
-  QSqlQuery fileExists ( d->db );
+  QSqlQuery fileExists ( d->Database );
   fileExists.prepare("SELECT InsertTimestamp FROM Images WHERE Filename == ?"); 
   fileExists.bindValue(0,filename);
   fileExists.exec();
@@ -169,7 +264,7 @@ void ctkDICOMDatabase::insert ( DcmDataset *dataset, QString filename ) {
   dataset->findAndGetSint32(DCM_EchoNumbers, echoNumber);
   dataset->findAndGetSint32(DCM_TemporalPositionIdentifier, temporalPosition);
 
-  QSqlQuery check_exists_query(d->db);
+  QSqlQuery check_exists_query(d->Database);
   //The patient UID is a unique number within the database, generated by the sqlite autoincrement
   int patientUID = -1;
   if ( patientID != "" && patientsName != "" )
@@ -187,7 +282,7 @@ void ctkDICOMDatabase::insert ( DcmDataset *dataset, QString filename ) {
     else
       {
       // Insert it
-      QSqlQuery statement ( d->db );
+      QSqlQuery statement ( d->Database );
       statement.prepare ( "INSERT INTO Patients ('UID', 'PatientsName', 'PatientID', 'PatientsBirthDate', 'PatientsBirthTime', 'PatientsSex', 'PatientsAge', 'PatientsComments' ) values ( NULL, ?, ?, ?, ?, ?, ?, ? )" );
       statement.bindValue ( 0, QString ( patientsName.c_str() ) );
       statement.bindValue ( 1, QString ( patientID.c_str() ) );
@@ -209,7 +304,7 @@ void ctkDICOMDatabase::insert ( DcmDataset *dataset, QString filename ) {
     check_exists_query.exec();
     if(!check_exists_query.next())
       {
-      QSqlQuery statement ( d->db );
+      QSqlQuery statement ( d->Database );
       statement.prepare ( "INSERT INTO Studies ( 'StudyInstanceUID', 'PatientsUID', 'StudyID', 'StudyDate', 'StudyTime', 'AccessionNumber', 'ModalitiesInStudy', 'InstitutionName', 'ReferringPhysician', 'PerformingPhysiciansName', 'StudyDescription' ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )" );
       statement.bindValue ( 0, QString ( studyInstanceUID.c_str() ) );
       statement.bindValue ( 1, patientUID );
@@ -237,7 +332,7 @@ void ctkDICOMDatabase::insert ( DcmDataset *dataset, QString filename ) {
     check_exists_query.exec();
     if(!check_exists_query.next())
       {
-      QSqlQuery statement ( d->db );
+      QSqlQuery statement ( d->Database );
       statement.prepare ( "INSERT INTO Series ( 'SeriesInstanceUID', 'StudyInstanceUID', 'SeriesNumber', 'SeriesDate', 'SeriesTime', 'SeriesDescription', 'BodyPartExamined', 'FrameOfReferenceUID', 'AcquisitionNumber', 'ContrastAgent', 'ScanningSequence', 'EchoNumber', 'TemporalPosition' ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )" );
       statement.bindValue ( 0, QString ( seriesInstanceUID.c_str() ) );
       statement.bindValue ( 1, QString ( studyInstanceUID.c_str() ) );
@@ -265,7 +360,7 @@ void ctkDICOMDatabase::insert ( DcmDataset *dataset, QString filename ) {
     check_exists_query.exec();
     if(!check_exists_query.next())
       {
-      QSqlQuery statement ( d->db );
+      QSqlQuery statement ( d->Database );
       statement.prepare ( "INSERT INTO Images ( 'Filename', 'SeriesInstanceUID', 'InsertTimestamp' ) VALUES ( ?, ?, ? )" );
       statement.bindValue ( 0, filename );
       statement.bindValue ( 1, QString ( seriesInstanceUID.c_str() ) );

+ 19 - 2
Libs/DICOM/Core/ctkDICOMDatabase.h

@@ -35,9 +35,24 @@ class CTK_DICOM_CORE_EXPORT ctkDICOMDatabase : public QObject
   Q_OBJECT
 public:
   explicit ctkDICOMDatabase();
+  explicit ctkDICOMDatabase(QString databaseFile);
   virtual ~ctkDICOMDatabase();
-  void setDatabase ( QSqlDatabase database );
+
   const QSqlDatabase& database() const;
+  const QString& GetLastError() const;
+
+  ///
+  /// open the SQLite database in @param file. If the file does not
+  /// exist, a new database is created and initialized with the
+  /// default schema
+  virtual void openDatabase(const QString file);
+
+  ///
+  /// close the database. It must not be used afterwards.
+  void closeDatabase();
+  ///
+  /// delete all data and reinitialize the database.
+  bool initializeDatabase(const char* schemaFile = ":/dicom/dicom-schema.sql");
 
   /**
    * Will create an entry in the appropriate tables for this dataset.
@@ -50,7 +65,9 @@ public:
 
 protected:
   QScopedPointer<ctkDICOMDatabasePrivate> d_ptr;
-  
+
+
+
 private:
   Q_DECLARE_PRIVATE(ctkDICOMDatabase);
   Q_DISABLE_COPY(ctkDICOMDatabase);

+ 5 - 5
Libs/DICOM/Core/ctkDICOMQuery.cpp

@@ -151,11 +151,11 @@ int ctkDICOMQuery::port()
 
 
 //------------------------------------------------------------------------------
-void ctkDICOMQuery::query(QSqlDatabase database )
+void ctkDICOMQuery::query(ctkDICOMDatabase& database )
 {
-  ctkDICOMDatabase::setDatabase ( database );
+  // ctkDICOMDatabase::setDatabase ( database );
   Q_D(ctkDICOMQuery);
-  if ( this->database().isOpen() )
+  if ( database.database().isOpen() )
     {
     logger.debug ( "DB open in Query" );
     }
@@ -254,7 +254,7 @@ void ctkDICOMQuery::query(QSqlDatabase database )
     DcmDataset *dataset = (*it)->m_dataset;
     if ( dataset != NULL )
       {
-      this->insert ( dataset );
+      database.insert ( dataset );
       OFString StudyInstanceUID;
       dataset->findAndGetOFString ( DCM_StudyInstanceUID, StudyInstanceUID );
       this->addStudyInstanceUID ( QString ( StudyInstanceUID.c_str() ) );
@@ -278,7 +278,7 @@ void ctkDICOMQuery::query(QSqlDatabase database )
         DcmDataset *dataset = (*it)->m_dataset;
         if ( dataset != NULL )
           {
-          this->insert ( dataset );
+          database.insert ( dataset );
           }
         }
       }

+ 2 - 2
Libs/DICOM/Core/ctkDICOMQuery.h

@@ -32,7 +32,7 @@
 #include "ctkDICOMDatabase.h"
 
 class ctkDICOMQueryPrivate;
-class CTK_DICOM_CORE_EXPORT ctkDICOMQuery : public ctkDICOMDatabase
+class CTK_DICOM_CORE_EXPORT ctkDICOMQuery : public QObject
 {
   Q_OBJECT
   Q_PROPERTY(QString callingAETitle READ callingAETitle WRITE setCallingAETitle);
@@ -53,7 +53,7 @@ public:
   int port();
   
   /// Query a remote DICOM Image Store SCP
-  void query(QSqlDatabase database);
+  void query(ctkDICOMDatabase& database);
 
   // Add a StudyInstanceUID to be queried
   void addStudyInstanceUID ( QString StudyInstanceUID );

+ 1 - 1
Libs/DICOM/Widgets/ctkDICOMAppWidget.cpp

@@ -5,7 +5,7 @@
 #include <QAction>
 
 // ctkDICOMWidgets includes
-#include "ctkDICOM.h"
+#include "ctkDICOMDatabase.h"
 #include "ctkDICOMModel.h"
 #include "ctkDICOMAppWidget.h"
 #include "ctkDICOMQueryResultsTabWidget.h"

+ 4 - 4
Libs/DICOM/Widgets/ctkDICOMDirectoryListWidget.cpp

@@ -21,7 +21,7 @@ class ctkDICOMDirectoryListWidgetPrivate: public Ui_ctkDICOMDirectoryListWidget
 {
 public:
   ctkDICOMDirectoryListWidgetPrivate(){}
-  ctkDICOM*       dicom;
+  ctkDICOMDatabase*       database;
   QSqlTableModel* directoryListModel;
 };
 
@@ -92,11 +92,11 @@ void ctkDICOMDirectoryListWidget::removeDirectoryClicked()
 }
 
 //----------------------------------------------------------------------------
-void ctkDICOMDirectoryListWidget::setDICOM(ctkDICOM* dicom)
+void ctkDICOMDirectoryListWidget::setDICOMDatabase(ctkDICOMDatabase* dicomDatabase)
 {
   Q_D(ctkDICOMDirectoryListWidget);
-  d->dicom = dicom;
-  d->directoryListModel =  new QSqlTableModel(this,d->dicom->database());
+  d->database = dicomDatabase;
+  d->directoryListModel =  new QSqlTableModel(this,d->database->database());
   d->directoryListModel->setTable("Directories");
   d->directoryListModel->setEditStrategy(QSqlTableModel::OnFieldChange);
   d->directoryListModel->select();

+ 2 - 2
Libs/DICOM/Widgets/ctkDICOMDirectoryListWidget.h

@@ -27,7 +27,7 @@
 
 // ctkDICOMWidgets includes
 #include "ctkDICOMWidgetsExport.h"
-#include "ctkDICOM.h"
+#include "ctkDICOMDatabase.h"
 
 class ctkDICOMDirectoryListWidgetPrivate;
 
@@ -38,7 +38,7 @@ class CTK_DICOM_WIDGETS_EXPORT ctkDICOMDirectoryListWidget : public QWidget
 public:
   typedef QWidget Superclass;
   explicit ctkDICOMDirectoryListWidget(QWidget* parent=0);
-  void setDICOM(ctkDICOM* dicom);
+  void setDICOMDatabase(ctkDICOMDatabase*);
   virtual ~ctkDICOMDirectoryListWidget();
 
 public slots:

+ 2 - 2
Libs/DICOM/Widgets/ctkDICOMQueryRetrieveWidget.cpp

@@ -4,7 +4,7 @@
 #include <QSettings>
 
 // ctkDICOMCore includes
-#include "ctkDICOM.h"
+#include "ctkDICOMDatabase.h"
 #include "ctkDICOMModel.h"
 #include "ctkDICOMQuery.h"
 #include "ctkDICOMRetrieve.h"
@@ -114,7 +114,7 @@ TODO: map the server node options to the query classes
 #endif
 
   // TODO: create a map of server locations to query results in the private class
-  ctkDICOM queryResultDatabase;
+  ctkDICOMDatabase queryResultDatabase;
 
   try { queryResultDatabase.openDatabase( ":memory:" ); }
   catch (std::exception e)