30 #define kSqlTime 123781
31 #define kSqlDate 123782
32 #define kSqlTimestamp 123783
33 #define kSqlBinary 123784
36 ClassImp(TODBCStatement);
41 TODBCStatement::TODBCStatement(SQLHSTMT stmt, Int_t rowarrsize, Bool_t errout) :
45 fBufferPreferredSize = rowarrsize;
55 fNumParsProcessed = 0;
58 SQLSMALLINT paramsCount = 0;
59 SQLRETURN retcode = SQLNumParams(fHstmt, ¶msCount);
60 if (ExtractErrors(retcode,
"Constructor"))
66 fNumParsProcessed = 0;
68 SQLSetStmtAttr(fHstmt, SQL_ATTR_PARAM_BIND_TYPE, SQL_PARAM_BIND_BY_COLUMN, 0);
70 SQLUINTEGER setsize = fBufferPreferredSize;
71 retcode = SQLSetStmtAttr(fHstmt, SQL_ATTR_PARAMSET_SIZE, (SQLPOINTER) (
long) setsize, 0);
72 ExtractErrors(retcode,
"Constructor");
74 SQLUINTEGER getsize = 0;
76 retcode = SQLGetStmtAttr(fHstmt, SQL_ATTR_PARAMSET_SIZE, &getsize, 0, 0);
77 ExtractErrors(retcode,
"Constructor");
79 Int_t bufferlen = fBufferPreferredSize;
82 if (getsize<=1) bufferlen=1;
else
83 if (getsize!=setsize) {
84 SQLSetStmtAttr(fHstmt, SQL_ATTR_PARAMSET_SIZE, (SQLPOINTER) 1, 0);
88 SetNumBuffers(paramsCount, bufferlen);
90 SQLSetStmtAttr(fHstmt, SQL_ATTR_PARAM_STATUS_PTR, fStatusBuffer, 0);
91 SQLSetStmtAttr(fHstmt, SQL_ATTR_PARAMS_PROCESSED_PTR, &fNumParsProcessed, 0);
104 TODBCStatement::~TODBCStatement()
112 void TODBCStatement::Close(Option_t *)
116 SQLFreeHandle(SQL_HANDLE_STMT, fHstmt);
124 Bool_t TODBCStatement::Process()
128 SQLRETURN retcode = SQL_SUCCESS;
130 if (IsParSettMode()) {
133 if (fBufferCounter>=0) {
135 if ((fBufferCounter>0) && (fBufferCounter<fBufferLength-1)) {
136 SQLUINTEGER setsize = fBufferCounter+1;
137 SQLSetStmtAttr(fHstmt, SQL_ATTR_PARAMSET_SIZE, (SQLPOINTER) (
long) setsize, 0);
139 retcode = SQLExecute(fHstmt);
151 retcode = SQLExecute(fHstmt);
154 return !ExtractErrors(retcode,
"Process");
160 Int_t TODBCStatement::GetNumAffectedRows()
165 SQLRETURN retcode = SQL_SUCCESS;
167 retcode = SQLRowCount(fHstmt, &rowCount);
169 if (ExtractErrors(retcode,
"GetNumAffectedRows"))
return -1;
179 Bool_t TODBCStatement::StoreResult()
183 if (IsParSettMode()) {
184 SetError(-1,
"Call Process() method before",
"StoreResult");
190 SQLSMALLINT columnCount = 0;
192 SQLRETURN retcode = SQLNumResultCols(fHstmt, &columnCount);
193 if (ExtractErrors(retcode,
"StoreResult"))
return kFALSE;
195 if (columnCount==0)
return kFALSE;
197 SetNumBuffers(columnCount, fBufferPreferredSize);
199 SQLULEN arrsize = fBufferLength;
201 SQLSetStmtAttr(fHstmt, SQL_ATTR_ROW_BIND_TYPE, SQL_BIND_BY_COLUMN, 0);
202 SQLSetStmtAttr(fHstmt, SQL_ATTR_ROW_ARRAY_SIZE, (SQLPOINTER) arrsize, 0);
203 SQLSetStmtAttr(fHstmt, SQL_ATTR_ROW_STATUS_PTR, fStatusBuffer, 0);
204 SQLSetStmtAttr(fHstmt, SQL_ATTR_ROWS_FETCHED_PTR, &fNumRowsFetched, 0);
206 for (
int n=0;n<fNumBuffers;n++) {
207 SQLCHAR columnName[1024];
208 SQLSMALLINT nameLength;
209 SQLSMALLINT dataType;
211 SQLSMALLINT decimalDigits;
212 SQLSMALLINT nullable;
214 retcode = SQLDescribeCol(fHstmt, n+1, columnName, 1024,
215 &nameLength, &dataType,
216 &columnSize, &decimalDigits, &nullable);
218 BindColumn(n, dataType, columnSize);
221 fBuffer[n].fBnamebuffer =
new char[nameLength+1];
222 strlcpy(fBuffer[n].fBnamebuffer, (
const char*) columnName, nameLength+1);
237 Int_t TODBCStatement::GetNumFields()
239 return IsResultSet() ? fNumBuffers : -1;
245 const char* TODBCStatement::GetFieldName(Int_t nfield)
249 if (!IsResultSet() || (nfield<0) || (nfield>=fNumBuffers))
return 0;
251 return fBuffer[nfield].fBnamebuffer;
258 Bool_t TODBCStatement::NextResultRow()
262 if (!IsResultSet())
return kFALSE;
264 if ((fNumRowsFetched==0) ||
265 (1.*fBufferCounter >= 1.*(fNumRowsFetched-1))) {
270 SQLRETURN retcode = SQLFetchScroll(fHstmt, SQL_FETCH_NEXT, 0);
271 if (retcode==SQL_NO_DATA) fNumRowsFetched=0;
else
272 ExtractErrors(retcode,
"NextResultRow");
277 if (!IsError() && (retcode!=SQL_NO_DATA) && (fNumRowsFetched==0)) {
278 SQLULEN rownumber = 0;
279 SQLRETURN retcode2 = SQLGetStmtAttr(fHstmt, SQL_ATTR_ROW_NUMBER, &rownumber, 0, 0);
280 ExtractErrors(retcode2,
"NextResultRow");
283 fNumRowsFetched = rownumber - fLastResultRow;
284 fLastResultRow = rownumber;
288 if (1.*fNumRowsFetched>fBufferLength)
289 SetError(-1,
"Missmatch between buffer length and fetched rows number",
"NextResultRow");
291 if (IsError() || (fNumRowsFetched==0)) {
299 return IsResultSet();
305 Bool_t TODBCStatement::ExtractErrors(SQLRETURN retcode,
const char* method)
307 if ((retcode== SQL_SUCCESS) || (retcode == SQL_SUCCESS_WITH_INFO))
return kFALSE;
316 ret = SQLGetDiagRec(SQL_HANDLE_STMT, fHstmt, ++i, state, &native, text,
317 sizeof(text), &len );
318 if (ret == SQL_SUCCESS) SetError(native, (
const char*) text, method);
321 while( ret == SQL_SUCCESS );
328 Bool_t TODBCStatement::NextIteration()
332 if (!IsParSettMode() || (fBuffer==0) || (fBufferLength<=0))
return kFALSE;
334 if (fBufferCounter>=fBufferLength-1) {
335 SQLRETURN retcode = SQLExecute(fHstmt);
336 if (ExtractErrors(retcode,
"NextIteration"))
return kFALSE;
342 fStatusBuffer[fBufferCounter] = SQL_ROW_SUCCESS;
350 Int_t TODBCStatement::GetNumParameters()
352 return IsParSettMode() ? fNumBuffers : 0;
358 void TODBCStatement::SetNumBuffers(Int_t isize, Int_t ilen)
363 fBufferLength = ilen;
366 fBuffer =
new ODBCBufferRec_t[fNumBuffers];
367 for (Int_t n=0;n<fNumBuffers;n++) {
368 fBuffer[n].fBroottype = 0;
369 fBuffer[n].fBsqltype = 0;
370 fBuffer[n].fBsqlctype = 0;
371 fBuffer[n].fBbuffer = 0;
372 fBuffer[n].fBelementsize = 0;
373 fBuffer[n].fBlenarray = 0;
374 fBuffer[n].fBstrbuffer = 0;
375 fBuffer[n].fBnamebuffer = 0;
378 fStatusBuffer =
new SQLUSMALLINT[fBufferLength];
384 void TODBCStatement::FreeBuffers()
386 if (fBuffer==0)
return;
387 for (Int_t n=0;n<fNumBuffers;n++) {
388 if (fBuffer[n].fBbuffer!=0)
389 free(fBuffer[n].fBbuffer);
390 delete[] fBuffer[n].fBlenarray;
391 delete[] fBuffer[n].fBstrbuffer;
392 delete[] fBuffer[n].fBnamebuffer;
395 delete[] fStatusBuffer;
406 Bool_t TODBCStatement::BindColumn(Int_t ncol, SQLSMALLINT sqltype, SQLUINTEGER size)
410 if ((ncol<0) || (ncol>=fNumBuffers)) {
411 SetError(-1,
"Internal error. Column number invalid",
"BindColumn");
415 if (fBuffer[ncol].fBsqltype!=0) {
416 SetError(-1,
"Internal error. Bind for column already done",
"BindColumn");
420 SQLSMALLINT sqlctype = 0;
423 case SQL_VARCHAR: sqlctype = SQL_C_CHAR;
break;
425 case SQL_LONGVARBINARY:
426 case SQL_VARBINARY: sqlctype = SQL_C_BINARY;
break;
427 case SQL_LONGVARCHAR: Info(
"BindColumn",
"BIG VARCHAR not supported yet");
return kFALSE;
break;
429 case SQL_DECIMAL: sqlctype = SQL_C_DOUBLE;
break;
430 case SQL_NUMERIC: sqlctype = SQL_C_DOUBLE;
break;
431 case SQL_SMALLINT: sqlctype = SQL_C_SLONG;
break;
432 case SQL_INTEGER: sqlctype = SQL_C_SLONG;
break;
433 case SQL_FLOAT: sqlctype = SQL_C_FLOAT;
break;
435 case SQL_DOUBLE: sqlctype = SQL_C_DOUBLE;
break;
436 case SQL_TINYINT: sqlctype = SQL_C_STINYINT;
break;
437 case SQL_BIGINT: sqlctype = SQL_C_SBIGINT;
break;
438 case SQL_TYPE_DATE: sqlctype = SQL_C_TYPE_DATE;
break;
439 case SQL_TYPE_TIME: sqlctype = SQL_C_TYPE_TIME;
break;
440 case SQL_TYPE_TIMESTAMP: sqlctype = SQL_C_TYPE_TIMESTAMP;
break;
442 SetError(-1, Form(
"SQL type %d not supported",sqltype),
"BindColumn");
450 case SQL_C_ULONG: elemsize =
sizeof(SQLUINTEGER);
break;
451 case SQL_C_SLONG: elemsize =
sizeof(SQLINTEGER);
break;
452 case SQL_C_UBIGINT: elemsize =
sizeof(ULong64_t);
break;
453 case SQL_C_SBIGINT: elemsize =
sizeof(Long64_t);
break;
454 case SQL_C_USHORT: elemsize =
sizeof(SQLUSMALLINT);
break;
455 case SQL_C_SSHORT: elemsize =
sizeof(SQLSMALLINT);
break;
456 case SQL_C_UTINYINT: elemsize =
sizeof(SQLCHAR);
break;
457 case SQL_C_STINYINT: elemsize =
sizeof(SQLSCHAR);
break;
458 case SQL_C_FLOAT: elemsize =
sizeof(SQLREAL);
break;
459 case SQL_C_DOUBLE: elemsize =
sizeof(SQLDOUBLE);
break;
460 case SQL_C_CHAR: elemsize = size;
break;
461 case SQL_C_BINARY: elemsize = size;
break;
462 case SQL_C_TYPE_DATE: elemsize =
sizeof(DATE_STRUCT);
break;
463 case SQL_C_TYPE_TIME: elemsize =
sizeof(TIME_STRUCT);
break;
464 case SQL_C_TYPE_TIMESTAMP: elemsize =
sizeof(TIMESTAMP_STRUCT);
break;
467 SetError(-1, Form(
"SQL C Type %d is not supported",sqlctype),
"BindColumn");
472 fBuffer[ncol].fBroottype = 0;
473 fBuffer[ncol].fBsqltype = sqltype;
474 fBuffer[ncol].fBsqlctype = sqlctype;
475 fBuffer[ncol].fBbuffer = malloc(elemsize * fBufferLength);
476 fBuffer[ncol].fBelementsize = elemsize;
477 fBuffer[ncol].fBlenarray =
new SQLLEN[fBufferLength];
480 SQLBindCol(fHstmt, ncol+1, sqlctype, fBuffer[ncol].fBbuffer,
482 fBuffer[ncol].fBlenarray);
484 return !ExtractErrors(retcode,
"BindColumn");
490 Bool_t TODBCStatement::BindParam(Int_t npar, Int_t roottype, Int_t size)
494 if ((npar<0) || (npar>=fNumBuffers))
return kFALSE;
496 if (fBuffer[npar].fBroottype!=0) {
497 SetError(-1,Form(
"ParameterType for par %d already specified", npar),
"BindParam");
501 SQLSMALLINT sqltype = 0, sqlctype = 0;
505 case kUInt_t: sqltype = SQL_INTEGER; sqlctype = SQL_C_ULONG; elemsize =
sizeof(SQLUINTEGER);
break;
506 case kInt_t: sqltype = SQL_INTEGER; sqlctype = SQL_C_SLONG; elemsize =
sizeof(SQLINTEGER);
break;
507 case kULong_t: sqltype = SQL_INTEGER; sqlctype = SQL_C_ULONG; elemsize =
sizeof(SQLUINTEGER);
break;
508 case kLong_t: sqltype = SQL_INTEGER; sqlctype = SQL_C_SLONG; elemsize =
sizeof(SQLINTEGER);
break;
512 case kULong64_t: sqltype = SQL_BIGINT; sqlctype = SQL_C_UBIGINT; elemsize =
sizeof(ULong64_t);
break;
513 case kLong64_t: sqltype = SQL_BIGINT; sqlctype = SQL_C_SBIGINT; elemsize =
sizeof(Long64_t);
break;
515 case kUShort_t: sqltype = SQL_SMALLINT;sqlctype = SQL_C_USHORT; elemsize =
sizeof(SQLUSMALLINT);
break;
516 case kShort_t: sqltype = SQL_SMALLINT;sqlctype = SQL_C_SSHORT; elemsize =
sizeof(SQLSMALLINT);
break;
517 case kUChar_t: sqltype = SQL_TINYINT; sqlctype = SQL_C_UTINYINT; elemsize =
sizeof(SQLCHAR);
break;
518 case kChar_t: sqltype = SQL_TINYINT; sqlctype = SQL_C_STINYINT; elemsize =
sizeof(SQLSCHAR);
break;
519 case kBool_t: sqltype = SQL_TINYINT; sqlctype = SQL_C_UTINYINT; elemsize =
sizeof(SQLCHAR);
break;
520 case kFloat_t: sqltype = SQL_FLOAT; sqlctype = SQL_C_FLOAT; elemsize =
sizeof(SQLREAL);
break;
521 case kFloat16_t: sqltype = SQL_FLOAT; sqlctype = SQL_C_FLOAT; elemsize =
sizeof(SQLREAL);
break;
522 case kDouble_t: sqltype = SQL_DOUBLE; sqlctype = SQL_C_DOUBLE; elemsize =
sizeof(SQLDOUBLE);
break;
523 case kDouble32_t: sqltype = SQL_DOUBLE; sqlctype = SQL_C_DOUBLE; elemsize =
sizeof(SQLDOUBLE);
break;
524 case kCharStar: sqltype = SQL_CHAR; sqlctype = SQL_C_CHAR; elemsize = size;
break;
525 case kSqlBinary: sqltype = SQL_BINARY; sqlctype = SQL_C_BINARY; elemsize = size;
break;
526 case kSqlDate: sqltype = SQL_TYPE_DATE; sqlctype = SQL_C_TYPE_DATE; elemsize =
sizeof(DATE_STRUCT);
break;
527 case kSqlTime: sqltype = SQL_TYPE_TIME; sqlctype = SQL_C_TYPE_TIME; elemsize =
sizeof(TIME_STRUCT);
break;
528 case kSqlTimestamp: sqltype = SQL_TYPE_TIMESTAMP; sqlctype = SQL_C_TYPE_TIMESTAMP; elemsize =
sizeof(TIMESTAMP_STRUCT);
break;
530 SetError(-1, Form(
"Root type %d is not supported", roottype),
"BindParam");
535 void* buffer = malloc(elemsize * fBufferLength);
536 SQLLEN* lenarray =
new SQLLEN[fBufferLength];
538 SQLBindParameter(fHstmt, npar+1, SQL_PARAM_INPUT,
539 sqlctype, sqltype, 0, 0,
540 buffer, elemsize, lenarray);
542 if (ExtractErrors(retcode,
"BindParam")) {
548 fBuffer[npar].fBroottype = roottype;
549 fBuffer[npar].fBsqlctype = sqlctype;
550 fBuffer[npar].fBsqltype = sqltype;
551 fBuffer[npar].fBbuffer = buffer;
552 fBuffer[npar].fBelementsize = elemsize;
553 fBuffer[npar].fBlenarray = lenarray;
561 void* TODBCStatement::GetParAddr(Int_t npar, Int_t roottype, Int_t length)
565 if ((fBuffer==0) || (npar<0) || (npar>=fNumBuffers) || (fBufferCounter<0)) {
566 SetError(-1,
"Invalid parameter number",
"GetParAddr");
570 if (fBuffer[npar].fBbuffer==0) {
571 if (IsParSettMode() && (roottype!=0) && (fBufferCounter==0))
572 if (!BindParam(npar, roottype, length))
return 0;
574 if (fBuffer[npar].fBbuffer==0)
return 0;
578 if (fBuffer[npar].fBroottype!=roottype)
return 0;
580 return (
char*)fBuffer[npar].fBbuffer + fBufferCounter*fBuffer[npar].fBelementsize;
586 long double TODBCStatement::ConvertToNumeric(Int_t npar)
588 void* addr = GetParAddr(npar);
589 if (addr==0)
return 0;
591 switch (fBuffer[npar].fBsqlctype) {
592 case SQL_C_ULONG:
return *((SQLUINTEGER*) addr);
break;
593 case SQL_C_SLONG:
return *((SQLINTEGER*) addr);
break;
594 case SQL_C_UBIGINT:
return *((ULong64_t*) addr);
break;
595 case SQL_C_SBIGINT:
return *((Long64_t*) addr);
break;
596 case SQL_C_USHORT:
return *((SQLUSMALLINT*) addr);
break;
597 case SQL_C_SSHORT:
return *((SQLSMALLINT*) addr);
break;
598 case SQL_C_UTINYINT:
return *((SQLCHAR*) addr);
break;
599 case SQL_C_STINYINT:
return *((SQLSCHAR*) addr);
break;
600 case SQL_C_FLOAT:
return *((SQLREAL*) addr);
break;
601 case SQL_C_DOUBLE:
return *((SQLDOUBLE*) addr);
break;
602 case SQL_C_TYPE_DATE: {
603 DATE_STRUCT* dt = (DATE_STRUCT*) addr;
604 TDatime rtm(dt->year, dt->month, dt->day, 0, 0, 0);
605 return rtm.GetDate();
608 case SQL_C_TYPE_TIME: {
609 TIME_STRUCT* tm = (TIME_STRUCT*) addr;
610 TDatime rtm(2000, 1, 1, tm->hour, tm->minute, tm->second);
611 return rtm.GetTime();
614 case SQL_C_TYPE_TIMESTAMP: {
615 TIMESTAMP_STRUCT* tm = (TIMESTAMP_STRUCT*) addr;
616 TDatime rtm(tm->year, tm->month, tm->day,
617 tm->hour, tm->minute, tm->second);
628 const char* TODBCStatement::ConvertToString(Int_t npar)
630 void* addr = GetParAddr(npar);
631 if (addr==0)
return 0;
632 if (fBuffer[npar].fBstrbuffer==0)
633 fBuffer[npar].fBstrbuffer =
new char[100];
635 char* buf = fBuffer[npar].fBstrbuffer;
637 switch(fBuffer[npar].fBsqlctype) {
638 #if (SIZEOF_LONG == 8)
639 case SQL_C_SLONG: snprintf(buf, 100,
"%d", *((SQLINTEGER*) addr));
break;
640 case SQL_C_ULONG: snprintf(buf, 100,
"%u", *((SQLUINTEGER*) addr));
break;
642 case SQL_C_SLONG: snprintf(buf, 100,
"%ld", (
long)*((SQLINTEGER*) addr));
break;
643 case SQL_C_ULONG: snprintf(buf, 100,
"%lu", (
unsigned long)*((SQLUINTEGER*) addr));
break;
645 case SQL_C_SBIGINT: snprintf(buf, 100,
"%lld", *((Long64_t*) addr));
break;
646 case SQL_C_UBIGINT: snprintf(buf, 100,
"%llu", *((ULong64_t*) addr));
break;
647 case SQL_C_SSHORT: snprintf(buf, 100,
"%hd", *((SQLSMALLINT*) addr));
break;
648 case SQL_C_USHORT: snprintf(buf, 100,
"%hu", *((SQLUSMALLINT*) addr));
break;
649 case SQL_C_STINYINT:snprintf(buf, 100,
"%d", *((SQLSCHAR*) addr));
break;
650 case SQL_C_UTINYINT:snprintf(buf, 100,
"%u", *((SQLCHAR*) addr));
break;
651 case SQL_C_FLOAT: snprintf(buf, 100, TSQLServer::GetFloatFormat(), *((SQLREAL*) addr));
break;
652 case SQL_C_DOUBLE: snprintf(buf, 100, TSQLServer::GetFloatFormat(), *((SQLDOUBLE*) addr));
break;
653 case SQL_C_TYPE_DATE: {
654 DATE_STRUCT* dt = (DATE_STRUCT*) addr;
655 snprintf(buf,100,
"%4.4d-%2.2d-%2.2d",
656 dt->year, dt->month, dt->day);
659 case SQL_C_TYPE_TIME: {
660 TIME_STRUCT* tm = (TIME_STRUCT*) addr;
661 snprintf(buf,100,
"%2.2d:%2.2d:%2.2d",
662 tm->hour, tm->minute, tm->second);
665 case SQL_C_TYPE_TIMESTAMP: {
666 TIMESTAMP_STRUCT* tm = (TIMESTAMP_STRUCT*) addr;
667 snprintf(buf,100,
"%4.4d-%2.2d-%2.2d %2.2d:%2.2d:%2.2d",
668 tm->year, tm->month, tm->day,
669 tm->hour, tm->minute, tm->second);
681 Bool_t TODBCStatement::IsNull(Int_t npar)
683 void* addr = GetParAddr(npar);
684 if (addr==0)
return kTRUE;
686 return fBuffer[npar].fBlenarray[fBufferCounter] == SQL_NULL_DATA;
692 Int_t TODBCStatement::GetInt(Int_t npar)
694 void* addr = GetParAddr(npar);
695 if (addr==0)
return 0;
697 if (fBuffer[npar].fBsqlctype==SQL_C_SLONG)
698 return (Int_t) *((SQLINTEGER*) addr);
700 return (Int_t) ConvertToNumeric(npar);
706 UInt_t TODBCStatement::GetUInt(Int_t npar)
708 void* addr = GetParAddr(npar);
709 if (addr==0)
return 0;
711 if (fBuffer[npar].fBsqlctype==SQL_C_ULONG)
712 return (UInt_t) *((SQLUINTEGER*) addr);
714 return (UInt_t) ConvertToNumeric(npar);
720 Long_t TODBCStatement::GetLong(Int_t npar)
722 void* addr = GetParAddr(npar);
723 if (addr==0)
return 0;
725 if (fBuffer[npar].fBsqlctype==SQL_C_SLONG)
726 return (Long_t) *((SQLINTEGER*) addr);
728 return (Long_t) ConvertToNumeric(npar);
734 Long64_t TODBCStatement::GetLong64(Int_t npar)
736 void* addr = GetParAddr(npar);
737 if (addr==0)
return 0;
739 if (fBuffer[npar].fBsqlctype==SQL_C_SBIGINT)
740 return *((Long64_t*) addr);
742 return (Long64_t) ConvertToNumeric(npar);
748 ULong64_t TODBCStatement::GetULong64(Int_t npar)
750 void* addr = GetParAddr(npar);
751 if (addr==0)
return 0;
753 if (fBuffer[npar].fBsqlctype==SQL_C_UBIGINT)
754 return *((ULong64_t*) addr);
756 return (ULong64_t) ConvertToNumeric(npar);
762 Double_t TODBCStatement::GetDouble(Int_t npar)
764 void* addr = GetParAddr(npar);
765 if (addr==0)
return 0;
767 if (fBuffer[npar].fBsqlctype==SQL_C_DOUBLE)
768 return *((SQLDOUBLE*) addr);
770 return (Double_t) ConvertToNumeric(npar);
776 const char* TODBCStatement::GetString(Int_t npar)
778 void* addr = GetParAddr(npar);
779 if (addr==0)
return 0;
781 if (fBuffer[npar].fBsqlctype==SQL_C_CHAR) {
784 int len = fBuffer[npar].fBlenarray[fBufferCounter];
786 if ((len == SQL_NULL_DATA) || (len==0))
return 0;
788 char* res = (
char*) addr;
789 if (len < fBuffer[npar].fBelementsize) {
794 if (len > fBuffer[npar].fBelementsize) {
795 SetError(-1, Form(
"Problems with string size %d", len),
"GetString");
799 if (fBuffer[npar].fBstrbuffer==0)
800 fBuffer[npar].fBstrbuffer =
new char[len+1];
802 strlcpy(fBuffer[npar].fBstrbuffer, res, len+1);
804 res = fBuffer[npar].fBstrbuffer;
809 return ConvertToString(npar);
815 Bool_t TODBCStatement::GetBinary(Int_t npar,
void* &mem, Long_t& size)
820 void* addr = GetParAddr(npar);
821 if (addr==0)
return kFALSE;
823 if ((fBuffer[npar].fBsqlctype==SQL_C_BINARY) ||
824 (fBuffer[npar].fBsqlctype==SQL_C_CHAR)) {
827 int len = fBuffer[npar].fBlenarray[fBufferCounter];
829 if ((len == SQL_NULL_DATA) || (len==0))
return kTRUE;
833 if (fBuffer[npar].fBstrbuffer==0)
834 fBuffer[npar].fBstrbuffer =
new char[size];
836 memcpy(fBuffer[npar].fBstrbuffer, addr, size);
838 mem = fBuffer[npar].fBstrbuffer;
850 Bool_t TODBCStatement::GetDate(Int_t npar, Int_t& year, Int_t& month, Int_t& day)
852 void* addr = GetParAddr(npar);
853 if (addr==0)
return kFALSE;
855 if (fBuffer[npar].fBsqlctype!=SQL_C_TYPE_DATE)
return kFALSE;
857 DATE_STRUCT* dt = (DATE_STRUCT*) addr;
868 Bool_t TODBCStatement::GetTime(Int_t npar, Int_t& hour, Int_t& min, Int_t& sec)
870 void* addr = GetParAddr(npar);
871 if (addr==0)
return kFALSE;
873 if (fBuffer[npar].fBsqlctype!=SQL_C_TYPE_TIME)
return kFALSE;
875 TIME_STRUCT* tm = (TIME_STRUCT*) addr;
886 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)
888 void* addr = GetParAddr(npar);
889 if (addr==0)
return kFALSE;
891 if (fBuffer[npar].fBsqlctype!=SQL_C_TYPE_TIMESTAMP)
return kFALSE;
893 TIMESTAMP_STRUCT* tm = (TIMESTAMP_STRUCT*) addr;
907 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)
909 void* addr = GetParAddr(npar);
910 if (addr==0)
return kFALSE;
912 if (fBuffer[npar].fBsqlctype!=SQL_C_TYPE_TIMESTAMP)
return kFALSE;
914 TIMESTAMP_STRUCT* tm = (TIMESTAMP_STRUCT*) addr;
936 Bool_t TODBCStatement::SetNull(Int_t npar)
938 void* addr = GetParAddr(npar, kInt_t);
940 *((SQLINTEGER*) addr) = 0;
942 if ((npar>=0) && (npar<fNumBuffers))
943 fBuffer[npar].fBlenarray[fBufferCounter] = SQL_NULL_DATA;
951 Bool_t TODBCStatement::SetInt(Int_t npar, Int_t value)
953 void* addr = GetParAddr(npar, kInt_t);
954 if (addr==0)
return kFALSE;
956 *((SQLINTEGER*) addr) = value;
958 fBuffer[npar].fBlenarray[fBufferCounter] = 0;
966 Bool_t TODBCStatement::SetUInt(Int_t npar, UInt_t value)
968 void* addr = GetParAddr(npar, kUInt_t);
969 if (addr==0)
return kFALSE;
971 *((SQLUINTEGER*) addr) = value;
973 fBuffer[npar].fBlenarray[fBufferCounter] = 0;
981 Bool_t TODBCStatement::SetLong(Int_t npar, Long_t value)
983 void* addr = GetParAddr(npar, kLong_t);
984 if (addr==0)
return kFALSE;
986 *((SQLINTEGER*) addr) = value;
988 fBuffer[npar].fBlenarray[fBufferCounter] = 0;
996 Bool_t TODBCStatement::SetLong64(Int_t npar, Long64_t value)
998 void* addr = GetParAddr(npar, kLong64_t);
999 if (addr==0)
return kFALSE;
1001 *((Long64_t*) addr) = value;
1003 fBuffer[npar].fBlenarray[fBufferCounter] = 0;
1011 Bool_t TODBCStatement::SetULong64(Int_t npar, ULong64_t value)
1013 void* addr = GetParAddr(npar, kULong64_t);
1014 if (addr==0)
return kFALSE;
1016 *((ULong64_t*) addr) = value;
1018 fBuffer[npar].fBlenarray[fBufferCounter] = 0;
1026 Bool_t TODBCStatement::SetDouble(Int_t npar, Double_t value)
1028 void* addr = GetParAddr(npar, kDouble_t);
1029 if (addr==0)
return kFALSE;
1031 *((SQLDOUBLE*) addr) = value;
1033 fBuffer[npar].fBlenarray[fBufferCounter] = 0;
1041 Bool_t TODBCStatement::SetString(Int_t npar,
const char* value, Int_t maxsize)
1043 void* addr = GetParAddr(npar, kCharStar, maxsize);
1045 if (addr==0)
return kFALSE;
1048 int len = strlen(value);
1050 if (len>=fBuffer[npar].fBelementsize) {
1051 len = fBuffer[npar].fBelementsize;
1052 strlcpy((
char*) addr, value, len+1);
1053 fBuffer[npar].fBlenarray[fBufferCounter] = len;
1056 strlcpy((
char*) addr, value, maxsize);
1057 fBuffer[npar].fBlenarray[fBufferCounter] = SQL_NTS;
1059 *((
char*) addr) = 0;
1060 fBuffer[npar].fBlenarray[fBufferCounter] = SQL_NTS;
1063 *((
char*) addr) = 0;
1064 fBuffer[npar].fBlenarray[fBufferCounter] = SQL_NTS;
1073 Bool_t TODBCStatement::SetBinary(Int_t npar,
void* mem, Long_t size, Long_t maxsize)
1075 void* addr = GetParAddr(npar, kSqlBinary, maxsize);
1076 if (addr==0)
return kFALSE;
1078 if (size>fBuffer[npar].fBelementsize)
1079 size = fBuffer[npar].fBelementsize;
1081 memcpy(addr, mem, size);
1082 fBuffer[npar].fBlenarray[fBufferCounter] = size;
1090 Bool_t TODBCStatement::SetDate(Int_t npar, Int_t year, Int_t month, Int_t day)
1092 void* addr = GetParAddr(npar, kSqlDate);
1093 if (addr==0)
return kFALSE;
1095 DATE_STRUCT* dt = (DATE_STRUCT*) addr;
1100 fBuffer[npar].fBlenarray[fBufferCounter] = 0;
1108 Bool_t TODBCStatement::SetTime(Int_t npar, Int_t hour, Int_t min, Int_t sec)
1110 void* addr = GetParAddr(npar, kSqlTime);
1111 if (addr==0)
return kFALSE;
1113 TIME_STRUCT* tm = (TIME_STRUCT*) addr;
1118 fBuffer[npar].fBlenarray[fBufferCounter] = 0;
1126 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)
1128 void* addr = GetParAddr(npar, kSqlTimestamp);
1129 if (addr==0)
return kFALSE;
1131 TIMESTAMP_STRUCT* tm = (TIMESTAMP_STRUCT*) addr;
1140 fBuffer[npar].fBlenarray[fBufferCounter] = 0;
1148 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)
1150 void* addr = GetParAddr(npar, kSqlTimestamp);
1151 if (addr==0)
return kFALSE;
1153 TIMESTAMP_STRUCT* tm = (TIMESTAMP_STRUCT*) addr;
1160 tm->fraction = frac;
1162 fBuffer[npar].fBlenarray[fBufferCounter] = 0;