GDBMS 1.0
GDBMS_for_documentation/settings.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 
00016 using namespace std;
00017 bool settings::is_admin(int user_id)
00018 {
00019   bool rv=false;
00020   hash_table conn("users", "admin/users", 4, "id;name;pass;gr_id", "id;name;gr_id", "id");
00021   hash_table gr("usergroups", "admin/usergroups", 3, "id;name;admin", "id;name", "id");
00022   char *buf;
00023   if(!conn.FindRecord("id", inttostr(user_id), "gr_id")){
00024     //nyama takyv user
00025     return rv;
00026     
00027   }
00028   char *buf1=gr.FindRecord("id", buf, "admin");
00029   if(!strstr(buf1, "true")){
00030     rv=true;
00031   }else{
00032     rv=false;
00033   }
00034   return rv;
00035   
00036 }
00037 
00038 bool settings::logging_enabled(char* type_log)
00039 {
00040   char *buf33= new char[500];
00041   buf33[0]=0;
00042  FILE *fp=fopen(strcat(strcat(buf33, MAINFOLDER),"admin/settings/settings.xml"), "r");
00043   bool a=false;
00044   if(!fp)
00045     return false;
00046   XMLNode one=XMLNode::parseFile(buf33);
00047   XMLNode xNode=one.getChildNode("logging");
00048   XMLNode two;
00049   int num=xNode.nChildNode();
00050   int i;
00051   two=xNode.getChildNode(type_log);
00052   if(!strcmp(two.getText(), "ena"))
00053     a=true;
00054     
00055   delete buf33;
00056   fclose(fp);
00057   return a;
00058 }
00059 
00060 void settings::send_log(char* path_file, char* what_to_log)
00061 {
00062 FILE *fp;
00063 char *buf1=current_moment();
00064 char *buf33=new char[1000];
00065 buf33[0]=0;
00066 strcat(buf33, MAINFOLDER);
00067 strcat(buf33, path_file);
00068 
00069 fp=fopen(buf33, "w");
00070 if(!fp)
00071   return;
00072 
00073 fprintf(fp, "%s> \t%s\n", buf1, what_to_log);
00074 delete buf33;
00075 delete buf1;
00076 fclose(fp);
00077 }
00078 
00079 settings::settings()
00080 {
00081 
00082 }
00083 settings::~settings()
00084 {
00085 
00086 }
00087 
00088 void settings::determineTransactionActionPermittion(int& permitted, int transaction_USCOREid, int rw1, int rw2, int rw3)
00089 {
00090   hash_table trn("transactions", "admin/transactions", "id;user_id;graph_id;time_started", "id;user_id;graph_id", "id");
00091   hash_table grp("graphs", "admin/graphs", "id;name;description;creator_id;t_created", "id;name", "id");
00092   char *inputtrid=0;
00093   char *foundusid=0;
00094   
00095   inputtrid=inttostr(transaction_USCOREid);
00096   foundusid=trn.FindRecord("id", inputtrid, "user_id");
00097   if(!foundusid){
00098     //nqma takava transakciya
00099     //_param_14.retvalue=3;
00100     permitted=0;
00101     
00102     if(inputtrid)
00103       delete inputtrid;
00104     return;
00105     
00106    
00107   }
00108   char *grid=0;
00109   hash_table users("users", "admin/users", "id;name;pass;gr_id", "id;name;gr_id", "id");
00110   grid=users.FindRecord("id", foundusid, "gr_id");
00111   if(!grid){
00112    //tova ne trqbva da se slu4va 
00113     //_param_14.retvalue=3;
00114     permitted=0;
00115     return;
00116   }
00117   hash_table ugroups("usergroups", "admin/usergroups", "id;name;admin", "id;name", "id");
00118   char *adminvalue=0;
00119   adminvalue=ugroups.FindRecord("id", grid, "admin");
00120   if(!adminvalue){
00121    //tova ne trqbva da se slu4va
00122   // _param_14.retvalue=3;
00123    delete grid;
00124    permitted=0;
00125    return;
00126    
00127     
00128   }
00129   
00130   if(!strstr(adminvalue, "false")){
00131     //ne e administrator
00132     char *buf=0;
00133     buf=trn.FindRecord("id", inputtrid, "graph_id");
00134     if(!buf){
00135       //tova ne trqbva da se slu4va
00136      permitted=0;
00137      return;
00138      
00139     }
00140     char *buf1=0;
00141     buf1=grp.FindRecord("id", buf, "creator_id");
00142     if(!buf1){
00143      goto define_tp_free; 
00144     }
00145     string gr_dir;
00146     gr_dir+="admin";
00147     gr_dir+=buf;
00148     hash_table grm("gr_main", gr_dir.c_str(), "id;node_maxid;edge_maxid;rights_word", "id;node_maxid", "id");
00149     if(!strcmp(foundusid, buf1)){
00150       //tova e syzdatel na grafa
00151       
00152       char *buf3=grp.FindRecord("id", "1", "rights_word");
00153       int rw=strtoint(buf3);
00154       if(rw & rw1){
00155         //ima pravo
00156         permitted=1;
00157       }else{
00158         //nqma pravo
00159         permitted=0;
00160       }
00161     }else{
00162       //ne e syzdatel na grafa
00163       char *buf2=0;
00164       buf2=settings::getgroupid(foundusid);
00165       char *buf3=0;
00166       buf3=settings::getgroupofgraphcreator(buf);
00167       if(buf2&&buf3){
00168         int rw=0;
00169         rw=settings::getRightsWORD(buf);
00170         
00171         if(!strcmp(buf2, buf3)){
00172           //ako e ot grupata na usera
00173           if(rw & rw2){
00174             permitted=1;
00175           }else{
00176             permitted=0;
00177             
00178           }
00179         }else{
00180           //ako ne e ot grupata na usera
00181           int rw=0;
00182           rw=settings::getRightsWORD(buf);
00183           if(rw & rw3){
00184             permitted=1;
00185           }else{
00186             permitted=0;
00187           }
00188           
00189         }
00190         
00191         delete buf2;
00192         delete buf3;
00193       }
00194       
00195       
00196       
00197     }
00198     
00199     
00200     if(buf1)
00201       delete buf1;
00202     
00203     if(buf)
00204       delete buf;
00205     
00206   }else{
00207     //e administrator
00208     permitted=1;
00209   }
00210 }
00211 
00212 char* settings::getgroupid(char* userid)
00213 {
00214   hash_table us("users", "admin/users", "id;name;pass;gr_id", "id;name;gr_id", "id");
00215   char *rv=0;
00216   us.FindRecord("id", userid, "gr_id");
00217   
00218   return rv;
00219 }
00220 
00221 char* settings::getgroupofgraphcreator(char* graph_id)
00222 {
00223   char *rv=0;
00224   hash_table grp("graphs", "admin/graphs", "id;name;creator_id;t_created", "id;name", "id");
00225   char *crid=grp.FindRecord("id", graph_id, "creator_id");
00226   if(crid)
00227     rv=settings::getgroupid(crid);
00228   
00229   return rv;
00230 }
00231 int settings::getRightsWORD(char* graph_id)
00232 {
00233   int rv=0;
00234   string folname1;
00235   folname1+="/admin";
00236   folname1+=graph_id;
00237   hash_table gr_mainn("gr_main", folname1.c_str(), "id;node_maxid;edge_maxid;rights_word", "id;node_maxid", "id");
00238   char *rv_str=0;
00239   rv_str = gr_mainn.FindRecord("id", "1", "rights_word");
00240   
00241   if(rv_str){
00242     rv=strtoint(rv_str);
00243     delete rv_str;
00244     
00245   }
00246   
00247 }
00248 char* settings::getGraphfromTransaction(char* transaction_id)
00249 {
00250   char *rv=0;
00251   hash_table trn("transactions", "admin/transactions", "id;user_id;graph_id;time_started", "id;user_id;graph_id", "id");
00252   char *crid=trn.FindRecord("id", transaction_id, "graph_id");
00253   if(crid)
00254     rv=crid;
00255   
00256   return rv;
00257 }
00258 
00259 bool settings::is_int(char* value)
00260 {
00261   int rv=atoi(value);
00262   if(rv)
00263     return true;
00264   return false;
00265   
00266 }
00267 bool settings::is_numeric(char* value)
00268 {
00269   int rv=atof(value);
00270   if(rv)
00271     return true;
00272   return false;
00273 }
00274 bool settings::is_type_path_valid(char* path, char* graph_id)
00275 {
00276   string fpth;
00277   fpth+="admin/";
00278   fpth+=graph_id;
00279   fpth+="/gr_types";
00280   hash_table grt("gr_types", fpth.c_str(), "id;name;parsestr;composite;array;asize;aid;internal", "id;name", "id");
00281   int i=0, j;
00282   bool retvalue=false;
00283   int n=0;
00284   char **splitted;
00285   settings::split(path, &n, &splitted, '.');
00286   int previt=1;
00287   for(i=0; i<n; i++){
00288     if(!previt)
00289       break;
00290     previt=0;
00291     string buf;
00292     buf="@";
00293     buf+=splitted[i];
00294     int num;
00295     
00296     char *buf1=new char[1000];
00297     if(buf1){
00298       for(j=0; j<1000; j++)
00299         buf1[j]=0;
00300       if(i<n-1){
00301         if(sscanf(buf.c_str(), "@%s[%d]", buf1, &num)==2){
00302           //4len na masiv e
00303           char *composite=grt.FindRecord("name", buf1, "composite");
00304           if(composite){
00305             if(!strcmp(composite, "2")){
00306               char *array_size=grt.FindRecord("name", buf1, "asize");
00307               if(array_size){
00308                 if(num<strtoint(array_size)&&num>=0){
00309                   char *aid=grt.FindRecord("name", buf1, "aid");
00310                   
00311                   if(aid){
00312                    char *internal1=grt.FindRecord("id", aid, "internal");
00313                    
00314                    if(internal1){
00315                     char *nextmemberid=grt.FindRecord("name", splitted[i+1], "id");
00316                     if(nextmemberid){
00317                      XMLNode x1, x2;
00318                      x1=XMLNode::parseString(internal1);
00319                      int nchild=0;
00320                      nchild=x1.nChildNode("tpi");
00321                      bool foundnext=false;
00322                      for(j=0; j<nchild; j++){
00323                        x2=x1.getChildNode("tpi");
00324                        char *buf2=x2.getAttribute("id");
00325                        
00326                        if(buf2){
00327                          if(!strcmp(buf2, nextmemberid)){
00328                            
00329                            foundnext=true;
00330                            
00331                          }
00332                          
00333                          
00334                          
00335                          delete buf2;
00336                          
00337                        }
00338                        if(foundnext)
00339                          break;
00340                        
00341                      }
00342                      if(foundnext){
00343                        //dotuk dobre, prodylji natatyk
00344                        previt=1;
00345                        
00346                      }
00347                      delete nextmemberid; 
00348                     }
00349                     delete internal1; 
00350                    }
00351                    
00352                    
00353                    delete aid; 
00354                   }
00355                   
00356                 }
00357                 
00358                 delete array_size;
00359               }
00360             }
00361             delete composite;
00362           }
00363         }else{
00364           //ne e masiv
00365           //tryabva zadyljitelno da e struktura
00366           char *composit=grt.FindRecord("name", splitted[i], "composite");
00367           if(composit){
00368             if(!strcmp(composit, "1")){
00369               //struktura e
00370               //tryabva id na tipa na sledva6tiq da go ima v spisyka v internal
00371               char *internal=grt.FindRecord("name", splitted[i], "internal");
00372               
00373               if(internal){
00374                 char *idnext=grt.FindRecord("name", splitted[i+1], "id");
00375                 XMLNode x1, x2;
00376                 x1=XMLNode::parseString(internal);
00377                 int nc=x1.nChildNode();
00378                 int k;
00379                 for(k=0; k<nc; k++){
00380                   x2=x1.getChildNode("tpi");
00381                   if(!strcmp(x2.getAttribute("id"), idnext)){
00382                     previt=1;
00383                     break;
00384                   }
00385                   
00386                 }
00387                 
00388                 delete internal;
00389               }
00390               
00391             }
00392             
00393             
00394             delete composit;
00395           }
00396         }
00397       
00398       
00399       }else{
00400       //posledniya tip v tipoviya path
00401       
00402         if(sscanf(buf.c_str(), "@%s[%d]", buf1, &num)==2){
00403           //4len na masiv e
00404           char *array=grt.FindRecord("name", buf1, "array");
00405           if(array){
00406             if(!strcmp(array, "1")){
00407               char *asize=grt.FindRecord("name", buf1, "asize");
00408               if(asize){
00409                 if(strtoint(asize)>num){
00410                   char *aid=grt.FindRecord("name", buf1, "aid");
00411                   if(aid){
00412                     //tova e id na tipa na masiva i tryabva da se vidi, dali tozi tip vodi do stojnost
00413                     char *aid_parsestr=grt.FindRecord("id", aid, "parsestr");
00414                     
00415                     if(aid_parsestr){
00416                       if(!(strcmp(aid_parsestr, "%d")&&strcmp(aid_parsestr, "%f")&&strcmp(aid_parsestr, "%s"))){
00417                         previt=1;
00418                       }
00419                         
00420                       delete aid_parsestr;
00421                     }
00422                     delete aid;
00423                   }
00424                   
00425                 }
00426                 
00427                 delete asize;
00428               }
00429               
00430             }
00431             delete array;
00432           }
00433           
00434         }else{
00435           //ne e masiv
00436           char *parsestr=grt.FindRecord("name", splitted[i], "parsestr");
00437           if(parsestr){
00438             if(!(strcmp(parsestr, "%d")&&strcmp(parsestr, "%f")&&strcmp(parsestr, "%s"))){
00439               previt=1;
00440               
00441             }
00442             delete parsestr;
00443           }
00444         }
00445       
00446       }
00447     }
00448     
00449   }
00450   if(splitted){
00451     for(i=0; i<n; i++)
00452       if(splitted[i])
00453         delete splitted[i];
00454     delete splitted; 
00455   }
00456   return previt;
00457   
00458 }
00459 void settings::getparsestr(char* graph_id, char* path, string& return_parsestr)
00460 {
00461   string fpth;
00462   fpth+="admin/";
00463   fpth+=graph_id;
00464   fpth+="/gr_types";
00465   hash_table grt("gr_types", fpth.c_str(), "id;name;parsestr;composite;array;asize;aid;internal", "id;name", "id");
00466    
00467   int i=0;
00468   
00469   int n=0;
00470   char **splitted;
00471   settings::split(path, &n, &splitted, '.');
00472   string buf;
00473   buf+="@";
00474   buf+=splitted[n-1];
00475   char *buf1=new char[1000];
00476   for(i=0; i<1000; i++)
00477     buf1[i]=0;
00478   int numb;
00479   if(sscanf(buf.c_str(), "@%s[%d]", buf1, &numb)==2){
00480     //tipa e masiv
00481     char *aid=grt.FindRecord("name", buf1, "aid");
00482     
00483     if(aid){
00484       char *parsestr=grt.FindRecord("id", aid, "parsestr");
00485       if(parsestr){
00486         
00487         return_parsestr=parsestr;
00488         delete parsestr;
00489       }else{
00490         return_parsestr="";
00491       }
00492       
00493       delete aid;
00494       
00495     }else{
00496       return_parsestr="";
00497     }
00498   }else{
00499     //trqbva da e obiknoven tip
00500     char *parsestr=grt.FindRecord("name", splitted[n-1], "parsestr");
00501     if(parsestr){
00502       return_parsestr=parsestr;
00503       delete parsestr;
00504     }else{
00505      return_parsestr=""; 
00506     }
00507   }
00508   if(splitted){
00509     for(i=0; i<n; i++)
00510       if(splitted[i])
00511         delete splitted[i];
00512     delete splitted; 
00513   }
00514   
00515     
00516   delete buf1;
00517   
00518 }
00519 
00520 void settings::split(char* str, int* numbers_splitted, char*** splitted, char delimeter)
00521 {
00522   int i;
00523   int j=0;
00524   
00525   for(i=0; i<strlen(str); i++)
00526     if(str[i]==';')
00527       j++;
00528     
00529    j++;
00530   char **a=new char *[j];
00531   *numbers_splitted=j;
00532   *splitted=a;
00533   int iprev=0;
00534   int ispl=0;
00535  int N=strlen(str);
00536   
00537   for(i=0; i<N; i++){
00538       if(str[i]==delimeter){
00539         str[i]=0;
00540         a[ispl]=new char[strlen(str+iprev)+2];
00541         a[ispl][0]=0;
00542         strcpy(a[ispl], str+iprev);
00543         ispl++;
00544         iprev=i+1;
00545         
00546       }
00547     
00548   }
00549   str[i]=0;
00550   a[ispl]=new char[strlen(str+iprev)+2];
00551   a[ispl][0]=0;
00552   strcpy(a[ispl], str+iprev);
00553   ispl++;
00554   iprev=i+1;
00555   
00556 
00557 }
 All Classes Files Functions Variables Typedefs Enumerations Enumerator Defines