Main Page | Class Hierarchy | Alphabetical List | Class List | File List | Class Members

msd_metadata.cc

00001 //-----------------------------------------------------
00002 // msd_metadata.cc
00003 // 
00004 // Project: PDBe API Framework 
00005 // Module: Implementation of META DATA Layer Classes
00006 // 
00007 // Data Layer
00008 // Last updated: 25 February 2004 10:17
00009 // (C) Siamak Sobhany
00010 //------------------------------------------------------
00011 #ifndef __MSD_METADATA_H__
00012 #include "msd_metadata.h"
00013 #endif
00014 
00015 struct TableArray datawarehouse={                                          
00016        {{"ALT",                              0, "WHOUSE1", "Something"},
00017             {"ASSEMBLY",                         1, "WHOUSE1", "Something"},      
00018         {"ASSEMBLY_MODEL",                   2, "WHOUSE1", "Something"},     
00019         {"ATOM",                             3, "WHOUSE1", "Something"}, 
00020         {"ATOM_DATA",                        4, "WHOUSE1", "Something"},  
00021         {"AUTHOR",                           5, "WHOUSE1", "Something"}, 
00022                 {"BULGE",                            6, "WHOUSE1", "Something"},
00023                 {"CHAIN",                            7, "WHOUSE1", "Something"},
00024                 {"CHEM_ATOM",                        8, "WHOUSE1", "Something"},                                                   
00025                 {"CHEM_COMP",                        9, "WHOUSE1", "Something"},                                   
00026                 {"COMP_OCCURENCES",                 10, "WHOUSE1", "Something"},
00027                 {"EC_MAPPING",                      11, "WHOUSE1", "Something"},
00028                 {"ENTRY",                           12, "WHOUSE1", "Something"},
00029                 {"ETAXI",                           13, "WHOUSE1", "Something"},
00030                 {"ETAXI_SYNONYMS",                  14, "WHOUSE1", "Something"},
00031                 {"GO_INT_MAPPING",                  15, "WHOUSE1", "Something"},
00032                 {"HAIRPIN",                         16, "WHOUSE1", "Something"},
00033                 {"HELIX",                           17, "WHOUSE1", "Something"},
00034                 {"HELIX_HELIX",                     18, "WHOUSE1", "Something"},
00035                 {"KEYWORD",                         19, "WHOUSE1", "Something"},
00036                 {"MATRIX",                          20, "WHOUSE1", "Something"},
00037                 {"MODEL",                           21, "WHOUSE1", "Something"},
00038                 {"MOLECULE",                        22, "WHOUSE1", "Something"},
00039                 {"MOLECULE_SOURCE",                 23, "WHOUSE1", "Something"},
00040                 {"MOTIF",                           24, "WHOUSE1", "Something"},
00041                 {"NCBI",                            25, "WHOUSE1", "Something"},
00042                 {"NCBI_SYNONYMS",                   26, "WHOUSE1", "Something"},
00043                 {"PFAM_INTERPRO_MAPPING",           27, "WHOUSE1", "Something"},
00044                 {"PLAN_TABLE",                      28, "WHOUSE1", "Something"},
00045                 {"PUBMEDLIST",                      29, "WHOUSE1", "Something"},
00046                 {"PUBMEDSEARCH",                    30, "WHOUSE1", "Something"},
00047                 {"RESIDUE",                         31, "WHOUSE1", "Something"},
00048                 {"RESIDUE_DATA",                    32, "WHOUSE1", "Something"},
00049                 {"SCOP_MAPPING",                    33, "WHOUSE1", "Something"},
00050                 {"SHEET",                           34, "WHOUSE1", "Something"},
00051                 {"SHEET_HBOND",                     35, "WHOUSE1", "Something"},
00052                 {"SHEET_ORDER",                     36, "WHOUSE1", "Something"},
00053                 {"STRAND",                          37, "WHOUSE1", "Something"},                                 
00054                 {"SWISS_PROT_MAPPING",              38, "WHOUSE1", "Something"},
00055                 {"TURN",                            39, "WHOUSE1", "Something"},
00056                 {"XRAY_DATA",                       40, "WHOUSE1", "Something"},
00057                 {"XRAY_REFINEMENT",                 41, "WHOUSE1", "Something"}}, 42};             
00058 
00059 
00060 
00061 
00062 
00063 
00064 
00065 
00066 
00067 
00068 
00069 
00070 
00071 void get_info(char* schema,struct TableArray * p2ta, char* liststr) 
00072 {  char tmp[5];
00073    strcpy(tmp, "', '");
00074    sprintf(liststr,"('%s.%s", schema ,p2ta->ptr[0].name);
00075    for (int i = 1; i < p2ta->size; i++) {
00076     sprintf(liststr, "%s%s%s.%s",liststr,tmp,schema,p2ta->ptr[i].name); 
00077    }
00078    sprintf(liststr, "%s')",liststr);
00079 } 
00080 
00081 
00082 
00083 int WriteTableAttributes(char* schema, char* connstr, char* fname){
00084  char stm[256];
00085  char type[16];
00086  char tname[32];
00087  char sname[32];
00088  char size[5];
00089  char comment_header[2048];
00090  char const_deconst[64];
00091  if (fileexists(fname))
00092  {cout << "A file with name: " << fname  << " already exists." << endl;
00093   exit(1); 
00094  }
00095  FILE * pfile;
00096  pfile = fopen (fname,"at");
00097    if (pfile==NULL)
00098    {
00099     cout << "error: could not open " << fname  << endl;
00100     exit(1); 
00101    }
00102 sprintf(comment_header,
00103 "/*-------------------------------------------------\n"
00104 " * dbstruct.h                                      \n"
00105 " *                                                 \n"
00106 " * Project: DATA Structures for PDBe API Framework  \n"
00107 " *                                                 \n"
00108 " * This file has been generated automatcally by    \n"
00109 " * WriteTableAttributes method of API Generator in \n"
00110 " * Meta Data layer.                                \n"
00111 " *                                                 \n"
00112 " * Data Layer                                      \n"
00113 " * Date created: %s"
00114 " * (C) Siamak Sobhany                              \n"
00115 " *-------------------------------------------------*/\n\n"
00116 "#ifndef __DBSTRUCT_H__\n"
00117 "#define __DBSTRUCT_H__\n\n"
00118 "#ifndef __MSD_DEFS_H__\n"
00119 "#include \"msd_defs.h\"\n"
00120 "#endif\n\n", getDateTime()); 
00121  
00122  
00123  fputs (comment_header,pfile);  
00124 
00125  msdbConnect db;
00126  msdbConnect::msdbInit(); // initialize OCI environment
00127  try{
00128   db.rlogon(connstr); // connect to Oracle
00129   msdbStream im (1, "select m.entity_string, m.table_name from WHOUSE1.mtd_entity m, SYS.all_tables s "
00130   "where m.table_name = s.table_name and s.owner = 'WHOUSE1' ", db);
00131   while (!im.eof()){
00132    im >> sname >> tname;
00133    sprintf(stm,"select * from %s.%s where rownum < 1",schema,tname);
00134    msdbStream i(1, stm, db); 
00135    otl_column_desc* desc;
00136    int desc_len;
00137    desc=i.describe_select(desc_len);
00138    lcase(tname);
00139    sprintf(stm, "struct msds_%s {\n", tname);
00140    fputs (stm,pfile);
00142         //output<< setw(16);
00144    for(int n=0;n<desc_len;++n){
00145     switch (desc[n].dbtype){                                                                   
00146          case 1 : {sprintf(type, "char");} break;                              
00147          case 2 : {if (desc[n].scale == 129) 
00148                         sprintf(type, "float");
00149                     else if (desc[n].scale==0)
00150                              {if ((desc[n].prec<=10 && desc[n].prec !=0) || has_integer_name(desc[n].name) == 1)
00151                                          sprintf(type, "int");
00152                                       else
00153                                          sprintf(type, "float");}
00154                                                   else
00155                                              sprintf(type, "int"); } break;     // sprintf(type, "long int");                  
00156          case 3 : {sprintf(type, "float");} break;                                 
00157          case 4 : {sprintf(type, "int");} break;                                   
00158          case 5 : {sprintf(type, "unsigned int");} break;                                
00159          case 6 : {sprintf(type, "short");} break;                           
00160          case 7 : {sprintf(type, "long");} break;
00161          case 12 : {sprintf(type, "msdbDate");} break; // 93 in Oracle 9i
00162          case 96 : {sprintf(type, "char");} break;
00163          case 112 : {sprintf(type, "otl_long_string");} break;
00164          default: {sprintf(type, "unknown");}                  
00165     } // switch case
00167         //output<<setfill ('x')<<setw(12)<<type;
00169         sprintf(stm,"   %s",type);
00170         fputs(stm,pfile);
00171         
00172         for (int i=0;i<strlen(desc[n].name);i++){
00173       desc[n].name[i]=tolower(desc[n].name[i]);
00174     }
00175     if (desc[n].dbtype==1 || desc[n].dbtype==96){
00176      sprintf(size,"[%d]", desc[n].dbsize);
00177          sprintf(desc[n].name, strcat(desc[n].name,size));}
00178         
00180         
00181         sprintf(stm,"   %s;\n",desc[n].name);
00182         fputs(stm,pfile);
00183         
00184 
00185   
00186   } // for loop
00187    fputs("};\n",pfile);
00188  
00189  } // End of for loop
00190    
00191     fputs("#endif\n\n",pfile);
00192     fclose (pfile);
00193  }
00194  catch(msdbException& p){ // intercept OTL exceptions
00195   cerr<<p.msg<<endl; // print out error message
00196   cerr<<p.stm_text<<endl; // print out SQL that caused the error
00197   cerr<<p.var_info<<endl; // print out the variable that caused the error
00198  }
00199  db.logoff(); // disconnect from Oracle
00200  return (0);
00201 }
00203 
00204 int MSDMakeSetGetAPIFunctions(const char* AttName, const char* TypeName, char* strResult) {       
00205  int len, index=0;
00206  char strTemp[3072];
00207  sprintf(strTemp, "void Set_%s (%s value) {\n"
00208                     " %s = value;\n};\n"
00209                                         "%s Get_%s () const {return %s;};\n"
00210                  , AttName, TypeName, AttName,TypeName, AttName, AttName);
00211   sprintf(strTemp,"%s void SetSt_%s (msdbStream& s) {\n"  //Set by Stream
00212                   " s  >> %s;};\n "
00213                                   "void GetSt_%s (msdbStream& s) {\n"
00214                                   " s << %s;};\n",strTemp, AttName, AttName,AttName,AttName);
00215   len = strlen(strTemp);
00216          for(int i = 0; i < len; i++)
00217          {
00218                 strResult[index] = strTemp[i];
00219                 index++;
00220          }
00221          strResult[index] = '\0';
00222    return 0;                                           
00223 }
00225 
00226 
00227 int MSDAPIGenerator(char* schema, char* connstr, char* fname){
00228  char stm[3072];
00229  char instruct[3072];
00230  char selstm[3072];
00231  char type[16];
00232  char coltype[16];
00233  char tname[32];
00234  char colname[32];
00235  char sname[32];
00236  char size[5];
00237  int buf = 50;
00238  char const_deconst[64];
00239  FILE * pfile;
00240  pfile = fopen (fname,"at");
00241    if (pfile==NULL)
00242    {
00243     cout << "error: could not open " << fname  << endl;
00244     exit(1); 
00245    }
00246  msdbConnect db;
00247  msdbConnect::msdbInit(); // initialize OCI environment
00248  try{
00249   db.rlogon(connstr); // connect to Oracle
00250   msdbStream im (1, "select m.entity_string, m.table_name from WHOUSE1.mtd_entity m, SYS.all_tables s "
00251   "where m.table_name = s.table_name and s.owner = 'WHOUSE1' ", db);
00252   while (!im.eof()){
00253    im >> sname >> tname;
00254    sprintf(stm,"select * from %s.%s where rownum < 1 ",schema,tname);
00255    msdbStream i(1, stm, db); 
00256    otl_column_desc* desc;
00257    int desc_len;
00258    desc=i.describe_select(desc_len);
00259   for(int n=0;n<desc_len;++n){
00260   sprintf(selstm, "const char* selstm = \"select * from %s where %s = :colvar < %s >", tname, coltype );
00261   sprintf(instruct, "try {\n msddbStream imsd ( %d, selstm, db);\n ", buf);
00262   fputs (stm,pfile);
00263         for (int i=0;i<strlen(desc[n].name);i++){
00264       desc[n].name[i]=tolower(desc[n].name[i]);
00265     }
00266     sprintf(stm,"   %s;\n",desc[n].name);
00267         fputs(stm,pfile);
00268         sprintf(stm,"select c.column_name from all_constraints p, all_cons_columns c "
00269          " where p.constraint_name = c.constraint_name and p.owner = c.owner and p.table_name = c.table_name "
00270          " and p.table_name = '%s' and p.owner = '%s' "
00271          " and p.constraint_type = 'P' ", tname, schema);
00272   } // end for
00273   } //end while loop
00274    fputs("};\n",pfile);
00275  
00276  
00277     fclose (pfile);
00278  } //try
00279  catch(msdbException& p){ // intercept OTL exceptions
00280   cerr<<p.msg<<endl; // print out error message
00281   cerr<<p.stm_text<<endl; // print out SQL that caused the error
00282   cerr<<p.var_info<<endl; // print out the variable that caused the error
00283  }
00284  db.logoff(); // disconnect from Oracle
00285  return (0);
00286 }
00288 
00290 int SoapDataGenerator(char* schema, char* connstr, char* fname){
00291  char stm[256];
00292  char type[16];
00293  char tname[32];
00294  char sname[32];
00295  char size[5];
00296  char comment_header[2048];
00297  char const_deconst[64];
00298  if (fileexists(fname))
00299  {cout << "A file with name: " << fname  << " already exists." << endl;
00300   exit(1); 
00301  }
00302  FILE * pfile;
00303  pfile = fopen (fname,"at");
00304    if (pfile==NULL)
00305    {
00306     cout << "error: could not open " << fname  << endl;
00307     exit(1); 
00308    }
00309 sprintf(comment_header,
00310 "/*-------------------------------------------------\n"
00311 " * dbsoap.h                                      \n"
00312 " *                                                 \n"
00313 " * Project: DATA Structures for PDBe API Framework  \n"
00314 " *                                                 \n"
00315 " * This file has been generated automatcally by    \n"
00316 " * SoapDataGenerator method of API Generator in    \n"
00317 " * Meta Data layer.                                \n"
00318 " *                                                 \n"
00319 " * SOAP User Layer                                 \n"
00320 " * Date created: %s"
00321 " * (C) Siamak Sobhany                              \n"
00322 " *-------------------------------------------------*/\n\n"
00323 "#ifndef __DBSOAP_H__\n"
00324 "#define __DBSOAP_H__\n\n", getDateTime()); 
00325  
00326  fputs (comment_header,pfile);  
00327 
00328   
00329    
00330 
00331  msdbConnect db;
00332  msdbConnect::msdbInit(); // initialize OCI environment
00333  try{
00334   db.rlogon(connstr); // connect to Oracle
00335   msdbStream im (1, "select m.entity_string, m.table_name from WHOUSE1.mtd_entity m, SYS.all_tables s "
00336   "where m.table_name = s.table_name and s.owner = 'WHOUSE1' ", db);
00337   while (!im.eof()){
00338    im >> sname >> tname;
00339    sprintf(stm,"select * from %s.%s where rownum < 1 ",schema,tname);
00340    msdbStream i(1, stm, db); 
00341    otl_column_desc* desc;
00342    int desc_len;
00343    desc=i.describe_select(desc_len);
00344    sprintf(stm, "class ns__C%s {\n  public : \n", sname);
00345    fputs (stm,pfile);
00347         //output<< setw(16);
00349    for(int n=0;n<desc_len;++n){
00350     switch (desc[n].dbtype){                                                                   
00351          case 1 : {sprintf(type, "xsd__string");} break;                               
00352          case 2 : {if (desc[n].scale == 129) 
00353                         sprintf(type, "xsd__float");
00354                     else if (desc[n].scale==0)
00355                              {if ((desc[n].prec<=10 && desc[n].prec !=0) || has_integer_name(desc[n].name) == 1)
00356                                          sprintf(type, "xsd__int");
00357                                       else
00358                                          sprintf(type, "xsd__float");}
00359                                                   else
00360                                              sprintf(type, "xsd__int"); } break;        // sprintf(type, "long int");                  
00361          case 3 : {sprintf(type, "xsd__float");} break;                            
00362          case 4 : {sprintf(type, "xsd__int");} break;                              
00363          case 5 : {sprintf(type, "xsd__unsignedInt");} break;                            
00364          case 6 : {sprintf(type, "xsd__short");} break;                      
00365          case 7 : {sprintf(type, "xsd__long");} break;
00366          case 12 : {sprintf(type, "xsd__date");} break; // 93 in Oracle 9i
00367          case 96 : {sprintf(type, "xsd__string");} break;
00368          case 112 : {sprintf(type, "xsd__base64Binary");} break;
00369          default: {sprintf(type, "unknown");}                  
00370     } // switch case
00371   
00372         sprintf(stm,"   %s",type);
00373         fputs(stm,pfile);
00374         
00375         for (int i=0;i<strlen(desc[n].name);i++){
00376       desc[n].name[i]=tolower(desc[n].name[i]);
00377     }
00378     
00379         
00380          if (strcmp(desc[n].name,"primaryacc#")==0 )
00381          {desc[n].name[10]= '_';
00382                  sprintf(stm,"   %s;\n",desc[n].name);
00383          }else{
00384                 if (strcmp(desc[n].name,"template")==0 || strcmp(desc[n].name,"const")==0 )
00385             {
00386                 sprintf(stm,"   %s_;\n",desc[n].name);
00387         }else{
00388                 sprintf(stm,"   %s;\n",desc[n].name);
00389             }
00390          } 
00391         
00392         fputs(stm,pfile);
00393         
00394 
00395   
00396   } // for loop
00397   sprintf(const_deconst, "   ns__C%s(){};\n", sname);
00398   fputs(const_deconst,pfile);
00399   sprintf(const_deconst, "   ~ns__C%s(){};\n", sname);
00400   fputs(const_deconst,pfile);
00401   fputs("};\n",pfile);
00402    
00403      
00404  
00405  
00406  
00407  } // End of while loop
00408  
00409     fputs("#endif\n\n",pfile);
00410         fclose (pfile);
00411  }
00412  catch(msdbException& p){ // intercept OTL exceptions
00413   cerr<<p.msg<<endl; // print out error message
00414   cerr<<p.stm_text<<endl; // print out SQL that caused the error
00415   cerr<<p.var_info<<endl; // print out the variable that caused the error
00416  }
00417  db.logoff(); // disconnect from Oracle
00418  return (0);
00419 }
00421 int MSDClassGenerator(char* schema, char* connstr, char* fname){
00422  char stm[256];
00423  char type[16];
00424  char tname[32];
00425  char sname[32];
00426  char size[5];
00427  char comment_header[2048];
00428  char const_deconst[64];
00429  if (fileexists(fname))
00430  {cout << "A file with name: " << fname  << " already exists." << endl;
00431   exit(1); 
00432  }
00433  FILE * pfile;
00434  pfile = fopen (fname,"at");
00435    if (pfile==NULL)
00436    {
00437     cout << "error: could not open " << fname  << endl;
00438     exit(1); 
00439    }
00440 sprintf(comment_header,
00441 "/*-------------------------------------------------\n"
00442 " * dbclass.h                                       \n"
00443 " *                                                 \n"
00444 " * Project: DATA Classes for PDBe API Framework     \n"
00445 " *                                                 \n"
00446 " * This file has been generated automatcally by    \n"
00447 " * MSDClassGenerator method of API Generator in    \n"
00448 " * Meta Data layer.                                \n"
00449 " *                                                 \n"
00450 " * Data Layer                                      \n"
00451 " * Date created: %s"
00452 " * (C) Siamak Sobhany                              \n"
00453 " *-------------------------------------------------*/\n\n"
00454 "#ifndef __DBCLASS_H__\n"
00455 "#define __DBCLASS_H__\n\n", getDateTime()); 
00456  
00457  fputs (comment_header,pfile);  
00458 
00459  msdbConnect db;
00460  msdbConnect::msdbInit(); // initialize OCI environment
00461  try{
00462   db.rlogon(connstr); // connect to Oracle
00463   msdbStream im (1, "select m.entity_string, m.table_name from WHOUSE1.mtd_entity m, SYS.all_tables s "
00464   "where m.table_name = s.table_name and s.owner = 'WHOUSE1' ", db);
00465   while (!im.eof()){
00466    im >> sname >> tname;
00467    sprintf(stm,"select * from %s.%s where rownum < 1 ",schema,tname);
00468    msdbStream i(1, stm, db); 
00469    otl_column_desc* desc;
00470    int desc_len;
00471    desc=i.describe_select(desc_len);
00472    lcase(tname);
00473    sprintf(stm, "class %s {\n  public : \n", tname);
00474    fputs (stm,pfile);
00475   
00476     for(int n=0;n<desc_len;++n){
00477     switch (desc[n].dbtype){                                                                   
00478          case 1 : {sprintf(type, "char");} break;                              
00479          case 2 : {if (desc[n].scale == 129) 
00480                         sprintf(type, "float");
00481                     else if (desc[n].scale==0)
00482                              {if ((desc[n].prec<=10 && desc[n].prec !=0) || has_integer_name(desc[n].name) == 1)
00483                                          sprintf(type, "int");
00484                                       else
00485                                          sprintf(type, "float");}
00486                                                   else
00487                                              sprintf(type, "int"); } break;     // sprintf(type, "long int");                  
00488          case 3 : {sprintf(type, "float");} break;                                 
00489          case 4 : {sprintf(type, "int");} break;                                   
00490          case 5 : {sprintf(type, "unsigned int");} break;                                
00491          case 6 : {sprintf(type, "short");} break;                           
00492          case 7 : {sprintf(type, "long");} break;
00493          case 12 : {sprintf(type, "msdbDate");} break; // 93 in Oracle 9i
00494          case 96 : {sprintf(type, "char");} break;
00495          case 112 : {sprintf(type, "otl_long_string");} break;
00496          default: {sprintf(type, "unknown");}                  
00497     } // switch case
00498    
00499         sprintf(stm,"   %s",type);
00500         fputs(stm,pfile);
00501         
00502         for (int i=0;i<strlen(desc[n].name);i++){
00503       desc[n].name[i]=tolower(desc[n].name[i]);
00504     }
00505     if (desc[n].dbtype==1 || desc[n].dbtype==96){
00506      sprintf(size,"[%d]", desc[n].dbsize);}else{
00507          sprintf(size,"%s","\0" );}
00508 
00509          if (strcmp(desc[n].name,"primaryacc#")==0 )
00510          {desc[n].name[10]= '_';
00511                  sprintf(stm,"   %s%s;\n",desc[n].name, size);
00512          }else{
00513                 if (strcmp(desc[n].name,"template")==0 || strcmp(desc[n].name,"const")==0 )
00514             {
00515                 sprintf(stm,"   %s_%s;\n",desc[n].name, size);
00516         }else{
00517                 sprintf(stm,"   %s%s;\n",desc[n].name, size);
00518             }
00519          } 
00520         
00521         fputs(stm,pfile);
00522   
00523   } // for loop
00524   sprintf(const_deconst, "   %s(){};\n", sname);
00525   fputs(const_deconst,pfile);
00526   sprintf(const_deconst, "   ~%s(){};\n", sname);
00527   fputs(const_deconst,pfile);
00528   fputs("};\n",pfile);
00529  
00530  
00531  } // End of while loop
00532    // close the output file
00533     fputs("#endif\n\n",pfile);
00534         fclose (pfile);
00535  }
00536  catch(msdbException& p){ // intercept OTL exceptions
00537   cerr<<p.msg<<endl; // print out error message
00538   cerr<<p.stm_text<<endl; // print out SQL that caused the error
00539   cerr<<p.var_info<<endl; // print out the variable that caused the error
00540  }
00541  db.logoff(); // disconnect from Oracle
00542  return (0);
00543 }
00545 int GetTablesRelations(char* schema,struct TableArray * p2ta, char* connstr){
00546 
00547  char stm[4096];
00548  char lst[2048];
00549  int k,m;
00550  //StrArrayToListStr(tabnames, lst);
00551  get_info(schema, p2ta, lst);
00552  sprintf(stm, "select k.constraint_name, k.constraint_type, k.table_name, k.r_constraint_name, "
00553  "k.delete_rule, k.status, k.deferrable, k.deferred from sys.user_constraints k"
00554  " where table_name in %s and 2 <> 1*:f<int> and k.constraint_type like 'R'", lst);
00555  MSDDataSet result=MSDDataSet();
00556  msdbConnect db;
00557  try{
00558  msdbConnect::msdbInit(); // initialize OCI environment
00559  db.rlogon(connstr);
00560  
00561  
00562  new_exec_query(50, db, stm, result);
00563  }
00564  catch(msdbException& p){ // intercept OTL exceptions
00565   cerr<<p.msg<<endl; // print out error message
00566   cerr<<p.stm_text<<endl; // print out SQL that caused the error
00567   cerr<<p.var_info<<endl; // print out the variable that caused the error
00568  }
00569  dolist(eachrow, result.getValue( msdSymbol(rowset), msdSymbol(rows))) {
00570             cout << "Row No.: " << result.getValue(eachrow, msdSymbol(rowno)) <<endl ;
00571                 
00572             k=1;
00573             dolist(eachcol, result.getValue( msdSymbol(colset), msdSymbol(cols))){
00574                 cout << eachcol << ": " << result.getValue(eachrow, eachcol) << " ";
00575                         
00576               ++k;
00577             }
00578              cout << " End of row."   << endl;
00579          
00580             ++m;
00581           }
00582  db.logoff(); // disconnect from Oracle
00583  return (0);
00584 }
00586 int GetDataModel(char* schema,TableArray * p2ta,char* connstr){
00587  char stm[4096];
00588  char lst[2048];
00589  int k,m;
00590  MSDDataSet result=MSDDataSet();
00591 
00592  get_info(schema, p2ta, lst);
00593  
00594  
00595  sprintf(stm, "select p.table_name as pktable_name,f.owner as fktable_schem,f.table_name as fktable_name, " 
00596  "decode (f.delete_rule, 'CASCADE', 'INTEGRITY', 'CASCADE DELETE') "
00597  "as delete_rule,f.constraint_name as fk_name,p.constraint_name as pk_name from all_constraints p,all_constraints f "
00598  "where p.table_name in %s and f.owner = 'WHOUSE1' and 2 <> 1*:f<int> and p.owner = f.owner "
00599  "and (p.constraint_type = 'P' or   p.constraint_type = 'U') and f.constraint_type = 'R' "
00600  "and p.constraint_name = f.r_constraint_name order by fktable_schem, fktable_name" , lst);
00601 
00602 msdbConnect db;
00603  try{
00604  msdbConnect::msdbInit(); // initialize OCI environment
00605  db.rlogon(connstr);
00606  new_exec_query(50, db, stm, result);
00607 
00608  sprintf(stm, "select p.table_name as pktable_name,f.owner as fktable_schem,f.table_name as fktable_name, " 
00609  "decode (f.delete_rule, 'CASCADE', 'INTEGRITY', 'CASCADE DELETE') "
00610  "as delete_rule,f.constraint_name as fk_name,p.constraint_name as pk_name from all_constraints p,all_constraints f "
00611  "where p.table_name in %s and f.owner = 'whouse1' and p.owner = f.owner "
00612  "and (p.constraint_type = 'P' or   p.constraint_type = 'U') and f.constraint_type = 'R' "
00613  "and p.constraint_name = f.r_constraint_name order by fktable_schem, fktable_name" , lst);
00614  }
00615  catch(msdbException& p){ // intercept OTL exceptions
00616   cerr<<p.msg<<endl; // print out error message
00617   cerr<<p.stm_text<<endl; // print out SQL that caused the error
00618   cerr<<p.var_info<<endl; // print out the variable that caused the error
00619  }
00620  dolist(eachrow, result.getValue( msdSymbol(rowset), msdSymbol(rows))) {
00621             cout << "Row No.: " << result.getValue(eachrow, msdSymbol(rowno)) <<endl ;
00622                 
00623             k=1;
00624             dolist(eachcol, result.getValue( msdSymbol(colset), msdSymbol(cols))){
00625                 cout << eachcol << ": " << result.getValue(eachrow, eachcol) << " ";
00626                 
00627               ++k;
00628             }
00629              cout << " End of row."   << endl;
00630          //printf("\nEnd of row.");
00631             ++m;
00632           }
00633  db.logoff(); // disconnect from Oracle
00634  return (0);
00635 }
00636 
00637 
00638 
00639 int LoadMetaData(char* schema,char* connstr){
00640  char stm[4096];
00641  char lst[2048];
00642  char tname[64];
00643  char tstr[64];
00644  char mname[64];
00645  
00646  //char martname[64];
00647  char tblitem[64];
00648  //char tblname[64];
00649  char tmp[5];
00650  char liststr[2048];
00651  char martitem[32];
00652  int k,m;
00653  stringstream martliststr;
00654  
00655  let martlist = listEM( msdEnd);
00656  
00657  
00658  let tbllist = listEM( msdEnd);
00659  let martname;
00660  let tblname;
00661  sprintf(stm, "select metadata_string from %s.mtd_metadata", schema );
00662  strcpy(tmp, "', '");
00663  MSDDataSet mtd = MSDDataSet();
00664  sprintf(mtd.name,"%s","metadata");
00665  msdbConnect db;
00666  msdbConnect::msdbInit(); 
00667  try{
00668   db.rlogon(connstr); 
00669   msdbStream im (1, stm, db);
00670   //string s = "( ";
00671   martliststr << "(";
00672   while (!im.eof()){
00673    im >> mname;
00674    sprintf(martitem,"%s", mname);
00675    martname = intern( msdConst(martitem));                             
00676    martliststr << " ";                                            
00677    martliststr << martitem; 
00678    
00679    mtd.addEntity(martname);
00680    mtd.setValue(martname, msdSymbol(name), msdConst(martitem));
00681   
00682    sprintf(stm, "select entity_string, table_name from %s.mtd_entity where metadata_string = '%s'", schema, mname);
00683    msdbStream it (1,stm, db);
00684    it >> tstr >> tname;
00685    sprintf(tblitem,"%s", tname);
00686    tblname = intern( msdConst(tblitem));                             
00687    stringstream tblliststr;
00688    tblliststr << "(";
00689    tblliststr << " ";                                            
00690    tblliststr << tblitem;                                        
00691    mtd.addEntity(tblname);
00692    sprintf(liststr,"('%s", tname);
00693  
00694    sprintf(stm, "select r.entity_string as entity, r.relation_name as relation, r.cardinality, r.relation_attributes as attribute , "
00695    "r.reverse_metadata_string as rmetadata, r.reverse_entity_string as rentity, e.containment_relation as containment from mtd_relation r, mtd_entity e where "
00696    "r.metadata_string = '%s' and r.entity_string = '%s' and r.metadata_string = e.metadata_string and "
00697    "r.entity_string = e.entity_string and :f<int> = 1*:f", martitem, tstr);
00698     msd_exec_query(50, db, stm, mtd, tblitem, "i", 1);
00699    
00700    while (!it.eof()){ 
00701         it >> tstr >> tname;
00702    sprintf(tblitem,"%s", tname);
00703    tblname = intern( msdConst(tblitem));                             
00704    tblliststr << " ";                                            
00705    tblliststr << tblitem;
00706    sprintf(liststr, "%s%s%s",liststr,tmp,tname); 
00707    
00708    sprintf(stm, "select r.entity_string as entity, r.relation_name as relation, r.cardinality, r.relation_attributes as attribute , "
00709    "r.reverse_metadata_string as rmetadata, r.reverse_entity_string as rentity, e.containment_relation as containment from mtd_relation r, mtd_entity e where "
00710    "r.metadata_string = '%s' and r.entity_string = '%s' and r.metadata_string = e.metadata_string and "
00711    "r.entity_string = e.entity_string and :f<int> = 1*:f", martitem, tstr);
00712     msd_exec_query(50, db, stm, mtd, tblitem, "i", 1);
00713    }
00714    tblliststr << ")";
00715    tbllist = read(tblliststr);
00716   
00717    mtd.setValue(martname, msdSymbol(tables), tbllist);
00718    
00719    sprintf(liststr, "%s')",liststr);
00720    sprintf(stm, "select p.table_name as pktable_name,f.owner as fktable_schem,f.table_name as fktable_name, " 
00721    "decode (f.delete_rule, 'CASCADE', 'INTEGRITY', 'CASCADE DELETE') "
00722    "as delete_rule,f.constraint_name as fk_name,p.constraint_name as pk_name from all_constraints p,all_constraints f "
00723    "where p.table_name in %s and f.owner = '%s' and :f<int> = 1*:f and p.owner = f.owner "
00724    "and (p.constraint_type = 'P' or   p.constraint_type = 'U') and f.constraint_type = 'R' "
00725    "and p.constraint_name = f.r_constraint_name order by fktable_schem, fktable_name" , liststr, schema);
00726    
00727   } //end while
00728    martliststr << ")";
00729    martlist = read(martliststr);
00730    mtd.addEntity( msdSymbol(warehouse));
00731    mtd.setValue( msdSymbol(warehouse), msdSymbol(marts), martlist);
00732    sprintf(stm, "select table_name  from mtd_entity where containment_relation is not null and :f<int> = 1*:f ");
00733    sprintf(tblitem, "%s", "contains");
00734    msd_exec_query(50, db, stm, mtd, tblitem, "i", 1);
00735  }
00736  catch(msdbException& p){ // intercept OTL exceptions
00737   cerr<<p.msg<<endl; // print out error message
00738   cerr<<p.stm_text<<endl; // print out SQL that caused the error
00739   cerr<<p.var_info<<endl; // print out the variable that caused the error
00740  }
00741   db.logoff();
00742  
00743  
00744  dolist(eachmart, mtd.getValue( msdSymbol(warehouse), msdSymbol(marts))) {
00745             cout << "Mart: " << mtd.getValue(eachmart, msdSymbol(name)) << endl ;
00746                 cout << "  Tables: " << endl << "         " <<mtd.getValue(eachmart, msdSymbol(tables)) << endl;
00747                 cout << "    Relations: " << endl;
00748         dolist(eachtable, mtd.getValue(eachmart, msdSymbol(tables))) {
00749                   dolist(eachrow, msd_make_rowlist(mtd.getValue(eachtable, msdSymbol(rows)))) {
00750             dolist(eachcol, mtd.getValue(eachtable, msdSymbol(cols))){
00751                  if (eachcol == msdSymbol(ENTITY) || eachcol == msdSymbol(RELATION) || eachcol == msdSymbol(RENTITY) || eachcol == msdSymbol(CONTAINMENT)) // (eachcol == mysym)
00752                   {
00753                                           cout << " " << mtd.getValue(eachrow, eachcol) << " ";
00754                   }
00755                 }
00756                         cout << endl;
00757           }
00758         }
00759  }
00760 
00761 
00762 cout << "\nContainment Relations: "  << endl;
00763        
00764                 dolist(eachrec, msd_make_rowlist(mtd.getValue( msdSymbol(contains), msdSymbol(rows)))) {
00765                         dolist (eachcolrec,mtd.getValue( msdSymbol(contains), msdSymbol(cols))){
00766                   let tbln = intern(mtd.getValue(eachrec, eachcolrec));
00767                           dolist(each_row, msd_make_rowlist(mtd.getValue(tbln, msdSymbol(rows)))) {
00768                  dolist(each_col, mtd.getValue(tbln, msdSymbol(cols))){
00769                   if (each_col == msdSymbol(ENTITY) || each_col == msdSymbol(RELATION) || each_col == msdSymbol(RENTITY) || each_col == msdSymbol(CONTAINMENT)) // (eachcol == mysym)
00770                   {
00771                                           cout << " " << mtd.getValue(each_row, each_col) << " ";
00772                   }
00773                  }
00774                              cout << endl;
00775               }
00776                           cout << endl;
00777                         }
00778                 }       
00779  
00780 
00781 
00782  gc(martname);
00783  gc(tblname);
00784  gc(martlist);
00785  gc(tbllist);
00786 
00787  return (0);
00788 }
00789 
00790 
00791 
00792 
00793 
00794 
00795 
00796 int MSDStructureModel(){
00797   MSDDataSet sm = MSDDataSet();
00798 
00799   sm.addEntity( msdSymbol(protein-family));
00800   sm.setValue( msdSymbol(protein-family), msdSymbol(member-proteins), listEM( msdSymbol(1ah7), msdSymbol(1ahe), msdSymbol(1ahf), msdSymbol(1ahg), msdSymbol(1ahx), msdSymbol(1ahy), msdEnd));
00801 
00802   sm.addEntity( msdSymbol(1ah7));
00803   sm.setValue( msdSymbol(1ah7), msdSymbol(name), msdConst("1ah7"));
00804   sm.setValue( msdSymbol(1ah7), msdSymbol(author), msdConst("henrick"));
00805   sm.setValue( msdSymbol(1ah7), msdSymbol(entry_id), msdConst(36926));
00806   sm.setValue( msdSymbol(1ah7), msdSymbol(group1), listEM( msdSymbol(1ahe), msdSymbol(1ahg), msdEnd));
00807 
00808   sm.addEntity( msdSymbol(1ahe));
00809   sm.setValue( msdSymbol(1ahe), msdSymbol(name), msdConst("1ahe"));
00810   sm.setValue( msdSymbol(1ahe), msdSymbol(author), msdConst("henrick"));
00811   sm.setValue( msdSymbol(1ahe), msdSymbol(entry_id), msdConst(26679));
00812   sm.setValue( msdSymbol(1ahe), msdSymbol(group1), listEM( msdSymbol(1ah7), msdSymbol(1ahg), msdEnd));
00813 
00814   sm.addEntity( msdSymbol(1ahf));
00815   sm.setValue( msdSymbol(1ahf), msdSymbol(name), msdConst("1ahf"));
00816   sm.setValue( msdSymbol(1ahf), msdSymbol(author), msdConst("henrick"));
00817   sm.setValue( msdSymbol(1ahf), msdSymbol(entry_id), msdConst(29738));
00818   sm.setValue( msdSymbol(1ahf), msdSymbol(group2), listEM( msdSymbol(1ahx), msdSymbol(1ahy), msdEnd));
00819   
00820   cout << "--- Report on Protein Family ---" << endl;
00821 
00822   dolist(protein, sm.getValue( msdSymbol(protein-family), msdSymbol(member-proteins))) {
00823     cout << "Protein: " << sm.getValue(protein, msdSymbol(name)) << endl
00824          << "Author: " << sm.getValue(protein, msdSymbol(author)) << endl;
00825     dolist(relation, listEM( msdSymbol(group1), msdSymbol(group2), msdSymbol(group3), msdEnd)) {
00826       let relatives = sm.getValue(protein, relation);
00827       if (relatives) {
00828         cout << "With " << relation << ": ";
00829         dolist(relative, relatives) cout << " " << relative;
00830         cout << endl;}}
00831     cout << endl;}
00832  return(0);
00833 }
00834 
00835 
00836 
00837 
00838 
00839 
00840 
00841 

Generated on Fri Apr 16 13:47:41 2004 for MSDAPI by doxygen 1.3.4-20031005