> 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