⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 result.cpp

📁 ncbi源码
💻 CPP
字号:
/* * =========================================================================== * PRODUCTION $Log: result.cpp,v $ * PRODUCTION Revision 1000.2  2004/06/01 19:21:31  gouriano * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.8 * PRODUCTION * =========================================================================== *//* $Id: result.cpp,v 1000.2 2004/06/01 19:21:31 gouriano Exp $ * =========================================================================== * *                            PUBLIC DOMAIN NOTICE *               National Center for Biotechnology Information * *  This software/database is a "United States Government Work" under the *  terms of the United States Copyright Act.  It was written as part of *  the author's official duties as a United States Government employee and *  thus cannot be copyrighted.  This software/database is freely available *  to the public for use. The National Library of Medicine and the U.S. *  Government have not placed any restriction on its use or reproduction. * *  Although all reasonable efforts have been taken to ensure the accuracy *  and reliability of the software and data, the NLM and the U.S. *  Government do not and cannot warrant the performance or results that *  may be obtained by using this software or data. The NLM and the U.S. *  Government disclaim all warranties, express or implied, including *  warranties of performance, merchantability or fitness for any particular *  purpose. * *  Please cite the author in any work or product based on this material. * * =========================================================================== * * Author:  Anton Butanayev * * File Description *    Driver for MySQL server * */#include <ncbi_pch.hpp>#include <dbapi/driver/mysql/interfaces.hpp>BEGIN_NCBI_SCOPEstatic EDB_Type s_GetDataType(enum_field_types type){    switch ( type ) {    case FIELD_TYPE_TINY:        return eDB_TinyInt;    case FIELD_TYPE_SHORT:       return eDB_SmallInt;    case FIELD_TYPE_LONG:        return eDB_Int;    case FIELD_TYPE_INT24:       return eDB_Int;    case FIELD_TYPE_LONGLONG:    return eDB_Int;    case FIELD_TYPE_DECIMAL:     return eDB_Numeric;    case FIELD_TYPE_FLOAT:       return eDB_Float;    case FIELD_TYPE_DOUBLE:      return eDB_Double;    case FIELD_TYPE_TIMESTAMP:   return eDB_DateTime;    case FIELD_TYPE_DATE:        return eDB_SmallDateTime;    case FIELD_TYPE_TIME:        return eDB_UnsupportedType;    case FIELD_TYPE_DATETIME:    return eDB_DateTime;    case FIELD_TYPE_YEAR:        return eDB_UnsupportedType;    case FIELD_TYPE_STRING:    case FIELD_TYPE_VAR_STRING:  return eDB_VarChar;    case FIELD_TYPE_BLOB:        return eDB_Image;    case FIELD_TYPE_SET:         return eDB_UnsupportedType;    case FIELD_TYPE_ENUM:        return eDB_UnsupportedType;    case FIELD_TYPE_NULL:        return eDB_UnsupportedType;    default:        return eDB_UnsupportedType;    }}CMySQL_RowResult::CMySQL_RowResult(CMySQL_Connection* conn)    : m_Connect(conn),      m_CurrItem(-1){    m_Result = mysql_use_result(&m_Connect->m_MySQL);    if ( !m_Result ) {        throw CDB_ClientEx(eDB_Warning, 800004,                           "CMySQL_RowResult::CMySQL_RowResult",                           "Failed: mysql_use_result");    }    m_NofCols = mysql_num_fields(m_Result);    m_ColFmt  = new SMySQL_ColDescr[m_NofCols];    MYSQL_FIELD* fields = mysql_fetch_fields(m_Result);    for (unsigned int n = 0;  n < m_NofCols;  n++) {        m_ColFmt[n].max_length = fields[n].max_length;        m_ColFmt[n].data_type  = s_GetDataType(fields[n].type);        m_ColFmt[n].col_name   = fields[n].name;    }}CMySQL_RowResult::~CMySQL_RowResult(){}EDB_ResType CMySQL_RowResult::ResultType() const{    return eDB_RowResult;}unsigned int CMySQL_RowResult::NofItems() const{    return m_NofCols;}const char* CMySQL_RowResult::ItemName(unsigned int item_num) const{    return item_num < m_NofCols ? m_ColFmt[item_num].col_name.c_str() : 0;}size_t CMySQL_RowResult::ItemMaxSize(unsigned int item_num) const{    return item_num < m_NofCols ? m_ColFmt[item_num].max_length : 0;}EDB_Type CMySQL_RowResult::ItemDataType(unsigned int item_num) const{    return item_num < m_NofCols ?        m_ColFmt[item_num].data_type : eDB_UnsupportedType;}bool CMySQL_RowResult::Fetch(){    m_CurrItem = -1;    m_Row = mysql_fetch_row(m_Result);    if ( m_Row ) {        m_Lengths = mysql_fetch_lengths(m_Result);        if ( !m_Lengths )            throw CDB_ClientEx(eDB_Warning, 800006,                               "CMySQL_RowResult::Fetch",                               "Failed: mysql_fetch_lengths");    }    m_CurrItem = 0;    return m_Row != 0;}int CMySQL_RowResult::CurrentItemNo() const{    return m_CurrItem;}static CDB_Object* s_GetItem(EDB_Type    data_type,                             CDB_Object* item_buff,                             EDB_Type    b_type,                             const char* d_ptr,                             size_t      d_len){    if ( !d_ptr )        d_ptr = "";    if (b_type == eDB_VarChar) {        if ( !item_buff ) {            item_buff = new CDB_VarChar;        }        if ( d_len ) {            ((CDB_VarChar*) item_buff)->SetValue(d_ptr, d_len);        } else {            item_buff->AssignNULL();        }        return item_buff;    }    if (b_type == eDB_Image) {        if ( !item_buff ) {            item_buff = new CDB_Image;        }        if ( d_len ) {            ((CDB_Image*) item_buff)->Append(d_ptr, d_len);        } else {            item_buff->AssignNULL();        }        return item_buff;    }    if (b_type == eDB_Text) {        if ( !item_buff ) {            item_buff = new CDB_Text;        }        if ( d_len ) {            ((CDB_Text*) item_buff)->Append(d_ptr, d_len);        } else {            item_buff->AssignNULL();        }        return item_buff;    }    long   int_val;    double double_val;    switch ( data_type ) {    case eDB_TinyInt:    case eDB_SmallInt:    case eDB_Int:        int_val = NStr::StringToInt(d_ptr);        break;    case eDB_Float:    case eDB_Double:        double_val = NStr::StringToDouble(d_ptr);        break;    }    switch ( b_type ) {    case eDB_TinyInt: {        if ( item_buff )            *((CDB_TinyInt*) item_buff) = (Uint1) int_val;        else            item_buff = new CDB_TinyInt((Uint1) int_val);        break;    }    case eDB_SmallInt: {        if ( item_buff )            *((CDB_SmallInt*) item_buff) = (Uint2) int_val;        else            item_buff = new CDB_SmallInt((Uint2) int_val);        break;    }    case eDB_Int: {        if ( item_buff )            *((CDB_Int*) item_buff) = (Uint4) int_val;        else            item_buff = new CDB_Int((Uint4) int_val);        break;    }    case eDB_Float: {        if ( item_buff )            *((CDB_Float*) item_buff) = (float) double_val;        else            item_buff = new CDB_Float((float) double_val);        break;    }    case eDB_Double: {        if ( item_buff )            *((CDB_Double*) item_buff) = double_val;        else            item_buff = new CDB_Double(double_val);        break;    }    case eDB_DateTime: {        CTime time;        if ( d_len )            time = CTime(d_ptr, "Y-M-D h:m:s");        if ( item_buff )            *(CDB_DateTime*) item_buff = time;        else            item_buff = new CDB_DateTime(time);        break;    }    case eDB_SmallDateTime: {        CTime time;        if (d_len)            time = CTime(d_ptr, "Y-M-D");        if (item_buff)            *(CDB_SmallDateTime*) item_buff = time;        else            item_buff = new CDB_SmallDateTime(time);        break;    }    }    if (d_len == 0  &&  item_buff) {        item_buff->AssignNULL();    }    return item_buff;}CDB_Object* CMySQL_RowResult::GetItem(CDB_Object* item_buf){    if ((unsigned int) m_CurrItem >= m_NofCols) {        return 0;    }    CDB_Object* r =        s_GetItem(m_ColFmt[m_CurrItem].data_type, item_buf,                  item_buf ? item_buf->GetType() : eDB_UnsupportedType,                  m_Row[m_CurrItem], m_Lengths[m_CurrItem]);    ++m_CurrItem;    return r;}size_t CMySQL_RowResult::ReadItem(void*  /*buffer*/,                                  size_t /*buffer_size*/,                                  bool*  /*is_null*/){    return 0;}I_ITDescriptor* CMySQL_RowResult::GetImageOrTextDescriptor(){    return 0;}bool CMySQL_RowResult::SkipItem(){    return false;}END_NCBI_SCOPE/* * =========================================================================== * $Log: result.cpp,v $ * Revision 1000.2  2004/06/01 19:21:31  gouriano * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.8 * * Revision 1.8  2004/05/17 21:15:34  gorelenk * Added include of PCH ncbi_pch.hpp * * Revision 1.7  2004/03/25 22:40:37  vysokolo * Atting eDB_Text type * * Revision 1.6  2004/03/24 19:46:53  vysokolo * addaed support of blob * * Revision 1.5  2003/02/26 17:10:35  kuznets * Fixed int->bool warning in MSVC * * Revision 1.4  2003/01/06 20:29:13  vakatov * Guarantee "m_CurrItem" to be invalid before first Fetch() and after * a failed Fetch(). * Get rid of some redundant header(s). * Formally reformatted to closer meet C++ Toolkit/DBAPI style. * * Revision 1.3  2003/01/03 18:12:23  butanaev * Removed unneeded code from Fetch(). * * Revision 1.2  2002/08/28 17:18:20  butanaev * Improved error handling, demo app. * * Revision 1.1  2002/08/13 20:23:14  butanaev * The beginning. * * =========================================================================== */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -