GDBMS 1.0
|
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