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

📄 result.cpp

📁 ncbi源码
💻 CPP
📖 第 1 页 / 共 3 页
字号:
/* * =========================================================================== * PRODUCTION $Log: result.cpp,v $ * PRODUCTION Revision 1000.2  2004/06/01 19:20:21  gouriano * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.22 * PRODUCTION * =========================================================================== *//* $Id: result.cpp,v 1000.2 2004/06/01 19:20:21 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:  Vladimir Soussov * * File Description:  DBLib Results * */#include <ncbi_pch.hpp>#ifndef USE_MS_DBLIB#  include <dbapi/driver/dblib/interfaces.hpp>#  include <dbapi/driver/dblib/interfaces_p.hpp>#else#  include <dbapi/driver/msdblib/interfaces.hpp>#  include <dbapi/driver/msdblib/interfaces_p.hpp>#endif#include <dbapi/driver/util/numeric_convert.hpp>BEGIN_NCBI_SCOPE// Aux. for s_*GetItem()static CDB_Object* s_GenericGetItem(EDB_Type data_type, CDB_Object* item_buff,                                    EDB_Type b_type, const BYTE* d_ptr, DBINT d_len){    switch (data_type) {    case eDB_VarBinary: {        if (item_buff) {            switch (b_type) {            case eDB_VarBinary:                ((CDB_VarBinary*) item_buff)->SetValue((const void*) d_ptr,                                                       (size_t) d_len);                break;            case eDB_Binary:                ((CDB_Binary*)    item_buff)->SetValue((const void*) d_ptr,                                                       (size_t) d_len);                break;            case eDB_VarChar:                ((CDB_VarChar*)   item_buff)->SetValue((const char*) d_ptr,                                                       (size_t) d_len);                break;            case eDB_Char:                ((CDB_Char*)      item_buff)->SetValue((const char*) d_ptr,                                                       (size_t) d_len);                break;			case eDB_LongBinary:                ((CDB_LongBinary*)item_buff)->SetValue((const void*) d_ptr,                                                       (size_t) d_len);                break;            case eDB_LongChar:                ((CDB_LongChar*)  item_buff)->SetValue((const char*) d_ptr,                                                       (size_t) d_len);                break;            default:                throw CDB_ClientEx(eDB_Error, 230020, "s_GenericGetItem",                                   "wrong type of CDB_Object");            }            return item_buff;        }        return d_ptr ? new CDB_VarBinary((const void*) d_ptr, (size_t) d_len)            : new CDB_VarBinary();    }    case eDB_Bit: {        DBBIT* v = (DBBIT*) d_ptr;        if (item_buff) {            if (v) {                switch (b_type) {                case eDB_Bit:                    *((CDB_Bit*)      item_buff) = (int) *v;                    break;                case eDB_TinyInt:                    *((CDB_TinyInt*)  item_buff) = *v ? 1 : 0;                    break;                case eDB_SmallInt:                    *((CDB_SmallInt*) item_buff) = *v ? 1 : 0;                    break;                case eDB_Int:                    *((CDB_Int*)      item_buff) = *v ? 1 : 0;                    break;                default:                    throw CDB_ClientEx(eDB_Error, 230020, "s_GenericGetItem",                                       "wrong type of CDB_Object");                }            } else                item_buff->AssignNULL();            return item_buff;        }        return v ? new CDB_Bit((int) *v) : new CDB_Bit;    }    case eDB_VarChar: {        if (item_buff) {            switch (b_type) {            case eDB_VarChar:                ((CDB_VarChar*)   item_buff)->SetValue((const char*) d_ptr,                                                       (size_t) d_len);                break;            case eDB_Char:                ((CDB_Char*)      item_buff)->SetValue((const char*) d_ptr,                                                       (size_t) d_len);                break;            case eDB_LongChar:                ((CDB_LongChar*)  item_buff)->SetValue((const char*) d_ptr,                                                       (size_t) d_len);                break;            case eDB_VarBinary:                ((CDB_VarBinary*) item_buff)->SetValue((const void*) d_ptr,                                                       (size_t) d_len);                break;            case eDB_Binary:                ((CDB_Binary*)    item_buff)->SetValue((const void*) d_ptr,                                                       (size_t) d_len);                break;            case eDB_LongBinary:                ((CDB_LongBinary*)item_buff)->SetValue((const void*) d_ptr,                                                       (size_t) d_len);                break;            default:                throw CDB_ClientEx(eDB_Error, 230020, "s_GenericGetItem",                                   "wrong type of CDB_Object");            }            return item_buff;        }        return d_ptr ? new CDB_VarChar((const char*) d_ptr, (size_t) d_len)            : new CDB_VarChar();    }    case eDB_DateTime: {        DBDATETIME* v = (DBDATETIME*) d_ptr;        if (item_buff) {            if (b_type != eDB_DateTime) {                throw CDB_ClientEx(eDB_Error, 230020, "s_GenericGetItem",                                   "wrong type of CDB_Object");            }            if (v)                ((CDB_DateTime*) item_buff)->Assign(v->dtdays, v->dttime);            else                item_buff->AssignNULL();            return item_buff;        }        return v ? new CDB_DateTime(v->dtdays, v->dttime) : new CDB_DateTime;    }    case eDB_SmallDateTime: {        DBDATETIME4* v = (DBDATETIME4*)d_ptr;        if (item_buff) {            if (v) {                switch (b_type) {                case eDB_SmallDateTime:                    ((CDB_SmallDateTime*) item_buff)->Assign                        (DBDATETIME4_days(v),             DBDATETIME4_mins(v));                    break;                case eDB_DateTime:                    ((CDB_DateTime*)      item_buff)->Assign                        ((int) DBDATETIME4_days(v), (int) DBDATETIME4_mins(v)*60*300);                    break;                default:                    throw CDB_ClientEx(eDB_Error, 230020, "s_GenericGetItem",                                       "wrong type of CDB_Object");                }            } else                item_buff->AssignNULL();            return item_buff;        }        return v ?            new CDB_SmallDateTime(DBDATETIME4_days(v), DBDATETIME4_mins(v)) : new CDB_SmallDateTime;    }    case eDB_TinyInt: {        DBTINYINT* v = (DBTINYINT*) d_ptr;        if (item_buff) {            if (v) {                switch (b_type) {                case eDB_TinyInt:                    *((CDB_TinyInt*)  item_buff) = (Uint1) *v;                    break;                case eDB_SmallInt:                    *((CDB_SmallInt*) item_buff) = (Int2)  *v;                    break;                case eDB_Int:                    *((CDB_Int*)      item_buff) = (Int4)  *v;                    break;                default:                    throw CDB_ClientEx(eDB_Error, 230020, "s_GenericGetItem",                                       "wrong type of CDB_Object");                }            } else                item_buff->AssignNULL();            return item_buff;        }        return v ? new CDB_TinyInt((Uint1) *v) : new CDB_TinyInt;    }    case eDB_SmallInt: {        DBSMALLINT* v = (DBSMALLINT*) d_ptr;        if (item_buff) {            if (v) {                switch (b_type) {                case eDB_SmallInt:                    *((CDB_SmallInt*) item_buff) = (Int2) *v;                    break;                case eDB_Int:                    *((CDB_Int*)      item_buff) = (Int4) *v;                        break;                default:                    throw CDB_ClientEx(eDB_Error, 230020, "s_GenericGetItem",                                       "wrong type of CDB_Object");                }            } else                item_buff->AssignNULL();            return item_buff;        }        return v ? new CDB_SmallInt((Int2) *v) : new CDB_SmallInt;    }    case eDB_Int: {        DBINT* v = (DBINT*) d_ptr;        if (item_buff) {            if (v) {                if (b_type == eDB_Int)                    *((CDB_Int*) item_buff) = (Int4) *v;                else {                    throw CDB_ClientEx(eDB_Error, 230020, "s_GenericGetItem",                                       "wrong type of CDB_Object");                }            } else                item_buff->AssignNULL();            return item_buff;        }        return v ? new CDB_Int((Int4) *v) : new CDB_Int;    }    case eDB_Double: {        if (item_buff && b_type != eDB_Double) {            throw CDB_ClientEx(eDB_Error, 130020, "s_GenericGetItem",                               "wrong type of CDB_Object");        }        DBFLT8* v = (DBFLT8*) d_ptr;        if (item_buff) {            if (v)                *((CDB_Double*) item_buff) = (double) *v;            else                item_buff->AssignNULL();            return item_buff;        }        return v ? new CDB_Double((double)*v) : new CDB_Double;    }    case eDB_Float: {        if (item_buff && b_type != eDB_Float) {            throw CDB_ClientEx(eDB_Error, 130020, "s_GenericGetItem",                               "wrong type of CDB_Object");        }        DBREAL* v = (DBREAL*) d_ptr;        if (item_buff) {            if (v)                *((CDB_Float*) item_buff) = (float) *v;            else                item_buff->AssignNULL();            return item_buff;        }        return v ? new CDB_Float((float)*v) : new CDB_Float;    }    case eDB_LongBinary: {        if (item_buff) {            switch (b_type) {			case eDB_LongBinary:                ((CDB_LongBinary*)item_buff)->SetValue((const void*) d_ptr,                                                       (size_t) d_len);                break;            case eDB_LongChar:                ((CDB_LongChar*)  item_buff)->SetValue((const char*) d_ptr,                                                       (size_t) d_len);                break;            default:                throw CDB_ClientEx(eDB_Error, 230020, "s_GenericGetItem",                                   "wrong type of CDB_Object");            }            return item_buff;        }        return d_ptr ? new CDB_LongBinary((size_t) d_len, (const void*) d_ptr,                                           (size_t) d_len)            : new CDB_LongBinary();    }    case eDB_LongChar: {        if (item_buff) {            switch (b_type) {            case eDB_LongChar:                ((CDB_LongChar*)  item_buff)->SetValue((const char*) d_ptr,                                                       (size_t) d_len);                break;            case eDB_LongBinary:                ((CDB_LongBinary*)item_buff)->SetValue((const void*) d_ptr,                                                       (size_t) d_len);                break;            default:                throw CDB_ClientEx(eDB_Error, 230020, "s_GenericGetItem",                                   "wrong type of CDB_Object");            }            return item_buff;        }        return d_ptr ? new CDB_LongChar((size_t) d_len, (const char*) d_ptr)            : new CDB_LongChar();    }    default:        return 0;    }}/////////////////////////////////////////////////////////////////////////////static EDB_Type s_GetDataType(DBPROCESS* cmd, int n){    switch (dbcoltype(cmd, n)) {    case SYBBINARY:    return (dbcollen(cmd, n) > 255) ? eDB_LongBinary :                                                          eDB_VarBinary;    case SYBBIT:       return eDB_Bit;    case SYBCHAR:      return (dbcollen(cmd, n) > 255) ? eDB_LongChar :                                                         eDB_VarChar;    case SYBDATETIME:  return eDB_DateTime;    case SYBDATETIME4: return eDB_SmallDateTime;    case SYBINT1:      return eDB_TinyInt;    case SYBINT2:      return eDB_SmallInt;    case SYBINT4:      return eDB_Int;    case SYBDECIMAL:    case SYBNUMERIC:   break;    case SYBFLT8:      return eDB_Double;    case SYBREAL:      return eDB_Float;    case SYBTEXT:      return eDB_Text;    case SYBIMAGE:     return eDB_Image;    default:           return eDB_UnsupportedType;    }#ifdef MS_DBLIB_IN_USE    DBCOL dbcol; dbcol.SizeOfStruct = sizeof(DBCOL);    RETCODE res = dbcolinfo(cmd, CI_REGULAR, n, 0, &dbcol );    return dbcol.Scale == 0 && dbcol.Precision < 20 ? eDB_BigInt : eDB_Numeric;#else    DBTYPEINFO* t = dbcoltypeinfo(cmd, n);    return t->scale == 0 && t->precision < 20 ? eDB_BigInt : eDB_Numeric;#endif}/////////////////////////////////////////////////////////////////////////////////  CDBL_RowResult:://CDBL_RowResult::CDBL_RowResult(DBPROCESS* cmd,                               unsigned int* res_status, bool need_init) :    m_Cmd(cmd), m_CurrItem(-1), m_EOR(false),    m_ResStatus(res_status), m_Offset(0){    if (!need_init)        return;    m_NofCols = dbnumcols(cmd);    m_CmdNum = DBCURCMD(cmd);    m_ColFmt = new SDBL_ColDescr[m_NofCols];    for (unsigned int n = 0; n < m_NofCols; n++) {        m_ColFmt[n].max_length = dbcollen(m_Cmd, n + 1);        m_ColFmt[n].data_type = s_GetDataType(m_Cmd, n + 1);        const char* s = dbcolname(m_Cmd, n + 1);        m_ColFmt[n].col_name = s ? s : "";    }}EDB_ResType CDBL_RowResult::ResultType() const{    return eDB_RowResult;}unsigned int CDBL_RowResult::NofItems() const{    return m_NofCols;}const char* CDBL_RowResult::ItemName(unsigned int item_num) const{    return item_num < m_NofCols ? m_ColFmt[item_num].col_name.c_str() : 0;}size_t CDBL_RowResult::ItemMaxSize(unsigned int item_num) const{    return item_num < m_NofCols ? m_ColFmt[item_num].max_length : 0;}EDB_Type CDBL_RowResult::ItemDataType(unsigned int item_num) const{    return item_num < m_NofCols        ? m_ColFmt[item_num].data_type : eDB_UnsupportedType;}bool CDBL_RowResult::Fetch(){    m_CurrItem = -1;    if (!m_EOR) {        switch (dbnextrow(m_Cmd)) {        case REG_ROW:            m_CurrItem = 0;            m_Offset = 0;            return true;        case NO_MORE_ROWS:            m_EOR = true;            break;        case FAIL:            throw CDB_ClientEx(eDB_Error, 230003, "CDBL_RowResult::Fetch",                               "error in fetching row");        case BUF_FULL:            throw CDB_ClientEx(eDB_Error, 230006, "CDBL_RowResult::Fetch",                               "buffer is full");        default:            *m_ResStatus|= 0x10;            m_EOR = true;            break;        }    }    return false;}int CDBL_RowResult::CurrentItemNo() const{    return m_CurrItem;}// Aux. for CDBL_RowResult::GetItem()static CDB_Object* s_GetItem(DBPROCESS* cmd, int item_no,                             SDBL_ColDescr* fmt, CDB_Object* item_buff){    EDB_Type b_type = item_buff ? item_buff->GetType() : eDB_UnsupportedType;    const BYTE* d_ptr = dbdata  (cmd, item_no);    DBINT d_len = dbdatlen(cmd, item_no);    CDB_Object* val = s_GenericGetItem(fmt->data_type, item_buff,                                       b_type, d_ptr, d_len);    if (val)        return val;    switch (fmt->data_type) {    case eDB_BigInt: {        DBNUMERIC* v = (DBNUMERIC*) d_ptr;        if (item_buff) {            if (v) {                if (b_type == eDB_Numeric) {                    ((CDB_Numeric*) item_buff)->Assign                        ((unsigned int)   v->precision,                         (unsigned int)   v->scale,                         (unsigned char*) DBNUMERIC_val(v));                } else if (b_type == eDB_BigInt) {                    *((CDB_BigInt*) item_buff) = numeric_to_longlong                        ((unsigned int) v->precision, DBNUMERIC_val(v));                } else {                    throw CDB_ClientEx(eDB_Error, 230020, "s_GetItem",                                       "wrong type of CDB_Object");                }            } else                item_buff->AssignNULL();            return item_buff;        }        return v ?            new CDB_BigInt(numeric_to_longlong((unsigned int) v->precision,                                               DBNUMERIC_val(v))) : new CDB_BigInt;    }    case eDB_Numeric: {        DBNUMERIC* v = (DBNUMERIC*) d_ptr;        if (item_buff) {                if (v) {                    if (b_type == eDB_Numeric) {                        ((CDB_Numeric*) item_buff)->Assign                            ((unsigned int)   v->precision,                             (unsigned int)   v->scale,                             (unsigned char*) DBNUMERIC_val(v));                    } else {                        throw CDB_ClientEx(eDB_Error, 230020, "s_GetItem",                                           "wrong type of CDB_Object");                    }                } else                    item_buff->AssignNULL();                return item_buff;        }        return v ?            new CDB_Numeric((unsigned int)   v->precision,                            (unsigned int)   v->scale,

⌨️ 快捷键说明

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