#ifndef __creaImageIODicomDatabase_h_INCLUDED__ #define __creaImageIODicomDatabase_h_INCLUDED__ #include #include #include #include #include class CppSQLite3DB; namespace creaImageIO { //===================================================================== class DicomDatabase : public DicomNode { public: /// Creates a database associated to the file 'filename'. /// Does not create the db nor reads any data from the file DicomDatabase(const std::string& filename, int flags = 0); /// Dtor ~DicomDatabase(); /// Returns the DicomNodeTypeDescription for DicomNodes of type c DicomNodeTypeDescription& GetDicomNodeTypeDescription(DicomNode::Type c) { return mDicomNodeTypeDescription[c]; } /// Returns the DicomNodeTypeDescription for DicomNodes of type c (const) const DicomNodeTypeDescription& GetDicomNodeTypeDescription(DicomNode::Type c) const { return mDicomNodeTypeDescription[c]; } /// Returns the sqlite db file name const std::string& GetFileName() const { return UnsafeGetFieldValue("File name"); } void SetName(const std::string& n) { UnsafeSetFieldValue("Name",n); } const std::string& GetName() const { return UnsafeGetFieldValue("Name"); } void Print() const; //============================================================= void Clear(); bool LocationIsValid(); /// Creates a new db on disk bool New(); /// Opens an existing db on disk bool Open(); /// Closes the db bool Close(); /// Recursively loads the children of node 'parent' until maxlevel /// is reached. /// If parent == NULL or parent == this then starts with the 'children' of /// the database itself, i.e. the patients. /// Returns the total number of children loaded. int DBLoadChildren(DicomNode* parent, DicomNode::Type maxlevel); /// struct UpdateSummary { int scanned_dirs; int scanned_files; int handled_images; int added_images; int added_patients; int added_studies; int added_series; long parse_time; long file_scan_time; long update_structs_time; long update_database_time; long total_time; bool cancelled_by_user; UpdateSummary() : scanned_dirs(0), scanned_files(0), handled_images(0), added_images(0), added_patients(0), added_studies(0), added_series(0), parse_time(0), file_scan_time(0), update_structs_time(0), update_database_time(0), total_time(0), cancelled_by_user(false) {} }; /// bool IsHandledFile( const std::string& filename); bool AddFile( const std::string& filename, UpdateSummary& summary ); bool AddFiles( const std::vector& filename, wxProgressDialog* progress, UpdateSummary& summary); bool AddDirectory( const std::string& directory, bool recurse, wxProgressDialog* progress, UpdateSummary& summary ); void ParseDirectory( const std::string& directory, std::vector &Filenames, bool recurse, wxProgressDialog* progress, UpdateSummary& summary); /// Removes the node and its descendants from the db bool Remove(DicomNode*); //============================================================= int DBQueryNumberOfChildren(DicomNode* n); protected: // Open bool OpenDB(); void ImportDicomNodeTypeDescriptionsFromDB(); // Creation bool CreateDB(); void BuildDefaultDicomNodeTypeDescriptions(); void AppendSQLFieldsDefinition(DicomNode::Type c, std::string& s); void ExportDicomNodeTypeDescriptionsToDB(); // // Test bool DBStructureIsValid(); // Insertion bool DBInsert(DicomNode* alien_node, UpdateSummary& summary); // std::string DBGetDicomNodeId(DicomNode* node, const std::string& parent_id); DicomNode* GetDicomNodeFromTypeId(DicomNode::Type t, const std::string& id); // DicomNode* DBGetOrCreateDicomNode(DicomNode* alien_node, DicomNode* internal_parent, std::string parentid, std::string& created_id, UpdateSummary& summary); DicomNode* DBGetOrCreateParent(DicomNode* alien_node, std::string& parent_id, UpdateSummary& summary); void DBRecursiveGetOrCreateDicomNode(DicomNode* alien_node, DicomNode* parent, const std::string& parent_id, UpdateSummary& summary); // void DBRecursiveRemoveDicomNode(DicomNode* node); void BuildSQLFieldsValues(DicomNode* n, std::string& str); DicomNode* GetChildrenLike(DicomNode* internal_parent, DicomNode* alien_node); private: CppSQLite3DB* mDB; ImageReader mReader; struct TypeId { int type; std::string id; bool operator< (const TypeId& o) const { return ((type TypeIdToDicomNodeMapType; TypeIdToDicomNodeMapType mTypeIdToDicomNodeMap; /// The 5 descriptions of node types (Database,Patient,Study,Series,Image) /// The array is accessed through the DicomNode::TypeCode DicomNodeTypeDescription mDicomNodeTypeDescription[5]; /// The physical location associated to the DicomDatabase (directory, db file...) std::string mFileName; std::string mName; int mFlags; wxStopWatch msw[10]; }; // class DicomDatabase //===================================================================== } // namespace creaImageIO #endif // #ifndef __creaImageIODicomDatabase_h_INCLUDED__