319{
320
321
322
323
324 if (!IsConnected()) {
325 Error("QueryTree", "not connected");
326 return 0;
327 }
328 if (!tree) {
329 Error("QueryTree", "tree is not valid");
330 return 0;
331 }
332
333 try {
336 fStmt->setSQL(query);
337 fStmt->setPrefetchRowCount(2000);
338 printf("\nexecute sql query: %s ...\n",query);
340
341 ResultSet *rset =
fStmt->getResultSet();
342 vector<MetaData> cmd = rset->getColumnListMetaData();
343 const int nlmax=cmd.size();
344 printf("Number of metadata fields: %d\n", nlmax);
345 if(nlmax<1) return 0;
346
347 TString leaflist(nlmax*64);
348 int ind=0;
349 int *ifields = new int[nlmax];
350 int dtype=0;
351
352 for (int i = 0; i < nlmax; i++) {
353 dtype = cmd[i].getInt(MetaData::ATTR_DATA_TYPE);
354 printf("\nocci field type: %d \t",dtype);
355 string s = cmd[i].getString(MetaData::ATTR_NAME);
356 if (dtype == OCCI_SQLT_NUM )
357 {
358 ifields[ind++] = i + 1;
359 if (ind > 1) leaflist+=":";
360 leaflist+=
s.c_str();
361 leaflist+="/F";
362 printf(
"%s added",
s.c_str());
363 }
else printf(
"%s skipped",
s.c_str());
364 }
365
366 leaflist.ToLower();
367 printf("\n\nleaflist=%s\n", leaflist.Data());
368 if(leafs) {
369 leaflist=leafs;
370 printf("\n\nleaflist=%s\n", leaflist.Data());
371 }
372 Float_t *data = new Float_t[ind];
373 tree->Branch("query", data, leaflist.Data() );
374
375 while (rset->next() == 1)
376 {
377 for (int i = 0; i < ind; i++)
378 data[i] = rset->getFloat(ifields[i]);
379 tree->Fill();
380 }
381
382 delete rset;
383 delete[] ifields;
384 delete[] data;
385 return tree->GetEntries();
386 } catch (SQLException &oraex) {
387 Error("TOracleServer", "QueryTree failed: (error: %s)", (oraex.getMessage()).c_str());
388 }
389 return 0;
390}