00001
00002
00003
00004
00005
00006
00007
00008
00009
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
00022
00023 fResult = result;
00024 fFieldCount = nfields;
00025 fFieldLength = 0;
00026 fFieldValue = 0;
00027 }
00028
00029
00030 TSapDBRow::~TSapDBRow()
00031 {
00032
00033
00034 if (fResult)
00035 Close();
00036 }
00037
00038
00039 void TSapDBRow::Close(Option_t *)
00040 {
00041
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
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
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
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
00157
00158
00159
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 }