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

msd_data.cc

00001 //-----------------------------------------------------
00002 // msd_data.cc
00003 // 
00004 // Project: PDBe API Framework, EBI 
00005 // Module: DATA Layer Classes
00006 // To build:
00007 //    make -f msd_api_fw.mk buildc++ NAME=msd_data
00008 //
00009 // Last updated: 25 February 2004 10:17
00010 // (C) Siamak Sobhany
00011 //------------------------------------------------------
00012 
00013 #ifndef __MSD_DATA_H__
00014 #include "msd_data.h"
00015 #endif
00016 #include <cstdio>
00017 
00018 
00020 // MSDSelect class methods.
00022  
00023  
00024 void MSDSelect::SetCriteria(char* strCVal){
00025  *((msdbStream *) pos) << strCVal;
00026 }
00027 void MSDSelect::SetCriteria(double  dfCVal){
00028  *((msdbStream *) pos) << dfCVal;
00029 }
00030 void MSDSelect::SetCriteria(float fCVal){
00031  *((msdbStream *) pos) << fCVal;
00032 }
00033 void MSDSelect::SetCriteria(int iCVal){
00034  *((msdbStream *) pos) << iCVal;
00035 }
00036 void MSDSelect::SetCriteria(unsigned int uiCVal){
00037  *((msdbStream *) pos) << uiCVal;
00038 }
00039 void MSDSelect::SetCriteria(short int shiCVal){
00040  *((msdbStream *) pos) << shiCVal;
00041 }
00042 void MSDSelect::SetCriteria(long int liCVal){
00043  *((msdbStream *) pos) << liCVal;
00044 }
00045 
00046 MSDSelect::MSDSelect(){
00047 }
00048 
00049 void MSDSelect::InitSql(msdbConnect& r_db, char* stm){
00050  j=0;
00051  buff=50;
00052  pos=NULL;
00053  char bufs[3072];
00054  sprintf(bufs, stm);
00055  
00056  try
00057 {
00058    pos= new msdbStream (buff, bufs, r_db); //
00059 }
00060 catch(msdbException& p){ // intercept OTL exceptions
00061    cerr<<p.msg<<endl; // print out error message
00062    cerr<<p.stm_text<<endl; // print out SQL that caused the error
00063    cerr<<p.var_info<<endl; // print out the variable that caused the error
00064 }
00065  
00066   if (pos == NULL) {
00067      cerr<< "Error: msdbStream can not initialize." << endl;
00068      return;
00069  }
00070 }
00071 
00072 void MSDSelect::MakeRecord(){
00073  try
00074 {
00075  desc=pos->describe_select(desc_len);  
00076 }
00077 catch(msdbException& p){ // intercept OTL exceptions
00078    cerr<<p.msg<<endl; // print out error message
00079    cerr<<p.stm_text<<endl; // print out SQL that caused the error
00080    cerr<<p.var_info<<endl; // print out the variable that caused the error
00081 } 
00082  let collist = listEM( msdEnd);
00083  let colliststr = msdConst("(");
00084 
00085  
00086  p = new msd_array(desc_len);
00087  for(int n=0;n<desc_len;++n){
00088           switch (desc[n].dbtype){                                                                     
00089          case 1 : {(*p)[n] = new msd_string(desc[n].dbsize+1);} break;       // desc[n].dbsize+1                  
00090          case 2 : {if (desc[n].scale == 129) 
00091                         (*p)[n] = new msd_float;
00092                     else if (desc[n].scale==0)
00093                                 {if ((desc[n].prec <= 10 && desc[n].prec != 0) || has_integer_name(desc[n].name)==1) // (desc[n].prec==10 ||desc[n].prec==0)
00094                                           (*p)[n] = new msd_int;
00095                                      else
00096                                           (*p)[n] = new msd_float;
00097                                                 }
00098                                 else 
00099                                    (*p)[n] = new msd_int;
00100                           } break;      
00101                           
00102          case 3 : {(*p)[n] = new msd_float;} break;                                
00103          case 4 : {(*p)[n] = new msd_int;} break;                                  
00104          case 5 : {(*p)[n] = new msd_int;} break;       // msd_unsignedint;                      
00105          case 6 : {(*p)[n] = new msd_short;} break;                          
00106          case 7 : {(*p)[n] = new msd_int;} break; // msd_long(0);
00107          case 12: {(*p)[n] = new msd_datetime;} break; // 93 in Oracle 9i
00108          case 96: {(*p)[n] = new msd_string(desc[n].dbsize+1);} break;
00109         
00110          default: {(*p)[n] = new msd_string(desc[n].dbsize+1);} 
00111     } // switch case
00112     (*p)[n]->msd_sym=intern( msdConst(desc[n].name));
00113 
00114                  colliststr = stringConcat(colliststr, msdConst(" "));
00115              colliststr = stringConcat(colliststr , msdConst(desc[n].name));
00116 
00117 
00118  } // end for   
00119  colliststr = stringConcat(colliststr, msdConst(")"));
00120  collist = readFromString(colliststr);
00121  
00122  
00123 }
00124 
00125 
00126 void MSDSelect::GetNext(){
00127 if (!((msdbStream *) pos)->eof())
00128 {
00129         p->getst(*((msdbStream *) pos));
00130                         
00131 ++j;
00132 }
00133 }
00134 
00135 int MSDSelect::GetRowNum(){
00136  return j;
00137 }
00138   
00139 int MSDSelect::GetVal(int col, float& f){
00140  f = ((msd_float*)(*p)[col])->msd_item;
00141  return 0;
00142 }
00143 
00144 int MSDSelect::GetVal(int col, int& i){
00145  i = ((msd_int*)(*p)[col])->msd_item;
00146 return 0;
00147 }
00148 
00149 int MSDSelect::GetVal(int col, char*& val){
00150  val = ((msd_string*)(*p)[col])->msd_item;
00151  return 0;
00152 }
00153 
00154 
00155 int MSDSelect::GetVal(int col, double& d){
00156  d = ((msd_double*)(*p)[col])->msd_item;
00157 return 0;
00158 }
00159 
00161 // End of MSDSelect calss methods.
00163 
00164  void genselect(msdbConnect& r_db, char* stm){
00165    MSDSelect mselect;
00166    mselect.InitSql(r_db, stm);
00167    mselect.SetCriteria(1);
00168    mselect.MakeRecord();
00169    while (mselect.GetRowNum()<2)
00170    {
00171            mselect.GetNext();
00172    }
00173  }
00174   
00175 
00176 
00177 void new_exec_query (int bf, msdbConnect& r_db, char* stm, MSDDataSet& rs)
00178 {
00179  r_db.set_max_long_size(MAXBLOBSIZE); // set maximum long string size for connect object
00180   //ostream o;
00181   int j=0;
00182   int desc_len;
00183   char* stmnt=(char*)malloc(strlen(stm)+1);
00184   sprintf(stmnt,"%s",stm);
00185  
00186   char rowitem[16];
00187   
00188   
00189   
00190   otl_column_desc* desc;
00191   msdbStream ins; 
00192   ins.open(bf, stmnt, r_db);
00193   ins<<1;
00194   desc=ins.describe_select(desc_len);
00195   
00196   msd_array * p;
00197   p = new msd_array(desc_len);
00198   
00199   stringstream rowliststr;
00200   let colliststr = msdConst("(");
00201   let collist = listEM( msdEnd);
00202   rowliststr << "(";
00203   let rowlist = listEM( msdEnd);
00204   
00205   for(int n=0;n<desc_len;++n){
00206     switch (desc[n].dbtype){                                                                   
00207          case 1 : {(*p)[n] = new msd_string(desc[n].dbsize+1);} break;       // desc[n].dbsize+1                  
00208          case 2 : {if (desc[n].scale == 129) 
00209                         (*p)[n] = new msd_float;
00210                     else if (desc[n].scale==0)
00211                                 {if ((desc[n].prec <= 10 && desc[n].prec != 0) || has_integer_name(desc[n].name)==1) // (desc[n].prec==10 ||desc[n].prec==0)
00212                                           (*p)[n] = new msd_int;
00213                                      else
00214                                           (*p)[n] = new msd_float;
00215                                                 }
00216                                 else 
00217                                    (*p)[n] = new msd_int;
00218                           } break;      // sprintf(type, "long int");   
00219                           
00220          case 3 : {(*p)[n] = new msd_float;} break;                                
00221          case 4 : {(*p)[n] = new msd_int;} break;                                  
00222          case 5 : {(*p)[n] = new msd_int;} break;       // msd_unsignedint;                      
00223          case 6 : {(*p)[n] = new msd_short;} break;                          
00224          case 7 : {(*p)[n] = new msd_int;} break; // msd_long(0);
00225          case 12: {(*p)[n] = new msd_datetime;} break; // 93 in Oracle 9i
00226          case 96: {(*p)[n] = new msd_string(desc[n].dbsize+1);} break;
00227         
00228          default: {(*p)[n] = new msd_string(desc[n].dbsize+1);} 
00229          
00230     } // switch case
00231     (*p)[n]->msd_sym=intern( msdConst(desc[n].name));
00232 
00233                  colliststr = stringConcat(colliststr, msdConst(" "));
00234              colliststr = stringConcat(colliststr , msdConst(desc[n].name));
00235   }      // for loop
00236  
00237 
00238 
00239  colliststr = stringConcat(colliststr, msdConst(")"));
00240  collist = readFromString(colliststr);
00241  rs.addEntity( msdSymbol(colset));
00242  rs.setValue( msdSymbol(colset), msdSymbol(cols), collist);
00243  
00244       while(!ins.eof()){ // while not end-of-data
00245         sprintf(rowitem,"R%d",j);                                      
00246                 let rowname = intern( msdConst(rowitem));                             
00247                 rowliststr << " ";                                            
00248                 rowliststr << rowitem;                                        
00249                 rs.addEntity(rowname);                                        
00250                 rs.setValue(rowname, msdSymbol(rowno), msdConst(j));                         
00251                 p->getst(ins);
00252                 for(int n=0;n<desc_len;++n){                                  
00253                         //(*p)[n]->getst(i);
00254                                 cout << "Column name: " << (*p)[n]->msd_sym << " ";
00255                                 cout << "Value: " << (*p)[n]->getval() << endl;
00256                                 
00257                 
00258                                 rs.setValue(rowname, (*p)[n]->msd_sym, (*p)[n]->getval());  
00259                 } // enf for loop                                                                              
00260                 ++j;                                                          
00261       }          // end while loop                                            
00262       j=j-1;
00263         rowliststr << ")";
00264         rowlist = read(rowliststr);
00265           //let ll = length(rowlist);
00266           //prin1(ll);
00267           rs.addEntity( msdSymbol(rowset));
00268           rs.setValue( msdSymbol(rowset), msdSymbol(rows), rowlist);
00269             gc(colliststr); 
00270           
00271            free(stmnt);
00272  }
00273 
00274 
00276 
00277 int msd_exec_query (int bf, msdbConnect& r_db, char* stm, MSDDataSet& rs, char* rs_table, const char* argtype, ...)
00278 {
00279  r_db.set_max_long_size(MAXBLOBSIZE); // set maximum long string size for connect object
00280   int i,j,desc_len;
00281   float f;
00282   double d;
00283   //otl_datetime dt;
00284   char rowitem[64];
00285   char tblname[64];
00286   char* s;
00287   const char *a=argtype;
00288   va_list ap;
00289   va_start(ap,argtype); // point to first element after fmt
00290   char stmnt[4096]; // =(char*)malloc(strlen(stm)+1);
00291   sprintf(stmnt,"%s",stm);
00292   //char* tblname=(char*)malloc(strlen(rs_table)+1);
00293   sprintf(tblname,"%s",rs_table);                                      
00294   let table = intern( msdConst(tblname)); 
00295   otl_column_desc* desc;
00296   j = rs.getSize()+1;
00297   msdbStream ins;
00298   ins.open(bf, stmnt, r_db);
00299   while(*a)
00300   {
00301    if (*a=='i') //int
00302    {
00303     i=va_arg(ap,int);
00304          ins<<i;
00305    }
00306    else if (*a=='d') //double or float
00307    {
00308     d=va_arg(ap,double);
00309    ins<<d;
00310    }
00311    else if (*a=='s') //string
00312    {
00313     s=va_arg(ap,char*);
00314         ins<<s;
00315    }
00316    else 
00317    {
00318     printf("unsupported format flag");
00319     break;
00320    }
00321    ++a; // get the next char of the format string 
00322   }// while
00323   va_end(ap); //cleanup
00324   desc=ins.describe_select(desc_len);
00325   msd_array * p;
00326   p = new msd_array(desc_len);
00327   stringstream rowliststr;
00328   let colliststr = msdConst("(");
00329   let collist = listEM( msdEnd);
00330  
00331   for(int n=0;n<desc_len;++n){
00332     switch (desc[n].dbtype){                                                                   
00333          case 1 : {(*p)[n] = new msd_string(desc[n].dbsize+1);} break;       // desc[n].dbsize+1                  
00334          case 2 : {if (desc[n].scale == 129) 
00335                         (*p)[n] = new msd_float;
00336                     else if (desc[n].scale==0)
00337                                 {if ((desc[n].prec <= 10 && desc[n].prec != 0) || has_integer_name(desc[n].name)==1) // (desc[n].prec==10 ||desc[n].prec==0)
00338                                           (*p)[n] = new msd_int;
00339                                      else
00340                                           (*p)[n] = new msd_float;
00341                                                 }
00342                                 else 
00343                                    (*p)[n] = new msd_int;
00344                           } break;      // sprintf(type, "long int");   
00345                           
00346          case 3 : {(*p)[n] = new msd_float;} break;                                
00347          case 4 : {(*p)[n] = new msd_int;} break;                                  
00348          case 5 : {(*p)[n] = new msd_int;} break;       // msd_unsignedint;                      
00349          case 6 : {(*p)[n] = new msd_short;} break;                          
00350          case 7 : {(*p)[n] = new msd_int;} break; // msd_long(0);
00351          case 12: {(*p)[n] = new msd_datetime;} break; // 93 in Oracle 9i
00352          case 96: {(*p)[n] = new msd_string(desc[n].dbsize+1);} break;
00353         
00354          default: {(*p)[n] = new msd_string(desc[n].dbsize+1);} 
00355     } // switch case
00356     (*p)[n]->msd_sym=intern( msdConst(desc[n].name));
00357 
00358                  colliststr = stringConcat(colliststr, msdConst(" "));
00359              colliststr = stringConcat(colliststr , msdConst(desc[n].name));
00360   }      // for loop
00361  colliststr = stringConcat(colliststr, msdConst(")"));
00362  collist = readFromString(colliststr);
00363 
00364  int st=j;
00365       while(!ins.eof()){ // while not end-of-data
00366         sprintf(rowitem,"R%d",j);                                      
00367                 let rowname = intern( msdConst(rowitem));                             
00368                 //rowliststr << " ";                                            
00369                 //rowliststr << rowitem;                                        
00370                 rs.addEntity(rowname);                                        
00371                 rs.setValue(rowname, msdSymbol(rowno), msdConst(j));                         
00372                 p->getst(ins);
00373                 for(int n=0;n<desc_len;++n){                                  
00374                                 rs.setValue(rowname, (*p)[n]->msd_sym, (*p)[n]->getval());  
00375                 } // enf for loop                                                                              
00376                 ++j;                                                          
00377       }          // end while loop                                            
00378      j=j-1;
00379         
00380           let rowlist = listEM( msdConst(st),msdConst(j),msdEnd);
00381           rs.addEntity(table);
00382           rs.setValue(table, msdSymbol(rows), rowlist);
00383           rs.setValue(table, msdSymbol(cols), collist);
00384         
00385           gc(colliststr);
00386         
00387           return (0);
00388  }
00389 
00390 let msd_make_rowlist(let se){
00391  int s,e;
00392  char rowitem[16];
00393  stringstream rowliststr;
00394  s = iC(nth(0,se));
00395  e = iC(nth(1,se));
00396  rowliststr << "(";
00397  let rowlist = listEM( msdEnd);
00398  int j = s;
00399  while(j<=e){ // while not end-of-data
00400         sprintf(rowitem,"R%d",j);                                      
00401                 let rowname = intern( msdConst(rowitem));                             
00402                 rowliststr << " ";                                            
00403                 rowliststr << rowitem;                                        
00404                 ++j;                                                          
00405  }               // end while loop  
00406  rowliststr << ")";
00407  rowlist = read(rowliststr);
00408  return rowlist;
00409 }
00410 
00411 
00412 
00414 
00415 
00416 

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