result.cpp
上传用户:yhdzpy8989
上传日期:2007-06-13
资源大小:13604k
文件大小:40k
源码类别:

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: result.cpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/06/01 19:20:55  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.14
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /* $Id: result.cpp,v 1000.2 2004/06/01 19:20:55 gouriano Exp $
  10.  * ===========================================================================
  11.  *
  12.  *                            PUBLIC DOMAIN NOTICE
  13.  *               National Center for Biotechnology Information
  14.  *
  15.  *  This software/database is a "United States Government Work" under the
  16.  *  terms of the United States Copyright Act.  It was written as part of
  17.  *  the author's official duties as a United States Government employee and
  18.  *  thus cannot be copyrighted.  This software/database is freely available
  19.  *  to the public for use. The National Library of Medicine and the U.S.
  20.  *  Government have not placed any restriction on its use or reproduction.
  21.  *
  22.  *  Although all reasonable efforts have been taken to ensure the accuracy
  23.  *  and reliability of the software and data, the NLM and the U.S.
  24.  *  Government do not and cannot warrant the performance or results that
  25.  *  may be obtained by using this software or data. The NLM and the U.S.
  26.  *  Government disclaim all warranties, express or implied, including
  27.  *  warranties of performance, merchantability or fitness for any particular
  28.  *  purpose.
  29.  *
  30.  *  Please cite the author in any work or product based on this material.
  31.  *
  32.  * ===========================================================================
  33.  *
  34.  * Author:  Vladimir Soussov
  35.  *
  36.  * File Description:   TDS Results
  37.  *
  38.  */
  39. #include <ncbi_pch.hpp>
  40. #include <dbapi/driver/ftds/interfaces.hpp>
  41. #include <dbapi/driver/util/numeric_convert.hpp>
  42. BEGIN_NCBI_SCOPE
  43. // Aux. for s_*GetItem()
  44. static CDB_Object* s_GenericGetItem(EDB_Type data_type, CDB_Object* item_buff,
  45.                                     EDB_Type b_type, BYTE* d_ptr, DBINT d_len)
  46. {
  47.     switch (data_type) {
  48.     case eDB_VarBinary: {
  49.         if (item_buff) {
  50.             switch (b_type) {
  51.             case eDB_VarBinary:
  52.                 ((CDB_VarBinary*) item_buff)->SetValue((const void*) d_ptr,
  53.                                                        (size_t) d_len);
  54.                 break;
  55.             case eDB_Binary:
  56.                 ((CDB_Binary*)    item_buff)->SetValue((const void*) d_ptr,
  57.                                                        (size_t) d_len);
  58.                 break;
  59.             case eDB_VarChar:
  60.                 ((CDB_VarChar*)   item_buff)->SetValue((const char*) d_ptr,
  61.                                                        (size_t) d_len);
  62.                 break;
  63.             case eDB_Char:
  64.                 ((CDB_Char*)      item_buff)->SetValue((const char*) d_ptr,
  65.                                                        (size_t) d_len);
  66.                 break;
  67. case eDB_LongBinary:
  68.                 ((CDB_LongBinary*)item_buff)->SetValue((const void*) d_ptr,
  69.                                                        (size_t) d_len);
  70.                 break;
  71.             case eDB_LongChar:
  72.                 ((CDB_LongChar*)  item_buff)->SetValue((const char*) d_ptr,
  73.                                                        (size_t) d_len);
  74.                 break;
  75.             default:
  76.                 throw CDB_ClientEx(eDB_Error, 230020, "s_GenericGetItem",
  77.                                    "wrong type of CDB_Object");
  78.             }
  79.             return item_buff;
  80.         }
  81.         return d_ptr ? new CDB_VarBinary((const void*) d_ptr, (size_t) d_len)
  82.             : new CDB_VarBinary();
  83.     }
  84.     case eDB_Bit: {
  85.         DBBIT* v = (DBBIT*) d_ptr;
  86.         if (item_buff) {
  87.             if (v) {
  88.                 switch (b_type) {
  89.                 case eDB_Bit:
  90.                     *((CDB_Bit*)      item_buff) = (int) *v;
  91.                     break;
  92.                 case eDB_TinyInt:
  93.                     *((CDB_TinyInt*)  item_buff) = *v ? 1 : 0;
  94.                     break;
  95.                 case eDB_SmallInt:
  96.                     *((CDB_SmallInt*) item_buff) = *v ? 1 : 0;
  97.                     break;
  98.                 case eDB_Int:
  99.                     *((CDB_Int*)      item_buff) = *v ? 1 : 0;
  100.                     break;
  101.                 default:
  102.                     throw CDB_ClientEx(eDB_Error, 230020, "s_GenericGetItem",
  103.                                        "wrong type of CDB_Object");
  104.                 }
  105.             } else
  106.                 item_buff->AssignNULL();
  107.             return item_buff;
  108.         }
  109.         return v ? new CDB_Bit((int) *v) : new CDB_Bit;
  110.     }
  111.     case eDB_VarChar: {
  112.         if (item_buff) {
  113.             switch (b_type) {
  114.             case eDB_VarChar:
  115.                 ((CDB_VarChar*)   item_buff)->SetValue((const char*) d_ptr,
  116.                                                        (size_t) d_len);
  117.                 break;
  118.             case eDB_Char:
  119.                 ((CDB_Char*)      item_buff)->SetValue((const char*) d_ptr,
  120.                                                        (size_t) d_len);
  121.                 break;
  122.             case eDB_LongChar:
  123.                 ((CDB_LongChar*)  item_buff)->SetValue((const char*) d_ptr,
  124.                                                        (size_t) d_len);
  125.                 break;
  126.             case eDB_VarBinary:
  127.                 ((CDB_VarBinary*) item_buff)->SetValue((const void*) d_ptr,
  128.                                                        (size_t) d_len);
  129.                 break;
  130.             case eDB_Binary:
  131.                 ((CDB_Binary*)    item_buff)->SetValue((const void*) d_ptr,
  132.                                                        (size_t) d_len);
  133.                 break;
  134.             case eDB_LongBinary:
  135.                 ((CDB_LongBinary*)item_buff)->SetValue((const void*) d_ptr,
  136.                                                        (size_t) d_len);
  137.                 break;
  138.             default:
  139.                 throw CDB_ClientEx(eDB_Error, 230020, "s_GenericGetItem",
  140.                                    "wrong type of CDB_Object");
  141.             }
  142.             return item_buff;
  143.         }
  144.         return d_ptr ? new CDB_VarChar((const char*) d_ptr, (size_t) d_len)
  145.             : new CDB_VarChar();
  146.     }
  147.     case eDB_DateTime: {
  148.         DBDATETIME* v = (DBDATETIME*) d_ptr;
  149.         if (item_buff) {
  150.             if (b_type != eDB_DateTime) {
  151.                 throw CDB_ClientEx(eDB_Error, 230020, "s_GenericGetItem",
  152.                                    "wrong type of CDB_Object");
  153.             }
  154.             if (v)
  155.                 ((CDB_DateTime*) item_buff)->Assign(v->dtdays, v->dttime);
  156.             else
  157.                 item_buff->AssignNULL();
  158.             return item_buff;
  159.         }
  160.         return v ? new CDB_DateTime(v->dtdays, v->dttime) : new CDB_DateTime;
  161.     }
  162.     case eDB_SmallDateTime: {
  163.         DBDATETIME4* v = (DBDATETIME4*)d_ptr;
  164.         if (item_buff) {
  165.             if (v) {
  166.                 switch (b_type) {
  167.                 case eDB_SmallDateTime:
  168.                     ((CDB_SmallDateTime*) item_buff)->Assign
  169.                         (v->days,             v->minutes);
  170.                     break;
  171.                 case eDB_DateTime:
  172.                     ((CDB_DateTime*)      item_buff)->Assign
  173.                         ((int) v->days, (int) v->minutes*60*300);
  174.                     break;
  175.                 default:
  176.                     throw CDB_ClientEx(eDB_Error, 230020, "s_GenericGetItem",
  177.                                        "wrong type of CDB_Object");
  178.                 }
  179.             } else
  180.                 item_buff->AssignNULL();
  181.             return item_buff;
  182.         }
  183.         return v ?
  184.             new CDB_SmallDateTime(v->days, v->minutes) : new CDB_SmallDateTime;
  185.     }
  186.     case eDB_TinyInt: {
  187.         DBTINYINT* v = (DBTINYINT*) d_ptr;
  188.         if (item_buff) {
  189.             if (v) {
  190.                 switch (b_type) {
  191.                 case eDB_TinyInt:
  192.                     *((CDB_TinyInt*)  item_buff) = (Uint1) *v;
  193.                     break;
  194.                 case eDB_SmallInt:
  195.                     *((CDB_SmallInt*) item_buff) = (Int2)  *v;
  196.                     break;
  197.                 case eDB_Int:
  198.                     *((CDB_Int*)      item_buff) = (Int4)  *v;
  199.                     break;
  200.                 default:
  201.                     throw CDB_ClientEx(eDB_Error, 230020, "s_GenericGetItem",
  202.                                        "wrong type of CDB_Object");
  203.                 }
  204.             } else
  205.                 item_buff->AssignNULL();
  206.             return item_buff;
  207.         }
  208.         return v ? new CDB_TinyInt((Uint1) *v) : new CDB_TinyInt;
  209.     }
  210.     case eDB_SmallInt: {
  211.         DBSMALLINT* v = (DBSMALLINT*) d_ptr;
  212.         if (item_buff) {
  213.             if (v) {
  214.                 switch (b_type) {
  215.                 case eDB_SmallInt:
  216.                     *((CDB_SmallInt*) item_buff) = (Int2) *v;
  217.                     break;
  218.                 case eDB_Int:
  219.                     *((CDB_Int*)      item_buff) = (Int4) *v;
  220.                     break;
  221.                 default:
  222.                     throw CDB_ClientEx(eDB_Error, 230020, "s_GenericGetItem",
  223.                                        "wrong type of CDB_Object");
  224.                 }
  225.             } else
  226.                 item_buff->AssignNULL();
  227.             return item_buff;
  228.         }
  229.         return v ? new CDB_SmallInt((Int2) *v) : new CDB_SmallInt;
  230.     }
  231.     case eDB_Int: {
  232.         DBINT* v = (DBINT*) d_ptr;
  233.         if (item_buff) {
  234.             if (v) {
  235.                 if (b_type == eDB_Int)
  236.                     *((CDB_Int*) item_buff) = (Int4) *v;
  237.                 else {
  238.                     throw CDB_ClientEx(eDB_Error, 230020, "s_GenericGetItem",
  239.                                        "wrong type of CDB_Object");
  240.                 }
  241.             } else
  242.                 item_buff->AssignNULL();
  243.             return item_buff;
  244.         }
  245.         return v ? new CDB_Int((Int4) *v) : new CDB_Int;
  246.     }
  247.     case eDB_Double: {
  248.         if (item_buff  &&  b_type != eDB_Double) {
  249.             throw CDB_ClientEx(eDB_Error, 130020, "s_GenericGetItem",
  250.                                "wrong type of CDB_Object");
  251.         }
  252.         DBFLT8 v;
  253.         if(d_ptr) memcpy((void*)&v, d_ptr, sizeof(DBFLT8));
  254.         if (item_buff) {
  255.             if (d_ptr)
  256.                 *((CDB_Double*) item_buff) = (double) v;
  257.             else
  258.                 item_buff->AssignNULL();
  259.             return item_buff;
  260.         }
  261.         return d_ptr ? new CDB_Double((double)v) : new CDB_Double;
  262.     }
  263.     case eDB_Float: {
  264.         if (item_buff  &&  b_type != eDB_Float) {
  265.             throw CDB_ClientEx(eDB_Error, 130020, "s_GenericGetItem",
  266.                                "wrong type of CDB_Object");
  267.         }
  268.         DBREAL* v = (DBREAL*) d_ptr;
  269.         if (item_buff) {
  270.             if (v)
  271.                 *((CDB_Float*) item_buff) = (float) *v;
  272.             else
  273.                 item_buff->AssignNULL();
  274.             return item_buff;
  275.         }
  276.         return v ? new CDB_Float((float) *v) : new CDB_Float;
  277.     }
  278.     case eDB_LongBinary: {
  279.         if (item_buff) {
  280.             switch (b_type) {
  281. case eDB_LongBinary:
  282.                 ((CDB_LongBinary*)item_buff)->SetValue((const void*) d_ptr,
  283.                                                        (size_t) d_len);
  284.                 break;
  285.             case eDB_LongChar:
  286.                 ((CDB_LongChar*)  item_buff)->SetValue((const char*) d_ptr,
  287.                                                        (size_t) d_len);
  288.                 break;
  289.             default:
  290.                 throw CDB_ClientEx(eDB_Error, 230020, "s_GenericGetItem",
  291.                                    "wrong type of CDB_Object");
  292.             }
  293.             return item_buff;
  294.         }
  295.         return d_ptr ? new CDB_LongBinary((size_t) d_len, (const void*) d_ptr, 
  296.                                           (size_t) d_len)
  297.             : new CDB_LongBinary();
  298.     }
  299.     case eDB_LongChar: {
  300.         if (item_buff) {
  301.             switch (b_type) {
  302.             case eDB_LongChar:
  303.                 ((CDB_LongChar*)  item_buff)->SetValue((const char*) d_ptr,
  304.                                                        (size_t) d_len);
  305.                 break;
  306.             case eDB_LongBinary:
  307.                 ((CDB_LongBinary*)item_buff)->SetValue((const void*) d_ptr,
  308.                                                        (size_t) d_len);
  309.                 break;
  310.             default:
  311.                 throw CDB_ClientEx(eDB_Error, 230020, "s_GenericGetItem",
  312.                                    "wrong type of CDB_Object");
  313.             }
  314.             return item_buff;
  315.         }
  316.         return d_ptr ? new CDB_LongChar((size_t) d_len, (const char*) d_ptr)
  317.             : new CDB_LongChar();
  318.     }
  319.     default:
  320.         return 0;
  321.     }
  322. }
  323. /////////////////////////////////////////////////////////////////////////////
  324. static EDB_Type s_GetDataType(DBPROCESS* cmd, int n)
  325. {
  326.     switch (dbcoltype(cmd, n)) {
  327.     case SYBBINARY:    return (dbcollen(cmd, n) > 255) ? eDB_LongBinary : 
  328.                                                          eDB_VarBinary;
  329.     case SYBBITN:                                                         
  330.     case SYBBIT:       return eDB_Bit;
  331.     case SYBCHAR:      return (dbcollen(cmd, n) > 255) ? eDB_LongChar :
  332.                                                          eDB_VarChar;
  333.     case SYBDATETIME:  return eDB_DateTime;
  334.     case SYBDATETIME4: return eDB_SmallDateTime;
  335.     case SYBINT1:      return eDB_TinyInt;
  336.     case SYBINT2:      return eDB_SmallInt;
  337.     case SYBINT4:      return eDB_Int;
  338.     case SYBINT8:      return eDB_BigInt;
  339.     case SYBDECIMAL:
  340.     case SYBNUMERIC:   break;
  341.     case SYBFLT8:      return eDB_Double;
  342.     case SYBREAL:      return eDB_Float;
  343.     case SYBTEXT:      return eDB_Text;
  344.     case SYBIMAGE:     return eDB_Image;
  345.     default:           return eDB_UnsupportedType;
  346.     }
  347.     DBTYPEINFO* t = dbcoltypeinfo(cmd, n);
  348.     return (t->scale == 0  &&  t->precision < 20) ? eDB_BigInt : eDB_Numeric;
  349. }
  350. /////////////////////////////////////////////////////////////////////////////
  351. //
  352. //  CTDS_RowResult::
  353. //
  354. CTDS_RowResult::CTDS_RowResult(DBPROCESS* cmd,
  355.                                unsigned int* res_status, bool need_init)
  356.     : m_Cmd(cmd), m_CurrItem(-1), m_EOR(false),
  357.       m_ResStatus(res_status), m_Offset(0)
  358. {
  359.     if (!need_init)
  360.         return;
  361.     m_NofCols = dbnumcols(cmd);
  362.     m_CmdNum = DBCURCMD(cmd);
  363.     m_ColFmt = new STDS_ColDescr[m_NofCols];
  364.     for (unsigned int n = 0;  n < m_NofCols;  n++) {
  365.         m_ColFmt[n].max_length = dbcollen(m_Cmd, n + 1);
  366.         m_ColFmt[n].data_type = s_GetDataType(m_Cmd, n + 1);
  367.         char* s = dbcolname(m_Cmd, n + 1);
  368.         m_ColFmt[n].col_name = s ? s : "";
  369.     }
  370. }
  371. EDB_ResType CTDS_RowResult::ResultType() const
  372. {
  373.     return eDB_RowResult;
  374. }
  375. unsigned int CTDS_RowResult::NofItems() const
  376. {
  377.     return m_NofCols;
  378. }
  379. const char* CTDS_RowResult::ItemName(unsigned int item_num) const
  380. {
  381.     return item_num < m_NofCols ? m_ColFmt[item_num].col_name.c_str() : 0;
  382. }
  383. size_t CTDS_RowResult::ItemMaxSize(unsigned int item_num) const
  384. {
  385.     return item_num < m_NofCols ? m_ColFmt[item_num].max_length : 0;
  386. }
  387. EDB_Type CTDS_RowResult::ItemDataType(unsigned int item_num) const
  388. {
  389.     return item_num < m_NofCols
  390.         ? m_ColFmt[item_num].data_type : eDB_UnsupportedType;
  391. }
  392. bool CTDS_RowResult::Fetch()
  393. {
  394.     m_CurrItem = -1;
  395.     if ( m_EOR )
  396.         return false;
  397.     switch ( dbnextrow(m_Cmd) ) {
  398.     case REG_ROW:
  399.         m_CurrItem = 0;
  400.         m_Offset = 0;
  401.         return true;
  402.     case NO_MORE_ROWS:
  403.         m_EOR = true;
  404.         break;
  405.     case FAIL:
  406.         throw CDB_ClientEx(eDB_Error, 230003, "CTDS_RowResult::Fetch",
  407.                            "error in fetching row");
  408.     case BUF_FULL:
  409.         throw CDB_ClientEx(eDB_Error, 230006, "CTDS_RowResult::Fetch",
  410.                            "buffer is full");
  411.     default:
  412.         *m_ResStatus |= 0x10;
  413.         m_EOR = true;
  414.         break;
  415.     }
  416.     return false;
  417. }
  418. int CTDS_RowResult::CurrentItemNo() const
  419. {
  420.     return m_CurrItem;
  421. }
  422. // Aux. for CTDS_RowResult::GetItem()
  423. static CDB_Object* s_GetItem(DBPROCESS* cmd, int item_no,
  424.                              STDS_ColDescr* fmt, CDB_Object* item_buff)
  425. {
  426.     EDB_Type b_type = item_buff ? item_buff->GetType() : eDB_UnsupportedType;
  427.     BYTE* d_ptr = dbdata  (cmd, item_no);
  428.     DBINT d_len = dbdatlen(cmd, item_no);
  429.     CDB_Object* val = s_GenericGetItem(fmt->data_type, item_buff,
  430.                                        b_type, d_ptr, d_len);
  431.     if (val)
  432.         return val;
  433.     switch (fmt->data_type) {
  434.     case eDB_BigInt: {
  435.     if(dbcoltype(cmd, item_no) == SYBINT8) {
  436.   Int8* v= (Int8*) d_ptr;
  437.   if(item_buff) {
  438. if(v) {
  439.       if(b_type == eDB_BigInt) {
  440. *((CDB_BigInt*) item_buff)= *v;
  441.   } 
  442.   else {
  443. throw CDB_ClientEx(eDB_Error, 230020, "s_GetItem",
  444.                                        "wrong type of CDB_Object");
  445.   }
  446. }
  447. else 
  448.                 item_buff->AssignNULL();
  449.             return item_buff;
  450.   }
  451.   return v ?
  452.             new CDB_BigInt(*v) : new CDB_BigInt;
  453.     }
  454.         DBNUMERIC* v = (DBNUMERIC*) d_ptr;
  455.         if (item_buff) {
  456.             if (v) {
  457.                 if (b_type == eDB_Numeric) {
  458.                     ((CDB_Numeric*) item_buff)->Assign
  459.                         ((unsigned int)   v->precision,
  460.                          (unsigned int)   v->scale,
  461.                          (unsigned char*) v->array);
  462.                 } else if (b_type == eDB_BigInt) {
  463.                     *((CDB_BigInt*) item_buff) = numeric_to_longlong
  464.                         ((unsigned int) v->precision, v->array);
  465.                 } else {
  466.                     throw CDB_ClientEx(eDB_Error, 230020, "s_GetItem",
  467.                                        "wrong type of CDB_Object");
  468.                 }
  469.             } else
  470.                 item_buff->AssignNULL();
  471.             return item_buff;
  472.         }
  473.         return v ?
  474.             new CDB_BigInt(numeric_to_longlong((unsigned int) v->precision,
  475.                                                v->array)) : new CDB_BigInt;
  476.     }
  477.     case eDB_Numeric: {
  478.         DBNUMERIC* v = (DBNUMERIC*) d_ptr;
  479.         if (item_buff) {
  480.             if (v) {
  481.                 if (b_type == eDB_Numeric) {
  482.                     ((CDB_Numeric*) item_buff)->Assign
  483.                         ((unsigned int)   v->precision,
  484.                          (unsigned int)   v->scale,
  485.                          (unsigned char*) v->array);
  486.                 } else {
  487.                     throw CDB_ClientEx(eDB_Error, 230020, "s_GetItem",
  488.                                        "wrong type of CDB_Object");
  489.                 }
  490.             } else
  491.                 item_buff->AssignNULL();
  492.             return item_buff;
  493.         }
  494.         return v ?
  495.             new CDB_Numeric((unsigned int)   v->precision,
  496.                             (unsigned int)   v->scale,
  497.                             (unsigned char*) v->array) : new CDB_Numeric;
  498.     }
  499.     case eDB_Text: {
  500.         if (item_buff  &&  b_type != eDB_Text  &&  b_type != eDB_Image) {
  501.             throw CDB_ClientEx(eDB_Error, 130020, "s_GetItem",
  502.                                "wrong type of CDB_Object");
  503.         }
  504.         CDB_Text* v = item_buff ? (CDB_Text*) item_buff : new CDB_Text;
  505.         v->Append((char*) d_ptr, (int) d_len);
  506.         return v;
  507.     }
  508.     case eDB_Image: {
  509.         if (item_buff  &&  b_type != eDB_Text  &&  b_type != eDB_Image) {
  510.             throw CDB_ClientEx(eDB_Error, 130020, "s_GetItem",
  511.                                "wrong type of CDB_Object");
  512.         }
  513.         CDB_Image* v = item_buff ? (CDB_Image*) item_buff : new CDB_Image;
  514.         v->Append((void*) d_ptr, (int) d_len);
  515.         return v;
  516.     }
  517.     default:
  518.         throw CDB_ClientEx(eDB_Error, 130004, "s_GetItem",
  519.                            "unexpected result type");
  520.     }
  521. }
  522. CDB_Object* CTDS_RowResult::GetItem(CDB_Object* item_buff)
  523. {
  524.     if ((unsigned int) m_CurrItem >= m_NofCols) {
  525.         return 0;
  526.     }
  527.     CDB_Object* r = s_GetItem(m_Cmd, m_CurrItem + 1,
  528.                               &m_ColFmt[m_CurrItem], item_buff);
  529.     ++m_CurrItem;
  530.     m_Offset = 0;
  531.     return r;
  532. }
  533. size_t CTDS_RowResult::ReadItem(void* buffer, size_t buffer_size,bool* is_null)
  534. {
  535.     if ((unsigned int) m_CurrItem >= m_NofCols) {
  536.         if (is_null)
  537.             *is_null = true;
  538.         return 0;
  539.     }
  540.     BYTE* d_ptr = dbdata  (m_Cmd, m_CurrItem + 1);
  541.     DBINT d_len = dbdatlen(m_Cmd, m_CurrItem + 1);
  542.     if (d_ptr == 0  ||  d_len < 1) { // NULL value
  543.         ++m_CurrItem;
  544.         m_Offset = 0;
  545.         if (is_null)
  546.             *is_null = true;
  547.         return 0;
  548.     }
  549.     if (is_null)
  550.         *is_null = false;
  551.     if ((size_t) (d_len - m_Offset) < buffer_size) {
  552.         buffer_size = d_len - m_Offset;
  553.     }
  554.     if (buffer)
  555.         memcpy(buffer, d_ptr + m_Offset, buffer_size);
  556.     m_Offset += buffer_size;
  557.     if (m_Offset >= d_len) {
  558.         m_Offset = 0;
  559.         ++m_CurrItem;
  560.     }
  561.     return buffer_size;
  562. }
  563. I_ITDescriptor* CTDS_RowResult::GetImageOrTextDescriptor()
  564. {
  565.     if ((unsigned int) m_CurrItem >= m_NofCols)
  566.         return 0;
  567.     return new CTDS_ITDescriptor(m_Cmd, m_CurrItem + 1);
  568. }
  569. bool CTDS_RowResult::SkipItem()
  570. {
  571.     if ((unsigned int) m_CurrItem < m_NofCols) {
  572.         ++m_CurrItem;
  573.         m_Offset = 0;
  574.         return true;
  575.     }
  576.     return false;
  577. }
  578. CTDS_RowResult::~CTDS_RowResult()
  579. {
  580.     if (m_ColFmt) {
  581.         delete[] m_ColFmt;
  582.         m_ColFmt = 0;
  583.     }
  584.     if (!m_EOR)
  585.         dbcanquery(m_Cmd);
  586. }
  587. /////////////////////////////////////////////////////////////////////////////
  588. //
  589. //  CTDS_BlobResult::
  590. CTDS_BlobResult::CTDS_BlobResult(DBPROCESS* cmd)
  591.     : m_Cmd(cmd), m_CurrItem(-1), m_EOR(false)
  592. {
  593.     m_CmdNum = DBCURCMD(cmd);
  594.     m_ColFmt.max_length = dbcollen(m_Cmd, 1);
  595.     m_ColFmt.data_type = s_GetDataType(m_Cmd, 1);
  596.     char* s = dbcolname(m_Cmd, 1);
  597.     m_ColFmt.col_name = s ? s : "";
  598. }
  599. EDB_ResType CTDS_BlobResult::ResultType() const
  600. {
  601.     return eDB_RowResult;
  602. }
  603. unsigned int CTDS_BlobResult::NofItems() const
  604. {
  605.     return 1;
  606. }
  607. const char* CTDS_BlobResult::ItemName(unsigned int item_num) const
  608. {
  609.     return item_num ? 0 : m_ColFmt.col_name.c_str();
  610. }
  611. size_t CTDS_BlobResult::ItemMaxSize(unsigned int item_num) const
  612. {
  613.     return item_num ? 0 : m_ColFmt.max_length;
  614. }
  615. EDB_Type CTDS_BlobResult::ItemDataType(unsigned int) const
  616. {
  617.     return m_ColFmt.data_type;
  618. }
  619. bool CTDS_BlobResult::Fetch()
  620. {
  621.     if (m_EOR)
  622.         return false;
  623.     STATUS s;
  624.     if (m_CurrItem == 0) {
  625.         while ((s = dbreadtext(m_Cmd, m_Buff, (DBINT) sizeof(m_Buff))) > 0)
  626.             ;
  627.         switch (s) {
  628.         case 0:
  629.             break;
  630.         case NO_MORE_ROWS:
  631.             m_EOR = true;
  632.             return false;
  633.         default:
  634.             throw CDB_ClientEx(eDB_Error, 280003, "CTDS_BlobResult::Fetch",
  635.                                "error in fetching row");
  636.         }
  637.     }
  638.     else {
  639.         m_CurrItem = 0;
  640.     }
  641.     s = dbreadtext(m_Cmd, m_Buff, (DBINT) sizeof(m_Buff));
  642.     if (s == NO_MORE_ROWS)
  643.         return false;
  644.     if (s < 0) {
  645.         throw CDB_ClientEx(eDB_Error, 280003, "CTDS_BlobResult::Fetch",
  646.                            "error in fetching row");
  647.     }
  648.     m_BytesInBuffer = s;
  649.     m_ReadedBytes = 0;
  650.     return true;
  651. }
  652. int CTDS_BlobResult::CurrentItemNo() const
  653. {
  654.     return m_CurrItem;
  655. }
  656. CDB_Object* CTDS_BlobResult::GetItem(CDB_Object* item_buff)
  657. {
  658.     if (m_CurrItem)
  659.         return 0;
  660.     EDB_Type b_type = item_buff ? item_buff->GetType() : eDB_UnsupportedType;
  661.     if (item_buff  &&  b_type != eDB_Text  &&  b_type != eDB_Image) {
  662.         throw CDB_ClientEx(eDB_Error, 230020, "CTDS_BlobResult::GetItem",
  663.                            "wrong type of CDB_Object");
  664.     }
  665.     if (item_buff == 0) {
  666.         item_buff = m_ColFmt.data_type == eDB_Text
  667.             ? (CDB_Object*) new CDB_Text : (CDB_Object*) new CDB_Image;
  668.     }
  669.     CDB_Text* val = (CDB_Text*) item_buff;
  670.     // check if we do have something in buffer
  671.     if (m_ReadedBytes < m_BytesInBuffer) {
  672.         val->Append(m_Buff + m_ReadedBytes, m_BytesInBuffer - m_ReadedBytes);
  673.         m_ReadedBytes = m_BytesInBuffer;
  674.     }
  675.     if (m_BytesInBuffer == 0) {
  676.         return item_buff;
  677.     }
  678.     STATUS s;
  679.     while ((s = dbreadtext(m_Cmd, m_Buff, (DBINT) sizeof(m_Buff))) > 0) {
  680.         val->Append(m_Buff, (s < sizeof(m_Buff))? (size_t)s : sizeof(m_Buff));
  681.     }
  682.     switch (s) {
  683.     case NO_MORE_ROWS:
  684.         m_EOR = true;
  685.     case 0:
  686.         m_CurrItem = 1;
  687.         break;
  688.     default:
  689.         throw CDB_ClientEx(eDB_Error, 280003, "CTDS_BlobResult::GetItem",
  690.                            "dbreadtext failed");
  691.     }
  692.     return item_buff;
  693. }
  694. size_t CTDS_BlobResult::ReadItem(void* buffer, size_t buffer_size,
  695.                                  bool* is_null)
  696. {
  697.     if (m_BytesInBuffer == 0)
  698.         m_CurrItem = 1;
  699.     if (m_CurrItem != 0) {
  700.         if (is_null)
  701.             *is_null = true;
  702.         return 0;
  703.     }
  704.     size_t l = 0;
  705.     // check if we do have something in buffer
  706.     if (m_ReadedBytes < m_BytesInBuffer) {
  707.         l = m_BytesInBuffer - m_ReadedBytes;
  708.         if (l >= buffer_size) {
  709.             memcpy(buffer, m_Buff + m_ReadedBytes, buffer_size);
  710.             m_ReadedBytes += buffer_size;
  711.             if (is_null)
  712.                 *is_null = false;
  713.             return buffer_size;
  714.         }
  715.         memcpy(buffer, m_Buff + m_ReadedBytes, l);
  716.     }
  717.     STATUS s = dbreadtext(m_Cmd,
  718.                           (void*)((char*)buffer + l), (DBINT)(buffer_size-l));
  719.     switch (s) {
  720.     case NO_MORE_ROWS:
  721.         m_EOR = true;
  722.     case 0:
  723.         m_CurrItem = 1;
  724.         break;
  725.     case -1:
  726.         throw CDB_ClientEx(eDB_Error, 280003, "CTDS_BlobResult::ReadItem",
  727.                            "dbreadtext failed");
  728.     default:
  729.         break;
  730.     }
  731.     if (is_null) {
  732.         *is_null = (m_BytesInBuffer == 0  &&  s <= 0);
  733.     }
  734.     return (size_t) s + l;
  735. }
  736. I_ITDescriptor* CTDS_BlobResult::GetImageOrTextDescriptor()
  737. {
  738.     if (m_CurrItem != 0)
  739.         return 0;
  740.     return new CTDS_ITDescriptor(m_Cmd, 1);
  741. }
  742. bool CTDS_BlobResult::SkipItem()
  743. {
  744.     if (m_EOR  ||  m_CurrItem)
  745.         return false;
  746.     STATUS s;
  747.     while ((s = dbreadtext(m_Cmd, m_Buff, sizeof(m_Buff))) > 0)
  748.         continue;
  749.     switch (s) {
  750.     case NO_MORE_ROWS:
  751.         m_EOR = true;
  752.     case 0:
  753.         m_CurrItem = 1;
  754.         break;
  755.     default:
  756.         throw CDB_ClientEx(eDB_Error, 280003, "CTDS_BlobResult::SkipItem",
  757.                            "dbreadtext failed");
  758.     }
  759.     return true;
  760. }
  761. CTDS_BlobResult::~CTDS_BlobResult()
  762. {
  763.     if (!m_EOR)
  764.         dbcanquery(m_Cmd);
  765. }
  766. /////////////////////////////////////////////////////////////////////////////
  767. static EDB_Type s_RetGetDataType(DBPROCESS* cmd, int n)
  768. {
  769.     switch (dbrettype(cmd, n)) {
  770.     case SYBBINARY:    return (dbretlen(cmd, n) > 255)? eDB_LongBinary : 
  771.                                                         eDB_VarBinary;
  772.     case SYBBIT:       return eDB_Bit;
  773.     case SYBCHAR:      return (dbretlen(cmd, n) > 255)? eDB_LongChar : 
  774.                                                         eDB_VarChar;
  775.     case SYBDATETIME:  return eDB_DateTime;
  776.     case SYBDATETIME4: return eDB_SmallDateTime;
  777.     case SYBINT1:      return eDB_TinyInt;
  778.     case SYBINT2:      return eDB_SmallInt;
  779.     case SYBINT4:      return eDB_Int;
  780.     case SYBFLT8:      return eDB_Double;
  781.     case SYBREAL:      return eDB_Float;
  782.     default:           return eDB_UnsupportedType;
  783.     }
  784. }
  785. // Aux. for CTDS_ParamResult::GetItem()
  786. static CDB_Object* s_RetGetItem(DBPROCESS* cmd, int item_no,
  787.                                 STDS_ColDescr* fmt, CDB_Object* item_buff)
  788. {
  789.     EDB_Type b_type = item_buff ? item_buff->GetType() : eDB_UnsupportedType;
  790.     BYTE* d_ptr = dbretdata(cmd, item_no);
  791.     DBINT d_len = dbretlen (cmd, item_no);
  792.     CDB_Object* val = s_GenericGetItem(fmt->data_type, item_buff,
  793.                                        b_type, d_ptr, d_len);
  794.     if (!val) {
  795.         throw CDB_ClientEx(eDB_Error, 230004, "s_RetGetItem",
  796.                            "unexpected result type");
  797.     }
  798.     return val;
  799. }
  800. /////////////////////////////////////////////////////////////////////////////
  801. //
  802. //  CTDS_ParamResult::
  803. //
  804. CTDS_ParamResult::CTDS_ParamResult(DBPROCESS* cmd, int nof_params)
  805.     : CTDS_RowResult(cmd, 0, false)
  806. {
  807.     m_NofCols = nof_params;
  808.     m_CmdNum = DBCURCMD(cmd);
  809.     m_ColFmt = new STDS_ColDescr[m_NofCols];
  810.     for (unsigned int n = 0;  n < m_NofCols;  n++) {
  811.         m_ColFmt[n].max_length = 255;
  812.         m_ColFmt[n].data_type = s_RetGetDataType(m_Cmd, n + 1);
  813.         const char* s = dbretname(m_Cmd, n + 1);
  814.         m_ColFmt[n].col_name = s ? s : "";
  815.     }
  816.     m_1stFetch = true;
  817. }
  818. EDB_ResType CTDS_ParamResult::ResultType() const
  819. {
  820.     return eDB_ParamResult;
  821. }
  822. bool CTDS_ParamResult::Fetch()
  823. {
  824.     if (m_1stFetch) { // we didn't get the items yet;
  825.         m_1stFetch = false;
  826. m_CurrItem= 0;
  827.         return true;
  828.     }
  829.     return false;
  830. }
  831. CDB_Object* CTDS_ParamResult::GetItem(CDB_Object* item_buff)
  832. {
  833.     if ((unsigned int) m_CurrItem >= m_NofCols) {
  834.         return 0;
  835.     }
  836.     CDB_Object* r = s_RetGetItem(m_Cmd, m_CurrItem + 1,
  837.                                  &m_ColFmt[m_CurrItem], item_buff);
  838.     ++m_CurrItem;
  839.     m_Offset = 0;
  840.     return r;
  841. }
  842. size_t CTDS_ParamResult::ReadItem(void* buffer, size_t buffer_size,
  843.                                   bool* is_null)
  844. {
  845.     if ((unsigned int) m_CurrItem >= m_NofCols) {
  846.         if (is_null)
  847.             *is_null = true;
  848.         return 0;
  849.     }
  850.     BYTE* d_ptr = dbretdata(m_Cmd, m_CurrItem + 1);
  851.     DBINT d_len = dbretlen (m_Cmd, m_CurrItem + 1);
  852.     if (d_ptr == 0  ||  d_len < 1) { // NULL value
  853.         ++m_CurrItem;
  854.         m_Offset = 0;
  855.         if (is_null)
  856.             *is_null = true;
  857.         return 0;
  858.     }
  859.     if (is_null)
  860.         *is_null = false;
  861.     if ((size_t) (d_len - m_Offset) < buffer_size) {
  862.         buffer_size = d_len - m_Offset;
  863.     }
  864.     memcpy(buffer, d_ptr + m_Offset, buffer_size);
  865.     m_Offset += buffer_size;
  866.     if (m_Offset >= d_len) {
  867.         m_Offset = 0;
  868.         ++m_CurrItem;
  869.     }
  870.     return buffer_size;
  871. }
  872. I_ITDescriptor* CTDS_ParamResult::GetImageOrTextDescriptor()
  873. {
  874.     return 0;
  875. }
  876. CTDS_ParamResult::~CTDS_ParamResult()
  877. {
  878.     if (m_ColFmt) {
  879.         delete[] m_ColFmt;
  880.         m_ColFmt = 0;
  881.     }
  882. }
  883. /////////////////////////////////////////////////////////////////////////////
  884. #if 0
  885. static EDB_Type s_AltGetDataType(DBPROCESS* cmd, int id, int n)
  886. {
  887.     switch (dbalttype(cmd, id, n)) {
  888.     case SYBBINARY:    return eDB_VarBinary;
  889.     case SYBBIT:       return eDB_Bit;
  890.     case SYBCHAR:      return eDB_VarChar;
  891.     case SYBDATETIME:  return eDB_DateTime;
  892.     case SYBDATETIME4: return eDB_SmallDateTime;
  893.     case SYBINT1:      return eDB_TinyInt;
  894.     case SYBINT2:      return eDB_SmallInt;
  895.     case SYBINT4:      return eDB_Int;
  896.     case SYBFLT8:      return eDB_Double;
  897.     case SYBREAL:      return eDB_Float;
  898.     default:           return eDB_UnsupportedType;
  899.     }
  900. }
  901. // Aux. for CTDS_ComputeResult::GetItem()
  902. static CDB_Object* s_AltGetItem(DBPROCESS* cmd, int id, int item_no,
  903.                                 STDS_ColDescr* fmt, CDB_Object* item_buff)
  904. {
  905.     EDB_Type b_type = item_buff ? item_buff->GetType() : eDB_UnsupportedType;
  906.     BYTE* d_ptr = dbadata(cmd, id, item_no);
  907.     DBINT d_len = dbadlen(cmd, id, item_no);
  908.     CDB_Object* val = s_GenericGetItem(fmt->data_type, item_buff,
  909.                                        b_type, d_ptr, d_len);
  910.     if (!val) {
  911.         throw CDB_ClientEx(eDB_Error, 130004, "s_AltGetItem",
  912.                            "unexpected result type");
  913.     }
  914.     return val;
  915. }
  916. #endif
  917. /////////////////////////////////////////////////////////////////////////////
  918. //
  919. //  CTL_ComputeResult::
  920. //
  921. CTDS_ComputeResult::CTDS_ComputeResult(DBPROCESS* cmd,
  922.                                        unsigned int* res_stat)
  923.     : CTDS_RowResult(cmd, res_stat, false)
  924. {
  925.     throw CDB_ClientEx(eDB_Error, 270000,
  926.                        "CDBL_ComputeResult::CDBL_ComputeResult",
  927.                        "The compute results do not implemented in Free TDS");
  928. }
  929. EDB_ResType CTDS_ComputeResult::ResultType() const
  930. {
  931.     return eDB_ComputeResult;
  932. }
  933. bool CTDS_ComputeResult::Fetch()
  934. {
  935.     return false; // do not implemented in Free TDS
  936. }
  937. int CTDS_ComputeResult::CurrentItemNo() const
  938. {
  939.     return m_CurrItem;
  940. }
  941. CDB_Object* CTDS_ComputeResult::GetItem(CDB_Object* /*item_buff*/)
  942. {
  943.     return 0; // not implemented in Free TDS
  944. }
  945. size_t CTDS_ComputeResult::ReadItem(void* /*buffer*/, size_t /*buffer_size*/,
  946.                                     bool* /*is_null*/)
  947. {
  948.     return 0; // not implemented in Free TDS
  949. }
  950. I_ITDescriptor* CTDS_ComputeResult::GetImageOrTextDescriptor()
  951. {
  952.     return 0;
  953. }
  954. CTDS_ComputeResult::~CTDS_ComputeResult()
  955. {
  956.     return;
  957. }
  958. /////////////////////////////////////////////////////////////////////////////
  959. //
  960. //  CTL_StatusResult::
  961. //
  962. CTDS_StatusResult::CTDS_StatusResult(DBPROCESS* cmd)
  963. {
  964.     m_Val = dbretstatus(cmd);
  965.     m_Offset = 0;
  966.     m_1stFetch = true;
  967. }
  968. EDB_ResType CTDS_StatusResult::ResultType() const
  969. {
  970.     return eDB_StatusResult;
  971. }
  972. unsigned int CTDS_StatusResult::NofItems() const
  973. {
  974.     return 1;
  975. }
  976. const char* CTDS_StatusResult::ItemName(unsigned int) const
  977. {
  978.     return 0;
  979. }
  980. size_t CTDS_StatusResult::ItemMaxSize(unsigned int) const
  981. {
  982.     return sizeof(DBINT);
  983. }
  984. EDB_Type CTDS_StatusResult::ItemDataType(unsigned int) const
  985. {
  986.     return eDB_Int;
  987. }
  988. bool CTDS_StatusResult::Fetch()
  989. {
  990.     if (m_1stFetch) {
  991.         m_1stFetch = false;
  992.         return true;
  993.     }
  994.     return false;
  995. }
  996. int CTDS_StatusResult::CurrentItemNo() const
  997. {
  998.     return m_1stFetch? -1 : 0;
  999. }
  1000. CDB_Object* CTDS_StatusResult::GetItem(CDB_Object* item_buff)
  1001. {
  1002.     if (!item_buff)
  1003.         return new CDB_Int(m_Val);
  1004.     if (item_buff->GetType() != eDB_Int) {
  1005.         throw CDB_ClientEx(eDB_Error, 230020, "CTDS_StatusResult::GetItem",
  1006.                            "wrong type of CDB_Object");
  1007.     }
  1008.     CDB_Int* i = (CDB_Int*) item_buff;
  1009.     *i = m_Val;
  1010.     return item_buff;
  1011. }
  1012. size_t CTDS_StatusResult::ReadItem(void* buffer, size_t buffer_size,
  1013.                                    bool* is_null)
  1014. {
  1015.     if (is_null)
  1016.         *is_null = false;
  1017.     if (sizeof(int) <= (size_t) m_Offset)
  1018.         return 0;
  1019.     size_t l = sizeof(int) - m_Offset;
  1020.     char* p = (char*) &m_Val;
  1021.     if (buffer_size > l)
  1022.         buffer_size = l;
  1023.     memcpy(buffer, p + m_Offset, buffer_size);
  1024.     m_Offset += buffer_size;
  1025.     return buffer_size;
  1026. }
  1027. I_ITDescriptor* CTDS_StatusResult::GetImageOrTextDescriptor()
  1028. {
  1029.     return 0;
  1030. }
  1031. bool CTDS_StatusResult::SkipItem()
  1032. {
  1033.     return false;
  1034. }
  1035. CTDS_StatusResult::~CTDS_StatusResult()
  1036. {
  1037.     return;
  1038. }
  1039. /////////////////////////////////////////////////////////////////////////////
  1040. //
  1041. //  CTL_CursorResult::
  1042. //
  1043. CTDS_CursorResult::CTDS_CursorResult(CDB_LangCmd* cmd)
  1044.     : m_Cmd(cmd), m_Res(0)
  1045. {
  1046.     try {
  1047.         m_Cmd->Send();
  1048.         while (m_Cmd->HasMoreResults()) {
  1049.             m_Res = m_Cmd->Result();
  1050.             if (m_Res  &&  m_Res->ResultType() == eDB_RowResult) {
  1051.                 return;
  1052.             }
  1053.             if (m_Res) {
  1054.                 while (m_Res->Fetch())
  1055.                     continue;
  1056.                 delete m_Res;
  1057.                 m_Res = 0;
  1058.             }
  1059.         }
  1060.     } catch (CDB_Exception& e) {
  1061.         throw CDB_ClientEx(eDB_Error, 222010,
  1062.                            "CTDS_CursorResult::CTDS_CursorResult",
  1063.                            "failed to get the results");
  1064.     }
  1065. }
  1066. EDB_ResType CTDS_CursorResult::ResultType() const
  1067. {
  1068.     return eDB_CursorResult;
  1069. }
  1070. unsigned int CTDS_CursorResult::NofItems() const
  1071. {
  1072.     return m_Res? m_Res->NofItems() : 0;
  1073. }
  1074. const char* CTDS_CursorResult::ItemName(unsigned int item_num) const
  1075. {
  1076.     return m_Res ? m_Res->ItemName(item_num) : 0;
  1077. }
  1078. size_t CTDS_CursorResult::ItemMaxSize(unsigned int item_num) const
  1079. {
  1080.     return m_Res ? m_Res->ItemMaxSize(item_num) : 0;
  1081. }
  1082. EDB_Type CTDS_CursorResult::ItemDataType(unsigned int item_num) const
  1083. {
  1084.     return m_Res ? m_Res->ItemDataType(item_num) : eDB_UnsupportedType;
  1085. }
  1086. bool CTDS_CursorResult::Fetch()
  1087. {
  1088.     if (!m_Res)
  1089.         return false;
  1090.     try {
  1091.         if (m_Res->Fetch())
  1092.             return true;
  1093.     }
  1094.     catch (CDB_ClientEx& ex) {
  1095.         if (ex.ErrCode() == 200003) {
  1096.             m_Res = 0;
  1097.         } else {
  1098.             throw CDB_ClientEx(eDB_Error, 222011, "CDBL_CursorResult::Fetch",
  1099.                                "Failed to fetch the results");
  1100.         }
  1101.     }
  1102.     // try to get next cursor result
  1103.     try {
  1104.         // finish this command
  1105.         if (m_Res)
  1106.             delete m_Res;
  1107.         while (m_Cmd->HasMoreResults()) {
  1108.             m_Res = m_Cmd->Result();
  1109.             if (m_Res) {
  1110.                 while (m_Res->Fetch())
  1111.                     continue;
  1112.                 delete m_Res;
  1113.                 m_Res = 0;
  1114.             }
  1115.         }
  1116.         // send the another "fetch cursor_name" command
  1117.         m_Cmd->Send();
  1118.         while (m_Cmd->HasMoreResults()) {
  1119.             m_Res = m_Cmd->Result();
  1120.             if (m_Res  &&  m_Res->ResultType() == eDB_RowResult) {
  1121.                 return m_Res->Fetch();
  1122.             }
  1123.             if (m_Res) {
  1124.                 while (m_Res->Fetch())
  1125.                     continue;
  1126.                 delete m_Res;
  1127.                 m_Res = 0;
  1128.             }
  1129.         }
  1130.     } catch (CDB_Exception& e) {
  1131.         throw CDB_ClientEx(eDB_Error, 222011, "CTDS_CursorResult::Fetch",
  1132.                            "Failed to fetch the results");
  1133.     }
  1134.     return false;
  1135. }
  1136. int CTDS_CursorResult::CurrentItemNo() const
  1137. {
  1138.     return m_Res ? m_Res->CurrentItemNo() : -1;
  1139. }
  1140. CDB_Object* CTDS_CursorResult::GetItem(CDB_Object* item_buff)
  1141. {
  1142.     return m_Res ? m_Res->GetItem(item_buff) : 0;
  1143. }
  1144. size_t CTDS_CursorResult::ReadItem(void* buffer, size_t buffer_size,
  1145.                                    bool* is_null)
  1146. {
  1147.     if (m_Res) {
  1148.         return m_Res->ReadItem(buffer, buffer_size, is_null);
  1149.     }
  1150.     if (is_null)
  1151.         *is_null = true;
  1152.     return 0;
  1153. }
  1154. I_ITDescriptor* CTDS_CursorResult::GetImageOrTextDescriptor()
  1155. {
  1156.     return m_Res ? m_Res->GetImageOrTextDescriptor() : 0;
  1157. }
  1158. bool CTDS_CursorResult::SkipItem()
  1159. {
  1160.     return m_Res ? m_Res->SkipItem() : false;
  1161. }
  1162. CTDS_CursorResult::~CTDS_CursorResult()
  1163. {
  1164.     delete m_Res;
  1165. }
  1166. /////////////////////////////////////////////////////////////////////////////
  1167. //
  1168. //  CTDS_ITDescriptor::
  1169. //
  1170. CTDS_ITDescriptor::CTDS_ITDescriptor(DBPROCESS* dblink, int col_num)
  1171. {
  1172.     m_ObjName = dbcolsource(dblink, col_num);
  1173.     DBBINARY* p = dbtxptr(dblink, col_num);
  1174.     if (p) {
  1175.         memcpy(m_TxtPtr, p, DBTXPLEN);
  1176.         m_TxtPtr_is_NULL = false;
  1177.     } else
  1178.         m_TxtPtr_is_NULL = true;
  1179.     p = dbtxtimestamp(dblink, col_num);
  1180.     if (p) {
  1181.         memcpy(m_TimeStamp, p, DBTXTSLEN);
  1182.         m_TimeStamp_is_NULL = false;
  1183.     } else
  1184.         m_TimeStamp_is_NULL = true;
  1185. }
  1186. CTDS_ITDescriptor::CTDS_ITDescriptor(DBPROCESS* dblink,
  1187.                                      const CDB_ITDescriptor& inp_d)
  1188. {
  1189.     m_ObjName = inp_d.TableName();
  1190.     m_ObjName += ".";
  1191.     m_ObjName += inp_d.ColumnName();
  1192.     DBBINARY* p = dbtxptr(dblink, 1);
  1193.     if (p) {
  1194.         memcpy(m_TxtPtr, p, DBTXPLEN);
  1195.         m_TxtPtr_is_NULL = false;
  1196.     } else
  1197.         m_TxtPtr_is_NULL = true;
  1198.     p = dbtxtimestamp(dblink, 1);
  1199.     if (p) {
  1200.         memcpy(m_TimeStamp, p, DBTXTSLEN);
  1201.         m_TimeStamp_is_NULL = false;
  1202.     } else
  1203.         m_TimeStamp_is_NULL = true;
  1204. }
  1205. int CTDS_ITDescriptor::DescriptorType() const
  1206. {
  1207.     return CTDS_ITDESCRIPTOR_TYPE_MAGNUM;
  1208. }
  1209. CTDS_ITDescriptor::~CTDS_ITDescriptor()
  1210. {
  1211.     return;
  1212. }
  1213. END_NCBI_SCOPE
  1214. /*
  1215.  * ===========================================================================
  1216.  * $Log: result.cpp,v $
  1217.  * Revision 1000.2  2004/06/01 19:20:55  gouriano
  1218.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.14
  1219.  *
  1220.  * Revision 1.14  2004/05/17 21:13:37  gorelenk
  1221.  * Added include of PCH ncbi_pch.hpp
  1222.  *
  1223.  * Revision 1.13  2004/02/24 20:22:12  soussov
  1224.  * SYBBITN processing added
  1225.  *
  1226.  * Revision 1.12  2003/04/29 21:15:03  soussov
  1227.  * new datatypes CDB_LongChar and CDB_LongBinary added
  1228.  *
  1229.  * Revision 1.11  2003/02/06 16:26:52  soussov
  1230.  * adding support for bigint datatype
  1231.  *
  1232.  * Revision 1.10  2003/01/06 16:59:31  soussov
  1233.  * sets m_CurrItem = -1 for all result types if no fetch was called
  1234.  *
  1235.  * Revision 1.9  2003/01/03 21:48:18  soussov
  1236.  * set m_CurrItem = -1 if fetch failes
  1237.  *
  1238.  * Revision 1.8  2002/07/18 14:59:31  soussov
  1239.  * fixes bug in blob result
  1240.  *
  1241.  * Revision 1.7  2002/06/13 21:10:18  soussov
  1242.  * freeTDS does not place doubles properly in memory, patch added
  1243.  *
  1244.  * Revision 1.6  2002/06/08 06:18:43  vakatov
  1245.  * Ran through 64-bit compilation (tests were successful on Solaris/Forte6u2).
  1246.  * Fixed a return type in CTDS_CursorResult::ItemMaxSize, eliminated a couple
  1247.  * of warnings. Formally formatted the code to fit the C++ Toolkit style.
  1248.  *
  1249.  * Revision 1.5  2002/05/29 22:04:29  soussov
  1250.  * Makes BlobResult read ahead
  1251.  *
  1252.  * Revision 1.4  2002/03/26 15:35:10  soussov
  1253.  * new image/text operations added
  1254.  *
  1255.  * Revision 1.3  2002/02/06 22:30:56  soussov
  1256.  * fixes the arguments order in numeric assign
  1257.  *
  1258.  * Revision 1.2  2001/11/06 18:00:02  lavr
  1259.  * Formatted uniformly as the rest of the library
  1260.  *
  1261.  * Revision 1.1  2001/10/25 00:39:22  vakatov
  1262.  * Initial revision
  1263.  *
  1264.  * ===========================================================================
  1265.  */