ROOT logo
// @(#)root/odbc:$Id$
// Author: Sergey Linev   6/02/2006

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


//________________________________________________________________________
//
//  SQL statement class for ODBC
//
//  See TSQLStatement class documentation for more details
//
//________________________________________________________________________


#include "TODBCStatement.h"
#include "TODBCServer.h"
#include "TDataType.h"
#include "Riostream.h"

#include <sqlext.h>
#include <stdlib.h>

#define kSqlTime      123781
#define kSqlDate      123782
#define kSqlTimestamp 123783
#define kSqlBinary    123784


ClassImp(TODBCStatement)

//______________________________________________________________________________
TODBCStatement::TODBCStatement(SQLHSTMT stmt, Int_t rowarrsize, Bool_t errout) :
   TSQLStatement(errout)
{
   //constructor

   fHstmt = stmt;
   fBufferPreferredSize = rowarrsize;

   fBuffer = 0;
   fStatusBuffer = 0;
   fNumBuffers = 0;
   fBufferLength = 0;
   fBufferCounter = 0;

   fWorkingMode = 0;

   fNumParsProcessed = 0;
   fNumRowsFetched = 0;

   SQLSMALLINT   paramsCount = 0;
   SQLRETURN retcode = SQLNumParams(fHstmt, &paramsCount);
   if (ExtractErrors(retcode,"Constructor"))
      paramsCount = 0;

   if (paramsCount>0) {

      fWorkingMode = 1; // we are now using buffers for parameters
      fNumParsProcessed = 0;

      SQLSetStmtAttr(fHstmt, SQL_ATTR_PARAM_BIND_TYPE, SQL_PARAM_BIND_BY_COLUMN, 0);

      SQLUINTEGER setsize = fBufferPreferredSize;
      retcode = SQLSetStmtAttr(fHstmt, SQL_ATTR_PARAMSET_SIZE, (SQLPOINTER) (long) setsize, 0);
      ExtractErrors(retcode,"Constructor");

      SQLUINTEGER getsize = 0;

      retcode = SQLGetStmtAttr(fHstmt, SQL_ATTR_PARAMSET_SIZE, &getsize, 0, 0);
      ExtractErrors(retcode,"Constructor");

      Int_t bufferlen = fBufferPreferredSize;

      // MySQL is not yet support array of parameters
      if (getsize<=1) bufferlen=1; else
      if (getsize!=setsize) {
         SQLSetStmtAttr(fHstmt, SQL_ATTR_PARAMSET_SIZE, (SQLPOINTER) 1, 0);
         bufferlen = 1;
      }

      SetNumBuffers(paramsCount, bufferlen);

      SQLSetStmtAttr(fHstmt, SQL_ATTR_PARAM_STATUS_PTR, fStatusBuffer, 0);
      SQLSetStmtAttr(fHstmt, SQL_ATTR_PARAMS_PROCESSED_PTR, &fNumParsProcessed, 0);

      // indicates that we are starting
      fBufferCounter = -1;
   }

   fNumRowsFetched = 0;
   fLastResultRow = 0;
}

//______________________________________________________________________________
TODBCStatement::~TODBCStatement()
{
   //destructor

   Close();
}

//______________________________________________________________________________
void TODBCStatement::Close(Option_t *)
{
   // Close statement

   FreeBuffers();

   SQLFreeHandle(SQL_HANDLE_STMT, fHstmt);

   fHstmt=0;
}

//______________________________________________________________________________
Bool_t TODBCStatement::Process()
{
   // process statement

   ClearError();

   SQLRETURN retcode = SQL_SUCCESS;

   if (IsParSettMode()) {

      // check if we start filling buffers, but not complete it
      if (fBufferCounter>=0) {
         // if buffer used not fully, set smaller size of buffer arrays
         if ((fBufferCounter>0) && (fBufferCounter<fBufferLength-1)) {
            SQLUINTEGER setsize = fBufferCounter+1;
            SQLSetStmtAttr(fHstmt, SQL_ATTR_PARAMSET_SIZE, (SQLPOINTER) (long) setsize, 0);
         }
         retcode = SQLExecute(fHstmt);
      }

      // after Process we finish working with parameters data,
      // if necessary, user can try to access resultset of statement
      fWorkingMode = 0;
      FreeBuffers();
      fBufferCounter = -1;
   } else {

      // just execute statement,
      // later one can try to access results of statement
      retcode = SQLExecute(fHstmt);
   }

   return !ExtractErrors(retcode, "Process");
}

//______________________________________________________________________________
Int_t TODBCStatement::GetNumAffectedRows()
{
   //get number of affected rows

   ClearError();

   SQLLEN    rowCount;
   SQLRETURN retcode = SQL_SUCCESS;

   retcode = SQLRowCount(fHstmt, &rowCount);

   if (ExtractErrors(retcode, "GetNumAffectedRows")) return -1;

   return rowCount;
}

//______________________________________________________________________________
Bool_t TODBCStatement::StoreResult()
{
   // Store result of statement processing.
   // Results set, produced by processing of statement, can be stored, and accessed by
   // TODBCStamenet methoods like NextResultRow(), GetInt(), GetLong() and so on.

   ClearError();

   if (IsParSettMode()) {
      SetError(-1,"Call Process() method before","StoreResult");
      return kFALSE;
   }

   FreeBuffers();

   SQLSMALLINT columnCount = 0;

   SQLRETURN retcode = SQLNumResultCols(fHstmt, &columnCount);
   if (ExtractErrors(retcode, "StoreResult")) return kFALSE;

   if (columnCount==0) return kFALSE;

   SetNumBuffers(columnCount, fBufferPreferredSize);

   SQLULEN arrsize = fBufferLength;

   SQLSetStmtAttr(fHstmt, SQL_ATTR_ROW_BIND_TYPE, SQL_BIND_BY_COLUMN, 0);
   SQLSetStmtAttr(fHstmt, SQL_ATTR_ROW_ARRAY_SIZE, (SQLPOINTER) arrsize, 0);
   SQLSetStmtAttr(fHstmt, SQL_ATTR_ROW_STATUS_PTR, fStatusBuffer, 0);
   SQLSetStmtAttr(fHstmt, SQL_ATTR_ROWS_FETCHED_PTR, &fNumRowsFetched, 0);

   for (int n=0;n<fNumBuffers;n++) {
      SQLCHAR     columnName[1024];
      SQLSMALLINT nameLength;
      SQLSMALLINT dataType;
      SQLULEN     columnSize;
      SQLSMALLINT decimalDigits;
      SQLSMALLINT nullable;

      retcode = SQLDescribeCol(fHstmt, n+1, columnName, 1024,
                               &nameLength, &dataType,
                               &columnSize, &decimalDigits, &nullable);

      BindColumn(n, dataType, columnSize);

      if (nameLength>0) {
         fBuffer[n].fBnamebuffer = new char[nameLength+1];
         strlcpy(fBuffer[n].fBnamebuffer, (const char*) columnName, nameLength+1);
      }
   }

   fNumRowsFetched = 0;
   fLastResultRow = 0;

   fWorkingMode = 2;

   return kTRUE;
}

//______________________________________________________________________________
Int_t TODBCStatement::GetNumFields()
{
   //return number of fields

   return IsResultSet() ? fNumBuffers : -1;
}

//______________________________________________________________________________
const char* TODBCStatement::GetFieldName(Int_t nfield)
{
   //return field name

   ClearError();

   if (!IsResultSet() || (nfield<0) || (nfield>=fNumBuffers)) return 0;

   return fBuffer[nfield].fBnamebuffer;
}


//______________________________________________________________________________
Bool_t TODBCStatement::NextResultRow()
{
   //next result row

   ClearError();

   if (!IsResultSet()) return kFALSE;

   if ((fNumRowsFetched==0) ||
       (1.*fBufferCounter >= 1.*(fNumRowsFetched-1))) {

      fBufferCounter = 0;
      fNumRowsFetched = 0;

      SQLRETURN retcode = SQLFetchScroll(fHstmt, SQL_FETCH_NEXT, 0);
      if (retcode==SQL_NO_DATA) fNumRowsFetched=0; else
         ExtractErrors(retcode,"NextResultRow");

      // this is workaround of Oracle Linux ODBC driver
      // it does not returns number of fetched lines, therefore one should
      // calculate it from current row number
      if (!IsError() && (retcode!=SQL_NO_DATA) && (fNumRowsFetched==0)) {
         SQLULEN rownumber = 0;
         SQLRETURN retcode2 = SQLGetStmtAttr(fHstmt, SQL_ATTR_ROW_NUMBER, &rownumber, 0, 0);
         ExtractErrors(retcode2, "NextResultRow");

         if (!IsError()) {
            fNumRowsFetched = rownumber - fLastResultRow;
            fLastResultRow = rownumber;
         }
      }

      if (1.*fNumRowsFetched>fBufferLength)
         SetError(-1, "Missmatch between buffer length and fetched rows number", "NextResultRow");

      if (IsError() || (fNumRowsFetched==0)) {
         fWorkingMode = 0;
         FreeBuffers();
      }

   } else
      fBufferCounter++;

   return IsResultSet();
}

//______________________________________________________________________________
Bool_t TODBCStatement::ExtractErrors(SQLRETURN retcode, const char* method)
{
   // Extract errors, produced by last ODBC function call

   if ((retcode== SQL_SUCCESS) || (retcode == SQL_SUCCESS_WITH_INFO)) return kFALSE;

   SQLINTEGER i = 0;
   SQLINTEGER native;
   SQLCHAR state[ 7 ];
   SQLCHAR text[256];
   SQLSMALLINT len;
   SQLRETURN ret;
   do {
      ret = SQLGetDiagRec(SQL_HANDLE_STMT, fHstmt, ++i, state, &native, text,
                          sizeof(text), &len );
      if (ret == SQL_SUCCESS) SetError(native, (const char*) text, method);
//         Error(method, "%s:%ld:%ld:%s\n", state, i, native, text);
   }
   while( ret == SQL_SUCCESS );
   return kTRUE;
}

//______________________________________________________________________________
Bool_t TODBCStatement::NextIteration()
{
   //run next iteration

   ClearError();

   if (!IsParSettMode() || (fBuffer==0) || (fBufferLength<=0)) return kFALSE;

   if (fBufferCounter>=fBufferLength-1) {
      SQLRETURN retcode = SQLExecute(fHstmt);
      if (ExtractErrors(retcode,"NextIteration")) return kFALSE;
      fBufferCounter = 0;
   } else
      fBufferCounter++;

   // probably, we do not need it, but anyway
   fStatusBuffer[fBufferCounter] = SQL_ROW_SUCCESS;

   return kTRUE;
}

//______________________________________________________________________________
Int_t TODBCStatement::GetNumParameters()
{
   //return number of parameters

   return IsParSettMode() ? fNumBuffers : 0;
}

//______________________________________________________________________________
void TODBCStatement::SetNumBuffers(Int_t isize, Int_t ilen)
{
   //set number of buffers

   FreeBuffers();

   fNumBuffers = isize;
   fBufferLength = ilen;
   fBufferCounter = 0;

   fBuffer = new ODBCBufferRec_t[fNumBuffers];
   for (Int_t n=0;n<fNumBuffers;n++) {
      fBuffer[n].fBroottype = 0;
      fBuffer[n].fBsqltype = 0;
      fBuffer[n].fBsqlctype = 0;
      fBuffer[n].fBbuffer = 0;
      fBuffer[n].fBelementsize = 0;
      fBuffer[n].fBlenarray = 0;
      fBuffer[n].fBstrbuffer = 0;
      fBuffer[n].fBnamebuffer = 0;
   }

   fStatusBuffer = new SQLUSMALLINT[fBufferLength];
}

//______________________________________________________________________________
void TODBCStatement::FreeBuffers()
{
   // Free allocated buffers

   if (fBuffer==0) return;
   for (Int_t n=0;n<fNumBuffers;n++) {
      if (fBuffer[n].fBbuffer!=0)
        free(fBuffer[n].fBbuffer);
      delete[] fBuffer[n].fBlenarray;
      delete[] fBuffer[n].fBstrbuffer;
      delete[] fBuffer[n].fBnamebuffer;
   }

   delete[] fStatusBuffer;
   delete[] fBuffer;
   fBuffer = 0;
   fNumBuffers = 0;
   fBufferLength = 0;
   fStatusBuffer = 0;
}

//______________________________________________________________________________
Bool_t TODBCStatement::BindColumn(Int_t ncol, SQLSMALLINT sqltype, SQLUINTEGER size)
{
   // Bind result column to buffer. Allocate buffer of appropriate type

   ClearError();

   if ((ncol<0) || (ncol>=fNumBuffers)) {
      SetError(-1,"Internal error. Column number invalid","BindColumn");
      return kFALSE;
   }

   if (fBuffer[ncol].fBsqltype!=0) {
      SetError(-1,"Internal error. Bind for column already done","BindColumn");
      return kFALSE;
   }

   SQLSMALLINT sqlctype = 0;
   switch (sqltype) {
      case SQL_CHAR:
      case SQL_VARCHAR:   sqlctype = SQL_C_CHAR; break;
      case SQL_BINARY:
      case SQL_LONGVARBINARY:
      case SQL_VARBINARY: sqlctype = SQL_C_BINARY; break;
      case SQL_LONGVARCHAR: Info("BindColumn","BIG VARCHAR not supported yet"); return kFALSE; break;

      case SQL_DECIMAL:   sqlctype = SQL_C_DOUBLE; break;
      case SQL_NUMERIC:   sqlctype = SQL_C_DOUBLE; break;
      case SQL_SMALLINT:  sqlctype = SQL_C_SLONG; break;
      case SQL_INTEGER:   sqlctype = SQL_C_SLONG; break;
      case SQL_FLOAT:     sqlctype = SQL_C_FLOAT; break;
      case SQL_REAL:
      case SQL_DOUBLE:    sqlctype = SQL_C_DOUBLE; break;
      case SQL_TINYINT:   sqlctype = SQL_C_STINYINT; break;
      case SQL_BIGINT:    sqlctype = SQL_C_SBIGINT; break;
      case SQL_TYPE_DATE: sqlctype = SQL_C_TYPE_DATE; break;
      case SQL_TYPE_TIME: sqlctype = SQL_C_TYPE_TIME; break;
      case SQL_TYPE_TIMESTAMP: sqlctype = SQL_C_TYPE_TIMESTAMP; break;
      default: {
         SetError(-1, Form("SQL type %d not supported",sqltype), "BindColumn");
         return kFALSE;
      }
   }

   int elemsize = 0;

   switch (sqlctype) {
      case SQL_C_ULONG:    elemsize = sizeof(SQLUINTEGER); break;
      case SQL_C_SLONG:    elemsize = sizeof(SQLINTEGER); break;
      case SQL_C_UBIGINT:  elemsize = sizeof(ULong64_t); break; // should be SQLUBIGINT, but it is 64-bit structure on some platforms
      case SQL_C_SBIGINT:  elemsize = sizeof(Long64_t); break; // should be SQLBIGINT, but it is 64-bit structure on some platforms
      case SQL_C_USHORT:   elemsize = sizeof(SQLUSMALLINT); break;
      case SQL_C_SSHORT:   elemsize = sizeof(SQLSMALLINT); break;
      case SQL_C_UTINYINT: elemsize = sizeof(SQLCHAR); break;
      case SQL_C_STINYINT: elemsize = sizeof(SQLSCHAR); break;
      case SQL_C_FLOAT:    elemsize = sizeof(SQLREAL); break;
      case SQL_C_DOUBLE:   elemsize = sizeof(SQLDOUBLE); break;
      case SQL_C_CHAR:     elemsize = size; break;
      case SQL_C_BINARY:   elemsize = size; break;
      case SQL_C_TYPE_DATE: elemsize = sizeof(DATE_STRUCT); break;
      case SQL_C_TYPE_TIME: elemsize = sizeof(TIME_STRUCT); break;
      case SQL_C_TYPE_TIMESTAMP: elemsize = sizeof(TIMESTAMP_STRUCT); break;

      default: {
         SetError(-1, Form("SQL C Type %d is not supported",sqlctype), "BindColumn");
         return kFALSE;
      }
   }

   fBuffer[ncol].fBroottype    = 0;
   fBuffer[ncol].fBsqltype     = sqltype;
   fBuffer[ncol].fBsqlctype    = sqlctype;
   fBuffer[ncol].fBbuffer      = malloc(elemsize * fBufferLength);
   fBuffer[ncol].fBelementsize = elemsize;
   fBuffer[ncol].fBlenarray    = new SQLLEN[fBufferLength];

   SQLRETURN retcode =
      SQLBindCol(fHstmt, ncol+1, sqlctype, fBuffer[ncol].fBbuffer,
                 elemsize,
                 fBuffer[ncol].fBlenarray);

   return !ExtractErrors(retcode, "BindColumn");
}

//______________________________________________________________________________
Bool_t TODBCStatement::BindParam(Int_t npar, Int_t roottype, Int_t size)
{
   // Bind query parameter with buffer. Creates buffer of appropriate type

   ClearError();

   if ((npar<0) || (npar>=fNumBuffers)) return kFALSE;

   if (fBuffer[npar].fBroottype!=0) {
      SetError(-1,Form("ParameterType for par %d already specified", npar),"BindParam");
      return kFALSE;
   }

   SQLSMALLINT sqltype = 0, sqlctype = 0;
   int elemsize = 0;

   switch (roottype) {
      case kUInt_t:     sqltype = SQL_INTEGER; sqlctype = SQL_C_ULONG;    elemsize = sizeof(SQLUINTEGER); break;
      case kInt_t:      sqltype = SQL_INTEGER; sqlctype = SQL_C_SLONG;    elemsize = sizeof(SQLINTEGER); break;
      case kULong_t:    sqltype = SQL_INTEGER; sqlctype = SQL_C_ULONG;    elemsize = sizeof(SQLUINTEGER); break;
      case kLong_t:     sqltype = SQL_INTEGER; sqlctype = SQL_C_SLONG;    elemsize = sizeof(SQLINTEGER); break;

      // here SQLUBIGINT/SQLBIGINT types should be used,
       // but on 32-bit platforms it is structures, which makes its usage inconvinient
      case kULong64_t:  sqltype = SQL_BIGINT;  sqlctype = SQL_C_UBIGINT;  elemsize = sizeof(ULong64_t); break;
      case kLong64_t:   sqltype = SQL_BIGINT;  sqlctype = SQL_C_SBIGINT;  elemsize = sizeof(Long64_t); break;

      case kUShort_t:   sqltype = SQL_SMALLINT;sqlctype = SQL_C_USHORT;   elemsize = sizeof(SQLUSMALLINT); break;
      case kShort_t:    sqltype = SQL_SMALLINT;sqlctype = SQL_C_SSHORT;   elemsize = sizeof(SQLSMALLINT); break;
      case kUChar_t:    sqltype = SQL_TINYINT; sqlctype = SQL_C_UTINYINT; elemsize = sizeof(SQLCHAR); break;
      case kChar_t:     sqltype = SQL_TINYINT; sqlctype = SQL_C_STINYINT; elemsize = sizeof(SQLSCHAR); break;
      case kBool_t:     sqltype = SQL_TINYINT; sqlctype = SQL_C_UTINYINT; elemsize = sizeof(SQLCHAR); break;
      case kFloat_t:    sqltype = SQL_FLOAT;   sqlctype = SQL_C_FLOAT;    elemsize = sizeof(SQLREAL); break;
      case kFloat16_t:  sqltype = SQL_FLOAT;   sqlctype = SQL_C_FLOAT;    elemsize = sizeof(SQLREAL); break;
      case kDouble_t:   sqltype = SQL_DOUBLE;  sqlctype = SQL_C_DOUBLE;   elemsize = sizeof(SQLDOUBLE); break;
      case kDouble32_t: sqltype = SQL_DOUBLE;  sqlctype = SQL_C_DOUBLE;   elemsize = sizeof(SQLDOUBLE); break;
      case kCharStar:   sqltype = SQL_CHAR;    sqlctype = SQL_C_CHAR;     elemsize = size; break;
      case kSqlBinary:  sqltype = SQL_BINARY;  sqlctype = SQL_C_BINARY;   elemsize = size; break;
      case kSqlDate:    sqltype = SQL_TYPE_DATE; sqlctype = SQL_C_TYPE_DATE; elemsize = sizeof(DATE_STRUCT); break;
      case kSqlTime:    sqltype = SQL_TYPE_TIME; sqlctype = SQL_C_TYPE_TIME; elemsize = sizeof(TIME_STRUCT); break;
      case kSqlTimestamp: sqltype = SQL_TYPE_TIMESTAMP; sqlctype = SQL_C_TYPE_TIMESTAMP; elemsize = sizeof(TIMESTAMP_STRUCT); break;
      default: {
         SetError(-1, Form("Root type %d is not supported", roottype), "BindParam");
         return kFALSE;
      }
   }

   void* buffer = malloc(elemsize * fBufferLength);
   SQLLEN* lenarray = new SQLLEN[fBufferLength];
   SQLRETURN retcode =
      SQLBindParameter(fHstmt, npar+1, SQL_PARAM_INPUT,
                       sqlctype, sqltype, 0, 0,
                       buffer, elemsize, lenarray);

   if (ExtractErrors(retcode, "BindParam")) {
      free(buffer);
      delete[] lenarray;
      return kFALSE;
   }

   fBuffer[npar].fBroottype = roottype;
   fBuffer[npar].fBsqlctype = sqlctype;
   fBuffer[npar].fBsqltype = sqltype;
   fBuffer[npar].fBbuffer = buffer;
   fBuffer[npar].fBelementsize = elemsize;
   fBuffer[npar].fBlenarray = lenarray;

   return kTRUE;
}

//______________________________________________________________________________
void* TODBCStatement::GetParAddr(Int_t npar, Int_t roottype, Int_t length)
{
   // Get parameter address

   ClearError();

   if ((fBuffer==0) || (npar<0) || (npar>=fNumBuffers) || (fBufferCounter<0)) {
      SetError(-1, "Invalid parameter number","GetParAddr");
      return 0;
   }

   if (fBuffer[npar].fBbuffer==0) {
      if (IsParSettMode() && (roottype!=0) && (fBufferCounter==0))
         if (!BindParam(npar, roottype, length)) return 0;

      if (fBuffer[npar].fBbuffer==0) return 0;
   }

   if (roottype!=0)
      if (fBuffer[npar].fBroottype!=roottype) return 0;

   return (char*)fBuffer[npar].fBbuffer + fBufferCounter*fBuffer[npar].fBelementsize;
}

//______________________________________________________________________________
long double TODBCStatement::ConvertToNumeric(Int_t npar)
{
   //convert to numeric type
   void* addr = GetParAddr(npar);
   if (addr==0) return 0;

   switch (fBuffer[npar].fBsqlctype) {
      case SQL_C_ULONG:    return *((SQLUINTEGER*) addr); break;
      case SQL_C_SLONG:    return *((SQLINTEGER*) addr); break;
      case SQL_C_UBIGINT:  return *((ULong64_t*) addr); break;
      case SQL_C_SBIGINT:  return *((Long64_t*) addr); break;
      case SQL_C_USHORT:   return *((SQLUSMALLINT*) addr); break;
      case SQL_C_SSHORT:   return *((SQLSMALLINT*) addr); break;
      case SQL_C_UTINYINT: return *((SQLCHAR*) addr); break;
      case SQL_C_STINYINT: return *((SQLSCHAR*) addr); break;
      case SQL_C_FLOAT:    return *((SQLREAL*) addr); break;
      case SQL_C_DOUBLE:   return *((SQLDOUBLE*) addr); break;
      case SQL_C_TYPE_DATE: {
         DATE_STRUCT* dt = (DATE_STRUCT*) addr;
         TDatime rtm(dt->year, dt->month,  dt->day, 0, 0, 0);
         return rtm.GetDate();
         break;
      }
      case SQL_C_TYPE_TIME: {
         TIME_STRUCT* tm = (TIME_STRUCT*) addr;
         TDatime rtm(2000, 1, 1, tm->hour, tm->minute, tm->second);
         return rtm.GetTime();
         break;
      }
      case SQL_C_TYPE_TIMESTAMP: {
         TIMESTAMP_STRUCT* tm = (TIMESTAMP_STRUCT*) addr;
         TDatime rtm(tm->year, tm->month,  tm->day,
                     tm->hour, tm->minute, tm->second);
         return rtm.Get();
         break;
      }
   }
   return 0;
}

//______________________________________________________________________________
const char* TODBCStatement::ConvertToString(Int_t npar)
{
   //convert to string
   void* addr = GetParAddr(npar);
   if (addr==0) return 0;
   if (fBuffer[npar].fBstrbuffer==0)
      fBuffer[npar].fBstrbuffer = new char[100];

   char* buf = fBuffer[npar].fBstrbuffer;

   switch(fBuffer[npar].fBsqlctype) {
#if (SIZEOF_LONG == 8)
      case SQL_C_SLONG:   snprintf(buf, 100, "%d", *((SQLINTEGER*) addr)); break;
      case SQL_C_ULONG:   snprintf(buf, 100, "%u", *((SQLUINTEGER*) addr)); break;
#else
      case SQL_C_SLONG:   snprintf(buf, 100, "%ld", *((SQLINTEGER*) addr)); break;
      case SQL_C_ULONG:   snprintf(buf, 100, "%lu", *((SQLUINTEGER*) addr)); break;
#endif
      case SQL_C_SBIGINT: snprintf(buf, 100, "%lld", *((Long64_t*) addr)); break;
      case SQL_C_UBIGINT: snprintf(buf, 100, "%llu", *((ULong64_t*) addr)); break;
      case SQL_C_SSHORT:  snprintf(buf, 100, "%hd", *((SQLSMALLINT*) addr)); break;
      case SQL_C_USHORT:  snprintf(buf, 100, "%hu", *((SQLUSMALLINT*) addr)); break;
      case SQL_C_STINYINT:snprintf(buf, 100, "%d", *((SQLSCHAR*) addr)); break;
      case SQL_C_UTINYINT:snprintf(buf, 100, "%u", *((SQLCHAR*) addr)); break;
      case SQL_C_FLOAT:   snprintf(buf, 100, TSQLServer::GetFloatFormat(), *((SQLREAL*) addr)); break;
      case SQL_C_DOUBLE:  snprintf(buf, 100, TSQLServer::GetFloatFormat(), *((SQLDOUBLE*) addr)); break;
      case SQL_C_TYPE_DATE: {
         DATE_STRUCT* dt = (DATE_STRUCT*) addr;
         snprintf(buf,100,"%4.4d-%2.2d-%2.2d",
                  dt->year, dt->month,  dt->day);
         break;
      }
      case SQL_C_TYPE_TIME: {
         TIME_STRUCT* tm = (TIME_STRUCT*) addr;
         snprintf(buf,100,"%2.2d:%2.2d:%2.2d",
                  tm->hour, tm->minute, tm->second);
         break;
      }
      case SQL_C_TYPE_TIMESTAMP: {
         TIMESTAMP_STRUCT* tm = (TIMESTAMP_STRUCT*) addr;
         snprintf(buf,100,"%4.4d-%2.2d-%2.2d %2.2d:%2.2d:%2.2d",
                  tm->year, tm->month,  tm->day,
                  tm->hour, tm->minute, tm->second);
         break;
      }
      default: return 0;
   }

   return buf;
}

//______________________________________________________________________________
Bool_t TODBCStatement::IsNull(Int_t npar)
{
   // Verifies if field value is NULL

   void* addr = GetParAddr(npar);
   if (addr==0) return kTRUE;

   return fBuffer[npar].fBlenarray[fBufferCounter] == SQL_NULL_DATA;
}

//______________________________________________________________________________
Int_t TODBCStatement::GetInt(Int_t npar)
{
   //get parameter as integer
   void* addr = GetParAddr(npar);
   if (addr==0) return 0;

   if (fBuffer[npar].fBsqlctype==SQL_C_SLONG)
      return (Int_t) *((SQLINTEGER*) addr);

   return (Int_t) ConvertToNumeric(npar);
}

//______________________________________________________________________________
UInt_t TODBCStatement::GetUInt(Int_t npar)
{
   //get parameter as unsigned integer
   void* addr = GetParAddr(npar);
   if (addr==0) return 0;

   if (fBuffer[npar].fBsqlctype==SQL_C_ULONG)
      return (UInt_t) *((SQLUINTEGER*) addr);

   return (UInt_t) ConvertToNumeric(npar);
}

//______________________________________________________________________________
Long_t TODBCStatement::GetLong(Int_t npar)
{
   //get parameter as Long_t
   void* addr = GetParAddr(npar);
   if (addr==0) return 0;

   if (fBuffer[npar].fBsqlctype==SQL_C_SLONG)
     return (Long_t) *((SQLINTEGER*) addr);

   return (Long_t) ConvertToNumeric(npar);
}

//______________________________________________________________________________
Long64_t TODBCStatement::GetLong64(Int_t npar)
{
   //get parameter as Long64_t
   void* addr = GetParAddr(npar);
   if (addr==0) return 0;

   if (fBuffer[npar].fBsqlctype==SQL_C_SBIGINT)
     return *((Long64_t*) addr);

   return (Long64_t) ConvertToNumeric(npar);
}

//______________________________________________________________________________
ULong64_t TODBCStatement::GetULong64(Int_t npar)
{
   //get parameter as ULong64_t
   void* addr = GetParAddr(npar);
   if (addr==0) return 0;

   if (fBuffer[npar].fBsqlctype==SQL_C_UBIGINT)
     return *((ULong64_t*) addr);

   return (ULong64_t) ConvertToNumeric(npar);
}

//______________________________________________________________________________
Double_t TODBCStatement::GetDouble(Int_t npar)
{
   //get parameter as Double_t
   void* addr = GetParAddr(npar);
   if (addr==0) return 0;

   if (fBuffer[npar].fBsqlctype==SQL_C_DOUBLE)
     return *((SQLDOUBLE*) addr);

   return (Double_t) ConvertToNumeric(npar);
}

//______________________________________________________________________________
const char* TODBCStatement::GetString(Int_t npar)
{
   //get parameter as string

   void* addr = GetParAddr(npar);
   if (addr==0) return 0;

   if (fBuffer[npar].fBsqlctype==SQL_C_CHAR) {
      // first check if string is null

      int len = fBuffer[npar].fBlenarray[fBufferCounter];

      if ((len == SQL_NULL_DATA) || (len==0)) return 0;

      char* res = (char*) addr;
      if (len < fBuffer[npar].fBelementsize) {
         *(res + len) = 0;
         return res;
      }

      if (len > fBuffer[npar].fBelementsize) {
         SetError(-1, Form("Problems with string size %d", len), "GetString");
         return 0;
      }

      if (fBuffer[npar].fBstrbuffer==0)
         fBuffer[npar].fBstrbuffer = new char[len+1];

      strlcpy(fBuffer[npar].fBstrbuffer, res, len+1);

      res = fBuffer[npar].fBstrbuffer;
      *(res + len) = 0;
      return res;
   }

   return ConvertToString(npar);
}

//______________________________________________________________________________
Bool_t TODBCStatement::GetBinary(Int_t npar, void* &mem, Long_t& size)
{
   // return parameter as binary data

   mem = 0;
   size = 0;

   void* addr = GetParAddr(npar);
   if (addr==0) return kFALSE;

   if ((fBuffer[npar].fBsqlctype==SQL_C_BINARY) ||
       (fBuffer[npar].fBsqlctype==SQL_C_CHAR)) {

      // first check if data length is null
      int len = fBuffer[npar].fBlenarray[fBufferCounter];

      if ((len == SQL_NULL_DATA) || (len==0)) return kTRUE;

      size = len;

      if (fBuffer[npar].fBstrbuffer==0)
         fBuffer[npar].fBstrbuffer = new char[size];

      memcpy(fBuffer[npar].fBstrbuffer, addr, size);

      mem = fBuffer[npar].fBstrbuffer;

      return kTRUE;
   }

   return kFALSE;
}


//______________________________________________________________________________
Bool_t TODBCStatement::GetDate(Int_t npar, Int_t& year, Int_t& month, Int_t& day)
{
   // return field value as date

   void* addr = GetParAddr(npar);
   if (addr==0) return kFALSE;

   if (fBuffer[npar].fBsqlctype!=SQL_C_TYPE_DATE) return kFALSE;

   DATE_STRUCT* dt = (DATE_STRUCT*) addr;
   year = dt->year;
   month = dt->month;
   day = dt->day;

   return kTRUE;
}

//______________________________________________________________________________
Bool_t TODBCStatement::GetTime(Int_t npar, Int_t& hour, Int_t& min, Int_t& sec)
{
   // return field value as time

   void* addr = GetParAddr(npar);
   if (addr==0) return kFALSE;

   if (fBuffer[npar].fBsqlctype!=SQL_C_TYPE_TIME) return kFALSE;

   TIME_STRUCT* tm = (TIME_STRUCT*) addr;
   hour = tm->hour;
   min = tm->minute;
   sec = tm->second;

   return kTRUE;
}

//______________________________________________________________________________
Bool_t TODBCStatement::GetDatime(Int_t npar, Int_t& year, Int_t& month, Int_t& day, Int_t& hour, Int_t& min, Int_t& sec)
{
   // return field value as date & time

   void* addr = GetParAddr(npar);
   if (addr==0) return kFALSE;

   if (fBuffer[npar].fBsqlctype!=SQL_C_TYPE_TIMESTAMP) return kFALSE;

   TIMESTAMP_STRUCT* tm = (TIMESTAMP_STRUCT*) addr;

   year = tm->year;
   month = tm->month;
   day = tm->day;
   hour = tm->hour;
   min = tm->minute;
   sec = tm->second;
   return kTRUE;
}

//______________________________________________________________________________
Bool_t TODBCStatement::GetTimestamp(Int_t npar, Int_t& year, Int_t& month, Int_t& day, Int_t& hour, Int_t& min, Int_t& sec, Int_t& frac)
{
   // return field value as time stamp

   void* addr = GetParAddr(npar);
   if (addr==0) return kFALSE;

   if (fBuffer[npar].fBsqlctype!=SQL_C_TYPE_TIMESTAMP) return kFALSE;

   TIMESTAMP_STRUCT* tm = (TIMESTAMP_STRUCT*) addr;

   year = tm->year;
   month = tm->month;
   day = tm->day;
   hour = tm->hour;
   min = tm->minute;
   sec = tm->second;
   frac = tm->fraction;
   return kTRUE;
}


//______________________________________________________________________________
Bool_t TODBCStatement::SetNull(Int_t npar)
{
   // Set NULL as parameter value
   // If NULL should be set for statement parameter during first iteration,
   // one should call before proper Set... method to identify type of argument for
   // the future. For instance, if one suppose to have double as type of parameter,
   // code should look like:
   //    stmt->SetDouble(2, 0.);
   //    stmt->SetNull(2);

   void* addr = GetParAddr(npar, kInt_t);
   if (addr!=0)
      *((SQLINTEGER*) addr) = 0;

   if ((npar>=0) && (npar<fNumBuffers))
      fBuffer[npar].fBlenarray[fBufferCounter] = SQL_NULL_DATA;

   return kTRUE;
}

//______________________________________________________________________________
Bool_t TODBCStatement::SetInt(Int_t npar, Int_t value)
{
   //set parameter as Int_t
   void* addr = GetParAddr(npar, kInt_t);
   if (addr==0) return kFALSE;

   *((SQLINTEGER*) addr) = value;

   fBuffer[npar].fBlenarray[fBufferCounter] = 0;

   return kTRUE;
}

//______________________________________________________________________________
Bool_t TODBCStatement::SetUInt(Int_t npar, UInt_t value)
{
   //set parameter as UInt_t
   void* addr = GetParAddr(npar, kUInt_t);
   if (addr==0) return kFALSE;

   *((SQLUINTEGER*) addr) = value;

   fBuffer[npar].fBlenarray[fBufferCounter] = 0;

   return kTRUE;
}

//______________________________________________________________________________
Bool_t TODBCStatement::SetLong(Int_t npar, Long_t value)
{
   //set parameter as Long_t
   void* addr = GetParAddr(npar, kLong_t);
   if (addr==0) return kFALSE;

   *((SQLINTEGER*) addr) = value;

   fBuffer[npar].fBlenarray[fBufferCounter] = 0;

   return kTRUE;
}

//______________________________________________________________________________
Bool_t TODBCStatement::SetLong64(Int_t npar, Long64_t value)
{
   //set parameter as Long64_t
   void* addr = GetParAddr(npar, kLong64_t);
   if (addr==0) return kFALSE;

   *((Long64_t*) addr) = value;

   fBuffer[npar].fBlenarray[fBufferCounter] = 0;

   return kTRUE;
}

//______________________________________________________________________________
Bool_t TODBCStatement::SetULong64(Int_t npar, ULong64_t value)
{
   //set parameter as ULong64_t

   void* addr = GetParAddr(npar, kULong64_t);
   if (addr==0) return kFALSE;

   *((ULong64_t*) addr) = value;

   fBuffer[npar].fBlenarray[fBufferCounter] = 0;

   return kTRUE;
}

//______________________________________________________________________________
Bool_t TODBCStatement::SetDouble(Int_t npar, Double_t value)
{
   //set parameter as Double_t

   void* addr = GetParAddr(npar, kDouble_t);
   if (addr==0) return kFALSE;

   *((SQLDOUBLE*) addr) = value;

   fBuffer[npar].fBlenarray[fBufferCounter] = 0;

   return kTRUE;
}

//______________________________________________________________________________
Bool_t TODBCStatement::SetString(Int_t npar, const char* value, Int_t maxsize)
{
   //set parameter as string
   void* addr = GetParAddr(npar, kCharStar, maxsize);

   if (addr==0) return kFALSE;

   if (value) {
      int len = strlen(value);

      if (len>=fBuffer[npar].fBelementsize) {
         len = fBuffer[npar].fBelementsize;
         strlcpy((char*) addr, value, len+1);
         fBuffer[npar].fBlenarray[fBufferCounter] = len;
         
      } else if (len>0) {
         strlcpy((char*) addr, value, maxsize);
         fBuffer[npar].fBlenarray[fBufferCounter] = SQL_NTS;
      } else {
         *((char*) addr) = 0;
         fBuffer[npar].fBlenarray[fBufferCounter] = SQL_NTS;
      }
   } else {
      *((char*) addr) = 0;
      fBuffer[npar].fBlenarray[fBufferCounter] = SQL_NTS;      
   }

   return kTRUE;
}

//______________________________________________________________________________
Bool_t TODBCStatement::SetBinary(Int_t npar, void* mem, Long_t size, Long_t maxsize)
{
   //set parameter value as binary data

   void* addr = GetParAddr(npar, kSqlBinary, maxsize);
   if (addr==0) return kFALSE;

   if (size>fBuffer[npar].fBelementsize)
      size = fBuffer[npar].fBelementsize;

   memcpy(addr, mem, size);
   fBuffer[npar].fBlenarray[fBufferCounter] = size;

   return kTRUE;
}

//______________________________________________________________________________
Bool_t TODBCStatement::SetDate(Int_t npar, Int_t year, Int_t month, Int_t day)
{
   // set parameter value as date

   void* addr = GetParAddr(npar, kSqlDate);
   if (addr==0) return kFALSE;

   DATE_STRUCT* dt = (DATE_STRUCT*) addr;
   dt->year = year;
   dt->month = month;
   dt->day = day;

   fBuffer[npar].fBlenarray[fBufferCounter] = 0;

   return kTRUE;
}

//______________________________________________________________________________
Bool_t TODBCStatement::SetTime(Int_t npar, Int_t hour, Int_t min, Int_t sec)
{
   // set parameter value as time

   void* addr = GetParAddr(npar, kSqlTime);
   if (addr==0) return kFALSE;

   TIME_STRUCT* tm = (TIME_STRUCT*) addr;
   tm->hour = hour;
   tm->minute = min;
   tm->second = sec;

   fBuffer[npar].fBlenarray[fBufferCounter] = 0;

   return kTRUE;
}

//______________________________________________________________________________
Bool_t TODBCStatement::SetDatime(Int_t npar, Int_t year, Int_t month, Int_t day, Int_t hour, Int_t min, Int_t sec)
{
   // set parameter value as date & time

   void* addr = GetParAddr(npar, kSqlTimestamp);
   if (addr==0) return kFALSE;

   TIMESTAMP_STRUCT* tm = (TIMESTAMP_STRUCT*) addr;
   tm->year = year;
   tm->month = month;
   tm->day = day;
   tm->hour = hour;
   tm->minute = min;
   tm->second = sec;
   tm->fraction = 0;

   fBuffer[npar].fBlenarray[fBufferCounter] = 0;

   return kTRUE;
}

//______________________________________________________________________________
Bool_t TODBCStatement::SetTimestamp(Int_t npar, Int_t year, Int_t month, Int_t day, Int_t hour, Int_t min, Int_t sec, Int_t frac)
{
   // set parameter value as timestamp

   void* addr = GetParAddr(npar, kSqlTimestamp);
   if (addr==0) return kFALSE;

   TIMESTAMP_STRUCT* tm = (TIMESTAMP_STRUCT*) addr;
   tm->year = year;
   tm->month = month;
   tm->day = day;
   tm->hour = hour;
   tm->minute = min;
   tm->second = sec;
   tm->fraction = frac;

   fBuffer[npar].fBlenarray[fBufferCounter] = 0;

   return kTRUE;
}
 TODBCStatement.cxx:1
 TODBCStatement.cxx:2
 TODBCStatement.cxx:3
 TODBCStatement.cxx:4
 TODBCStatement.cxx:5
 TODBCStatement.cxx:6
 TODBCStatement.cxx:7
 TODBCStatement.cxx:8
 TODBCStatement.cxx:9
 TODBCStatement.cxx:10
 TODBCStatement.cxx:11
 TODBCStatement.cxx:12
 TODBCStatement.cxx:13
 TODBCStatement.cxx:14
 TODBCStatement.cxx:15
 TODBCStatement.cxx:16
 TODBCStatement.cxx:17
 TODBCStatement.cxx:18
 TODBCStatement.cxx:19
 TODBCStatement.cxx:20
 TODBCStatement.cxx:21
 TODBCStatement.cxx:22
 TODBCStatement.cxx:23
 TODBCStatement.cxx:24
 TODBCStatement.cxx:25
 TODBCStatement.cxx:26
 TODBCStatement.cxx:27
 TODBCStatement.cxx:28
 TODBCStatement.cxx:29
 TODBCStatement.cxx:30
 TODBCStatement.cxx:31
 TODBCStatement.cxx:32
 TODBCStatement.cxx:33
 TODBCStatement.cxx:34
 TODBCStatement.cxx:35
 TODBCStatement.cxx:36
 TODBCStatement.cxx:37
 TODBCStatement.cxx:38
 TODBCStatement.cxx:39
 TODBCStatement.cxx:40
 TODBCStatement.cxx:41
 TODBCStatement.cxx:42
 TODBCStatement.cxx:43
 TODBCStatement.cxx:44
 TODBCStatement.cxx:45
 TODBCStatement.cxx:46
 TODBCStatement.cxx:47
 TODBCStatement.cxx:48
 TODBCStatement.cxx:49
 TODBCStatement.cxx:50
 TODBCStatement.cxx:51
 TODBCStatement.cxx:52
 TODBCStatement.cxx:53
 TODBCStatement.cxx:54
 TODBCStatement.cxx:55
 TODBCStatement.cxx:56
 TODBCStatement.cxx:57
 TODBCStatement.cxx:58
 TODBCStatement.cxx:59
 TODBCStatement.cxx:60
 TODBCStatement.cxx:61
 TODBCStatement.cxx:62
 TODBCStatement.cxx:63
 TODBCStatement.cxx:64
 TODBCStatement.cxx:65
 TODBCStatement.cxx:66
 TODBCStatement.cxx:67
 TODBCStatement.cxx:68
 TODBCStatement.cxx:69
 TODBCStatement.cxx:70
 TODBCStatement.cxx:71
 TODBCStatement.cxx:72
 TODBCStatement.cxx:73
 TODBCStatement.cxx:74
 TODBCStatement.cxx:75
 TODBCStatement.cxx:76
 TODBCStatement.cxx:77
 TODBCStatement.cxx:78
 TODBCStatement.cxx:79
 TODBCStatement.cxx:80
 TODBCStatement.cxx:81
 TODBCStatement.cxx:82
 TODBCStatement.cxx:83
 TODBCStatement.cxx:84
 TODBCStatement.cxx:85
 TODBCStatement.cxx:86
 TODBCStatement.cxx:87
 TODBCStatement.cxx:88
 TODBCStatement.cxx:89
 TODBCStatement.cxx:90
 TODBCStatement.cxx:91
 TODBCStatement.cxx:92
 TODBCStatement.cxx:93
 TODBCStatement.cxx:94
 TODBCStatement.cxx:95
 TODBCStatement.cxx:96
 TODBCStatement.cxx:97
 TODBCStatement.cxx:98
 TODBCStatement.cxx:99
 TODBCStatement.cxx:100
 TODBCStatement.cxx:101
 TODBCStatement.cxx:102
 TODBCStatement.cxx:103
 TODBCStatement.cxx:104
 TODBCStatement.cxx:105
 TODBCStatement.cxx:106
 TODBCStatement.cxx:107
 TODBCStatement.cxx:108
 TODBCStatement.cxx:109
 TODBCStatement.cxx:110
 TODBCStatement.cxx:111
 TODBCStatement.cxx:112
 TODBCStatement.cxx:113
 TODBCStatement.cxx:114
 TODBCStatement.cxx:115
 TODBCStatement.cxx:116
 TODBCStatement.cxx:117
 TODBCStatement.cxx:118
 TODBCStatement.cxx:119
 TODBCStatement.cxx:120
 TODBCStatement.cxx:121
 TODBCStatement.cxx:122
 TODBCStatement.cxx:123
 TODBCStatement.cxx:124
 TODBCStatement.cxx:125
 TODBCStatement.cxx:126
 TODBCStatement.cxx:127
 TODBCStatement.cxx:128
 TODBCStatement.cxx:129
 TODBCStatement.cxx:130
 TODBCStatement.cxx:131
 TODBCStatement.cxx:132
 TODBCStatement.cxx:133
 TODBCStatement.cxx:134
 TODBCStatement.cxx:135
 TODBCStatement.cxx:136
 TODBCStatement.cxx:137
 TODBCStatement.cxx:138
 TODBCStatement.cxx:139
 TODBCStatement.cxx:140
 TODBCStatement.cxx:141
 TODBCStatement.cxx:142
 TODBCStatement.cxx:143
 TODBCStatement.cxx:144
 TODBCStatement.cxx:145
 TODBCStatement.cxx:146
 TODBCStatement.cxx:147
 TODBCStatement.cxx:148
 TODBCStatement.cxx:149
 TODBCStatement.cxx:150
 TODBCStatement.cxx:151
 TODBCStatement.cxx:152
 TODBCStatement.cxx:153
 TODBCStatement.cxx:154
 TODBCStatement.cxx:155
 TODBCStatement.cxx:156
 TODBCStatement.cxx:157
 TODBCStatement.cxx:158
 TODBCStatement.cxx:159
 TODBCStatement.cxx:160
 TODBCStatement.cxx:161
 TODBCStatement.cxx:162
 TODBCStatement.cxx:163
 TODBCStatement.cxx:164
 TODBCStatement.cxx:165
 TODBCStatement.cxx:166
 TODBCStatement.cxx:167
 TODBCStatement.cxx:168
 TODBCStatement.cxx:169
 TODBCStatement.cxx:170
 TODBCStatement.cxx:171
 TODBCStatement.cxx:172
 TODBCStatement.cxx:173
 TODBCStatement.cxx:174
 TODBCStatement.cxx:175
 TODBCStatement.cxx:176
 TODBCStatement.cxx:177
 TODBCStatement.cxx:178
 TODBCStatement.cxx:179
 TODBCStatement.cxx:180
 TODBCStatement.cxx:181
 TODBCStatement.cxx:182
 TODBCStatement.cxx:183
 TODBCStatement.cxx:184
 TODBCStatement.cxx:185
 TODBCStatement.cxx:186
 TODBCStatement.cxx:187
 TODBCStatement.cxx:188
 TODBCStatement.cxx:189
 TODBCStatement.cxx:190
 TODBCStatement.cxx:191
 TODBCStatement.cxx:192
 TODBCStatement.cxx:193
 TODBCStatement.cxx:194
 TODBCStatement.cxx:195
 TODBCStatement.cxx:196
 TODBCStatement.cxx:197
 TODBCStatement.cxx:198
 TODBCStatement.cxx:199
 TODBCStatement.cxx:200
 TODBCStatement.cxx:201
 TODBCStatement.cxx:202
 TODBCStatement.cxx:203
 TODBCStatement.cxx:204
 TODBCStatement.cxx:205
 TODBCStatement.cxx:206
 TODBCStatement.cxx:207
 TODBCStatement.cxx:208
 TODBCStatement.cxx:209
 TODBCStatement.cxx:210
 TODBCStatement.cxx:211
 TODBCStatement.cxx:212
 TODBCStatement.cxx:213
 TODBCStatement.cxx:214
 TODBCStatement.cxx:215
 TODBCStatement.cxx:216
 TODBCStatement.cxx:217
 TODBCStatement.cxx:218
 TODBCStatement.cxx:219
 TODBCStatement.cxx:220
 TODBCStatement.cxx:221
 TODBCStatement.cxx:222
 TODBCStatement.cxx:223
 TODBCStatement.cxx:224
 TODBCStatement.cxx:225
 TODBCStatement.cxx:226
 TODBCStatement.cxx:227
 TODBCStatement.cxx:228
 TODBCStatement.cxx:229
 TODBCStatement.cxx:230
 TODBCStatement.cxx:231
 TODBCStatement.cxx:232
 TODBCStatement.cxx:233
 TODBCStatement.cxx:234
 TODBCStatement.cxx:235
 TODBCStatement.cxx:236
 TODBCStatement.cxx:237
 TODBCStatement.cxx:238
 TODBCStatement.cxx:239
 TODBCStatement.cxx:240
 TODBCStatement.cxx:241
 TODBCStatement.cxx:242
 TODBCStatement.cxx:243
 TODBCStatement.cxx:244
 TODBCStatement.cxx:245
 TODBCStatement.cxx:246
 TODBCStatement.cxx:247
 TODBCStatement.cxx:248
 TODBCStatement.cxx:249
 TODBCStatement.cxx:250
 TODBCStatement.cxx:251
 TODBCStatement.cxx:252
 TODBCStatement.cxx:253
 TODBCStatement.cxx:254
 TODBCStatement.cxx:255
 TODBCStatement.cxx:256
 TODBCStatement.cxx:257
 TODBCStatement.cxx:258
 TODBCStatement.cxx:259
 TODBCStatement.cxx:260
 TODBCStatement.cxx:261
 TODBCStatement.cxx:262
 TODBCStatement.cxx:263
 TODBCStatement.cxx:264
 TODBCStatement.cxx:265
 TODBCStatement.cxx:266
 TODBCStatement.cxx:267
 TODBCStatement.cxx:268
 TODBCStatement.cxx:269
 TODBCStatement.cxx:270
 TODBCStatement.cxx:271
 TODBCStatement.cxx:272
 TODBCStatement.cxx:273
 TODBCStatement.cxx:274
 TODBCStatement.cxx:275
 TODBCStatement.cxx:276
 TODBCStatement.cxx:277
 TODBCStatement.cxx:278
 TODBCStatement.cxx:279
 TODBCStatement.cxx:280
 TODBCStatement.cxx:281
 TODBCStatement.cxx:282
 TODBCStatement.cxx:283
 TODBCStatement.cxx:284
 TODBCStatement.cxx:285
 TODBCStatement.cxx:286
 TODBCStatement.cxx:287
 TODBCStatement.cxx:288
 TODBCStatement.cxx:289
 TODBCStatement.cxx:290
 TODBCStatement.cxx:291
 TODBCStatement.cxx:292
 TODBCStatement.cxx:293
 TODBCStatement.cxx:294
 TODBCStatement.cxx:295
 TODBCStatement.cxx:296
 TODBCStatement.cxx:297
 TODBCStatement.cxx:298
 TODBCStatement.cxx:299
 TODBCStatement.cxx:300
 TODBCStatement.cxx:301
 TODBCStatement.cxx:302
 TODBCStatement.cxx:303
 TODBCStatement.cxx:304
 TODBCStatement.cxx:305
 TODBCStatement.cxx:306
 TODBCStatement.cxx:307
 TODBCStatement.cxx:308
 TODBCStatement.cxx:309
 TODBCStatement.cxx:310
 TODBCStatement.cxx:311
 TODBCStatement.cxx:312
 TODBCStatement.cxx:313
 TODBCStatement.cxx:314
 TODBCStatement.cxx:315
 TODBCStatement.cxx:316
 TODBCStatement.cxx:317
 TODBCStatement.cxx:318
 TODBCStatement.cxx:319
 TODBCStatement.cxx:320
 TODBCStatement.cxx:321
 TODBCStatement.cxx:322
 TODBCStatement.cxx:323
 TODBCStatement.cxx:324
 TODBCStatement.cxx:325
 TODBCStatement.cxx:326
 TODBCStatement.cxx:327
 TODBCStatement.cxx:328
 TODBCStatement.cxx:329
 TODBCStatement.cxx:330
 TODBCStatement.cxx:331
 TODBCStatement.cxx:332
 TODBCStatement.cxx:333
 TODBCStatement.cxx:334
 TODBCStatement.cxx:335
 TODBCStatement.cxx:336
 TODBCStatement.cxx:337
 TODBCStatement.cxx:338
 TODBCStatement.cxx:339
 TODBCStatement.cxx:340
 TODBCStatement.cxx:341
 TODBCStatement.cxx:342
 TODBCStatement.cxx:343
 TODBCStatement.cxx:344
 TODBCStatement.cxx:345
 TODBCStatement.cxx:346
 TODBCStatement.cxx:347
 TODBCStatement.cxx:348
 TODBCStatement.cxx:349
 TODBCStatement.cxx:350
 TODBCStatement.cxx:351
 TODBCStatement.cxx:352
 TODBCStatement.cxx:353
 TODBCStatement.cxx:354
 TODBCStatement.cxx:355
 TODBCStatement.cxx:356
 TODBCStatement.cxx:357
 TODBCStatement.cxx:358
 TODBCStatement.cxx:359
 TODBCStatement.cxx:360
 TODBCStatement.cxx:361
 TODBCStatement.cxx:362
 TODBCStatement.cxx:363
 TODBCStatement.cxx:364
 TODBCStatement.cxx:365
 TODBCStatement.cxx:366
 TODBCStatement.cxx:367
 TODBCStatement.cxx:368
 TODBCStatement.cxx:369
 TODBCStatement.cxx:370
 TODBCStatement.cxx:371
 TODBCStatement.cxx:372
 TODBCStatement.cxx:373
 TODBCStatement.cxx:374
 TODBCStatement.cxx:375
 TODBCStatement.cxx:376
 TODBCStatement.cxx:377
 TODBCStatement.cxx:378
 TODBCStatement.cxx:379
 TODBCStatement.cxx:380
 TODBCStatement.cxx:381
 TODBCStatement.cxx:382
 TODBCStatement.cxx:383
 TODBCStatement.cxx:384
 TODBCStatement.cxx:385
 TODBCStatement.cxx:386
 TODBCStatement.cxx:387
 TODBCStatement.cxx:388
 TODBCStatement.cxx:389
 TODBCStatement.cxx:390
 TODBCStatement.cxx:391
 TODBCStatement.cxx:392
 TODBCStatement.cxx:393
 TODBCStatement.cxx:394
 TODBCStatement.cxx:395
 TODBCStatement.cxx:396
 TODBCStatement.cxx:397
 TODBCStatement.cxx:398
 TODBCStatement.cxx:399
 TODBCStatement.cxx:400
 TODBCStatement.cxx:401
 TODBCStatement.cxx:402
 TODBCStatement.cxx:403
 TODBCStatement.cxx:404
 TODBCStatement.cxx:405
 TODBCStatement.cxx:406
 TODBCStatement.cxx:407
 TODBCStatement.cxx:408
 TODBCStatement.cxx:409
 TODBCStatement.cxx:410
 TODBCStatement.cxx:411
 TODBCStatement.cxx:412
 TODBCStatement.cxx:413
 TODBCStatement.cxx:414
 TODBCStatement.cxx:415
 TODBCStatement.cxx:416
 TODBCStatement.cxx:417
 TODBCStatement.cxx:418
 TODBCStatement.cxx:419
 TODBCStatement.cxx:420
 TODBCStatement.cxx:421
 TODBCStatement.cxx:422
 TODBCStatement.cxx:423
 TODBCStatement.cxx:424
 TODBCStatement.cxx:425
 TODBCStatement.cxx:426
 TODBCStatement.cxx:427
 TODBCStatement.cxx:428
 TODBCStatement.cxx:429
 TODBCStatement.cxx:430
 TODBCStatement.cxx:431
 TODBCStatement.cxx:432
 TODBCStatement.cxx:433
 TODBCStatement.cxx:434
 TODBCStatement.cxx:435
 TODBCStatement.cxx:436
 TODBCStatement.cxx:437
 TODBCStatement.cxx:438
 TODBCStatement.cxx:439
 TODBCStatement.cxx:440
 TODBCStatement.cxx:441
 TODBCStatement.cxx:442
 TODBCStatement.cxx:443
 TODBCStatement.cxx:444
 TODBCStatement.cxx:445
 TODBCStatement.cxx:446
 TODBCStatement.cxx:447
 TODBCStatement.cxx:448
 TODBCStatement.cxx:449
 TODBCStatement.cxx:450
 TODBCStatement.cxx:451
 TODBCStatement.cxx:452
 TODBCStatement.cxx:453
 TODBCStatement.cxx:454
 TODBCStatement.cxx:455
 TODBCStatement.cxx:456
 TODBCStatement.cxx:457
 TODBCStatement.cxx:458
 TODBCStatement.cxx:459
 TODBCStatement.cxx:460
 TODBCStatement.cxx:461
 TODBCStatement.cxx:462
 TODBCStatement.cxx:463
 TODBCStatement.cxx:464
 TODBCStatement.cxx:465
 TODBCStatement.cxx:466
 TODBCStatement.cxx:467
 TODBCStatement.cxx:468
 TODBCStatement.cxx:469
 TODBCStatement.cxx:470
 TODBCStatement.cxx:471
 TODBCStatement.cxx:472
 TODBCStatement.cxx:473
 TODBCStatement.cxx:474
 TODBCStatement.cxx:475
 TODBCStatement.cxx:476
 TODBCStatement.cxx:477
 TODBCStatement.cxx:478
 TODBCStatement.cxx:479
 TODBCStatement.cxx:480
 TODBCStatement.cxx:481
 TODBCStatement.cxx:482
 TODBCStatement.cxx:483
 TODBCStatement.cxx:484
 TODBCStatement.cxx:485
 TODBCStatement.cxx:486
 TODBCStatement.cxx:487
 TODBCStatement.cxx:488
 TODBCStatement.cxx:489
 TODBCStatement.cxx:490
 TODBCStatement.cxx:491
 TODBCStatement.cxx:492
 TODBCStatement.cxx:493
 TODBCStatement.cxx:494
 TODBCStatement.cxx:495
 TODBCStatement.cxx:496
 TODBCStatement.cxx:497
 TODBCStatement.cxx:498
 TODBCStatement.cxx:499
 TODBCStatement.cxx:500
 TODBCStatement.cxx:501
 TODBCStatement.cxx:502
 TODBCStatement.cxx:503
 TODBCStatement.cxx:504
 TODBCStatement.cxx:505
 TODBCStatement.cxx:506
 TODBCStatement.cxx:507
 TODBCStatement.cxx:508
 TODBCStatement.cxx:509
 TODBCStatement.cxx:510
 TODBCStatement.cxx:511
 TODBCStatement.cxx:512
 TODBCStatement.cxx:513
 TODBCStatement.cxx:514
 TODBCStatement.cxx:515
 TODBCStatement.cxx:516
 TODBCStatement.cxx:517
 TODBCStatement.cxx:518
 TODBCStatement.cxx:519
 TODBCStatement.cxx:520
 TODBCStatement.cxx:521
 TODBCStatement.cxx:522
 TODBCStatement.cxx:523
 TODBCStatement.cxx:524
 TODBCStatement.cxx:525
 TODBCStatement.cxx:526
 TODBCStatement.cxx:527
 TODBCStatement.cxx:528
 TODBCStatement.cxx:529
 TODBCStatement.cxx:530
 TODBCStatement.cxx:531
 TODBCStatement.cxx:532
 TODBCStatement.cxx:533
 TODBCStatement.cxx:534
 TODBCStatement.cxx:535
 TODBCStatement.cxx:536
 TODBCStatement.cxx:537
 TODBCStatement.cxx:538
 TODBCStatement.cxx:539
 TODBCStatement.cxx:540
 TODBCStatement.cxx:541
 TODBCStatement.cxx:542
 TODBCStatement.cxx:543
 TODBCStatement.cxx:544
 TODBCStatement.cxx:545
 TODBCStatement.cxx:546
 TODBCStatement.cxx:547
 TODBCStatement.cxx:548
 TODBCStatement.cxx:549
 TODBCStatement.cxx:550
 TODBCStatement.cxx:551
 TODBCStatement.cxx:552
 TODBCStatement.cxx:553
 TODBCStatement.cxx:554
 TODBCStatement.cxx:555
 TODBCStatement.cxx:556
 TODBCStatement.cxx:557
 TODBCStatement.cxx:558
 TODBCStatement.cxx:559
 TODBCStatement.cxx:560
 TODBCStatement.cxx:561
 TODBCStatement.cxx:562
 TODBCStatement.cxx:563
 TODBCStatement.cxx:564
 TODBCStatement.cxx:565
 TODBCStatement.cxx:566
 TODBCStatement.cxx:567
 TODBCStatement.cxx:568
 TODBCStatement.cxx:569
 TODBCStatement.cxx:570
 TODBCStatement.cxx:571
 TODBCStatement.cxx:572
 TODBCStatement.cxx:573
 TODBCStatement.cxx:574
 TODBCStatement.cxx:575
 TODBCStatement.cxx:576
 TODBCStatement.cxx:577
 TODBCStatement.cxx:578
 TODBCStatement.cxx:579
 TODBCStatement.cxx:580
 TODBCStatement.cxx:581
 TODBCStatement.cxx:582
 TODBCStatement.cxx:583
 TODBCStatement.cxx:584
 TODBCStatement.cxx:585
 TODBCStatement.cxx:586
 TODBCStatement.cxx:587
 TODBCStatement.cxx:588
 TODBCStatement.cxx:589
 TODBCStatement.cxx:590
 TODBCStatement.cxx:591
 TODBCStatement.cxx:592
 TODBCStatement.cxx:593
 TODBCStatement.cxx:594
 TODBCStatement.cxx:595
 TODBCStatement.cxx:596
 TODBCStatement.cxx:597
 TODBCStatement.cxx:598
 TODBCStatement.cxx:599
 TODBCStatement.cxx:600
 TODBCStatement.cxx:601
 TODBCStatement.cxx:602
 TODBCStatement.cxx:603
 TODBCStatement.cxx:604
 TODBCStatement.cxx:605
 TODBCStatement.cxx:606
 TODBCStatement.cxx:607
 TODBCStatement.cxx:608
 TODBCStatement.cxx:609
 TODBCStatement.cxx:610
 TODBCStatement.cxx:611
 TODBCStatement.cxx:612
 TODBCStatement.cxx:613
 TODBCStatement.cxx:614
 TODBCStatement.cxx:615
 TODBCStatement.cxx:616
 TODBCStatement.cxx:617
 TODBCStatement.cxx:618
 TODBCStatement.cxx:619
 TODBCStatement.cxx:620
 TODBCStatement.cxx:621
 TODBCStatement.cxx:622
 TODBCStatement.cxx:623
 TODBCStatement.cxx:624
 TODBCStatement.cxx:625
 TODBCStatement.cxx:626
 TODBCStatement.cxx:627
 TODBCStatement.cxx:628
 TODBCStatement.cxx:629
 TODBCStatement.cxx:630
 TODBCStatement.cxx:631
 TODBCStatement.cxx:632
 TODBCStatement.cxx:633
 TODBCStatement.cxx:634
 TODBCStatement.cxx:635
 TODBCStatement.cxx:636
 TODBCStatement.cxx:637
 TODBCStatement.cxx:638
 TODBCStatement.cxx:639
 TODBCStatement.cxx:640
 TODBCStatement.cxx:641
 TODBCStatement.cxx:642
 TODBCStatement.cxx:643
 TODBCStatement.cxx:644
 TODBCStatement.cxx:645
 TODBCStatement.cxx:646
 TODBCStatement.cxx:647
 TODBCStatement.cxx:648
 TODBCStatement.cxx:649
 TODBCStatement.cxx:650
 TODBCStatement.cxx:651
 TODBCStatement.cxx:652
 TODBCStatement.cxx:653
 TODBCStatement.cxx:654
 TODBCStatement.cxx:655
 TODBCStatement.cxx:656
 TODBCStatement.cxx:657
 TODBCStatement.cxx:658
 TODBCStatement.cxx:659
 TODBCStatement.cxx:660
 TODBCStatement.cxx:661
 TODBCStatement.cxx:662
 TODBCStatement.cxx:663
 TODBCStatement.cxx:664
 TODBCStatement.cxx:665
 TODBCStatement.cxx:666
 TODBCStatement.cxx:667
 TODBCStatement.cxx:668
 TODBCStatement.cxx:669
 TODBCStatement.cxx:670
 TODBCStatement.cxx:671
 TODBCStatement.cxx:672
 TODBCStatement.cxx:673
 TODBCStatement.cxx:674
 TODBCStatement.cxx:675
 TODBCStatement.cxx:676
 TODBCStatement.cxx:677
 TODBCStatement.cxx:678
 TODBCStatement.cxx:679
 TODBCStatement.cxx:680
 TODBCStatement.cxx:681
 TODBCStatement.cxx:682
 TODBCStatement.cxx:683
 TODBCStatement.cxx:684
 TODBCStatement.cxx:685
 TODBCStatement.cxx:686
 TODBCStatement.cxx:687
 TODBCStatement.cxx:688
 TODBCStatement.cxx:689
 TODBCStatement.cxx:690
 TODBCStatement.cxx:691
 TODBCStatement.cxx:692
 TODBCStatement.cxx:693
 TODBCStatement.cxx:694
 TODBCStatement.cxx:695
 TODBCStatement.cxx:696
 TODBCStatement.cxx:697
 TODBCStatement.cxx:698
 TODBCStatement.cxx:699
 TODBCStatement.cxx:700
 TODBCStatement.cxx:701
 TODBCStatement.cxx:702
 TODBCStatement.cxx:703
 TODBCStatement.cxx:704
 TODBCStatement.cxx:705
 TODBCStatement.cxx:706
 TODBCStatement.cxx:707
 TODBCStatement.cxx:708
 TODBCStatement.cxx:709
 TODBCStatement.cxx:710
 TODBCStatement.cxx:711
 TODBCStatement.cxx:712
 TODBCStatement.cxx:713
 TODBCStatement.cxx:714
 TODBCStatement.cxx:715
 TODBCStatement.cxx:716
 TODBCStatement.cxx:717
 TODBCStatement.cxx:718
 TODBCStatement.cxx:719
 TODBCStatement.cxx:720
 TODBCStatement.cxx:721
 TODBCStatement.cxx:722
 TODBCStatement.cxx:723
 TODBCStatement.cxx:724
 TODBCStatement.cxx:725
 TODBCStatement.cxx:726
 TODBCStatement.cxx:727
 TODBCStatement.cxx:728
 TODBCStatement.cxx:729
 TODBCStatement.cxx:730
 TODBCStatement.cxx:731
 TODBCStatement.cxx:732
 TODBCStatement.cxx:733
 TODBCStatement.cxx:734
 TODBCStatement.cxx:735
 TODBCStatement.cxx:736
 TODBCStatement.cxx:737
 TODBCStatement.cxx:738
 TODBCStatement.cxx:739
 TODBCStatement.cxx:740
 TODBCStatement.cxx:741
 TODBCStatement.cxx:742
 TODBCStatement.cxx:743
 TODBCStatement.cxx:744
 TODBCStatement.cxx:745
 TODBCStatement.cxx:746
 TODBCStatement.cxx:747
 TODBCStatement.cxx:748
 TODBCStatement.cxx:749
 TODBCStatement.cxx:750
 TODBCStatement.cxx:751
 TODBCStatement.cxx:752
 TODBCStatement.cxx:753
 TODBCStatement.cxx:754
 TODBCStatement.cxx:755
 TODBCStatement.cxx:756
 TODBCStatement.cxx:757
 TODBCStatement.cxx:758
 TODBCStatement.cxx:759
 TODBCStatement.cxx:760
 TODBCStatement.cxx:761
 TODBCStatement.cxx:762
 TODBCStatement.cxx:763
 TODBCStatement.cxx:764
 TODBCStatement.cxx:765
 TODBCStatement.cxx:766
 TODBCStatement.cxx:767
 TODBCStatement.cxx:768
 TODBCStatement.cxx:769
 TODBCStatement.cxx:770
 TODBCStatement.cxx:771
 TODBCStatement.cxx:772
 TODBCStatement.cxx:773
 TODBCStatement.cxx:774
 TODBCStatement.cxx:775
 TODBCStatement.cxx:776
 TODBCStatement.cxx:777
 TODBCStatement.cxx:778
 TODBCStatement.cxx:779
 TODBCStatement.cxx:780
 TODBCStatement.cxx:781
 TODBCStatement.cxx:782
 TODBCStatement.cxx:783
 TODBCStatement.cxx:784
 TODBCStatement.cxx:785
 TODBCStatement.cxx:786
 TODBCStatement.cxx:787
 TODBCStatement.cxx:788
 TODBCStatement.cxx:789
 TODBCStatement.cxx:790
 TODBCStatement.cxx:791
 TODBCStatement.cxx:792
 TODBCStatement.cxx:793
 TODBCStatement.cxx:794
 TODBCStatement.cxx:795
 TODBCStatement.cxx:796
 TODBCStatement.cxx:797
 TODBCStatement.cxx:798
 TODBCStatement.cxx:799
 TODBCStatement.cxx:800
 TODBCStatement.cxx:801
 TODBCStatement.cxx:802
 TODBCStatement.cxx:803
 TODBCStatement.cxx:804
 TODBCStatement.cxx:805
 TODBCStatement.cxx:806
 TODBCStatement.cxx:807
 TODBCStatement.cxx:808
 TODBCStatement.cxx:809
 TODBCStatement.cxx:810
 TODBCStatement.cxx:811
 TODBCStatement.cxx:812
 TODBCStatement.cxx:813
 TODBCStatement.cxx:814
 TODBCStatement.cxx:815
 TODBCStatement.cxx:816
 TODBCStatement.cxx:817
 TODBCStatement.cxx:818
 TODBCStatement.cxx:819
 TODBCStatement.cxx:820
 TODBCStatement.cxx:821
 TODBCStatement.cxx:822
 TODBCStatement.cxx:823
 TODBCStatement.cxx:824
 TODBCStatement.cxx:825
 TODBCStatement.cxx:826
 TODBCStatement.cxx:827
 TODBCStatement.cxx:828
 TODBCStatement.cxx:829
 TODBCStatement.cxx:830
 TODBCStatement.cxx:831
 TODBCStatement.cxx:832
 TODBCStatement.cxx:833
 TODBCStatement.cxx:834
 TODBCStatement.cxx:835
 TODBCStatement.cxx:836
 TODBCStatement.cxx:837
 TODBCStatement.cxx:838
 TODBCStatement.cxx:839
 TODBCStatement.cxx:840
 TODBCStatement.cxx:841
 TODBCStatement.cxx:842
 TODBCStatement.cxx:843
 TODBCStatement.cxx:844
 TODBCStatement.cxx:845
 TODBCStatement.cxx:846
 TODBCStatement.cxx:847
 TODBCStatement.cxx:848
 TODBCStatement.cxx:849
 TODBCStatement.cxx:850
 TODBCStatement.cxx:851
 TODBCStatement.cxx:852
 TODBCStatement.cxx:853
 TODBCStatement.cxx:854
 TODBCStatement.cxx:855
 TODBCStatement.cxx:856
 TODBCStatement.cxx:857
 TODBCStatement.cxx:858
 TODBCStatement.cxx:859
 TODBCStatement.cxx:860
 TODBCStatement.cxx:861
 TODBCStatement.cxx:862
 TODBCStatement.cxx:863
 TODBCStatement.cxx:864
 TODBCStatement.cxx:865
 TODBCStatement.cxx:866
 TODBCStatement.cxx:867
 TODBCStatement.cxx:868
 TODBCStatement.cxx:869
 TODBCStatement.cxx:870
 TODBCStatement.cxx:871
 TODBCStatement.cxx:872
 TODBCStatement.cxx:873
 TODBCStatement.cxx:874
 TODBCStatement.cxx:875
 TODBCStatement.cxx:876
 TODBCStatement.cxx:877
 TODBCStatement.cxx:878
 TODBCStatement.cxx:879
 TODBCStatement.cxx:880
 TODBCStatement.cxx:881
 TODBCStatement.cxx:882
 TODBCStatement.cxx:883
 TODBCStatement.cxx:884
 TODBCStatement.cxx:885
 TODBCStatement.cxx:886
 TODBCStatement.cxx:887
 TODBCStatement.cxx:888
 TODBCStatement.cxx:889
 TODBCStatement.cxx:890
 TODBCStatement.cxx:891
 TODBCStatement.cxx:892
 TODBCStatement.cxx:893
 TODBCStatement.cxx:894
 TODBCStatement.cxx:895
 TODBCStatement.cxx:896
 TODBCStatement.cxx:897
 TODBCStatement.cxx:898
 TODBCStatement.cxx:899
 TODBCStatement.cxx:900
 TODBCStatement.cxx:901
 TODBCStatement.cxx:902
 TODBCStatement.cxx:903
 TODBCStatement.cxx:904
 TODBCStatement.cxx:905
 TODBCStatement.cxx:906
 TODBCStatement.cxx:907
 TODBCStatement.cxx:908
 TODBCStatement.cxx:909
 TODBCStatement.cxx:910
 TODBCStatement.cxx:911
 TODBCStatement.cxx:912
 TODBCStatement.cxx:913
 TODBCStatement.cxx:914
 TODBCStatement.cxx:915
 TODBCStatement.cxx:916
 TODBCStatement.cxx:917
 TODBCStatement.cxx:918
 TODBCStatement.cxx:919
 TODBCStatement.cxx:920
 TODBCStatement.cxx:921
 TODBCStatement.cxx:922
 TODBCStatement.cxx:923
 TODBCStatement.cxx:924
 TODBCStatement.cxx:925
 TODBCStatement.cxx:926
 TODBCStatement.cxx:927
 TODBCStatement.cxx:928
 TODBCStatement.cxx:929
 TODBCStatement.cxx:930
 TODBCStatement.cxx:931
 TODBCStatement.cxx:932
 TODBCStatement.cxx:933
 TODBCStatement.cxx:934
 TODBCStatement.cxx:935
 TODBCStatement.cxx:936
 TODBCStatement.cxx:937
 TODBCStatement.cxx:938
 TODBCStatement.cxx:939
 TODBCStatement.cxx:940
 TODBCStatement.cxx:941
 TODBCStatement.cxx:942
 TODBCStatement.cxx:943
 TODBCStatement.cxx:944
 TODBCStatement.cxx:945
 TODBCStatement.cxx:946
 TODBCStatement.cxx:947
 TODBCStatement.cxx:948
 TODBCStatement.cxx:949
 TODBCStatement.cxx:950
 TODBCStatement.cxx:951
 TODBCStatement.cxx:952
 TODBCStatement.cxx:953
 TODBCStatement.cxx:954
 TODBCStatement.cxx:955
 TODBCStatement.cxx:956
 TODBCStatement.cxx:957
 TODBCStatement.cxx:958
 TODBCStatement.cxx:959
 TODBCStatement.cxx:960
 TODBCStatement.cxx:961
 TODBCStatement.cxx:962
 TODBCStatement.cxx:963
 TODBCStatement.cxx:964
 TODBCStatement.cxx:965
 TODBCStatement.cxx:966
 TODBCStatement.cxx:967
 TODBCStatement.cxx:968
 TODBCStatement.cxx:969
 TODBCStatement.cxx:970
 TODBCStatement.cxx:971
 TODBCStatement.cxx:972
 TODBCStatement.cxx:973
 TODBCStatement.cxx:974
 TODBCStatement.cxx:975
 TODBCStatement.cxx:976
 TODBCStatement.cxx:977
 TODBCStatement.cxx:978
 TODBCStatement.cxx:979
 TODBCStatement.cxx:980
 TODBCStatement.cxx:981
 TODBCStatement.cxx:982
 TODBCStatement.cxx:983
 TODBCStatement.cxx:984
 TODBCStatement.cxx:985
 TODBCStatement.cxx:986
 TODBCStatement.cxx:987
 TODBCStatement.cxx:988
 TODBCStatement.cxx:989
 TODBCStatement.cxx:990
 TODBCStatement.cxx:991
 TODBCStatement.cxx:992
 TODBCStatement.cxx:993
 TODBCStatement.cxx:994
 TODBCStatement.cxx:995
 TODBCStatement.cxx:996
 TODBCStatement.cxx:997
 TODBCStatement.cxx:998
 TODBCStatement.cxx:999
 TODBCStatement.cxx:1000
 TODBCStatement.cxx:1001
 TODBCStatement.cxx:1002
 TODBCStatement.cxx:1003
 TODBCStatement.cxx:1004
 TODBCStatement.cxx:1005
 TODBCStatement.cxx:1006
 TODBCStatement.cxx:1007
 TODBCStatement.cxx:1008
 TODBCStatement.cxx:1009
 TODBCStatement.cxx:1010
 TODBCStatement.cxx:1011
 TODBCStatement.cxx:1012
 TODBCStatement.cxx:1013
 TODBCStatement.cxx:1014
 TODBCStatement.cxx:1015
 TODBCStatement.cxx:1016
 TODBCStatement.cxx:1017
 TODBCStatement.cxx:1018
 TODBCStatement.cxx:1019
 TODBCStatement.cxx:1020
 TODBCStatement.cxx:1021
 TODBCStatement.cxx:1022
 TODBCStatement.cxx:1023
 TODBCStatement.cxx:1024
 TODBCStatement.cxx:1025
 TODBCStatement.cxx:1026
 TODBCStatement.cxx:1027
 TODBCStatement.cxx:1028
 TODBCStatement.cxx:1029
 TODBCStatement.cxx:1030
 TODBCStatement.cxx:1031
 TODBCStatement.cxx:1032
 TODBCStatement.cxx:1033
 TODBCStatement.cxx:1034
 TODBCStatement.cxx:1035
 TODBCStatement.cxx:1036
 TODBCStatement.cxx:1037
 TODBCStatement.cxx:1038
 TODBCStatement.cxx:1039
 TODBCStatement.cxx:1040
 TODBCStatement.cxx:1041
 TODBCStatement.cxx:1042
 TODBCStatement.cxx:1043
 TODBCStatement.cxx:1044
 TODBCStatement.cxx:1045
 TODBCStatement.cxx:1046
 TODBCStatement.cxx:1047
 TODBCStatement.cxx:1048
 TODBCStatement.cxx:1049
 TODBCStatement.cxx:1050
 TODBCStatement.cxx:1051
 TODBCStatement.cxx:1052
 TODBCStatement.cxx:1053
 TODBCStatement.cxx:1054
 TODBCStatement.cxx:1055
 TODBCStatement.cxx:1056
 TODBCStatement.cxx:1057
 TODBCStatement.cxx:1058
 TODBCStatement.cxx:1059
 TODBCStatement.cxx:1060
 TODBCStatement.cxx:1061
 TODBCStatement.cxx:1062
 TODBCStatement.cxx:1063
 TODBCStatement.cxx:1064
 TODBCStatement.cxx:1065
 TODBCStatement.cxx:1066
 TODBCStatement.cxx:1067
 TODBCStatement.cxx:1068
 TODBCStatement.cxx:1069
 TODBCStatement.cxx:1070
 TODBCStatement.cxx:1071
 TODBCStatement.cxx:1072
 TODBCStatement.cxx:1073
 TODBCStatement.cxx:1074
 TODBCStatement.cxx:1075
 TODBCStatement.cxx:1076
 TODBCStatement.cxx:1077
 TODBCStatement.cxx:1078
 TODBCStatement.cxx:1079
 TODBCStatement.cxx:1080
 TODBCStatement.cxx:1081
 TODBCStatement.cxx:1082
 TODBCStatement.cxx:1083
 TODBCStatement.cxx:1084
 TODBCStatement.cxx:1085
 TODBCStatement.cxx:1086
 TODBCStatement.cxx:1087
 TODBCStatement.cxx:1088
 TODBCStatement.cxx:1089
 TODBCStatement.cxx:1090
 TODBCStatement.cxx:1091
 TODBCStatement.cxx:1092
 TODBCStatement.cxx:1093
 TODBCStatement.cxx:1094
 TODBCStatement.cxx:1095
 TODBCStatement.cxx:1096
 TODBCStatement.cxx:1097
 TODBCStatement.cxx:1098
 TODBCStatement.cxx:1099
 TODBCStatement.cxx:1100
 TODBCStatement.cxx:1101
 TODBCStatement.cxx:1102
 TODBCStatement.cxx:1103
 TODBCStatement.cxx:1104
 TODBCStatement.cxx:1105
 TODBCStatement.cxx:1106
 TODBCStatement.cxx:1107
 TODBCStatement.cxx:1108
 TODBCStatement.cxx:1109
 TODBCStatement.cxx:1110
 TODBCStatement.cxx:1111
 TODBCStatement.cxx:1112
 TODBCStatement.cxx:1113
 TODBCStatement.cxx:1114
 TODBCStatement.cxx:1115
 TODBCStatement.cxx:1116
 TODBCStatement.cxx:1117
 TODBCStatement.cxx:1118
 TODBCStatement.cxx:1119
 TODBCStatement.cxx:1120
 TODBCStatement.cxx:1121
 TODBCStatement.cxx:1122
 TODBCStatement.cxx:1123
 TODBCStatement.cxx:1124
 TODBCStatement.cxx:1125
 TODBCStatement.cxx:1126
 TODBCStatement.cxx:1127
 TODBCStatement.cxx:1128
 TODBCStatement.cxx:1129
 TODBCStatement.cxx:1130
 TODBCStatement.cxx:1131
 TODBCStatement.cxx:1132
 TODBCStatement.cxx:1133
 TODBCStatement.cxx:1134
 TODBCStatement.cxx:1135
 TODBCStatement.cxx:1136
 TODBCStatement.cxx:1137
 TODBCStatement.cxx:1138
 TODBCStatement.cxx:1139
 TODBCStatement.cxx:1140
 TODBCStatement.cxx:1141
 TODBCStatement.cxx:1142
 TODBCStatement.cxx:1143
 TODBCStatement.cxx:1144
 TODBCStatement.cxx:1145
 TODBCStatement.cxx:1146
 TODBCStatement.cxx:1147
 TODBCStatement.cxx:1148
 TODBCStatement.cxx:1149
 TODBCStatement.cxx:1150
 TODBCStatement.cxx:1151
 TODBCStatement.cxx:1152