GDBMS 1.0
GDBMS_for_documentation/transaction_mode_commands_find.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_find::FindAllFriends(int transaction_USCOREid, string node_USCOREname, string paths_USCOREnodes, int paths_USCOREcount, ns1__FindAllFriendsResponse& _param_27)
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 trn("transactions", "admin/transactions", "id;user_id;graph_id;time_started", "id;user_id;graph_id", "id");
00055     
00056     
00057     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");
00058     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");
00059   
00060     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);
00061     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);
00062     
00063     char *idnode=nodtwin.FindRecord("name", node_USCOREname.c_str(), "id");
00064     if(idnode){
00065      _param_27.Xiksml_USCOREresponse+="<friends id=\""; 
00066      _param_27.Xiksml_USCOREresponse+=idnode;
00067      _param_27.Xiksml_USCOREresponse+="\">";
00068      listi res(0, ',');
00069      listi metr(0, ',');
00070      string path_edg;
00071      path_edg="id";
00072      transaction_mode_commands_find::getNeighborNodes(strtoint(idnode), res, metr, nodtwin, edgtwin, path_edg);
00073      int i, j;
00074      int ni=res.getnum();
00075      for(i=0; i<ni; i++){
00076        _param_27.Xiksml_USCOREresponse+="<neighbor id=\"";
00077        _param_27.Xiksml_USCOREresponse+=res.getith(i);
00078        _param_27.Xiksml_USCOREresponse+="\">";
00079        listi paths_l(paths_USCOREnodes.c_str(), ";");
00080        int nj=paths_l.getnum();
00081        for(j=0; j<nj; j++){
00082          char *curpath=paths_l.getith(j);
00083          
00084          if(curpath){
00085           if(settings::is_type_path_valid(curpath, grphidstr)){
00086             char *val=nodtwin.FindRecord("id", res.getith(i), "data");
00087             if(val){
00088              XMLNode x1=XMLNode::parseString(val);
00089              XMLNode x2=x1.getChildNodeByPath(curpath, 0, '.');
00090              _param_27.Xiksml_USCOREresponse+="<val name=\"";
00091              _param_27.Xiksml_USCOREresponse+=x2.getName();
00092              _param_27.Xiksml_USCOREresponse+="\">";
00093              _param_27.Xiksml_USCOREresponse+=x2.getText();
00094              
00095              _param_27.Xiksml_USCOREresponse+="</val>";
00096               
00097              delete val; 
00098             }
00099             
00100             
00101           }else{
00102             _param_27.Xiksml_USCOREresponse+="<error>";
00103             _param_27.Xiksml_USCOREresponse+="Invalid path.";
00104             _param_27.Xiksml_USCOREresponse+="</error>";
00105             
00106             
00107           }
00108            
00109            
00110            
00111           delete curpath; 
00112          }
00113          
00114          
00115          
00116        }      
00117        
00118        _param_27.Xiksml_USCOREresponse+="</neighbor>";
00119        
00120        
00121      }
00122      _param_27.Xiksml_USCOREresponse+="</friends>";
00123      delete idnode; 
00124     }
00125     
00126     }else{
00127      _param_27.Xiksml_USCOREresponse+="<error>";
00128      _param_27.Xiksml_USCOREresponse+="Node name not found.";
00129      _param_27.Xiksml_USCOREresponse+="</error>";
00130     }
00131   
00132   return 0;
00133 }
00134 int transaction_mode_commands_find::FindAllPathsBetweenNodes(int transaction_USCOREid, string node_USCOREname1, string node_USCOREname2, string paths, int paths_USCOREcount, string path_USCOREedges, ns1__FindAllPathsBetweenNodesResponse& _param_26)
00135 {
00136     char *grphidstr=0;
00137   char *tridstr=0;
00138   tridstr=inttostr(transaction_USCOREid);
00139   grphidstr=settings::getGraphfromTransaction(tridstr);
00140   if(grphidstr&&tridstr){
00141     string trfolder;
00142   
00143     trfolder+="admin/";
00144     trfolder+=grphidstr;
00145     trfolder+="/";
00146     trfolder+=tridstr;
00147     string cmd;
00148     
00149   
00150     string edgfolder;
00151     edgfolder+=trfolder;
00152     edgfolder+="/edges";
00153   
00154     string nodefolder;
00155     nodefolder=trfolder;
00156     nodefolder+="/nodes";
00157   
00158   
00159     string grfolder;
00160     grfolder+="admin/";
00161     grfolder+=grphidstr;
00162     
00163     
00164     string realedges_folder;
00165     realedges_folder+=grfolder;
00166     realedges_folder+="/edges";
00167   
00168     string realnodes_folder;
00169     realnodes_folder+=grfolder;
00170     realnodes_folder+="/nodes";
00171     
00172     hash_table trn("transactions", "admin/transactions", "id;user_id;graph_id;time_started", "id;user_id;graph_id", "id");
00173     
00174     
00175     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");
00176     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");
00177   
00178     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);
00179     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);
00180     char *idnod1=nodtwin.FindRecord("name", node_USCOREname1.c_str(), "id");
00181     if(idnod1){
00182       char *idnod2=nodtwin.FindRecord("name", node_USCOREname2.c_str(), "id");
00183       if(idnod2){
00184         int i;
00185         listi paths_l(paths.c_str(), ";");
00186         
00187         for(i=0; i<paths_USCOREcount; i++){
00188           if(!settings::is_type_path_valid(paths_l.getith(i), grphidstr)){
00189             break;
00190           }
00191           
00192         }
00193         if(i>=paths_USCOREcount){
00194           if(settings::is_type_path_valid(path_USCOREedges.c_str(), grphidstr)){
00195             //vhodnite danni sa validni
00196             char *used=new char[MAXNUM];
00197             unsigned *path=new unsigned[MAXNUM];
00198             if(used&&path){
00199               _param_26.Xiksml_USCOREresponse+="<paths>";
00200               unsigned count=0;
00201               int k;
00202               for(k=0; k<MAXNUM; k++){
00203                 used[k]=0;
00204               }
00205             
00206               transaction_mode_commands_find::allDFS(strtoint(idnod1), strtoint(idnod2), used, path, count, nodtwin, edgtwin, _param_26.Xiksml_USCOREresponse, path_USCOREedges, paths);
00207             
00208               _param_26.Xiksml_USCOREresponse+="</paths>";
00209               delete used;
00210               delete path;
00211             
00212             }else{
00213               
00214               _param_26.Xiksml_USCOREresponse+="<error>";
00215               _param_26.Xiksml_USCOREresponse+="Memory allocation error.";
00216               _param_26.Xiksml_USCOREresponse+="</error>";
00217             }
00218             
00219           }else{
00220             
00221             _param_26.Xiksml_USCOREresponse+="<error>";
00222             _param_26.Xiksml_USCOREresponse+="Type paths error.";
00223             _param_26.Xiksml_USCOREresponse+="</error>";
00224             
00225           }
00226           
00227           
00228           
00229           
00230         }else{
00231           _param_26.Xiksml_USCOREresponse+="<error>";
00232           _param_26.Xiksml_USCOREresponse+="Type paths error.";
00233           _param_26.Xiksml_USCOREresponse+="</error>";
00234         }
00235         delete idnod2;
00236       }else{
00237         _param_26.Xiksml_USCOREresponse+="<error>";
00238         _param_26.Xiksml_USCOREresponse+="Node name not found.";
00239         _param_26.Xiksml_USCOREresponse+="</error>";
00240       }
00241       delete idnod1;
00242     }else{
00243      _param_26.Xiksml_USCOREresponse+="<error>";
00244      _param_26.Xiksml_USCOREresponse+="Node name not found.";
00245      _param_26.Xiksml_USCOREresponse+="</error>";
00246     }
00247   }
00248   return 0;
00249 }
00250 
00251 void transaction_mode_commands_find::allDFS(unsigned int i, unsigned int j, char* used, unsigned int* path, unsigned int& count, tr_twin_ht& nodtwin1, tr_twin_ht& edgtwin1, string& XMLRes, string& path_edges, string& paths)
00252 {
00253   unsigned k;
00254   if(i==j){
00255     path[count]=j;
00256     transaction_mode_commands_find::getAllDFS_XML_Path(path, count, XMLRes, nodtwin1, edgtwin1, paths);
00257     return;
00258   }
00259   /*markirane na poseteniq vryh*/
00260   used[i]=1;
00261   path[count++]=i;
00262   listi neighb(0, ',');
00263   listi metrics_edges(0, ',');
00264   transaction_mode_commands_find::getNeighborNodes(i, neighb, metrics_edges, nodtwin1, edgtwin1, path_edges);
00265   int ni=neighb.getnum();
00266   for(k=0; k<ni; k++){
00267     char *neighbindstr=neighb.getith(k);
00268     if(neighbindstr){
00269      int ki=strtoint(neighbindstr);
00270      if(!used[ki])
00271        allDFS(ki, j, used, path, count, nodtwin1, edgtwin1, XMLRes, path_edges, paths);
00272      used[i]=0;
00273      count--;
00274 
00275       
00276      delete neighbindstr; 
00277     }
00278   }
00279   
00280 }
00281 void transaction_mode_commands_find::getAllDFS_XML_Path(unsigned int* path, unsigned int& count, string& XMLRes, tr_twin_ht& nodtwin1, tr_twin_ht& edgtwin1, string& paths)
00282 {
00283   unsigned k;
00284   XMLRes+="<path>";
00285   for(k=0; k<=count; k++){
00286     char *idknode=inttostr(k);
00287     if(idknode){
00288       char *dataknode=nodtwin1.FindRecord("id", idknode, "data");
00289       XMLRes+="<node id=\"";
00290       XMLRes+=idknode;
00291       XMLRes+="\">";
00292       
00293       if(dataknode){
00294         XMLNode x1, x2;
00295         listi paths_l(paths.c_str(), ';');
00296         int j, nj=paths_l.getnum();
00297         for(j=0; j<nj; j++){
00298           char *curpath=paths_l.getith(j);
00299           if(curpath){
00300             x1=XMLNode::parseString(dataknode);
00301             x2=x1.getChildNodeByPath(curpath, 0, '.');
00302             char *cname=x2.getName();
00303             char *cval=x2.getText();
00304             if(cname&&cval){
00305              XMLRes+="<val name=\""; 
00306              XMLRes+=cname;
00307              XMLRes+="\">";
00308              XMLRes+=cval;
00309              XMLRes+="</val>";
00310               
00311              delete cname;
00312              delete cval;
00313             }
00314             
00315             delete curpath;
00316           }
00317           
00318         }
00319         
00320         
00321         delete dataknode;
00322       }
00323       XMLRes+="</node>";
00324       
00325       delete idknode;
00326     }
00327     
00328   }
00329   
00330   XMLRes+="</path>";
00331 }
00332 
00333 int transaction_mode_commands_find::FindBFS(int transaction_USCOREid, string node_USCOREname, string paths_USCOREnodes, string paths_USCOREvalues, int paths_USCOREcount, int limit_USCOREnodes, ns1__FindBFSResponse& _param_28)
00334 {
00335    char *grphidstr=0;
00336   char *tridstr=0;
00337   tridstr=inttostr(transaction_USCOREid);
00338   grphidstr=settings::getGraphfromTransaction(tridstr);
00339   if(grphidstr&&tridstr){
00340     string trfolder;
00341   
00342     trfolder+="admin/";
00343     trfolder+=grphidstr;
00344     trfolder+="/";
00345     trfolder+=tridstr;
00346     string cmd;
00347     
00348   
00349     string edgfolder;
00350     edgfolder+=trfolder;
00351     edgfolder+="/edges";
00352   
00353     string nodefolder;
00354     nodefolder=trfolder;
00355     nodefolder+="/nodes";
00356   
00357   
00358     string grfolder;
00359     grfolder+="admin/";
00360     grfolder+=grphidstr;
00361     
00362     
00363     string realedges_folder;
00364     realedges_folder+=grfolder;
00365     realedges_folder+="/edges";
00366   
00367     string realnodes_folder;
00368     realnodes_folder+=grfolder;
00369     realnodes_folder+="/nodes";
00370     
00371     hash_table trn("transactions", "admin/transactions", "id;user_id;graph_id;time_started", "id;user_id;graph_id", "id");
00372     
00373     
00374     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");
00375     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");
00376   
00377     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);
00378     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);
00379     
00380     char *idnode=nodtwin.FindRecord("name", node_USCOREname.c_str(), "id");
00381     if(idnode){
00382      int idnode_int=strtoint(idnode);
00383      listi paths_nodes_l(paths_USCOREnodes.c_str(), ';');
00384      listi paths_values_l(paths_USCOREvalues.c_str(), ';');
00385      int k;
00386      char *used= new char[MAXNUM];
00387      unsigned *queue = new unsigned[MAXNUM];
00388      for(k=0; k<MAXNUM; k++){
00389        used[k]=0;
00390        queue[k]=0;
00391      }
00392      unsigned j, p, currentVert=0, levelVertex=1, queueEnd=1;
00393      queue[0]=idnode_int;
00394      used[idnode_int]=1;
00395      _param_28.Xiksml_USCOREresponse+="<nodes>";
00396      while(currentVert<queueEnd){
00397        for(p=currentVert; p<levelVertex; p++){
00398          /*vzemame poredniq element ot opa6kata*/
00399          printDFS( queue[p], used, paths_nodes_l, paths_values_l, _param_28.Xiksml_USCOREresponse, nodtwin, edgtwin);
00400          currentVert++;
00401          /*dobavyame vseki neobhoden naslednik v opa6kata*/
00402          listi neighbn(0, ',');
00403          listi metrneighbn(0, ',');
00404          transaction_mode_commands_find::getNeighborNodes(queue[p], neighbn, metrneighbn, nodtwin, edgtwin, "id");
00405          unsigned kn=neighbn.getnum();
00406          for(k=0; k<kn; k++){
00407             char *curneinod=neighbn.getith(k);
00408             if(curneinod){
00409               int in_curneinode=strtoint(curneinod);
00410               if(!used[in_curneinode]){
00411                 queue[queueEnd++]=in_curneinode;
00412                 used[in_curneinode]=1;
00413                 
00414               }
00415               
00416               
00417               delete curneinod;
00418             }
00419            
00420            
00421          }
00422          
00423        }
00424        levelVertex=queueEnd;
00425      }
00426      
00427      _param_28.Xiksml_USCOREresponse+="</nodes>";
00428      
00429      delete idnode; 
00430     }
00431     
00432     }else{
00433      _param_28.Xiksml_USCOREresponse+="<error>";
00434      _param_28.Xiksml_USCOREresponse+="Node name not found.";
00435      _param_28.Xiksml_USCOREresponse+="</error>";
00436     }
00437   
00438   return 0;
00439 }
00440 int transaction_mode_commands_find::FindDFS(int transaction_USCOREid, string node_USCOREname, string paths_USCOREnodes, string paths_USCOREvalues, int paths_USCOREcount, int limit_USCOREnodes, ns1__FindDFSResponse& _param_29)
00441 {
00442    char *grphidstr=0;
00443   char *tridstr=0;
00444   tridstr=inttostr(transaction_USCOREid);
00445   grphidstr=settings::getGraphfromTransaction(tridstr);
00446   if(grphidstr&&tridstr){
00447     string trfolder;
00448   
00449     trfolder+="admin/";
00450     trfolder+=grphidstr;
00451     trfolder+="/";
00452     trfolder+=tridstr;
00453     string cmd;
00454     
00455   
00456     string edgfolder;
00457     edgfolder+=trfolder;
00458     edgfolder+="/edges";
00459   
00460     string nodefolder;
00461     nodefolder=trfolder;
00462     nodefolder+="/nodes";
00463   
00464   
00465     string grfolder;
00466     grfolder+="admin/";
00467     grfolder+=grphidstr;
00468     
00469     
00470     string realedges_folder;
00471     realedges_folder+=grfolder;
00472     realedges_folder+="/edges";
00473   
00474     string realnodes_folder;
00475     realnodes_folder+=grfolder;
00476     realnodes_folder+="/nodes";
00477     
00478     hash_table trn("transactions", "admin/transactions", "id;user_id;graph_id;time_started", "id;user_id;graph_id", "id");
00479     
00480     
00481     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");
00482     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");
00483   
00484     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);
00485     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);
00486     
00487     char *idnode=nodtwin.FindRecord("name", node_USCOREname.c_str(), "id");
00488     if(idnode){
00489      int idnode_int=strtoint(idnode);
00490      listi paths_nodes_l(paths_USCOREnodes.c_str(), ';');
00491      listi paths_values_l(paths_USCOREvalues.c_str(), ';');
00492      int k;
00493      char *used= new char[MAXNUM];
00494      
00495      for(k=0; k<MAXNUM; k++){
00496        used[k]=0;
00497        
00498      }
00499      _param_29.Xiksml_USCOREresponse+="<nodes>";
00500      transaction_mode_commands_find::DFS(idnode_int, used, paths_nodes_l, paths_values_l, _param_29.Xiksml_USCOREresponse, nodtwin, edgtwin, limit_USCOREnodes, 0);
00501      
00502      _param_29.Xiksml_USCOREresponse+="</nodes>";
00503      
00504      delete idnode; 
00505     }
00506     
00507     }else{
00508      _param_29.Xiksml_USCOREresponse+="<error>";
00509      _param_29.Xiksml_USCOREresponse+="Node name not found.";
00510      _param_29.Xiksml_USCOREresponse+="</error>";
00511     }
00512   
00513   return 0;
00514 }
00515 void transaction_mode_commands_find::DFS(unsigned int i, char* used, listi& paths_nodes_l, listi& paths_values_l, std::string& response, tr_twin_ht& nodtwin1, tr_twin_ht& edgtwin1, int limit_nodes, int countvar)
00516 {
00517   if(countvar>=limit_nodes)
00518     return;
00519   unsigned k;
00520   used[i]=1;
00521   printDFS( i, used, paths_nodes_l, paths_values_l, response, nodtwin1, edgtwin1);
00522   listi neighbn(0, ',');
00523   listi metrneighbn(0, ',');
00524   transaction_mode_commands_find::getNeighborNodes(i, neighbn, metrneighbn, nodtwin1, edgtwin1, "id");
00525   unsigned kn=neighbn.getnum();
00526   for(k=0; k<kn; k++){
00527     char *curneinod=neighbn.getith(k);
00528     if(curneinod){
00529      if(!used[strtoint(curneinod)]){
00530        DFS( strtoint(curneinod), used, paths_nodes_l, paths_values_l, response, nodtwin1, edgtwin1, limit_nodes, countvar+1);
00531      }
00532      delete curneinod; 
00533     }
00534     
00535     
00536   }
00537 }
00538 void transaction_mode_commands_find::printDFS(unsigned int i, char* used, listi& paths_nodes_l, listi& paths_values_l, string& response, tr_twin_ht& nodtwin1, tr_twin_ht& edgtwin1)
00539 {
00540   
00541   char *nodeidstr=inttostr(i);
00542   if(nodeidstr){
00543     response+="<node id=\"";
00544     response+=nodeidstr;
00545     response+="\">";
00546     int k;
00547     int kn=paths_nodes_l.getnum();
00548     for(k=0; k<kn; k++){
00549       char *data=nodtwin1.FindRecord("id", nodeidstr, "data");
00550       if(data){
00551         XMLNode x1, x2;
00552         x1=XMLNode::parseString(data);
00553         char *curpath=paths_nodes_l.getith(k);
00554         if(curpath){
00555          x2=x1.getChildNodeByPath(curpath, 0, '.'); 
00556          response+="<val name=\"";
00557          response+=x2.getName();
00558          response+="\">";
00559          response+=x2.getText();
00560          response+="</val>";
00561          delete curpath; 
00562         }
00563         
00564         delete data;
00565       }
00566       
00567       
00568     }
00569     
00570     
00571     response+="</node>";
00572     
00573     delete nodeidstr;
00574   }
00575 }
00576 
00577 int transaction_mode_commands_find::FindMaxPathBetweenNodes(int transaction_USCOREid, string node_USCOREname1, string node_USCOREname2, string paths, int paths_USCOREcount, string path_USCOREedges, ns1__FindMaxPathBetweenNodesResponse& _param_25)
00578 {
00579     char *grphidstr=0;
00580   char *tridstr=0;
00581   tridstr=inttostr(transaction_USCOREid);
00582   grphidstr=settings::getGraphfromTransaction(tridstr);
00583   if(grphidstr&&tridstr){
00584     string trfolder;
00585   
00586     trfolder+="admin/";
00587     trfolder+=grphidstr;
00588     trfolder+="/";
00589     trfolder+=tridstr;
00590     string cmd;
00591     
00592   
00593     string edgfolder;
00594     edgfolder+=trfolder;
00595     edgfolder+="/edges";
00596   
00597     string nodefolder;
00598     nodefolder=trfolder;
00599     nodefolder+="/nodes";
00600   
00601   
00602     string grfolder;
00603     grfolder+="admin/";
00604     grfolder+=grphidstr;
00605     
00606     
00607     string realedges_folder;
00608     realedges_folder+=grfolder;
00609     realedges_folder+="/edges";
00610   
00611     string realnodes_folder;
00612     realnodes_folder+=grfolder;
00613     realnodes_folder+="/nodes";
00614     
00615     hash_table trn("transactions", "admin/transactions", "id;user_id;graph_id;time_started", "id;user_id;graph_id", "id");
00616     
00617     
00618     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");
00619     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");
00620   
00621     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);
00622     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);
00623     char *idnod1=nodtwin.FindRecord("name", node_USCOREname1.c_str(), "id");
00624     if(idnod1){
00625       char *idnod2=nodtwin.FindRecord("name", node_USCOREname2.c_str(), "id");
00626       if(idnod2){
00627         int i;
00628         listi paths_l(paths.c_str(), ";");
00629         
00630         for(i=0; i<paths_USCOREcount; i++){
00631           if(!settings::is_type_path_valid(paths_l.getith(i), grphidstr)){
00632             break;
00633           }
00634           
00635         }
00636         if(i>=paths_USCOREcount){
00637           if(settings::is_type_path_valid(path_USCOREedges.c_str(), grphidstr)){
00638             //vhodnite danni sa validni
00639             char *T=new char[MAXNUM];
00640             unsigned *d= new unsigned[MAXNUM];
00641             int *pred=new int[MAXNUM];
00642             if(T&&d&&pred){
00643               int s=strtoint(idnod1);
00644               transaction_mode_commands_find::dijkstraMax(s, T, d, pred, path_USCOREedges, nodtwin, edgtwin);
00645               transaction_mode_commands_find::dijkstraGetXMLResult(s, _param_25.Xiksml_USCOREresponse, paths, path_USCOREedges, T, d, pred, strtoint(idnod2), nodtwin);
00646               delete T;
00647               delete d;
00648               delete pred;
00649             }else{
00650               _param_25.Xiksml_USCOREresponse+="<error>";
00651               _param_25.Xiksml_USCOREresponse+="Memory allocation error.";
00652               _param_25.Xiksml_USCOREresponse+="</error>";
00653             }
00654             
00655             
00656             
00657           }else{
00658             _param_25.Xiksml_USCOREresponse+="<error>";
00659             _param_25.Xiksml_USCOREresponse+="Type paths error.";
00660             _param_25.Xiksml_USCOREresponse+="</error>";
00661             
00662           }
00663           
00664           
00665           
00666           
00667         }else{
00668           _param_25.Xiksml_USCOREresponse+="<error>";
00669           _param_25.Xiksml_USCOREresponse+="Type paths error.";
00670           _param_25.Xiksml_USCOREresponse+="</error>";
00671         }
00672         delete idnod2;
00673       }else{
00674         _param_25.Xiksml_USCOREresponse+="<error>";
00675         _param_25.Xiksml_USCOREresponse+="Node name not found.";
00676         _param_25.Xiksml_USCOREresponse+="</error>";
00677       }
00678       delete idnod1;
00679     }else{
00680      _param_25.Xiksml_USCOREresponse+="<error>";
00681      _param_25.Xiksml_USCOREresponse+="Node name not found.";
00682      _param_25.Xiksml_USCOREresponse+="</error>";
00683     }
00684   }
00685   return 0;
00686 }
00687 int transaction_mode_commands_find::FindMinPathBetweenNodes(int transaction_USCOREid, string node_USCOREname1, string node_USCOREname2, string paths, int paths_USCOREcount, string path_USCOREedges, ns1__FindMinPathBetweenNodesResponse& _param_24)
00688 {
00689     char *grphidstr=0;
00690   char *tridstr=0;
00691   tridstr=inttostr(transaction_USCOREid);
00692   grphidstr=settings::getGraphfromTransaction(tridstr);
00693   if(grphidstr&&tridstr){
00694     string trfolder;
00695   
00696     trfolder+="admin/";
00697     trfolder+=grphidstr;
00698     trfolder+="/";
00699     trfolder+=tridstr;
00700     string cmd;
00701     
00702   
00703     string edgfolder;
00704     edgfolder+=trfolder;
00705     edgfolder+="/edges";
00706   
00707     string nodefolder;
00708     nodefolder=trfolder;
00709     nodefolder+="/nodes";
00710   
00711   
00712     string grfolder;
00713     grfolder+="admin/";
00714     grfolder+=grphidstr;
00715     
00716     
00717     string realedges_folder;
00718     realedges_folder+=grfolder;
00719     realedges_folder+="/edges";
00720   
00721     string realnodes_folder;
00722     realnodes_folder+=grfolder;
00723     realnodes_folder+="/nodes";
00724     
00725     hash_table trn("transactions", "admin/transactions", "id;user_id;graph_id;time_started", "id;user_id;graph_id", "id");
00726     
00727     
00728     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");
00729     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");
00730   
00731     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);
00732     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);
00733     char *idnod1=nodtwin.FindRecord("name", node_USCOREname1.c_str(), "id");
00734     if(idnod1){
00735       char *idnod2=nodtwin.FindRecord("name", node_USCOREname2.c_str(), "id");
00736       if(idnod2){
00737         int i;
00738         listi paths_l(paths.c_str(), ";");
00739         
00740         for(i=0; i<paths_USCOREcount; i++){
00741           if(!settings::is_type_path_valid(paths_l.getith(i), grphidstr)){
00742             break;
00743           }
00744           
00745         }
00746         if(i>=paths_USCOREcount){
00747           if(settings::is_type_path_valid(path_USCOREedges.c_str(), grphidstr)){
00748             //vhodnite danni sa validni
00749             char *T=new char[MAXNUM];
00750             unsigned *d= new unsigned[MAXNUM];
00751             int *pred=new int[MAXNUM];
00752             if(T&&d&&pred){
00753               int s=strtoint(idnod1);
00754               transaction_mode_commands_find::dijkstraMin(s, T, d, pred, path_USCOREedges, nodtwin, edgtwin);
00755               transaction_mode_commands_find::dijkstraGetXMLResult(s, _param_24.Xiksml_USCOREresponse, paths, path_USCOREedges, T, d, pred, strtoint(idnod2), nodtwin);
00756               delete T;
00757               delete d;
00758               delete pred;
00759             }else{
00760               _param_24.Xiksml_USCOREresponse+="<error>";
00761               _param_24.Xiksml_USCOREresponse+="Memory allocation error.";
00762               _param_24.Xiksml_USCOREresponse+="</error>";
00763             }
00764             
00765             
00766             
00767           }else{
00768             _param_24.Xiksml_USCOREresponse+="<error>";
00769             _param_24.Xiksml_USCOREresponse+="Type paths error.";
00770             _param_24.Xiksml_USCOREresponse+="</error>";
00771             
00772           }
00773           
00774           
00775           
00776           
00777         }else{
00778           _param_24.Xiksml_USCOREresponse+="<error>";
00779           _param_24.Xiksml_USCOREresponse+="Type paths error.";
00780           _param_24.Xiksml_USCOREresponse+="</error>";
00781         }
00782         delete idnod2;
00783       }else{
00784         _param_24.Xiksml_USCOREresponse+="<error>";
00785         _param_24.Xiksml_USCOREresponse+="Node name not found.";
00786         _param_24.Xiksml_USCOREresponse+="</error>";
00787       }
00788       delete idnod1;
00789     }else{
00790      _param_24.Xiksml_USCOREresponse+="<error>";
00791      _param_24.Xiksml_USCOREresponse+="Node name not found.";
00792      _param_24.Xiksml_USCOREresponse+="</error>";
00793     }
00794   }
00795   return 0;
00796 }
00797 void transaction_mode_commands_find::dijkstraGetXMLResult(int s, string& result, string& paths, string& path_edges, char* T, unsigned int* d, int* pred, int endnodeid, tr_twin_ht& nodtwin1)
00798 {
00799   result+="<nodes metric=\"";
00800   result+=path_edges;
00801   result+="\">";
00802   listi paths_l(paths.c_str(), ';');
00803   int num_paths_l=paths_l.getnum();
00804   int i=0, j=0, k=0, currec=endnodeid;
00805   while(currec!=s){
00806     char *currecstr=inttostr(currec);
00807     if(currecstr){
00808       
00809       char *datafield=nodtwin1.FindRecord("id", currecstr, "data");
00810       result+="<node id=\"";
00811       result+=currecstr;
00812       result+="\">";
00813       if(datafield){
00814         
00815         
00816         
00817         for(i=0; i<num_paths_l; i++){
00818           char *curpath=paths_l.getith(i);
00819           if(curpath){
00820             XMLNode x1=XMLNode::parseString(datafield);
00821             XMLNode x2;
00822             x2=x1.getChildNodeByPath(curpath, 0, '.');
00823             result+="<val name=\"";
00824             result+=x2.getName();
00825             result+="\">";
00826             result+=x2.getText();
00827             result+="</val>";
00828             delete curpath;
00829           }
00830           
00831         }
00832         
00833         
00834         
00835         
00836         
00837         delete datafield;
00838       }
00839       
00840       
00841       result+="</node>";
00842       delete currecstr;
00843       currec=pred[currec];
00844     }
00845     
00846   }
00847   
00848   result+="</nodes>";
00849   
00850 }
00851 
00852 
00853 void transaction_mode_commands_find::dijkstraMin(int s, char* T, unsigned int* d, int* pred, string& path_edges, tr_twin_ht& nodtwin1, tr_twin_ht& edgtwin1)
00854 {
00855   int i;
00856   //inizializacii
00857   for(i=0; i<MAXNUM; i++){
00858     T[i]=1;
00859     pred[i]=0;
00860     d[i]=NO_PARENT;
00861   }
00862   T[s]=0;
00863   listi neighb_s(0, ',');
00864   listi metrics_edges(0, ',');
00865   transaction_mode_commands_find::getNeighborNodes(s, neighb_s, metrics_edges, nodtwin1, edgtwin1, path_edges);
00866   int len_neighb_s=neighb_s.getnum();
00867   //inizializirane na d i pred
00868   for(i=0; i<len_neighb_s; i++){
00869     char *str1=neighb_s.getith(i);
00870     char *str2=metrics_edges.getith(i);
00871     if(str1&&str2){
00872       d[strtoint(str1)]=strtoint(str2);
00873       pred[strtoint(str1)]=s;
00874       delete str1; 
00875       delete str2;
00876     }
00877     
00878   }
00879   pred[s]=NO_PARENT;
00880   while(1){
00881     //izbirane na j ot T, za kojto d[j] e minimalno
00882     unsigned j=NO_PARENT;
00883     unsigned di= NO_PARENT;
00884     for(i=0; i<MAXNUM; i++){
00885       if(T[i]&&d[i]<di){
00886         di=d[i];
00887         j=i;
00888       }
00889     }
00890     //ako d[i]=maksimalnata stojnost za vsi4ki vyzli: izhod
00891     if(j==NO_PARENT)
00892       break;
00893     //izklu4vame j ot T
00894     T[j]=0;
00895     /*za vsqko i ot T izpylnqvame D[i]=min(d[i], d[j]+metricata na rebroto mejdu j i i)*/
00896     listi neighb_j(0, ',');
00897     listi metrics_edgesj(0, ',');
00898     transaction_mode_commands_find::getNeighborNodes(j, neighb_j, metrics_edgesj, nodtwin1, edgtwin1, path_edges);
00899     for(i=0; i<neighb_j.getnum(); i++){
00900       char *strindi=neighb_j.getith(i);
00901       char *metrindi=metrics_edgesj.getith(i);
00902       if(strindi&&metrindi){
00903         int ii=strtoint(strindi);
00904         if(T[ii]){
00905           if(d[ii]>d[j]+strtoint(metrindi)){
00906             d[ii]=d[j]+strtoint(metrindi);
00907             pred[ii]=j;
00908             
00909           }
00910         
00911         }
00912         delete strindi;
00913         delete metrindi;
00914       }
00915       
00916       
00917     }
00918     
00919     
00920   }
00921   
00922   
00923   
00924 }
00925 void transaction_mode_commands_find::getNeighborNodes(int node_id, listi& result, listi& metrics_edges, tr_twin_ht& nodtwin1, tr_twin_ht& edgtwin1, string& path_edges_1)
00926 {
00927   char *nodeidstr=inttostr(node_id);
00928   if(nodeidstr){
00929     int stacki=0;
00930     char *oedges_str=nodtwin1.FindRecord("id", nodeidstr, "oedges");
00931     if(oedges_str){
00932       listi oedges(oedges_str, ',');
00933       int i, ni=oedges.getnum();
00934       for(i=0; i<ni; i++){
00935         char *data_edges=edgtwin1.FindRecord("id", oedges.getith(i), "data");
00936         if(data_edges){
00937           XMLNode x1, x2;
00938           x1=XMLNode::parseString(data_edges);
00939           x2=x1.getChildNodeByPath(path_edges_1.c_str(), 0, '.');
00940           char *ithedgeid=oedges.getith(i);
00941           char *metric_ith_edge=x2.getText();
00942           if(ithedgeid&&metric_ith_edge){
00943             int j=0;
00944             char *onodesliststr=edgtwin1.FindRecord("id", ithedgeid, "onodes");
00945             if(onodesliststr){
00946               listi onodeslist(onodesliststr, ',');
00947               int nj=onodeslist.getnum();
00948               for(j=0; j<nj; j++){
00949                 metrics_edges.addelement(metric_ith_edge);
00950                 
00951                 result.addelement(onodeslist.getith(i));
00952                 
00953               }
00954               
00955               delete onodesliststr;
00956             }
00957             
00958             
00959             delete ithedgeid;
00960             delete metric_ith_edge;
00961           }
00962           
00963           delete data_edges; 
00964         }
00965         
00966       }
00967       
00968       delete oedges_str;
00969     }
00970     
00971     delete nodeidstr;
00972   }
00973 }
00974 void transaction_mode_commands_find::dijkstraMax(int s, char* T, unsigned int* d, int* pred, string& path_edges, tr_twin_ht& nodtwin1, tr_twin_ht& edgtwin1)
00975 {
00976   int i;
00977   //inizializacii
00978   for(i=0; i<MAXNUM; i++){
00979     T[i]=1;
00980     pred[i]=0;
00981     d[i]=0;
00982   }
00983   T[s]=0;
00984   listi neighb_s(0, ',');
00985   listi metrics_edges(0, ',');
00986   transaction_mode_commands_find::getNeighborNodes(s, neighb_s, metrics_edges, nodtwin1, edgtwin1, path_edges);
00987   int len_neighb_s=neighb_s.getnum();
00988   //inizializirane na d i pred
00989   for(i=0; i<len_neighb_s; i++){
00990     char *str1=neighb_s.getith(i);
00991     char *str2=metrics_edges.getith(i);
00992     if(str1&&str2){
00993       d[strtoint(str1)]=strtoint(str2);
00994       pred[strtoint(str1)]=s;
00995       delete str1; 
00996       delete str2;
00997     }
00998     
00999   }
01000   pred[s]=NO_PARENT;
01001   while(1){
01002     //izbirane na j ot T, za kojto d[j] e maximalno
01003     unsigned j=0;
01004     unsigned di= 0;
01005     for(i=0; i<MAXNUM; i++){
01006       if(T[i]&&d[i]>di){
01007         di=d[i];
01008         j=i;
01009       }
01010     }
01011     //ako d[i]=minimalnata stojnost za vsi4ki vyzli: izhod
01012     if(j==0)
01013       break;
01014     //izklu4vame j ot T
01015     T[j]=0;
01016     /*za vsqko i ot T izpylnqvame D[i]=min(d[i], d[j]+metricata na rebroto mejdu j i i)*/
01017     listi neighb_j(0, ',');
01018     listi metrics_edgesj(0, ',');
01019     transaction_mode_commands_find::getNeighborNodes(j, neighb_j, metrics_edgesj, nodtwin1, edgtwin1, path_edges);
01020     for(i=0; i<neighb_j.getnum(); i++){
01021       char *strindi=neighb_j.getith(i);
01022       char *metrindi=metrics_edgesj.getith(i);
01023       if(strindi&&metrindi){
01024         int ii=strtoint(strindi);
01025         if(T[ii]){
01026           if(d[ii]<d[j]+strtoint(metrindi)){
01027             d[ii]=d[j]+strtoint(metrindi);
01028             pred[ii]=j;
01029             
01030           }
01031         
01032         }
01033         delete strindi;
01034         delete metrindi;
01035       }
01036       
01037       
01038     }
01039     
01040     
01041   }
01042   
01043   
01044   
01045 }
01046 
 All Classes Files Functions Variables Typedefs Enumerations Enumerator Defines