--- YodaProfiler/src/GLTables.cpp 2006/11/27 14:25:34 1.20 +++ YodaProfiler/src/GLTables.cpp 2007/01/23 17:04:11 1.21 @@ -161,9 +161,6 @@ TYPE = 0; } -GL_TLE::GL_TLE(){ -} - // **************************************************** void GL_RUN::SetEV_FROM(UInt_t evfrom){ @@ -1573,84 +1570,111 @@ } -// **************************************************** -/** - * Function to query the GL_TLE table of the DB. - * - * time is the unix time for which a good tle is requested. - * - * Return the pointer to a cTle object that has the closest and - * previous date compared with time. - * - * If errors occurs it returns NULL. - */ -cTle* GL_TLE::Query_GL_TLE(UInt_t time, TSQLServer *dbc){ +// +// Build a query and call DoQuery. +// +// date it's an SQL datetime date and dbc is the connection to be +// used. It will query for the tle with the nearest but previous date +// and the immediatly next one. +// +Int_t GL_TLE::Query(TString date, TSQLServer *dbc){ stringstream myquery; myquery.str(""); - myquery << "SELECT TLE1, TLE2, TLE3 FROM GL_TLE " - << "WHERE FROM_TIME < FROM_UNIXTIME(" << time << ") ORDER BY FROM_TIME DESC LIMIT 1;"; - + myquery << "(SELECT ID, TLE1, TLE2, TLE3, UNIX_TIMESTAMP(FROM_TIME) FROM GL_TLE " + << "WHERE FROM_TIME <= '" << date.Data() + << "' ORDER BY FROM_TIME DESC LIMIT 1) " + << "UNION " + << "(SELECT ID, TLE1, TLE2, TLE3, UNIX_TIMESTAMP(FROM_TIME) FROM GL_TLE " + << "WHERE FROM_TIME > '" << date.Data() + << "' ORDER BY FROM_TIME ASC LIMIT 1)"; - return Query_GL_TLE_go(myquery.str(), dbc); + return DoQuery(myquery.str().c_str(), dbc); } -// **************************************************** -/** - * Function to query the GL_TLE table of the DB. - * - * date is a datetime format YYYY-MM-DD hh:mm:ss for which a good tle - * is requested. - * - * Return the pointer to a cTle object that has the closest and - * previous date compared with time. - * - * If errors occurs it returns NULL. - */ -cTle* GL_TLE::Query_GL_TLE(TString date, TSQLServer *dbc){ +// +// Build a query and call DoQuery. +// +// time is the UTC date in unix time (UTC) and dbc is the connection +// to be used. It will query for the tle with the nearest but +// previous date and the immediatly next one. +// +// Returns the value returned by DoQuery(). +// +Int_t GL_TLE::Query(UInt_t time, TSQLServer *dbc){ stringstream myquery; myquery.str(""); - myquery << "SELECT TLE1, TLE2, TLE3 FROM GL_TLE " - << "WHERE FROM_TIME < '" << date.Data() << "' ORDER BY FROM_TIME DESC LIMIT 1;"; - + myquery << "(SELECT ID, TLE1, TLE2, TLE3, UNIX_TIMESTAMP(FROM_TIME) FROM GL_TLE " + << "WHERE FROM_TIME <= FROM_UNIXTIME('" << time + << "') ORDER BY FROM_TIME DESC LIMIT 1) " + << "UNION " + << "(SELECT ID, TLE1, TLE2, TLE3, UNIX_TIMESTAMP(FROM_TIME) FROM GL_TLE " + << "WHERE FROM_TIME > FROM_UNIXTIME('" << time + << "') ORDER BY FROM_TIME ASC LIMIT 1)"; - return Query_GL_TLE_go(myquery.str(), dbc); + return DoQuery(myquery.str().c_str(), dbc); } -// **************************************************** -/** - * Private function used by Query_GL_TLE methods. - * - * myquery is the query string. - * - * Return the pointer to a cTle object that has the closest and - * previous date compared with time. - * - * If errors occurs it returns NULL. - */ -cTle* GL_TLE::Query_GL_TLE_go(TString myquery, TSQLServer *dbc){ - cTle *tle; - string tle1, tle2, tle3; - - // MySQL variables +// +// Do the query myquery on the connectio dbc. Initialize tle, +// tleFromTime and tleToTime. +// +// We should have two rows (unless the table is old). From the last +// one we only take tleToTime. +// +// Returns 0 for success, 1 for failure. +// +Int_t GL_TLE::DoQuery(TString myquery, TSQLServer *dbc){ TSQLResult *result; TSQLRow *row; + // Set the right time_zone (otherwise horrible things will occur! :) + dbc->Query("SET time_zone = '+0:00'"); + + // Do the query result = dbc->Query(myquery.Data()); - if(! result->GetRowCount() ) return NULL; + if(! result->GetRowCount() ) { + cerr << "GL_TLE: query failed: " << myquery.Data() << endl; + return 1; + } + + // Get results + row = result->Next(); // first tle row + tle = GiveTle(row); + + tleFromTime = strtol(row->GetField(4), NULL, 10); + + row = result->Next(); // second tle row + if(row) + tleToTime = strtol(row->GetField(4), NULL, 10); + else { + cerr << "GL_TLE: Warning: using last avaible TLE. Please update GL_TLE table!\n"; + tleToTime = UINT_MAX; + } + + delete row; + delete result; - row = result->Next(); - tle1 = row->GetField(0); - tle2 = row->GetField(1); - tle3 = row->GetField(2); + return 0; +} - tle = new cTle(tle1, tle2, tle3); - delete result; - delete row; +// +// Build a cTle object from the GL_TLE row. +// +cTle* GL_TLE::GiveTle(TSQLRow *row) { + cTle *thistle = NULL; + string tle1, tle2, tle3; + + // Build cTle object + tle1 = row->GetField(1); + tle2 = row->GetField(2); + tle3 = row->GetField(3); + + thistle = new cTle(tle1, tle2, tle3); - return tle; + return thistle; }