: mFileName(filename)
{
mDB = new CppSQLite3DB;
+ mIsAdding=false;
GimmickMessage(1,"SQLite version : "
<<std::string(mDB->SQLiteVersion())<< std::endl);
}
{
return false;
}
- //=====================================================================
-
- //=====================================================================
- unsigned int SQLiteTreeHandler::GetNumberOfChildren(tree::Node* n)
- {
- return 0;
- }
+
//=====================================================================
//=====================================================================
}
//=====================================================================
-
//=====================================================================
int SQLiteTreeHandler::AddBranch( const AttributeMapType& attr )
{
tree::Node* parent = DBGetParent(attr);
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 && parent->GetLevel()>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);
+ }
+ //=====================================================================
// Add Attribute 'ID' to Description
- GetTree().GetLevelDescriptor(l).Add
+ GetTree().GetDescriptor().Add
(AttributeDescriptor( "ID",
"Database Identifier",
0,0,
AttributeDescriptor::PRIVATE
- ));
+ ),l);
if (l>1)
{
// Add Attribute 'PARENT_ID' to Description
- GetTree().GetLevelDescriptor(l).Add
+ GetTree().GetDescriptor().Add
(AttributeDescriptor( "PARENT_ID",
"Database Parent Identifier",
0,0,
AttributeDescriptor::PRIVATE
- ));
+ ),l);
}
}
<< i->GetGroup() << ","
<< i->GetElement() << ","
<< i->GetFlags() << ");";
-
UPDATEDB(insert.str());
}
tree::Descriptor& desc = GetTree().GetDescriptor();
// clears the existing one
- desc.GetLevelDescriptorList().clear();
+ desc.Clear();
int nblevel = 0;
std::string query = "SELECT * FROM LEVELS";
{
std::string name = q.getStringField(0);
GimmickMessage(2," * Importing level '"<<name<<"'"<<std::endl);
- desc.GetLevelDescriptorList().push_back(LevelDescriptor(name));
+ desc.Add(LevelDescriptor(name));
nblevel++;
q.nextRow();
}
std::string name(q.getStringField(1));
GimmickMessage(2," - Importing attribute '"<<key<<"' '"<<name
<<"'"<<std::endl);
- desc.GetLevelDescriptor(level).Add
+ desc.Add
(AttributeDescriptor( key, // Key
name, // Name
q.getIntField(2), // Group
q.getIntField(3), // Element
q.getIntField(4) // Flags
- ));
+ ),level);
if ( key == "ID" )
{
ID_found = true;
if (node->GetChildrenLoaded())
{
// Iterate the children
+
tree::Node::ChildrenListType::iterator i;
for (i = node->GetChildrenList().begin();
i!= node->GetChildrenList().end();
{
nbloaded += DBLoadChildren(*i,numberoflevels-1);
}
+ node->SetChildrenLoaded(true);
return nbloaded;
+
}
-
+ else
+ {
/// If children not loaded : do it and recurse
// Query DB
int level = node->GetLevel();
std::string query = "SELECT * FROM ";
+
query += GetTree().GetLevelDescriptor(level+1).GetName();
if (level>0)
{
CppSQLite3Query q;
QUERYDB(query,q);
+ int p=0;
while (!q.eof())
{
+
+ // std::cout << "DBLoadCh : creating node level "<<level+1<<std::endl;
+
nbloaded++;
Node* n = new Node(node);
for (int fld = 0; fld < q.numFields(); fld++)
}
node->SetChildrenLoaded(true);
+
// msw[2].Pause();
return nbloaded;
+ }
}
//=====================================================================
void SQLiteTreeHandler::DBGraftToParent( tree::Node* parent,
const AttributeMapType& attr)
{
- GimmickMessage(2,"Grafting to parent '"<<parent->GetLabel()
- <<"'"<<std::endl);
+ // std::cout <<"Grafting to parent '"<<parent->GetLabel()
+ // <<"'"<<std::endl;
for (int level = parent->GetLevel()+1;
level < GetTree().GetNumberOfLevels();
{
// Create Node
tree::Node* child = new tree::Node(parent,attr);
-
+ child->SetChildrenLoaded(true);
+ 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 += "'";
+ std::cout<<sql<<std::endl;
+ UPDATEDB(sql);
+ }
+ //=====================================================================
void SQLiteTreeHandler::DBRecursiveRemoveNode(Node* node)
{
<<"' in level "<< GetTree().GetLevelDescriptor(node->GetLevel()).GetName()
<<std::endl);
- Node::ChildrenListType::iterator i;
- for (i = node->GetChildrenList().begin();
- i != node->GetChildrenList().end();
- i++)
+
+ if(node->GetNumberOfChildren()!=0)
+ {
+ Node::ChildrenListType::iterator i;
+ for (i = node->GetChildrenList().begin();
+ i != node->GetChildrenList().end();
+ i++)
+ {
+ DBRecursiveRemoveNode((*i));
+ }
+ }
+ else if(node->GetLevel()<GetTree().GetNumberOfLevels()-1)
+ {
+ DBRecursiveRemoveNode(node->GetLevel()+1,node->GetAttribute("ID"));
+ }
+ }
+
+ //=====================================================================
+ void SQLiteTreeHandler::DBRecursiveRemoveNode(int level, std::string parentId)
+ {
+ std::stringstream out;
+ std::stringstream result;
+ out<<"SELECT ID FROM "<<GetTree().GetLevelDescriptor(level).GetName()<<" WHERE PARENT_ID='"<<parentId<<"'";
+
+ CppSQLite3Query q;
+ QUERYDB(out.str(),q);
+
+ while (!q.eof())
+ {
+ for (int fld = 0; fld < q.numFields(); fld++)
+ {
+ result<<q.getStringField(fld)<<"#";
+ }
+ q.nextRow();
+ }
+ std::string res=result.str();
+ size_t ini=0;
+ size_t fin=0;
+ while(fin<res.size()-1)
+ {
+ fin=res.find('#',ini);
+ DBDelete(GetTree().GetLevelDescriptor(level).GetName(),"ID",res.substr(ini,fin-ini));
+ if(level<GetTree().GetNumberOfLevels()-1)
+ {
+ DBRecursiveRemoveNode(level+1,res.substr(ini,fin-ini));
+ }
+ ini=fin+1;
+ }
+
+
+ }
+
+ //=====================================================================
+ 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());
+ GimmickDebugMessage(2," 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;
+ int level = n->GetLevel();
+
+ if(level<GetTree().GetNumberOfLevels()&& level>0)
{
- DBRecursiveRemoveNode((*i));
+ 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())
+ {
+ for (int fld = 0; fld < q.numFields(); fld++)
+ {
+ nb=q.getIntField(fld);
+ }
+ q.nextRow();
+ }
+ }
+ /*
+ if(nb==0)
+ {
+ nb=1;
}
+ */
+ return nb;
}
+ //=====================================================================
+ void SQLiteTreeHandler::GetTopLevelNodeId(const std::string& searchParam, const std::string& searchValue, std::string& parent_id)
+ {
+ int level=GetTree().GetNumberOfLevels()-1;
+ std::string sp=searchParam.c_str();
+ std::string sv=searchValue.c_str();
+
+ while(level>1)
+ {
+ std::stringstream out;
+ std::stringstream results;
+ out<<"SELECT PARENT_ID FROM "<<GetTree().GetLevelDescriptor(level).GetName();
+ out<<" WHERE "<<sp<<"='"<<sv<<"'";
+ CppSQLite3Query q;
+ QUERYDB(out.str(),q);
+
+
+ while (!q.eof())
+ {
+ for (int fld = 0; fld < q.numFields(); fld++)
+ {
+ results<<q.getStringField(fld);
+ }
+ q.nextRow();
+ }
+ level=level-1;
+ sp="ID";
+ sv=results.str();
+ }
+ parent_id=sv;
+
+ }
+
+ //=====================================================================
+ void SQLiteTreeHandler::RemoveEntries(const std::string i_table,
+ const std::string i_attribute,
+ const std::string i_operand,
+ const std::string i_val)
+ {
+ std::stringstream query;
+ query<<"DELETE FROM "<<i_table<<" WHERE "<<i_attribute<<" "<<i_operand<<" '"<<i_val<<"'";
+ UPDATEDB(query.str());
+ }
+
+ //=====================================================================
+ void SQLiteTreeHandler::BeginTransaction()
+ {
+ std::stringstream out;
+ out<<"begin transaction;";
+ UPDATEDB(out.str());
+ }
+
+ //=====================================================================
+ void SQLiteTreeHandler::EndTransaction()
+ {
+ std::stringstream out;
+ out<<"commit transaction;";
+ UPDATEDB(out.str());
+ }
+
/*
//=====================================================================
bool SQLiteTreeHandler::DBInsert(Node* alien_node,