TSapDBRow.cxx

Go to the documentation of this file.
00001 // @(#)root/sapdb:$Id: TSapDBRow.cxx 35938 2010-09-30 15:49:39Z brun $
00002 // Author: Mark Hemberger & Fons Rademakers   03/08/2001
00003 
00004 /*************************************************************************
00005  * Copyright (C) 1995-2001, Rene Brun and Fons Rademakers.               *
00006  * All rights reserved.                                                  *
00007  *                                                                       *
00008  * For the licensing terms see $ROOTSYS/LICENSE.                         *
00009  * For the list of contributors see $ROOTSYS/README/CREDITS.             *
00010  *************************************************************************/
00011 
00012 #include "TString.h"
00013 #include "TSapDBRow.h"
00014 
00015 
00016 ClassImp(TSapDBRow)
00017 
00018 //______________________________________________________________________________
00019 TSapDBRow::TSapDBRow(SQLHSTMT result, Int_t nfields)
00020 {
00021    // Single row of query result.
00022 
00023    fResult      = result;
00024    fFieldCount  = nfields;
00025    fFieldLength = 0;
00026    fFieldValue  = 0;
00027 }
00028 
00029 //______________________________________________________________________________
00030 TSapDBRow::~TSapDBRow()
00031 {
00032    // Destroy row object.
00033 
00034    if (fResult)
00035       Close();
00036 }
00037 
00038 //______________________________________________________________________________
00039 void TSapDBRow::Close(Option_t *)
00040 {
00041    // Close row.
00042 
00043    delete [] fFieldLength;
00044    delete [] fFieldValue;
00045    fResult      = 0;
00046    fFieldCount  = 0;
00047    fFieldLength = 0;
00048    fFieldValue  = 0;
00049 }
00050 
00051 //______________________________________________________________________________
00052 Bool_t TSapDBRow::IsValid(Int_t field)
00053 {
00054    // Check if row is open and field index within range.
00055 
00056    if (field < 0 || field >= fFieldCount) {
00057       Error("IsValid", "field index out of bounds");
00058       return kFALSE;
00059    }
00060 
00061    return kTRUE;
00062 }
00063 
00064 //______________________________________________________________________________
00065 ULong_t TSapDBRow::GetFieldLength(Int_t field)
00066 {
00067    // Get length in bytes of specified field.
00068 
00069    if (!IsValid(field))
00070       return 0;
00071 
00072    if (!fFieldLength) {
00073       fFieldLength = new ULong_t[fFieldCount];
00074       for (int i = 0; i < fFieldCount; i++)
00075          fFieldLength[i] = 0;
00076    }
00077 
00078    if (fFieldLength[field])
00079       return fFieldLength[field];
00080 
00081    SQLUSMALLINT columnNumber;
00082    SQLCHAR      columnName[256];
00083    SQLSMALLINT  bufferLength = 256;
00084    SQLSMALLINT  nameLength;
00085    SQLSMALLINT  dataType;
00086    SQLULEN      columnSize;
00087    SQLSMALLINT  decimalDigits;
00088    SQLSMALLINT  nullable;
00089 
00090    columnNumber = field + 1;
00091    if (SQLDescribeCol(fResult, columnNumber, columnName, bufferLength,
00092                       &nameLength, &dataType, &columnSize, &decimalDigits,
00093                       &nullable) == SQL_SUCCESS) {
00094       fFieldLength[field] = columnSize;
00095       return columnSize;
00096    } else {
00097       Error("GetFieldLength", "cannot get field length");
00098       return 0;
00099    }
00100 }
00101 
00102 //______________________________________________________________________________
00103 const char *TSapDBRow::GetField(Int_t field)
00104 {
00105    // Get specified field from row (0 <= field < GetFieldCount()).
00106 
00107    if (!IsValid(field))
00108       return 0;
00109 
00110    if (!fFieldValue)
00111       fFieldValue = new TString[fFieldCount];
00112 
00113    if (!fFieldValue[field].IsNull())
00114       return fFieldValue[field];
00115 
00116    SQLUSMALLINT columnNumber;
00117    SQLCHAR      columnName[256];
00118    SQLSMALLINT  bufferLength = 256;
00119    SQLSMALLINT  nameLength;
00120    SQLSMALLINT  dataType;
00121    SQLULEN      columnSize;
00122    SQLSMALLINT  decimalDigits;
00123    SQLSMALLINT  nullable;
00124 
00125    columnNumber = field + 1;
00126    RETCODE rc;
00127    rc = SQLDescribeCol(fResult, columnNumber, columnName, bufferLength,
00128                        &nameLength, &dataType, &columnSize, &decimalDigits,
00129                        &nullable);
00130    if (rc != SQL_SUCCESS) {
00131       Error("TSapDBRow", "error in getting description");
00132       return 0;
00133    }
00134 
00135    if (columnSize > 4000) {
00136       Error("TSapDBRow", "column size too large for current implementation.");
00137       return 0;
00138    }
00139 
00140    SQLLEN     strLenOrIndPtr;
00141    SQLPOINTER targetValuePtr[4000];
00142    bufferLength = sizeof(targetValuePtr);
00143 
00144    if (SQLGetData(fResult, columnNumber, SQL_C_DEFAULT, targetValuePtr,
00145                   bufferLength, &strLenOrIndPtr) != SQL_SUCCESS) {
00146       Error("TSapDBRow", "error in getting data");
00147       return 0;
00148    }
00149 
00150    char fieldstr[4001];
00151 
00152    switch (dataType) {
00153       case SQL_CHAR:
00154       case SQL_VARCHAR:
00155       case SQL_LONGVARCHAR:
00156       // not yet supported...
00157       //case SQL_WCHAR:
00158       //case SQL_WVARCHAR:
00159       //case SQL_WLONGVARCHAR:
00160          snprintf(fieldstr,4001, "%-*.*s", (int)columnSize, (int)columnSize,
00161                  (char*) targetValuePtr);
00162          break;
00163       case SQL_TINYINT:
00164       case SQL_SMALLINT:
00165       case SQL_INTEGER:
00166       case SQL_BIGINT:
00167          snprintf(fieldstr,4001, "%-*ld", (int)columnSize, *(long int*)(targetValuePtr));
00168          break;
00169       case SQL_DECIMAL:
00170       case SQL_NUMERIC:
00171       case SQL_REAL:
00172       case SQL_FLOAT:
00173          snprintf(fieldstr,4001, "%-*.2f", (int)columnSize, *(float*)(targetValuePtr));
00174          break;
00175       case SQL_DOUBLE:
00176          snprintf(fieldstr,4001, "%-*.2f", (int)columnSize, *(double*)(targetValuePtr));
00177          break;
00178       case SQL_BIT:
00179       case SQL_BINARY:
00180       case SQL_VARBINARY:
00181       case SQL_LONGVARBINARY:
00182       case SQL_TYPE_DATE:
00183       case SQL_TYPE_TIME:
00184       case SQL_TYPE_TIMESTAMP:
00185       default:
00186          snprintf(fieldstr,4001, "%-*.*s", (int)columnSize, (int)columnSize,
00187                  (char*)targetValuePtr);
00188          break;
00189    }
00190 
00191    fFieldValue[field] = fieldstr;
00192 
00193    return fFieldValue[field];
00194 }

Generated on Tue Jul 5 15:14:41 2011 for ROOT_528-00b_version by  doxygen 1.5.1