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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: result.cpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/06/01 19:21:31  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.8
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /* $Id: result.cpp,v 1000.2 2004/06/01 19:21:31 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:  Anton Butanayev
  35.  *
  36.  * File Description
  37.  *    Driver for MySQL server
  38.  *
  39.  */
  40. #include <ncbi_pch.hpp>
  41. #include <dbapi/driver/mysql/interfaces.hpp>
  42. BEGIN_NCBI_SCOPE
  43. static EDB_Type s_GetDataType(enum_field_types type)
  44. {
  45.     switch ( type ) {
  46.     case FIELD_TYPE_TINY:        return eDB_TinyInt;
  47.     case FIELD_TYPE_SHORT:       return eDB_SmallInt;
  48.     case FIELD_TYPE_LONG:        return eDB_Int;
  49.     case FIELD_TYPE_INT24:       return eDB_Int;
  50.     case FIELD_TYPE_LONGLONG:    return eDB_Int;
  51.     case FIELD_TYPE_DECIMAL:     return eDB_Numeric;
  52.     case FIELD_TYPE_FLOAT:       return eDB_Float;
  53.     case FIELD_TYPE_DOUBLE:      return eDB_Double;
  54.     case FIELD_TYPE_TIMESTAMP:   return eDB_DateTime;
  55.     case FIELD_TYPE_DATE:        return eDB_SmallDateTime;
  56.     case FIELD_TYPE_TIME:        return eDB_UnsupportedType;
  57.     case FIELD_TYPE_DATETIME:    return eDB_DateTime;
  58.     case FIELD_TYPE_YEAR:        return eDB_UnsupportedType;
  59.     case FIELD_TYPE_STRING:
  60.     case FIELD_TYPE_VAR_STRING:  return eDB_VarChar;
  61.     case FIELD_TYPE_BLOB:        return eDB_Image;
  62.     case FIELD_TYPE_SET:         return eDB_UnsupportedType;
  63.     case FIELD_TYPE_ENUM:        return eDB_UnsupportedType;
  64.     case FIELD_TYPE_NULL:        return eDB_UnsupportedType;
  65.     default:
  66.         return eDB_UnsupportedType;
  67.     }
  68. }
  69. CMySQL_RowResult::CMySQL_RowResult(CMySQL_Connection* conn)
  70.     : m_Connect(conn),
  71.       m_CurrItem(-1)
  72. {
  73.     m_Result = mysql_use_result(&m_Connect->m_MySQL);
  74.     if ( !m_Result ) {
  75.         throw CDB_ClientEx(eDB_Warning, 800004,
  76.                            "CMySQL_RowResult::CMySQL_RowResult",
  77.                            "Failed: mysql_use_result");
  78.     }
  79.     m_NofCols = mysql_num_fields(m_Result);
  80.     m_ColFmt  = new SMySQL_ColDescr[m_NofCols];
  81.     MYSQL_FIELD* fields = mysql_fetch_fields(m_Result);
  82.     for (unsigned int n = 0;  n < m_NofCols;  n++) {
  83.         m_ColFmt[n].max_length = fields[n].max_length;
  84.         m_ColFmt[n].data_type  = s_GetDataType(fields[n].type);
  85.         m_ColFmt[n].col_name   = fields[n].name;
  86.     }
  87. }
  88. CMySQL_RowResult::~CMySQL_RowResult()
  89. {
  90. }
  91. EDB_ResType CMySQL_RowResult::ResultType() const
  92. {
  93.     return eDB_RowResult;
  94. }
  95. unsigned int CMySQL_RowResult::NofItems() const
  96. {
  97.     return m_NofCols;
  98. }
  99. const char* CMySQL_RowResult::ItemName(unsigned int item_num) const
  100. {
  101.     return item_num < m_NofCols ? m_ColFmt[item_num].col_name.c_str() : 0;
  102. }
  103. size_t CMySQL_RowResult::ItemMaxSize(unsigned int item_num) const
  104. {
  105.     return item_num < m_NofCols ? m_ColFmt[item_num].max_length : 0;
  106. }
  107. EDB_Type CMySQL_RowResult::ItemDataType(unsigned int item_num) const
  108. {
  109.     return item_num < m_NofCols ?
  110.         m_ColFmt[item_num].data_type : eDB_UnsupportedType;
  111. }
  112. bool CMySQL_RowResult::Fetch()
  113. {
  114.     m_CurrItem = -1;
  115.     m_Row = mysql_fetch_row(m_Result);
  116.     if ( m_Row ) {
  117.         m_Lengths = mysql_fetch_lengths(m_Result);
  118.         if ( !m_Lengths )
  119.             throw CDB_ClientEx(eDB_Warning, 800006,
  120.                                "CMySQL_RowResult::Fetch",
  121.                                "Failed: mysql_fetch_lengths");
  122.     }
  123.     m_CurrItem = 0;
  124.     return m_Row != 0;
  125. }
  126. int CMySQL_RowResult::CurrentItemNo() const
  127. {
  128.     return m_CurrItem;
  129. }
  130. static CDB_Object* s_GetItem(EDB_Type    data_type,
  131.                              CDB_Object* item_buff,
  132.                              EDB_Type    b_type,
  133.                              const char* d_ptr,
  134.                              size_t      d_len)
  135. {
  136.     if ( !d_ptr )
  137.         d_ptr = "";
  138.     if (b_type == eDB_VarChar) {
  139.         if ( !item_buff ) {
  140.             item_buff = new CDB_VarChar;
  141.         }
  142.         if ( d_len ) {
  143.             ((CDB_VarChar*) item_buff)->SetValue(d_ptr, d_len);
  144.         } else {
  145.             item_buff->AssignNULL();
  146.         }
  147.         return item_buff;
  148.     }
  149.     if (b_type == eDB_Image) {
  150.         if ( !item_buff ) {
  151.             item_buff = new CDB_Image;
  152.         }
  153.         if ( d_len ) {
  154.             ((CDB_Image*) item_buff)->Append(d_ptr, d_len);
  155.         } else {
  156.             item_buff->AssignNULL();
  157.         }
  158.         return item_buff;
  159.     }
  160.     if (b_type == eDB_Text) {
  161.         if ( !item_buff ) {
  162.             item_buff = new CDB_Text;
  163.         }
  164.         if ( d_len ) {
  165.             ((CDB_Text*) item_buff)->Append(d_ptr, d_len);
  166.         } else {
  167.             item_buff->AssignNULL();
  168.         }
  169.         return item_buff;
  170.     }
  171.     long   int_val;
  172.     double double_val;
  173.     switch ( data_type ) {
  174.     case eDB_TinyInt:
  175.     case eDB_SmallInt:
  176.     case eDB_Int:
  177.         int_val = NStr::StringToInt(d_ptr);
  178.         break;
  179.     case eDB_Float:
  180.     case eDB_Double:
  181.         double_val = NStr::StringToDouble(d_ptr);
  182.         break;
  183.     }
  184.     switch ( b_type ) {
  185.     case eDB_TinyInt: {
  186.         if ( item_buff )
  187.             *((CDB_TinyInt*) item_buff) = (Uint1) int_val;
  188.         else
  189.             item_buff = new CDB_TinyInt((Uint1) int_val);
  190.         break;
  191.     }
  192.     case eDB_SmallInt: {
  193.         if ( item_buff )
  194.             *((CDB_SmallInt*) item_buff) = (Uint2) int_val;
  195.         else
  196.             item_buff = new CDB_SmallInt((Uint2) int_val);
  197.         break;
  198.     }
  199.     case eDB_Int: {
  200.         if ( item_buff )
  201.             *((CDB_Int*) item_buff) = (Uint4) int_val;
  202.         else
  203.             item_buff = new CDB_Int((Uint4) int_val);
  204.         break;
  205.     }
  206.     case eDB_Float: {
  207.         if ( item_buff )
  208.             *((CDB_Float*) item_buff) = (float) double_val;
  209.         else
  210.             item_buff = new CDB_Float((float) double_val);
  211.         break;
  212.     }
  213.     case eDB_Double: {
  214.         if ( item_buff )
  215.             *((CDB_Double*) item_buff) = double_val;
  216.         else
  217.             item_buff = new CDB_Double(double_val);
  218.         break;
  219.     }
  220.     case eDB_DateTime: {
  221.         CTime time;
  222.         if ( d_len )
  223.             time = CTime(d_ptr, "Y-M-D h:m:s");
  224.         if ( item_buff )
  225.             *(CDB_DateTime*) item_buff = time;
  226.         else
  227.             item_buff = new CDB_DateTime(time);
  228.         break;
  229.     }
  230.     case eDB_SmallDateTime: {
  231.         CTime time;
  232.         if (d_len)
  233.             time = CTime(d_ptr, "Y-M-D");
  234.         if (item_buff)
  235.             *(CDB_SmallDateTime*) item_buff = time;
  236.         else
  237.             item_buff = new CDB_SmallDateTime(time);
  238.         break;
  239.     }
  240.     }
  241.     if (d_len == 0  &&  item_buff) {
  242.         item_buff->AssignNULL();
  243.     }
  244.     return item_buff;
  245. }
  246. CDB_Object* CMySQL_RowResult::GetItem(CDB_Object* item_buf)
  247. {
  248.     if ((unsigned int) m_CurrItem >= m_NofCols) {
  249.         return 0;
  250.     }
  251.     CDB_Object* r =
  252.         s_GetItem(m_ColFmt[m_CurrItem].data_type, item_buf,
  253.                   item_buf ? item_buf->GetType() : eDB_UnsupportedType,
  254.                   m_Row[m_CurrItem], m_Lengths[m_CurrItem]);
  255.     ++m_CurrItem;
  256.     return r;
  257. }
  258. size_t CMySQL_RowResult::ReadItem(void*  /*buffer*/,
  259.                                   size_t /*buffer_size*/,
  260.                                   bool*  /*is_null*/)
  261. {
  262.     return 0;
  263. }
  264. I_ITDescriptor* CMySQL_RowResult::GetImageOrTextDescriptor()
  265. {
  266.     return 0;
  267. }
  268. bool CMySQL_RowResult::SkipItem()
  269. {
  270.     return false;
  271. }
  272. END_NCBI_SCOPE
  273. /*
  274.  * ===========================================================================
  275.  * $Log: result.cpp,v $
  276.  * Revision 1000.2  2004/06/01 19:21:31  gouriano
  277.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.8
  278.  *
  279.  * Revision 1.8  2004/05/17 21:15:34  gorelenk
  280.  * Added include of PCH ncbi_pch.hpp
  281.  *
  282.  * Revision 1.7  2004/03/25 22:40:37  vysokolo
  283.  * Atting eDB_Text type
  284.  *
  285.  * Revision 1.6  2004/03/24 19:46:53  vysokolo
  286.  * addaed support of blob
  287.  *
  288.  * Revision 1.5  2003/02/26 17:10:35  kuznets
  289.  * Fixed int->bool warning in MSVC
  290.  *
  291.  * Revision 1.4  2003/01/06 20:29:13  vakatov
  292.  * Guarantee "m_CurrItem" to be invalid before first Fetch() and after
  293.  * a failed Fetch().
  294.  * Get rid of some redundant header(s).
  295.  * Formally reformatted to closer meet C++ Toolkit/DBAPI style.
  296.  *
  297.  * Revision 1.3  2003/01/03 18:12:23  butanaev
  298.  * Removed unneeded code from Fetch().
  299.  *
  300.  * Revision 1.2  2002/08/28 17:18:20  butanaev
  301.  * Improved error handling, demo app.
  302.  *
  303.  * Revision 1.1  2002/08/13 20:23:14  butanaev
  304.  * The beginning.
  305.  *
  306.  * ===========================================================================
  307.  */