> 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