ROOT logo
// @(#)root/oracle:$Id: TOracleResult.cxx 20882 2007-11-19 11:31:26Z rdm $
// Author: Yan Liu and Shaowen Wang   23/11/04

/*************************************************************************
 * Copyright (C) 1995-2005, Rene Brun and Fons Rademakers.               *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/

#include "TOracleResult.h"
#include "TOracleRow.h"
#include "TList.h"

using namespace std;


ClassImp(TOracleResult)

//______________________________________________________________________________
void TOracleResult::initResultSet(Statement *stmt)
{
   // Oracle query result.

   if (!stmt) {
      Error("initResultSet()", "construction: empty statement");
   } else {
      try {
         fStmt = stmt;
         if (stmt->status() == Statement::RESULT_SET_AVAILABLE) {
            fResultType  = 1;
            fResult      = stmt->getResultSet();
            fFieldInfo   = (fResult==0) ? 0 : new vector<MetaData>(fResult->getColumnListMetaData());
            fFieldCount  = (fFieldInfo==0) ? 0 : fFieldInfo->size();
         } else if (stmt->status() == Statement::UPDATE_COUNT_AVAILABLE) {
            fResultType  = 3; // this is update_count_available
            fResult      = 0;
            fFieldInfo   = 0;
            fFieldCount  = 0;
            fUpdateCount = stmt->getUpdateCount();
         }
      } catch (SQLException &oraex) {
         Error("initResultSet()", (oraex.getMessage()).c_str());
         MakeZombie();
      }
   }
}

//______________________________________________________________________________
TOracleResult::TOracleResult(Connection *conn, Statement *stmt)
{
   fConn        = conn;
   fResult      = 0;
   fStmt        = 0;
   fPool        = 0;
   fRowCount    = 0;
   fFieldInfo   = 0;
   fResultType  = 0;
   fUpdateCount = 0;
   
   initResultSet(stmt);
   
   if (fResult) ProducePool();
}

//______________________________________________________________________________
TOracleResult::TOracleResult(Connection *conn, const char *tableName)
{
   // This construction func is only used to get table metainfo.

   fResult      = 0;
   fStmt        = 0;
   fConn        = 0;
   fPool        = 0;
   fRowCount    = 0;
   fFieldInfo   = 0;
   fResultType  = 0;
   fUpdateCount = 0;
   
   if (!tableName || !conn) {
      Error("TOracleResult", "construction: empty input parameter");
   } else {
      MetaData connMD = conn->getMetaData(tableName, MetaData::PTYPE_TABLE);
      fFieldInfo   = new vector<MetaData>(connMD.getVector(MetaData::ATTR_LIST_COLUMNS));
      fFieldCount  = fFieldInfo->size();
      fResultType  = 2; // indicates that this is just an table metainfo
   }
}

//______________________________________________________________________________
TOracleResult::~TOracleResult()
{
   // Cleanup Oracle query result.

   Close();
}

//______________________________________________________________________________
void TOracleResult::Close(Option_t *)
{
   // Close query result.

   if (fConn && fStmt) {
      if (fResult) fStmt->closeResultSet(fResult);
      fConn->terminateStatement(fStmt);
   }
   
   if (fPool) {
      fPool->Delete();
      delete fPool;   
   }

   if (fFieldInfo)
      delete fFieldInfo;

   fResultType = 0;
   
   fStmt = 0;
   fResult = 0;
   fFieldInfo = 0;
   fPool = 0;
}

//______________________________________________________________________________
Bool_t TOracleResult::IsValid(Int_t field)
{
   // Check if result set is open and field index within range.

   if (field < 0 || field >= fFieldCount) {
      Error("IsValid", "field index out of bounds");
      return kFALSE;
   }
   return kTRUE;
}

//______________________________________________________________________________
Int_t TOracleResult::GetFieldCount()
{
   // Get number of fields in result.

   return fFieldCount;
}

//______________________________________________________________________________
const char *TOracleResult::GetFieldName(Int_t field)
{
   // Get name of specified field.

   if (!IsValid(field))
      return 0;
   fNameBuffer = (*fFieldInfo)[field].getString(MetaData::ATTR_NAME);
   return fNameBuffer.c_str();
}

//______________________________________________________________________________
TSQLRow *TOracleResult::Next()
{
   // Get next query result row. The returned object must be
   // deleted by the user.

   if (!fResult || (fResultType!=1)) return 0;
   
   if (fPool!=0) {
      TSQLRow* row = (TSQLRow*) fPool->First();
      if (row!=0) fPool->Remove(row);
      return row;
   }

   // if select query,
   try {
      if (fResult->next()) {
         fRowCount++; 
         return new TOracleRow(fResult, fFieldInfo);
      } else
         return 0;
   } catch (SQLException &oraex) {
      Error("Next()", (oraex.getMessage()).c_str());
      MakeZombie();
   }
   return 0;
}

//______________________________________________________________________________
Int_t TOracleResult::GetRowCount() const
{
   if (!fResult) return 0;
   
   if (fPool==0) ((TOracleResult*) this)->ProducePool();
   
   return fRowCount; 
}

//______________________________________________________________________________
void TOracleResult::ProducePool()
{
   if (fPool!=0) return;
   
   TList* pool = new TList;
   TSQLRow* res = 0;
   while ((res = Next()) !=0) {
      pool->Add(res);
   } 
       
   fPool = pool;
}
 TOracleResult.cxx:1
 TOracleResult.cxx:2
 TOracleResult.cxx:3
 TOracleResult.cxx:4
 TOracleResult.cxx:5
 TOracleResult.cxx:6
 TOracleResult.cxx:7
 TOracleResult.cxx:8
 TOracleResult.cxx:9
 TOracleResult.cxx:10
 TOracleResult.cxx:11
 TOracleResult.cxx:12
 TOracleResult.cxx:13
 TOracleResult.cxx:14
 TOracleResult.cxx:15
 TOracleResult.cxx:16
 TOracleResult.cxx:17
 TOracleResult.cxx:18
 TOracleResult.cxx:19
 TOracleResult.cxx:20
 TOracleResult.cxx:21
 TOracleResult.cxx:22
 TOracleResult.cxx:23
 TOracleResult.cxx:24
 TOracleResult.cxx:25
 TOracleResult.cxx:26
 TOracleResult.cxx:27
 TOracleResult.cxx:28
 TOracleResult.cxx:29
 TOracleResult.cxx:30
 TOracleResult.cxx:31
 TOracleResult.cxx:32
 TOracleResult.cxx:33
 TOracleResult.cxx:34
 TOracleResult.cxx:35
 TOracleResult.cxx:36
 TOracleResult.cxx:37
 TOracleResult.cxx:38
 TOracleResult.cxx:39
 TOracleResult.cxx:40
 TOracleResult.cxx:41
 TOracleResult.cxx:42
 TOracleResult.cxx:43
 TOracleResult.cxx:44
 TOracleResult.cxx:45
 TOracleResult.cxx:46
 TOracleResult.cxx:47
 TOracleResult.cxx:48
 TOracleResult.cxx:49
 TOracleResult.cxx:50
 TOracleResult.cxx:51
 TOracleResult.cxx:52
 TOracleResult.cxx:53
 TOracleResult.cxx:54
 TOracleResult.cxx:55
 TOracleResult.cxx:56
 TOracleResult.cxx:57
 TOracleResult.cxx:58
 TOracleResult.cxx:59
 TOracleResult.cxx:60
 TOracleResult.cxx:61
 TOracleResult.cxx:62
 TOracleResult.cxx:63
 TOracleResult.cxx:64
 TOracleResult.cxx:65
 TOracleResult.cxx:66
 TOracleResult.cxx:67
 TOracleResult.cxx:68
 TOracleResult.cxx:69
 TOracleResult.cxx:70
 TOracleResult.cxx:71
 TOracleResult.cxx:72
 TOracleResult.cxx:73
 TOracleResult.cxx:74
 TOracleResult.cxx:75
 TOracleResult.cxx:76
 TOracleResult.cxx:77
 TOracleResult.cxx:78
 TOracleResult.cxx:79
 TOracleResult.cxx:80
 TOracleResult.cxx:81
 TOracleResult.cxx:82
 TOracleResult.cxx:83
 TOracleResult.cxx:84
 TOracleResult.cxx:85
 TOracleResult.cxx:86
 TOracleResult.cxx:87
 TOracleResult.cxx:88
 TOracleResult.cxx:89
 TOracleResult.cxx:90
 TOracleResult.cxx:91
 TOracleResult.cxx:92
 TOracleResult.cxx:93
 TOracleResult.cxx:94
 TOracleResult.cxx:95
 TOracleResult.cxx:96
 TOracleResult.cxx:97
 TOracleResult.cxx:98
 TOracleResult.cxx:99
 TOracleResult.cxx:100
 TOracleResult.cxx:101
 TOracleResult.cxx:102
 TOracleResult.cxx:103
 TOracleResult.cxx:104
 TOracleResult.cxx:105
 TOracleResult.cxx:106
 TOracleResult.cxx:107
 TOracleResult.cxx:108
 TOracleResult.cxx:109
 TOracleResult.cxx:110
 TOracleResult.cxx:111
 TOracleResult.cxx:112
 TOracleResult.cxx:113
 TOracleResult.cxx:114
 TOracleResult.cxx:115
 TOracleResult.cxx:116
 TOracleResult.cxx:117
 TOracleResult.cxx:118
 TOracleResult.cxx:119
 TOracleResult.cxx:120
 TOracleResult.cxx:121
 TOracleResult.cxx:122
 TOracleResult.cxx:123
 TOracleResult.cxx:124
 TOracleResult.cxx:125
 TOracleResult.cxx:126
 TOracleResult.cxx:127
 TOracleResult.cxx:128
 TOracleResult.cxx:129
 TOracleResult.cxx:130
 TOracleResult.cxx:131
 TOracleResult.cxx:132
 TOracleResult.cxx:133
 TOracleResult.cxx:134
 TOracleResult.cxx:135
 TOracleResult.cxx:136
 TOracleResult.cxx:137
 TOracleResult.cxx:138
 TOracleResult.cxx:139
 TOracleResult.cxx:140
 TOracleResult.cxx:141
 TOracleResult.cxx:142
 TOracleResult.cxx:143
 TOracleResult.cxx:144
 TOracleResult.cxx:145
 TOracleResult.cxx:146
 TOracleResult.cxx:147
 TOracleResult.cxx:148
 TOracleResult.cxx:149
 TOracleResult.cxx:150
 TOracleResult.cxx:151
 TOracleResult.cxx:152
 TOracleResult.cxx:153
 TOracleResult.cxx:154
 TOracleResult.cxx:155
 TOracleResult.cxx:156
 TOracleResult.cxx:157
 TOracleResult.cxx:158
 TOracleResult.cxx:159
 TOracleResult.cxx:160
 TOracleResult.cxx:161
 TOracleResult.cxx:162
 TOracleResult.cxx:163
 TOracleResult.cxx:164
 TOracleResult.cxx:165
 TOracleResult.cxx:166
 TOracleResult.cxx:167
 TOracleResult.cxx:168
 TOracleResult.cxx:169
 TOracleResult.cxx:170
 TOracleResult.cxx:171
 TOracleResult.cxx:172
 TOracleResult.cxx:173
 TOracleResult.cxx:174
 TOracleResult.cxx:175
 TOracleResult.cxx:176
 TOracleResult.cxx:177
 TOracleResult.cxx:178
 TOracleResult.cxx:179
 TOracleResult.cxx:180
 TOracleResult.cxx:181
 TOracleResult.cxx:182
 TOracleResult.cxx:183
 TOracleResult.cxx:184
 TOracleResult.cxx:185
 TOracleResult.cxx:186
 TOracleResult.cxx:187
 TOracleResult.cxx:188
 TOracleResult.cxx:189
 TOracleResult.cxx:190
 TOracleResult.cxx:191
 TOracleResult.cxx:192
 TOracleResult.cxx:193
 TOracleResult.cxx:194
 TOracleResult.cxx:195
 TOracleResult.cxx:196
 TOracleResult.cxx:197
 TOracleResult.cxx:198
 TOracleResult.cxx:199
 TOracleResult.cxx:200
 TOracleResult.cxx:201
 TOracleResult.cxx:202
 TOracleResult.cxx:203
 TOracleResult.cxx:204
 TOracleResult.cxx:205
 TOracleResult.cxx:206