17 using namespace oracle::occi;
19 ClassImp(TOracleResult);
24 void TOracleResult::initResultSet(Statement *stmt)
27 Error(
"initResultSet",
"construction: empty statement");
31 if (stmt->status() == Statement::RESULT_SET_AVAILABLE) {
33 fResult = stmt->getResultSet();
34 fFieldInfo = (fResult==0) ? 0 :
new vector<MetaData>(fResult->getColumnListMetaData());
35 fFieldCount = (fFieldInfo==0) ? 0 : fFieldInfo->size();
36 }
else if (stmt->status() == Statement::UPDATE_COUNT_AVAILABLE) {
41 fUpdateCount = stmt->getUpdateCount();
43 }
catch (SQLException &oraex) {
44 Error(
"initResultSet",
"%s", (oraex.getMessage()).c_str());
52 TOracleResult::TOracleResult(Connection *conn, Statement *stmt)
65 if (fResult) ProducePool();
71 TOracleResult::TOracleResult(Connection *conn,
const char *tableName)
83 if (!tableName || !conn) {
84 Error(
"TOracleResult",
"construction: empty input parameter");
86 MetaData connMD = conn->getMetaData(tableName, MetaData::PTYPE_TABLE);
87 fFieldInfo =
new vector<MetaData>(connMD.getVector(MetaData::ATTR_LIST_COLUMNS));
88 fFieldCount = fFieldInfo->size();
96 TOracleResult::~TOracleResult()
104 void TOracleResult::Close(Option_t *)
106 if (fConn && fStmt) {
107 if (fResult) fStmt->closeResultSet(fResult);
108 fConn->terminateStatement(fStmt);
130 Bool_t TOracleResult::IsValid(Int_t field)
132 if (field < 0 || field >= fFieldCount) {
133 Error(
"IsValid",
"field index out of bounds");
142 Int_t TOracleResult::GetFieldCount()
150 const char *TOracleResult::GetFieldName(Int_t field)
154 fNameBuffer = (*fFieldInfo)[field].getString(MetaData::ATTR_NAME);
155 return fNameBuffer.c_str();
162 TSQLRow *TOracleResult::Next()
164 if (!fResult || (fResultType!=1))
return 0;
167 TSQLRow* row = (TSQLRow*) fPool->First();
168 if (row!=0) fPool->Remove(row);
174 if (fResult->next() != oracle::occi::ResultSet::END_OF_FETCH) {
176 return new TOracleRow(fResult, fFieldInfo);
179 }
catch (SQLException &oraex) {
180 Error(
"Next",
"%s", (oraex.getMessage()).c_str());
188 Int_t TOracleResult::GetRowCount()
const
190 if (!fResult)
return 0;
192 if (fPool==0) ((TOracleResult*)
this)->ProducePool();
199 void TOracleResult::ProducePool()
201 if (fPool!=0)
return;
203 TList* pool =
new TList;
205 while ((res = Next()) !=0) {