Re: [ROOT] Root File Generation From SQL Data

From: Valeriy Onuchin (Valeri.Onoutchine@cern.ch)
Date: Wed Jun 11 2003 - 10:19:53 MEST


> Hi all,
> I want to create Root files dynamically from sql query.I want to write  a
> utility in JAVA which will get the sql query(obviously for RDBMS based
> databases) and will return the result as a ROOT file.Is there any tool or
> platfrom available which can serve the purpose?
> 
> If any one has been involved with such type of effrots, please do help me.
> 
> I will be grateful for this help.
> 
> Regards
> Ashiq Anjum

 Hi Ashiq Anjum,
there is RDBC package http://minos.phy.bnl.gov/software/cvs/RDBC/
which is JDBC API implementation in ROOT.
See below the TTree* TSQLResultSet::Tree(Int_t begin,Int_t end) method 
which does what you want. I suppose rewriting it in Java will not be a problem.

HTH. Regards. Valeriy


TTree* TSQLResultSet::Tree(Int_t begin,Int_t end)
{
   // Writes resultset content to ROOT tree
   //
   // This method creates "new TTree". 
   // To avoid memory leakage it should be deleted if not used.
   //
   // See also TTree
   //
   // Comment: this method is experimental nad buggy
   
   TString leafList;    // leaf description string
   TString clmname;     // column name

   Int_t siz = 0;
   Int_t ncollumns = 0;
   char* buf = 0;
   Int_t type,offset,prec;
   TString str;
   char tmpstr[40];

   Int_t  intg = 0;
   Short_t shrt = 0;
   Float_t flt = 0;
   Double_t dbl = 0;
   Int_t yy, mm, dd, hh, mi, ss;
   UInt_t t =0;
   struct tm tp;
   Int_t save_row = GetRow(); 
   Int_t cur_row =0;

   Int_t srow = begin > 0 ? begin : save_row; 
   Int_t erow = end > 0 ? end : -1;
   Int_t tmp = 0;

   if(srow>erow) { 
      tmp = erow; 
      erow = srow;
      srow = tmp; 
   }

   // calculate "leaf buffer" size
   ncollumns = fMetaData->GetColumnCount();

   for( int i=1; i <= ncollumns; ++i ) {
      type = fMetaData->GetColumnType(i);
            
      switch( type ) { 
      case kCHAR: 
      case kVARCHAR:
        siz += fMetaData->GetPrecision(i)+1; // length + zero
        break;
      case kINTEGER:
         siz += sizeof(Int_t);
         break;
      case kDATE:
      case kTIME:
      case kTIMESTAMP:
         siz += sizeof(UInt_t);
         break;      
      case kBIT:       
      case kTINYINT:
      case kSMALLINT:
         siz += sizeof(Short_t);
         break;
      case kREAL:
         siz += sizeof(Float_t);
         break;
      case kLONGVARCHAR: // not resolved yet how to handle   
      case kLONGVARBINARY:
      case kVARBINARY:
         break;  
      case kBIGINT:     // convert all these types to Double_t
      case kDECIMAL:
      case kNUMERIC:
      case kDOUBLE:
      case kFLOAT:
      default:
         siz += sizeof(Double_t);
         break;      
      }  
   }

   // determine leaf description string
   for( int i=1; i <= ncollumns; ++i ) {
      type = fMetaData->GetColumnType(i);
      clmname = fMetaData->GetColumnName(i);
      
      switch( type ) {
      case kCHAR: 
      case kVARCHAR:
         prec = fMetaData->GetPrecision(i)+1;
         sprintf(tmpstr,"[%d]",prec);
         leafList += clmname + tmpstr + "/C:"; // 
         break;
      case kINTEGER:
         leafList += clmname + "/I:"; // signed integer 
         break;
      case kDATE:
      case kTIME:
      case kTIMESTAMP:
         leafList += clmname + "/i:"; // unsigned integer ( time_t format )
         break;
      case kBIT:        
      case kTINYINT:      
      case kSMALLINT:
         leafList += clmname + "/S:"; //  signed short        
         break;
      case kREAL:
          leafList += clmname + "/F:"; // floating point
         break;
      case kLONGVARCHAR: // not resolved yet how to handle   
      case kLONGVARBINARY:
      case kVARBINARY: 
         break;         
      case kBIGINT:     // convert all these types to Double_t
      case kDECIMAL:
      case kNUMERIC:          
      case kDOUBLE:
      case kFLOAT:
      default:
         leafList += clmname + "/D:"; // double
         break;
      }
   }  
   if(!leafList.IsNull()) leafList.Resize(leafList.Length()-1);   // cut off last ":"

   //  Dinamically allocate  "leaf buffer"  
   buf = new char[siz]; // buffer

   TString tblname =  fMetaData->GetTableName(1);

   if(tblname.IsNull()) { // if table name unknown => generate "random name" 
      tblname = "table"; 
      sprintf(tmpstr,"%d",rand()%1000);
      tblname += tmpstr;
   }

   // Create a ROOT Tree
   //
   TTree* tree = new TTree(tblname.Data(),"Created by TSQLResultSet:Tree() method");

   tree->Branch(tblname.Data(),(void*)buf,leafList.Data());

   // skip to start 
   cur_row = GetRow();

   if(fStatement) { 
      if(fStatement->GetResultSetType() != kTYPE_FORWARD_ONLY ) {
         Absolute(srow-1);
      } else {
         if(srow>cur_row) {
            while ( Next() && cur_row+2 < srow) cur_row = GetRow();
         }
      }
   }

   // tree filling 
   while( Next() ) {   // iterate rows
      offset = 0;
   
      if(erow>0 && cur_row >= erow) break;
      cur_row = GetRow();

      for( int i=1; i <= ncollumns; ++i ) {
         type = fMetaData->GetColumnType(i);
         
         switch( type ) {      
         case kCHAR:  
         case kVARCHAR:
            siz = fMetaData->GetPrecision(i)+1; 
            str = GetString(i);
            memcpy(&buf[offset],str.Data(),siz); 
            break;  
         case kINTEGER:
            siz = sizeof(Int_t);
            intg = GetInt(i);
            memcpy(&buf[offset],&intg,siz); 
            break;
         case kBIT:
         case kTINYINT:  
         case kSMALLINT:
            siz = sizeof(Short_t);
            shrt = GetShort(i);
            memcpy(&buf[offset],&shrt,siz); 
            break;
         case kREAL:
            siz = sizeof(Float_t);
            dbl = GetFloat(i);
            memcpy(&buf[offset],&flt,siz); 
            break;
         case kDATE: // convert all date-times into time_t
         case kTIME:       // probably not working for kTIME  
         case kTIMESTAMP: 
            siz = sizeof(UInt_t);
            str = GetString(i);
            sscanf(str.Data(), "%d-%d-%d %d:%d:%d", 
                                &yy, &mm, &dd, &hh, &mi, &ss);
            tp.tm_year  = yy-1900;
            tp.tm_mon   = mm;
            tp.tm_mday  = dd;
            tp.tm_hour  = hh;
            tp.tm_min   = mi;
            tp.tm_sec   = ss;
            tp.tm_isdst = -1;
            t = (UInt_t)mktime(&tp);
            memcpy(&buf[offset],&t,siz);
            break;            
         case kLONGVARCHAR: // not resolved  how to handle   
         case kLONGVARBINARY:
         case kVARBINARY:
            break;
         case kBIGINT:     // convert all these types to Double_t
         case kDECIMAL:
         case kNUMERIC:
         case kDOUBLE:
         case kFLOAT:                        
         default:
            siz = sizeof(Double_t);
            dbl = GetDouble(i);
            memcpy(&buf[offset],&dbl,siz); 
            break;      
         }  
         offset += siz;
      }
      tree->Fill();
   } 

   delete [] buf;

   if(fStatement) { 
      if(fStatement->GetResultSetType() != kTYPE_FORWARD_ONLY ) {
         Absolute(save_row);
      } else {
         Warning("Print","To set cursor to initial position -> re-execute Query.");
      }
   }

   return tree;  
}



This archive was generated by hypermail 2b29 : Thu Jan 01 2004 - 17:50:12 MET