1 #ifndef __creaImageIOSQLiteTreeHandler_h_INCLUDED__
2 #define __creaImageIOSQLiteTreeHandler_h_INCLUDED__
4 #include <creaImageIOTreeHandler.h>
15 //=======================================================================
16 /// Concrete TreeHandler which manages a Tree stored in a sqlite database
17 class SQLiteTreeHandler : virtual public TreeHandler
20 //====================================================================
21 /// Ctor with database file name
22 SQLiteTreeHandler(const std::string& filename);
24 virtual ~SQLiteTreeHandler();
25 //====================================================================
27 //====================================================================
28 /// Returns the sqlite db file name
29 const std::string& GetFileName() const { return mFileName; }
30 //====================================================================
32 //====================================================================
34 /// Is the 'source' readable ?
35 virtual bool IsReadable() { return true; }
36 /// Is the 'source' writable ?
37 virtual bool IsWritable() { return true; }
38 //====================================================================
41 //====================================================================
42 // INITIALIZATION / FINALIZATION
43 //====================================================================
45 //====================================================================
46 /// Opens an existing 'source'
47 // Default mode is read only
48 // If IsWritable and writable==true then opens in read/write mode
49 virtual bool Open(bool writable = false);
50 /// Closes the 'source'
52 /// Creates a new 'source'
53 // Default mode is read only
54 // If IsWritable and writable==true then opens in read/write mode
55 virtual bool Create(bool writable = false);
56 /// Destroys the 'source'
57 virtual bool Destroy();
58 //====================================================================
61 //====================================================================
63 //====================================================================
66 //====================================================================
67 /// Returns the number of children of the Node *WITHOUT LOADING THEM*
68 // REM : The Tree itself is a Node and asking for its number of
69 // children returns the number of children of level 1.
70 virtual unsigned int GetNumberOfChildren(tree::Node* n);
71 //====================================================================
73 //====================================================================
74 /// Recursively loads the children of node 'parent' until maxlevel
76 // If parent == NULL or parent == tree then starts with the 'children' of
78 // Returns the total number of children loaded.
79 virtual int LoadChildren(tree::Node* parent, int maxlevel);
80 //====================================================================
82 //====================================================================
83 /// Unloads the Node and its descendants
84 // WITHOUT altering the source, e.g. the database
85 virtual void UnLoad(tree::Node* n);
86 ///====================================================================
89 //====================================================================
90 // WRITE METHODS : WORK ONLY IN WRITE MODE
91 //====================================================================
92 /// Adds a branch in the tree with the attributes provided
93 // returns the Level in the tree where the branch was connected
94 // (-1 for error, 0 for top level, etc. )
95 // Of course the branch is loaded on exit
96 virtual int AddBranch( const AttributeMapType& attr );
97 // Removes the node and its descendants
98 virtual bool Remove(tree::Node*);
99 // Sets an attribute of a Node
100 virtual bool SetAttribute(tree::Node*,
101 const std::string& key,
102 const std::string& value);
103 //====================================================================
108 //======================================================================
109 /// Open the database
111 /// Import the Tree::Description from database (verifies the structure)
112 bool DBImportTreeDescription();
113 //======================================================================
114 //======================================================================
116 /// Creates a new database on disk and the tables
118 /// Appends to string s the SQL command to create the attributes of a given level
119 void SQLAppendAttributesDefinition(int level, std::string& s);
120 //======================================================================
122 //======================================================================
124 /// Returns the parent to which the branch defined by the attributes
125 // provided must be grafted
126 tree::Node* DBGetParent( const AttributeMapType& attr);
127 //======================================================================
129 //======================================================================
131 /// Loads the children of Node parent
132 // Can recurse to numberoflevels levels
133 // \return The total number of Node loaded (may be at different levels)
134 int DBLoadChildren( tree::Node* parent, int numberoflevels = 1);
135 //======================================================================
137 //======================================================================
139 /// Appends to string s the SQL command to set the attributes values
141 void SQLAppendAttributesValues(tree::Node* n, std::string& s);
142 //======================================================================
144 //======================================================================
146 /// Graft the branch defined by the attributes to the parent
147 void DBGraftToParent( tree::Node* parent, const AttributeMapType& attr);
148 //======================================================================
149 //======================================================================
151 /// Sets an attribute of a Node and updates the database
152 bool DBSetAttribute(tree::Node*,
153 const std::string& key,
154 const std::string& value);
155 //======================================================================
156 //======================================================================
158 /// Inserts the Node in the database
159 void DBInsert(tree::Node* n);
160 //======================================================================
163 /// Recursively Removes the nodes whose parent is given as a parameter
164 void DBRecursiveRemoveNode(tree::Node* node);
167 int DBQueryNumberOfChildren(tree::Node* n);
170 bool DBInsert(tree::Node* alien_node) ; //, UpdateSummary& summary);
173 std::string DBGetNodeId(tree::Node* node, const std::string& parent_id);
175 tree::Node* GetNodeFromTypeId(int level,
176 const std::string& id);
179 tree::Node* DBGetOrCreateNode(tree::Node* alien_node,
180 tree::Node* internal_parent,
181 std::string parentid,
182 std::string& created_id);
183 // UpdateSummary& summary);
185 tree::Node* DBGetOrCreateParent(tree::Node* alien_node,
186 std::string& parent_id);
187 // UpdateSummary& summary);
189 void DBRecursiveGetOrCreateNode(tree::Node* alien_node,
191 const std::string& parent_id);
192 // UpdateSummary& summary);
199 void BuildSQLFieldsValues(tree::Node* n,
203 tree::Node* GetChildrenLike(tree::Node* internal_parent,
204 tree::Node* alien_node);
209 /// The physical location associated to the DicomDatabase (directory, db file...)
210 std::string mFileName;
211 /// Is the DB writable ?
213 void SetWritable(bool w) { mWritable; }
214 bool GetWritable() const { return mWritable; }
222 bool operator< (const TypeId& o) const
224 return ((type<o.type) ||
225 ((type==o.type)&&id<o.id));
229 typedef std::map<TypeId,tree::Node*> TypeIdToNodeMapType;
230 TypeIdToNodeMapType mTypeIdToNodeMap;
233 // EO class SQLiteTreeHandler
234 //=======================================================================
237 } // EO namespace creaImageIO