Pārlūkot izejas kodu

Merge branch 'master' of git@github.com:pieper/CTK

Jean-Christophe Fillion-Robin 15 gadi atpakaļ
vecāks
revīzija
e735b6a438

+ 5 - 0
Libs/DICOM/Core/Resources/dicom-sample.sql

@@ -3,6 +3,11 @@
 -- For the corresponding DICOM files and more information see
 -- For the corresponding DICOM files and more information see
 -- http://www.slicer.org/slicerWiki/index.php/DICOM:Database
 -- http://www.slicer.org/slicerWiki/index.php/DICOM:Database
 -- 
 -- 
+-- Note: the semicolon at the end is necessary for the simple parser to separate
+--       the statements since the SQlite driver does not handle multiple
+--       commands per QSqlQuery::exec call!
+-- ;
+ 
 BEGIN TRANSACTION;
 BEGIN TRANSACTION;
 CREATE TABLE 'Images' (   'Filename' VARCHAR(1024) NOT NULL ,   'SeriesInstanceUID' VARCHAR(255) NOT NULL ,   PRIMARY KEY ('Filename') );
 CREATE TABLE 'Images' (   'Filename' VARCHAR(1024) NOT NULL ,   'SeriesInstanceUID' VARCHAR(255) NOT NULL ,   PRIMARY KEY ('Filename') );
 INSERT INTO "Images" VALUES('CTHeadAxialDicom/CTHead24.dcm','1.2.826.0.1.3680043.2.1125.1.65375240934815452318141136507497058');
 INSERT INTO "Images" VALUES('CTHeadAxialDicom/CTHead24.dcm','1.2.826.0.1.3680043.2.1125.1.65375240934815452318141136507497058');

+ 5 - 2
Libs/DICOM/Core/Resources/dicom-schema.sql

@@ -1,8 +1,11 @@
 -- 
 -- 
+-- A simple SQLITE3 database schema for modelling locally stored DICOM files 
 -- 
 -- 
+-- Note: the semicolon at the end is necessary for the simple parser to separate
+--       the statements since the SQlite driver does not handle multiple
+--       commands per QSqlQuery::exec call!
+-- ;
 
 
-BEGIN TRANSACTION;
 DROP TABLE IF EXISTS 'Images' ;
 DROP TABLE IF EXISTS 'Images' ;
 DROP TABLE IF EXISTS 'Patients' ;
 DROP TABLE IF EXISTS 'Patients' ;
 DROP TABLE IF EXISTS 'Series' ;
 DROP TABLE IF EXISTS 'Series' ;
@@ -46,5 +49,4 @@ CREATE TABLE 'Studies' (
   'ReferringPhysician' VARCHAR(255) NULL ,
   'ReferringPhysician' VARCHAR(255) NULL ,
   'StudyDescription' VARCHAR(255) NULL ,
   'StudyDescription' VARCHAR(255) NULL ,
   PRIMARY KEY ('StudyInstanceUID') );
   PRIMARY KEY ('StudyInstanceUID') );
-COMMIT;
 
 

+ 1 - 1
Libs/DICOM/Core/Testing/CMakeLists.txt

@@ -19,4 +19,4 @@ IF(WIN32)
 ENDIF(WIN32)
 ENDIF(WIN32)
 
 
 ADD_TEST( qCTKDCMTKModelTest1 ${CTKDICOMCore_TESTS} qCTKDCMTKModelTest1 ../../Resources/dicom-sample.sql)
 ADD_TEST( qCTKDCMTKModelTest1 ${CTKDICOMCore_TESTS} qCTKDCMTKModelTest1 ../../Resources/dicom-sample.sql)
-ADD_TEST( qCTKDCMTKTest1 ${CTKDICOMCore_TESTS} qCTKDCMTKTest1 ${CMAKE_CURRENT_BINARY_DIR}/dicom.db)
+ADD_TEST( qCTKDCMTKTest1 ${CTKDICOMCore_TESTS} qCTKDCMTKTest1 ${CMAKE_CURRENT_BINARY_DIR}/dicom.db ${CMAKE_CURRENT_SOURCE_DIR}/../Resources/dicom-sample.sql)

+ 4 - 0
Libs/DICOM/Core/Testing/qCTKDCMTKTest1.cxx

@@ -14,7 +14,11 @@ int qCTKDCMTKTest1(int argc, char** argv) {
   if ( myCTK.openDatabase( argv[1]) )
   if ( myCTK.openDatabase( argv[1]) )
     {
     {
     out << "open db success\n";
     out << "open db success\n";
+    /// make sure it is empty and properly initialized
     myCTK.initializeDatabase();
     myCTK.initializeDatabase();
+    /// insert some sample data
+    myCTK.initializeDatabase(argv[2]);
+    myCTK.closeDatabase();
     }
     }
   else
   else
     { 
     { 

+ 28 - 20
Libs/DICOM/Core/qCTKDCMTK.cxx

@@ -44,9 +44,6 @@ qCTKDCMTK::~qCTKDCMTK()
 }
 }
 
 
 //----------------------------------------------------------------------------
 //----------------------------------------------------------------------------
-QCTK_SET_CXX(qCTKDCMTK, const QString&, setDatabaseFileName, DatabaseFileName);
-
-//----------------------------------------------------------------------------
 bool qCTKDCMTK::openDatabase(const QString& databaseFileName) 
 bool qCTKDCMTK::openDatabase(const QString& databaseFileName) 
 {
 {
   QCTK_D(qCTKDCMTK);
   QCTK_D(qCTKDCMTK);
@@ -57,44 +54,55 @@ bool qCTKDCMTK::openDatabase(const QString& databaseFileName)
     d->LastError = d->Database.lastError().text();
     d->LastError = d->Database.lastError().text();
     return false;
     return false;
     }
     }
+  if ( d->Database.tables().empty() ) 
+    {
+    initializeDatabase();
+    }
   return true;
   return true;
 }
 }
 const QString& qCTKDCMTK::GetLastError() const {
 const QString& qCTKDCMTK::GetLastError() const {
   QCTK_D(const qCTKDCMTK);
   QCTK_D(const qCTKDCMTK);
   return d->LastError; 
   return d->LastError; 
 }
 }
-QSqlDatabase& qCTKDCMTK::database() {
-  QCTK_D(qCTKDCMTK);
+const QSqlDatabase& qCTKDCMTK::database() const {
+  QCTK_D(const qCTKDCMTK);
   return d->Database;
   return d->Database;
 }
 }
 
 
 bool qCTKDCMTKPrivate::executeScript(const QString& script) {
 bool qCTKDCMTKPrivate::executeScript(const QString& script) {
   QFile scriptFile(script);
   QFile scriptFile(script);
-  qDebug() << scriptFile.exists();
-  qDebug() << scriptFile.size();
-  QString sqlCommands( scriptFile.readAll() );
-  qDebug() << sqlCommands ;
+  scriptFile.open(QIODevice::ReadOnly);
+  QString sqlCommands( QTextStream(&scriptFile).readAll() );
   sqlCommands.replace( '\n', ' ' );
   sqlCommands.replace( '\n', ' ' );
   sqlCommands.replace("; ", ";\n");
   sqlCommands.replace("; ", ";\n");
+
   QStringList sqlCommandsLines = sqlCommands.split('\n');
   QStringList sqlCommandsLines = sqlCommands.split('\n');
+
   QSqlQuery query(Database);
   QSqlQuery query(Database);
+
   for (QStringList::iterator it = sqlCommandsLines.begin(); it != sqlCommandsLines.end()-1; ++it)
   for (QStringList::iterator it = sqlCommandsLines.begin(); it != sqlCommandsLines.end()-1; ++it)
-    {
-    query.exec(*it);
-    if (query.lastError().type())
+  {
+    if (! (*it).startsWith("--") )
       {
       {
-      std::cerr 
-      << "There was an error during execution of the statement: " 
-      << (*it).toStdString();
+      query.exec(*it);
+      if (query.lastError().type())
+        {
+        qDebug() << "There was an error during execution of the statement: " << (*it);
+        return false;
+        }
       }
       }
-      return false;
-    }
+  }
   return true;
   return true;
 }
 }
 
 
-bool qCTKDCMTK::initializeDatabase() 
+bool qCTKDCMTK::initializeDatabase(const char* sqlFileName) 
 {
 {
   QCTK_D(qCTKDCMTK);
   QCTK_D(qCTKDCMTK);
-  return d->executeScript(":/dicom/dicom-schema.sql");
+  return d->executeScript(sqlFileName);
+}
+  
+void qCTKDCMTK::closeDatabase()
+{
+  QCTK_D(qCTKDCMTK);
+  d->Database.close();
 }
 }
-

+ 9 - 11
Libs/DICOM/Core/qCTKDCMTK.h

@@ -19,23 +19,21 @@ public:
   explicit qCTKDCMTK(QObject* parent = 0);
   explicit qCTKDCMTK(QObject* parent = 0);
   virtual ~qCTKDCMTK();
   virtual ~qCTKDCMTK();
   
   
-  /// 
-  /// 
-  void setDatabaseFileName(const QString& file);
-  
   ///
   ///
-  /// open the SQLite database in file
+  /// 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 bool openDatabase(const QString& file);
   virtual bool openDatabase(const QString& file);
 
 
-  QSqlDatabase& database();
+  const QSqlDatabase& database() const;
   const QString& GetLastError() const; 
   const QString& GetLastError() const; 
   
   
-  
-  
   ///
   ///
-  /// delete all data and initialize the database with
-  /// the default schema
-  bool initializeDatabase();
+  /// 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");
 private:
 private:
   QCTK_DECLARE_PRIVATE(qCTKDCMTK);
   QCTK_DECLARE_PRIVATE(qCTKDCMTK);
 };
 };