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_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 }