浏览代码

ENH: improved command line option handling of DICOM indexer, changed error handling to exceptions

Marco Nolden 15 年之前
父节点
当前提交
de8344bed5

+ 8 - 4
Applications/ctkDICOM/ctkDICOM.cpp

@@ -49,12 +49,16 @@ int main(int argc, char** argv)
     }
 
   ctkDICOM myCTK;
-  if (!myCTK.openDatabase( datbaseFileName ))
-    {
+  try
+  {
+    myCTK.openDatabase( datbaseFileName );
+  }
+  catch (std::exception e)
+  {
     std::cerr << "Error when opening the data base file: " << datbaseFileName
-              << " error: " << myCTK.GetLastError().toStdString();
+              << " error: " << e.what();
     return EXIT_FAILURE;
-    }
+  }
   if (!myCTK.initializeDatabase(datbaseScriptFileName))
     {
     std::cerr << "Error when initializing the data base: " << datbaseScriptFileName

+ 16 - 9
Applications/ctkDICOMIndexer/ctkDICOMIndexer.cpp

@@ -34,7 +34,7 @@
 
 void print_usage()
 {
-  std::cerr << "Usage: ";
+  std::cerr << "Usage:\n";
   std::cerr << "  1. ctkDICOMIndexer --add <database.db> <sourceDir> [destDir]\n";
   std::cerr << "     Adds (or refreshes) sourceDir to the index of the database.\n";
   std::cerr << "     Creates the database if it is not valid..\n";
@@ -42,7 +42,7 @@ void print_usage()
   std::cerr << "  2. ctkDICOMIndexer --init <database.db> [sqlScript]\n";
   std::cerr << "     Reinitialize the database. Uses default schema or the provided sqlScript file.\n";
   std::cerr << "  3. ctkDICOMIndexer --cleanup <database.db>\n";
-  std::cerr << "     Remove non-existent files from the database.";
+  std::cerr << "     Remove non-existent files from the database.\n";
   return;
 }
 
@@ -66,17 +66,12 @@ int main(int argc, char** argv)
   ctkDICOM myCTK;
 
 
-  if (!myCTK.openDatabase( argv[2]))
-  {
-    std::cerr << "Database error:" << qPrintable(myCTK.GetLastError());
-    myCTK.closeDatabase();
-    return EXIT_FAILURE;
-  }
-  else
+  try
   {
     if (std::string("--add") == argv[1])
     {
       {
+        myCTK.openDatabase( argv[2] );
         if (argc > 4)
         {
           idx.addDirectory(myCTK.database(),argv[3],argv[4]);
@@ -89,6 +84,7 @@ int main(int argc, char** argv)
     }
     else if (std::string("--init") == argv[1])
     {
+      myCTK.openDatabase( argv[2] );
       if (argc > 2)
       {
         myCTK.initializeDatabase(argv[2]);
@@ -102,6 +98,17 @@ int main(int argc, char** argv)
     {
       // TODO
     }
+    else
+    {
+      print_usage();
+      return EXIT_FAILURE;
+    }
+  }
+  catch (std::exception e)
+  {
+    std::cerr << "Database error:" << qPrintable(myCTK.GetLastError());
+    myCTK.closeDatabase();
+    return EXIT_FAILURE;
   }
   return EXIT_SUCCESS;
 }

+ 8 - 4
Libs/DICOM/Core/Testing/Cpp/ctkDICOMModelTest1.cpp

@@ -31,12 +31,16 @@ int ctkDICOMModelTest1( int argc, char * argv [] )
     }
   
   ctkDICOM myCTK;
-  if (!myCTK.openDatabase( argv[1] ))
-    {
+  try
+  {
+    myCTK.openDatabase( argv[1] );
+  }
+  catch (std::exception e)
+  {
     std::cerr << "Error when opening the data base file: " << argv[1] 
-              << " error: " << myCTK.GetLastError().toStdString();
+              << " error: " << e.what();
     return EXIT_FAILURE;
-    }
+  }
   if (!myCTK.initializeDatabase(argv[2]))
     {
     std::cerr << "Error when initializing the data base: " << argv[2] 

+ 8 - 7
Libs/DICOM/Core/Testing/Cpp/ctkDICOMTest1.cpp

@@ -15,8 +15,9 @@ int ctkDICOMTest1(int argc, char * argv []) {
   QApplication app(argc, argv);
   QTextStream out(stdout);
   ctkDICOM myCTK;
-  if ( myCTK.openDatabase( argv[1]) )
-    {
+  try
+  {
+    myCTK.openDatabase( argv[1]);
     out << "open db success\n";
     /// make sure it is empty and properly initialized
     if (! myCTK.initializeDatabase() ) {
@@ -30,11 +31,11 @@ int ctkDICOMTest1(int argc, char * argv []) {
     };
     myCTK.closeDatabase(); 
     }
-  else
-    { 
-    out << "ERROR: " ;
-    out << myCTK.GetLastError();
-    }
+  catch (std::exception e)
+  {
+    out << "ERROR: " << e.what();
+    return EXIT_FAILURE;
+  }
   return EXIT_SUCCESS;
 }
 

+ 3 - 3
Libs/DICOM/Core/ctkDICOM.cpp

@@ -31,6 +31,7 @@
 
 // STD includes
 #include <iostream>
+#include <stdexcept>
 
 //----------------------------------------------------------------------------
 class ctkDICOMPrivate: public ctkPrivate<ctkDICOM>
@@ -67,7 +68,7 @@ ctkDICOM::~ctkDICOM()
 }
 
 //----------------------------------------------------------------------------
-bool ctkDICOM::openDatabase(const QString& databaseFileName)
+void ctkDICOM::openDatabase(const QString& databaseFileName)
 {
   CTK_D(ctkDICOM);
   d->Database = QSqlDatabase::addDatabase("QSQLITE","DICOM-DB");
@@ -75,13 +76,12 @@ bool ctkDICOM::openDatabase(const QString& databaseFileName)
   if ( ! (d->Database.open()) )
     {
     d->LastError = d->Database.lastError().text();
-    return false;
+    throw std::runtime_error(qPrintable(d->LastError));
     }
   if ( d->Database.tables().empty() ) 
     {
     initializeDatabase();
     }
-  return true;
 }
 
 //------------------------------------------------------------------------------

+ 1 - 1
Libs/DICOM/Core/ctkDICOM.h

@@ -43,7 +43,7 @@ public:
   /// 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 void openDatabase(const QString& file);
 
   const QSqlDatabase& database() const;
   const QString& GetLastError() const;