ROOT logo
// @(#)root/oracle:$Id: TOracleRow.cxx 22419 2008-03-03 00:25:01Z 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 "TOracleRow.h"
#include "Riostream.h"
#include <string.h>

using namespace std;

ClassImp(TOracleRow);

//______________________________________________________________________________
TOracleRow::TOracleRow(ResultSet *rs, vector<MetaData> *fieldMetaData)
{
   // Single row of query result.

   fResult      = rs;
   fFieldInfo   = fieldMetaData;
   fFieldCount  = fFieldInfo->size();
   
   fFieldsBuffer = 0;
   
   GetRowData();
}

//______________________________________________________________________________
TOracleRow::~TOracleRow()
{
   // Destroy row object.

   Close();
   
}

//______________________________________________________________________________
void TOracleRow::Close(Option_t *)
{
   // Close row.

   if (fFieldsBuffer!=0) {
      for (int n=0;n<fFieldCount;n++)
        if (fFieldsBuffer[n]) delete[] fFieldsBuffer[n];
      delete[] fFieldsBuffer;  
   }

   fFieldInfo   = 0;
   fFieldCount  = 0;
   fResult      = 0;
}

//______________________________________________________________________________
Bool_t TOracleRow::IsValid(Int_t field)
{
   // Check if row is open and field index within range.

   if (!fResult) {
      Error("IsValid", "row closed");
      return kFALSE;
   }
   if (field < 0 || field >= (Int_t)fFieldInfo->size()) {
      Error("IsValid", "field index out of bounds");
      return kFALSE;
   }
   return kTRUE;
}

//______________________________________________________________________________
ULong_t TOracleRow::GetFieldLength(Int_t field)
{
   // Get length in bytes of specified field.

   if (!IsValid(field) || fFieldInfo->size() <= 0)
      return 0;

   MetaData fieldMD = (*fFieldInfo)[field];

   return fieldMD.getInt(MetaData::ATTR_DATA_SIZE);
}

//______________________________________________________________________________
const char* TOracleRow::GetField(Int_t field)
{
   if ((field<0) || (field>=fFieldCount)) {
      Error("TOracleRow","GetField(): out-of-range or No RowData/ResultSet/MetaData");
      return 0;
   }
   
   return fFieldsBuffer ? fFieldsBuffer[field] : 0;
}

//______________________________________________________________________________
void TOracleRow::GetRowData()
{
   if (!fResult || !fFieldInfo || (fFieldCount<=0)) return;
   
   fFieldsBuffer = new char* [fFieldCount];
   for (int n=0;n<fFieldCount;n++)
     fFieldsBuffer[n] = 0;

   std::string res;
   
   char str_number[200];

   int fPrecision, fScale, fDataType;
   double double_val; 

   try {
   
   for (int field=0;field<fFieldCount;field++) {
      if (fResult->isNull(field+1)) continue;
   
      fDataType = (*fFieldInfo)[field].getInt(MetaData::ATTR_DATA_TYPE);

      switch (fDataType) {
        case SQLT_NUM: //NUMBER
           fPrecision = (*fFieldInfo)[field].getInt(MetaData::ATTR_PRECISION);
           fScale = (*fFieldInfo)[field].getInt(MetaData::ATTR_SCALE);

           if ((fScale == 0) || (fPrecision == 0)) {
              res = fResult->getString(field+1);
           } else {
              double_val = fResult->getDouble(field+1);  
              sprintf(str_number, "%lf", double_val);
              res = str_number;
           }
           break;
        
        case SQLT_CHR:  // character string
        case SQLT_VCS:  // variable character string
        case SQLT_AFC: // ansi fixed char
        case SQLT_AVC: // ansi var char
           res = fResult->getString(field+1);
           break;
        case SQLT_DAT:  // Oracle native DATE type
           res = (fResult->getDate(field+1)).toText("MM/DD/YYYY, HH24:MI:SS");
           break;
        case SQLT_TIMESTAMP:     // TIMESTAMP
        case SQLT_TIMESTAMP_TZ:  // TIMESTAMP WITH TIMEZONE
        case SQLT_TIMESTAMP_LTZ: // TIMESTAMP WITH LOCAL TIMEZONE
           res = (fResult->getTimestamp(field+1)).toText("MM/DD/YYYY, HH24:MI:SS",0);
           break;
        default:
           Error("GetRowData()","Oracle type %d not supported.", fDataType);
           continue;
      }
      
      int len = res.length();
      if (len>0) {
         fFieldsBuffer[field] = new char[len+1];
         strcpy(fFieldsBuffer[field], res.c_str()); 
      }
   }

   } catch (SQLException &oraex) {
      Error("GetRowData()", (oraex.getMessage()).c_str());
   }
}
 TOracleRow.cxx:1
 TOracleRow.cxx:2
 TOracleRow.cxx:3
 TOracleRow.cxx:4
 TOracleRow.cxx:5
 TOracleRow.cxx:6
 TOracleRow.cxx:7
 TOracleRow.cxx:8
 TOracleRow.cxx:9
 TOracleRow.cxx:10
 TOracleRow.cxx:11
 TOracleRow.cxx:12
 TOracleRow.cxx:13
 TOracleRow.cxx:14
 TOracleRow.cxx:15
 TOracleRow.cxx:16
 TOracleRow.cxx:17
 TOracleRow.cxx:18
 TOracleRow.cxx:19
 TOracleRow.cxx:20
 TOracleRow.cxx:21
 TOracleRow.cxx:22
 TOracleRow.cxx:23
 TOracleRow.cxx:24
 TOracleRow.cxx:25
 TOracleRow.cxx:26
 TOracleRow.cxx:27
 TOracleRow.cxx:28
 TOracleRow.cxx:29
 TOracleRow.cxx:30
 TOracleRow.cxx:31
 TOracleRow.cxx:32
 TOracleRow.cxx:33
 TOracleRow.cxx:34
 TOracleRow.cxx:35
 TOracleRow.cxx:36
 TOracleRow.cxx:37
 TOracleRow.cxx:38
 TOracleRow.cxx:39
 TOracleRow.cxx:40
 TOracleRow.cxx:41
 TOracleRow.cxx:42
 TOracleRow.cxx:43
 TOracleRow.cxx:44
 TOracleRow.cxx:45
 TOracleRow.cxx:46
 TOracleRow.cxx:47
 TOracleRow.cxx:48
 TOracleRow.cxx:49
 TOracleRow.cxx:50
 TOracleRow.cxx:51
 TOracleRow.cxx:52
 TOracleRow.cxx:53
 TOracleRow.cxx:54
 TOracleRow.cxx:55
 TOracleRow.cxx:56
 TOracleRow.cxx:57
 TOracleRow.cxx:58
 TOracleRow.cxx:59
 TOracleRow.cxx:60
 TOracleRow.cxx:61
 TOracleRow.cxx:62
 TOracleRow.cxx:63
 TOracleRow.cxx:64
 TOracleRow.cxx:65
 TOracleRow.cxx:66
 TOracleRow.cxx:67
 TOracleRow.cxx:68
 TOracleRow.cxx:69
 TOracleRow.cxx:70
 TOracleRow.cxx:71
 TOracleRow.cxx:72
 TOracleRow.cxx:73
 TOracleRow.cxx:74
 TOracleRow.cxx:75
 TOracleRow.cxx:76
 TOracleRow.cxx:77
 TOracleRow.cxx:78
 TOracleRow.cxx:79
 TOracleRow.cxx:80
 TOracleRow.cxx:81
 TOracleRow.cxx:82
 TOracleRow.cxx:83
 TOracleRow.cxx:84
 TOracleRow.cxx:85
 TOracleRow.cxx:86
 TOracleRow.cxx:87
 TOracleRow.cxx:88
 TOracleRow.cxx:89
 TOracleRow.cxx:90
 TOracleRow.cxx:91
 TOracleRow.cxx:92
 TOracleRow.cxx:93
 TOracleRow.cxx:94
 TOracleRow.cxx:95
 TOracleRow.cxx:96
 TOracleRow.cxx:97
 TOracleRow.cxx:98
 TOracleRow.cxx:99
 TOracleRow.cxx:100
 TOracleRow.cxx:101
 TOracleRow.cxx:102
 TOracleRow.cxx:103
 TOracleRow.cxx:104
 TOracleRow.cxx:105
 TOracleRow.cxx:106
 TOracleRow.cxx:107
 TOracleRow.cxx:108
 TOracleRow.cxx:109
 TOracleRow.cxx:110
 TOracleRow.cxx:111
 TOracleRow.cxx:112
 TOracleRow.cxx:113
 TOracleRow.cxx:114
 TOracleRow.cxx:115
 TOracleRow.cxx:116
 TOracleRow.cxx:117
 TOracleRow.cxx:118
 TOracleRow.cxx:119
 TOracleRow.cxx:120
 TOracleRow.cxx:121
 TOracleRow.cxx:122
 TOracleRow.cxx:123
 TOracleRow.cxx:124
 TOracleRow.cxx:125
 TOracleRow.cxx:126
 TOracleRow.cxx:127
 TOracleRow.cxx:128
 TOracleRow.cxx:129
 TOracleRow.cxx:130
 TOracleRow.cxx:131
 TOracleRow.cxx:132
 TOracleRow.cxx:133
 TOracleRow.cxx:134
 TOracleRow.cxx:135
 TOracleRow.cxx:136
 TOracleRow.cxx:137
 TOracleRow.cxx:138
 TOracleRow.cxx:139
 TOracleRow.cxx:140
 TOracleRow.cxx:141
 TOracleRow.cxx:142
 TOracleRow.cxx:143
 TOracleRow.cxx:144
 TOracleRow.cxx:145
 TOracleRow.cxx:146
 TOracleRow.cxx:147
 TOracleRow.cxx:148
 TOracleRow.cxx:149
 TOracleRow.cxx:150
 TOracleRow.cxx:151
 TOracleRow.cxx:152
 TOracleRow.cxx:153
 TOracleRow.cxx:154
 TOracleRow.cxx:155
 TOracleRow.cxx:156
 TOracleRow.cxx:157
 TOracleRow.cxx:158
 TOracleRow.cxx:159
 TOracleRow.cxx:160
 TOracleRow.cxx:161
 TOracleRow.cxx:162
 TOracleRow.cxx:163
 TOracleRow.cxx:164
 TOracleRow.cxx:165