GDBMS 1.0
GDBMS_for_documentation/transaction_mode_commands_edges.cpp
Go to the documentation of this file.
00001 #include "maininclude.h"
00002 #include "listi.h"
00003 #include "settings.h"
00004 #include "hash_table.h"
00005 #include "tr_twin_ht.h"
00006 #include "file_semaphore.h"
00007 #include "some_functions.h"
00008 #include "initial_mode_commands.h"
00009 #include "session_mode_commands.h"
00010 #include "transaction_mode_commands.h"
00011 #include "transaction_mode_commands_types.h"
00012 #include "transaction_mode_commands_nodes.h"
00013 #include "transaction_mode_commands_edges.h"
00014 #include "transaction_mode_commands_find.h"
00015 using namespace std;
00016 int transaction_mode_commands_edges::AddEdge(int transaction_USCOREid, std::string edge_USCOREname, std::string edge_USCOREtype, ns1__AddEdgeResponse& _param_21)
00017 {
00018   char *grphidstr=0;
00019   char *tridstr=0;
00020   tridstr=inttostr(transaction_USCOREid);
00021   grphidstr=settings::getGraphfromTransaction(tridstr);
00022   if(grphidstr&&tridstr){
00023     string trfolder;
00024   
00025     trfolder+="admin/";
00026     trfolder+=grphidstr;
00027     trfolder+="/";
00028     trfolder+=tridstr;
00029     string cmd;
00030     
00031   
00032     string edgfolder;
00033     edgfolder+=trfolder;
00034     edgfolder+="/edges";
00035   
00036     string nodefolder;
00037     nodefolder=trfolder;
00038     nodefolder+="/nodes";
00039   
00040   
00041     string grfolder;
00042     grfolder+="admin/";
00043     grfolder+=grphidstr;
00044     
00045     
00046     string realedges_folder;
00047     realedges_folder+=grfolder;
00048     realedges_folder+="/edges";
00049   
00050     string realnodes_folder;
00051     realnodes_folder+=grfolder;
00052     realnodes_folder+="/nodes";
00053     
00054     hash_table real_edges("edges", realedges_folder.c_str(), "id;name;data;inodes;onodes;type_id;tr_id", "id;name;inodes;onodes;type_id;tr_id", "id");
00055     hash_table real_nodes("nodes", realnodes_folder.c_str(), "id;name;data;iedges;oedges;type_id;tr_id", "id;name;iedges;oedges;type_id;tr_id", "id");
00056   
00057     tr_twin_ht edgtwin("edges", edgfolder.c_str(), "id;name;data;inodes;onodes;type_id;tr_id", "id;name;inodes;onodes;type_id;tr_id", "id", transaction_USCOREid, edgfolder.c_str(), &real_edges);
00058     tr_twin_ht nodtwin("nodes", nodefolder.c_str(), "id;name;data;iedges;oedges;type_id;tr_id", "id;name;iedges;oedges;type_id;tr_id", "id", transaction_USCOREid, nodefolder.c_str(), &real_nodes);
00059     
00060     string types_folder;
00061     types_folder+=grfolder;
00062     types_folder+="/gr_types";
00063     hash_table grt("gr_types", types_folder.c_str(), "id;name;parsestr;composite;array;asize;aid;internal", "id;name", "id");
00064     //tuk se pravi ne6to
00065     int permitted=0;
00066     settings::determineTransactionActionPermittion(permitted, transaction_USCOREid, 0x400, 0x40, 0x4);
00067     if(permitted){
00068       string vals;
00069       int curid=edgtwin.getMAXID();
00070       
00071       char *grtypeid=0;
00072       grtypeid=grt.FindRecord("name", edge_USCOREtype.c_str(), "id");
00073       
00074       if(grtypeid){
00075         if(edge_USCOREname[0]!='@'){
00076           vals=inttostr(curid);
00077           vals+=";";
00078           vals+=edge_USCOREname;
00079           vals+=";";
00080           vals+=grtypeid;
00081           edgtwin.AddRecord("id;name;type_id", vals.c_str());
00082           _param_21.retvalue=0;
00083         }else{
00084           char *buf1=0;
00085           char *buf2=0;
00086           char *buf3=0;
00087           if(sscanf(edge_USCOREname.c_str(), "@Edge(%s) with incoming Nodes(%s) and outgoing Nodes(%s);", buf1, buf2, buf3)==3){
00088             vals=inttostr(curid);
00089             vals+=";";
00090             vals+=buf1;
00091             vals+=";";
00092             listi inodes_names(buf2, ';');
00093             listi inodes_ids(0, ',');
00094             
00095             int n=inodes_names.getnum();
00096             int i;
00097             for(i=0; i<n; i++){
00098               char *inodeid=nodtwin.FindRecord("name", inodes_names.getith(i), "id");
00099               if(inodeid){
00100                 inodes_ids.addelement(inodeid);
00101                 delete inodeid;
00102               }
00103             }
00104             vals+=inodes_ids.returnstring();
00105             vals+=";";
00106             for(i=0; i<n; i++){
00107              char *oedges=nodtwin.FindRecord("name", inodes_names.getith(i), "oedges");
00108              if(oedges){
00109               listi oedges_ids(oedges, ',');
00110               oedges_ids.addelement(inttostr(curid));
00111               nodtwin.UpdateRecord("name", inodes_names.getith(i), "oedges", oedges_ids.returnstring());
00112               delete oedges; 
00113              }
00114             }
00115             listi onodes_names(buf3, ';');
00116             n = onodes_names.getnum();
00117             listi onodes_ids(0, ',');
00119             for(i=0; i<n; i++){
00120               char *onodeid=nodtwin.FindRecord("name", onodes_names.getith(i), "id");
00121               if(onodeid){
00122                 onodes_ids.addelement(onodeid);
00123                 delete onodeid;
00124               }
00125             }
00126             vals+=onodes_ids.returnstring();
00127             
00128             
00129             
00130             
00131             
00133             
00134             
00135             
00136             
00137             for(i=0; i<n; i++){
00138               char *iedges=nodtwin.FindRecord("name", onodes_names.getith(i), "iedges");
00139               if(iedges){
00140                 listi iedges_ids(iedges, ',');
00141                 iedges_ids.addelement(inttostr(curid));
00142                 nodtwin.UpdateRecord("name", onodes_names.getith(i), "iedges", iedges_ids.returnstring());
00143                 delete iedges;
00144               }
00145              
00146             }
00147             edgtwin.AddRecord("id;name;type_id;inodes;onodes", vals.c_str());
00148             _param_21.retvalue=0;
00149           }else if(sscanf(edge_USCOREname.c_str(), "@Add Link for Edge(%s) with incoming Node(%s);", buf1, buf2)==2){
00150             char *edgid=edgtwin.FindRecord("name", buf1, "id");
00151             if(edgid){
00152               char *nodid=nodtwin.FindRecord("name", buf2, "id");
00153               if(nodid){
00154                 char *inodes=edgtwin.FindRecord("id", edgid, "inodes");
00155                 if(inodes){
00156                   //dobavyane na informaciya za vyzela kym rebroto
00157                  listi inodes_l(inodes, ',');
00158                  inodes_l.addelement(nodid);
00159                  edgtwin.UpdateRecord("id", edgid, "inodes", inodes_l.returnstring());
00160                  //dobavyane na informaciya za rebroto kym vyzela
00161                  char *oedges=nodtwin.FindRecord("id", nodid, "oedges");
00162                  if(oedges){
00163                    listi oedges_l(oedges, ',');
00164                    oedges_l.addelement(edgid);
00165                    nodtwin.UpdateRecord("id", nodid, "oedges", oedges_l.returnstring());
00166                    delete oedges;
00167                  } 
00168                  
00169                  delete inodes; 
00170                 }
00171                 
00172                 delete nodid;
00173               }
00174               delete edgid;
00175             }else{
00176              _param_21.retvalue=3; 
00177             }
00178               
00179           }else if(sscanf(edge_USCOREname.c_str(), "@Add Link for Edge(%s) with outgoing Node(%s);", buf1, buf2)==2){
00181             char *edgid=edgtwin.FindRecord("name", buf1, "id");
00182             if(edgid){
00183               char *nodid=nodtwin.FindRecord("name", buf2, "id");
00184               if(nodid){
00185                 char *onodes=edgtwin.FindRecord("id", edgid, "onodes");
00186                 if(onodes){
00187                   //dobavyane na informaciya za vyzela kym rebroto
00188                  listi onodes_l(onodes, ',');
00189                  onodes_l.addelement(nodid);
00190                  edgtwin.UpdateRecord("id", edgid, "onodes", onodes_l.returnstring());
00191                  //dobavyane na informaciya za rebroto kym vyzela
00192                  char *iedges=nodtwin.FindRecord("id", nodid, "iedges");
00193                  if(iedges){
00194                    listi iedges_l(iedges, ',');
00195                    iedges_l.addelement(edgid);
00196                    nodtwin.UpdateRecord("id", nodid, "oedges", iedges_l.returnstring());
00197                    delete iedges;
00198                  } 
00199                  
00200                  delete onodes; 
00201                 }
00202                 
00203                 delete nodid;
00204               }
00205               delete edgid;
00206             }else{
00207              _param_21.retvalue=3; 
00208             }
00209             
00211           }else{
00212             _param_21.retvalue=3;
00213           }
00214           
00215         }
00216         delete grtypeid;
00217       }else{
00218         _param_21.retvalue=3;
00219       }
00220       
00221       
00222       
00223       
00224     }else{
00225       _param_21.retvalue=1;
00226     }
00227     return 0;
00228   }
00229   return 0;
00230 }
00231 int transaction_mode_commands_edges::AddValueToEdge(int transaction_USCOREid, string edge_USCOREname, string path, string value, ns1__AddValueToEdgeResponse& _param_22)
00232 {
00233   char *grphidstr=0;
00234   char *tridstr=0;
00235   tridstr=inttostr(transaction_USCOREid);
00236   grphidstr=settings::getGraphfromTransaction(tridstr);
00237   if(grphidstr&&tridstr){
00238     string trfolder;
00239   
00240     trfolder+="admin/";
00241     trfolder+=grphidstr;
00242     trfolder+="/";
00243     trfolder+=tridstr;
00244     string cmd;
00245     
00246   
00247     string edgfolder;
00248     edgfolder+=trfolder;
00249     edgfolder+="/edges";
00250   
00251     string nodefolder;
00252     nodefolder=trfolder;
00253     nodefolder+="/nodes";
00254   
00255   
00256     string grfolder;
00257     grfolder+="admin/";
00258     grfolder+=grphidstr;
00259     
00260     
00261     string realedges_folder;
00262     realedges_folder+=grfolder;
00263     realedges_folder+="/edges";
00264   
00265     string realnodes_folder;
00266     realnodes_folder+=grfolder;
00267     realnodes_folder+="/nodes";
00268     
00269     hash_table real_edges("edges", realedges_folder.c_str(), "id;name;data;inodes;onodes;type_id;tr_id", "id;name;inodes;onodes;type_id;tr_id", "id");
00270     //hash_table real_nodes("nodes", realnodes_folder.c_str(), "id;name;data;iedges;oedges;type_id;tr_id", "id;name;iedges;oedges;type_id;tr_id", "id");
00271   
00272     tr_twin_ht edgtwin("edges", edgfolder.c_str(), "id;name;data;inodes;onodes;type_id;tr_id", "id;name;inodes;onodes;type_id;tr_id", "id", transaction_USCOREid, edgfolder.c_str(), &real_edges);
00273     //r_twin_ht nodtwin("nodes", nodefolder.c_str(), "id;name;data;iedges;oedges;type_id;tr_id", "id;name;iedges;oedges;type_id;tr_id", "id", transaction_USCOREid, nodefolder.c_str(), &real_nodes);
00274     
00275     //tuk se pravi ne6to
00276     int permitted=0;
00277     settings::determineTransactionActionPermittion(permitted, transaction_USCOREid, 0x400, 0x40, 0x4);
00278     if(permitted){
00279       
00280       char *foundnodedata=0;
00281       
00282       foundnodedata=edgtwin.FindRecord("name", edge_USCOREname.c_str(), "data");
00283       if(foundnodedata){
00284         
00285         XMLNode x;
00286         x=XMLNode::parseString(foundnodedata);
00287         
00288         if(settings::is_type_path_valid(path.c_str(), grphidstr)){
00289           //tuka trqbva da se dobavi infoto
00290           
00291           string parsestr;
00292           bool success=0;
00293           settings::getparsestr(grphidstr, path.c_str(), parsestr);
00294           if(!parsestr.compare("%d")){
00295             if(settings::is_int(value.c_str())){
00296               success=1;
00297               
00298             }
00299             
00300           }else if(!parsestr.compare("%f")){
00301             if(settings::is_numeric(value.c_str()))
00302               success=1;
00303             
00304             
00305             
00306           }else{
00307             
00308             success=1;
00309           }
00310           if(success){
00311             x.getChildNodeByPath(path.c_str(), 1, ".");
00312             x.updateText(value.c_str());
00313             char *updated_data=0;
00314             XMLNode x2;
00315             x2=XMLNode::createXMLTopNode("xml");
00316             x2.addChild(x);
00317             updated_data=x2.getText();
00318             
00319             if(updated_data){
00320               edgtwin.UpdateRecord("name", edge_USCOREname.c_str(), "data", value.c_str());
00321               _param_22.retvalue=0;
00322             }else{
00323               _param_22.retvalue=3;
00324             }
00325             
00326           }else{
00327             
00328             _param_22.retvalue=1;
00329           }
00330           
00331           
00332           
00333         }else{
00334           _param_22.retvalue=3;
00335         }
00336         
00337         
00338         
00339       }else{
00340         _param_22.retvalue=3;
00341       }
00342       
00343       
00344     }else{
00345       _param_22.retvalue=3;
00346     }
00347    
00348     
00349     delete grphidstr;
00350     delete tridstr;
00351   }else{
00352     _param_22.retvalue=3;
00353   }
00354   return 0;
00355 }
00356 int transaction_mode_commands_edges::DeleteEdge(int transaction_USCOREid, string edge_USCOREname, ns1__DeleteEdgeResponse& _param_23)
00357 {
00358   char *grphidstr=0;
00359   char *tridstr=0;
00360   tridstr=inttostr(transaction_USCOREid);
00361   grphidstr=settings::getGraphfromTransaction(tridstr);
00362   if(grphidstr&&tridstr){
00363     string trfolder;
00364   
00365     trfolder+="admin/";
00366     trfolder+=grphidstr;
00367     trfolder+="/";
00368     trfolder+=tridstr;
00369     string cmd;
00370     
00371   
00372     string edgfolder;
00373     edgfolder+=trfolder;
00374     edgfolder+="/edges";
00375   
00376     string nodefolder;
00377     nodefolder=trfolder;
00378     nodefolder+="/nodes";
00379   
00380   
00381     string grfolder;
00382     grfolder+="admin/";
00383     grfolder+=grphidstr;
00384     
00385     
00386     string realedges_folder;
00387     realedges_folder+=grfolder;
00388     realedges_folder+="/edges";
00389   
00390     string realnodes_folder;
00391     realnodes_folder+=grfolder;
00392     realnodes_folder+="/nodes";
00393     
00394     hash_table real_edges("edges", realedges_folder.c_str(), "id;name;data;inodes;onodes;type_id;tr_id", "id;name;inodes;onodes;type_id;tr_id", "id");
00395     //hash_table real_nodes("nodes", realnodes_folder.c_str(), "id;name;data;iedges;oedges;type_id;tr_id", "id;name;iedges;oedges;type_id;tr_id", "id");
00396   
00397     tr_twin_ht edgtwin("edges", edgfolder.c_str(), "id;name;data;inodes;onodes;type_id;tr_id", "id;name;inodes;onodes;type_id;tr_id", "id", transaction_USCOREid, edgfolder.c_str(), &real_edges);
00398     //tr_twin_ht nodtwin("nodes", nodefolder.c_str(), "id;name;data;iedges;oedges;type_id;tr_id", "id;name;iedges;oedges;type_id;tr_id", "id", transaction_USCOREid, nodefolder.c_str(), &real_nodes);
00399     
00400     //tuk se pravi ne6to
00401     int permitted=0;
00402     settings::determineTransactionActionPermittion(permitted, transaction_USCOREid, 0x100, 0x10, 0x1);
00403     if(permitted){
00404       
00405       //iztrivane na vryzkite na nodes kym tozi edge
00406       hash_table real_nodes("nodes", realnodes_folder.c_str(), "id;name;data;iedges;oedges;type_id;tr_id", "id;name;iedges;oedges;type_id;tr_id", "id");
00407       tr_twin_ht nodtwin("nodes", nodefolder.c_str(), "id;name;data;iedges;oedges;type_id;tr_id", "id;name;iedges;oedges;type_id;tr_id", "id", transaction_USCOREid, nodefolder.c_str(), &real_nodes);
00408      char *edgid=edgtwin.FindRecord("name", edge_USCOREname.c_str(), "id");
00409      char *onodes=edgtwin.FindRecord("name", edge_USCOREname.c_str(), "onodes");
00410      if(onodes){
00411        listi lonodes(onodes, ',');
00412        int j;
00413        for(j=0; j<lonodes.getnum(); j++){
00414          char *buf=lonodes.getith(j);
00415         char *iedges=nodtwin.FindRecord("id", buf, "iedges");
00416         if(iedges){
00417           listi liedges(iedges, ',');
00418           liedges.removeelement(edgid);
00419           nodtwin.UpdateRecord("id", buf, "iedges", liedges.returnstring());
00420           
00421          }
00422         }
00423          delete onodes; 
00424        }
00425        char *inodes=edgtwin.FindRecord("name", edge_USCOREname.c_str(), "inodes");
00426      if(inodes){
00427        listi linodes(inodes, ',');
00428        int j;
00429        for(j=0; j<linodes.getnum(); j++){
00430          char *buf=linodes.getith(j);
00431         char *oedges=nodtwin.FindRecord("id", buf, "oedges");
00432         if(oedges){
00433           listi loedges(oedges, ",");
00434           loedges.removeelement(edgid);
00435           nodtwin.UpdateRecord("id", buf, "oedges", loedges.returnstring());
00436           
00437           
00438           
00439          }
00440         }
00441          delete inodes; 
00442        }
00443        
00444       
00445      
00446      
00447      
00448              //iztrivane na samiya node
00449       edgtwin.DeleteRecord("name", edge_USCOREname.c_str());
00450       
00451       
00452       _param_23.retvalue=0;
00453     }else{
00454       _param_23.retvalue=1;
00455     }
00456     return 0;
00457   }
00458 }
 All Classes Files Functions Variables Typedefs Enumerations Enumerator Defines