//=====================================================================
int SQLiteTreeHandler::AddBranch( const AttributeMapType& attr )
{
- //std::cout << "AddBranch" << std::endl;
tree::Node* parent = DBGetParent(attr);
- //std::cout << " parent = "<<parent->GetLabel()<<" level "<<parent->GetLevel()<<std::endl;
DBGraftToParent(parent,attr);
-
return (parent->GetLevel()+1);
}
DBRecursiveRemoveNode(node);
// std::cout << "DELETE"<<std::endl;
- if (node->GetParent())
+ bool remove=false;
+ tree::Node* parent=node->GetParent();
+ if (parent)
{
- node->GetParent()->RemoveChildrenFromList(node);
+ int nC = parent->RemoveChildrenFromList(node);
+ if(nC>0)
+ {
+ std::stringstream out;
+ out <<nC;
+ SetAttribute(parent,"NumberOfChildren",out.str());
+ }
+ else
+ {
+ remove=true;
+ }
+
}
delete node;
+ if(remove&&parent->GetLevel()>0)
+ {
+ Remove(parent);
+ }
// std::cout << "DELETE OK"<<std::endl;
return true;
}
return DBSetAttribute(n,key,value);
}
//=====================================================================
+ //=====================================================================
+ /// Sets an attribute
+ void SQLiteTreeHandler::SetAttribute(const std::string& levelDescriptor,
+ const std::string& key,
+ const std::string& value,
+ const std::string& searchParam,
+ const std::string& searchVal)
+ {
+ DBSetAttribute(levelDescriptor,key,value,searchParam, searchVal);
+ }
+ //=====================================================================
+ /// Deletes a tuple
+ void SQLiteTreeHandler::DeleteTuple(std::string levelDescriptor,
+ std::string key, std::string value)
+ {
+ DBDelete(levelDescriptor,key,value);
+ }
+ //=====================================================================
int nbloaded = 0;
// If children loaded we do not have to do it but we need to recurse
// in order to load the children's children if necessary, and so on...
- if (node->GetChildrenLoaded()||mIsAdding)
+ if (node->GetChildrenLoaded())
{
// Iterate the children
// Create Node
tree::Node* child = new tree::Node(parent,attr);
child->SetChildrenLoaded(true);
- // std::cout<<"Number of children "<<parent->GetNumberOfChildren()<<std::endl;
+ if (level>1)
+ {
+ int nc = GetNumberOfChildren(parent)+1;
+
+ // std::cout<<"Number of children "<<parent->GetNumberOfChildren()<<std::endl;
+ std::stringstream out;
+ out << nc;
+ SetAttribute(parent,"NumberOfChildren",out.str());
+ }
+
// Set PARENT_ID if necessary
if ( parent->GetLevel()>0 )
child->SetAttribute("PARENT_ID",parent->GetAttribute("ID"));
sql += GetTree().GetLevelDescriptor(n->GetLevel()).GetName();
sql += " SET ";
sql += key;
- sql += "='";
+ sql += " = '";
sql += value;
- sql += "' WHERE ID=";
+ sql += "' WHERE ID = '";
sql += n->GetAttribute("ID");
+ sql +="'";
// sql += " LIMIT 1";
UPDATEDB(sql);
}
- //=====================================================================
+ //=====================================================================
+ /// Sets an attribute of a Node
+ void SQLiteTreeHandler::DBSetAttribute(const std::string& levelDescriptor,
+ const std::string& key,
+ const std::string& value,
+ const std::string& searchParam,
+ const std::string& searchVal)
+ {
- //=====================================================================
+ std::string sql = "UPDATE ";
+ sql += levelDescriptor;
+ sql += " SET ";
+ sql += key;
+ sql += " = '";
+ sql += value;
+ sql += "' WHERE ";
+ sql += searchParam;
+ sql += " = '";
+ sql += searchVal;
+ sql += "'";
+ UPDATEDB(sql);
+ }
+ //=====================================================================
void SQLiteTreeHandler::DBRecursiveRemoveNode(Node* node)
{
}
}
+ //=====================================================================
+ void SQLiteTreeHandler::DBDelete(std::string levelDescriptor, std::string key, std::string value)
+ {
+
+ std::stringstream query;
+ query<<"DELETE FROM "<<levelDescriptor<<" WHERE "<<key<<"='"<<value<<"';";
+
+ UPDATEDB(query.str());
+ GimmickMessage(1," Deleting: Query: "<<query.str()<<std::endl);
+ }
+
+
+ //=====================================================================
+ void SQLiteTreeHandler::GetAttribute(std::string levelDescriptor,
+ std::string searchParam,
+ std::string searchVal,
+ std::string key,
+ std::string& result)
+ {
+ std::stringstream out;
+ std::stringstream results;
+ out<<"SELECT "<<key<<" FROM "<<levelDescriptor;
+ if(searchParam!="")
+ {
+ out<<" WHERE "<<searchParam<<"='"<<searchVal<<"'";
+ }
+
+ CppSQLite3Query q;
+ QUERYDB(out.str(),q);
+
+
+ while (!q.eof())
+ {
+ for (int fld = 0; fld < q.numFields(); fld++)
+ {
+ results<<q.getStringField(fld);
+ if(searchParam=="")
+ {
+ results<<"#";
+ }
+ }
+ q.nextRow();
+ }
+ result=results.str();
+
+ }
//=====================================================================
unsigned int SQLiteTreeHandler::GetNumberOfChildren(tree::Node* n)
{
- // Query DB
- int nb=0;
+ // Query DB
+ int nb=0;
int level = n->GetLevel();
- if(GetTree().GetNumberOfLevels()!=(level+1))
- {
- std::string query = "SELECT * FROM ";
- query += GetTree().GetLevelDescriptor(level+1).GetName();
- if (level>0)
- {
- query += " WHERE PARENT_ID='" + n->UnsafeGetAttribute("ID")
- + "'";
- }
- CppSQLite3Query q;
- QUERYDB(query,q);
+ if(level<GetTree().GetNumberOfLevels()&& level>0)
+ {
+ std::string query = "SELECT NumberOfChildren FROM ";
+ query += GetTree().GetLevelDescriptor(level).GetName();
+ if (level>0)
+ {
+ query += " WHERE ID='" + n->UnsafeGetAttribute("ID")
+ + "'";
+ }
+ CppSQLite3Query q;
+ QUERYDB(query,q);
-
- while (!q.eof())
- {
- nb++;
- q.nextRow();
- }
- }
+
+ while (!q.eof())
+ {
+ for (int fld = 0; fld < q.numFields(); fld++)
+ {
+ nb=q.getIntField(fld);
+ }
+ q.nextRow();
+ }
+ }
+ /*
+ if(nb==0)
+ {
+ nb=1;
+ }
+ */
return nb;
}