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

📄 result.cpp

📁 ncbi源码
💻 CPP
📖 第 1 页 / 共 3 页
字号:
		  return v ?            new CDB_BigInt(*v) : new CDB_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*) v->array);                } else if (b_type == eDB_BigInt) {                    *((CDB_BigInt*) item_buff) = numeric_to_longlong                        ((unsigned int) v->precision, v->array);                } 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,                                               v->array)) : 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*) v->array);                } 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,                            (unsigned char*) v->array) : new CDB_Numeric;    }    case eDB_Text: {        if (item_buff  &&  b_type != eDB_Text  &&  b_type != eDB_Image) {            throw CDB_ClientEx(eDB_Error, 130020, "s_GetItem",                               "wrong type of CDB_Object");        }        CDB_Text* v = item_buff ? (CDB_Text*) item_buff : new CDB_Text;        v->Append((char*) d_ptr, (int) d_len);        return v;    }    case eDB_Image: {        if (item_buff  &&  b_type != eDB_Text  &&  b_type != eDB_Image) {            throw CDB_ClientEx(eDB_Error, 130020, "s_GetItem",                               "wrong type of CDB_Object");        }        CDB_Image* v = item_buff ? (CDB_Image*) item_buff : new CDB_Image;        v->Append((void*) d_ptr, (int) d_len);        return v;    }    default:        throw CDB_ClientEx(eDB_Error, 130004, "s_GetItem",                           "unexpected result type");    }}CDB_Object* CTDS_RowResult::GetItem(CDB_Object* item_buff){    if ((unsigned int) m_CurrItem >= m_NofCols) {        return 0;    }    CDB_Object* r = s_GetItem(m_Cmd, m_CurrItem + 1,                              &m_ColFmt[m_CurrItem], item_buff);    ++m_CurrItem;    m_Offset = 0;    return r;}size_t CTDS_RowResult::ReadItem(void* buffer, size_t buffer_size,bool* is_null){    if ((unsigned int) m_CurrItem >= m_NofCols) {        if (is_null)            *is_null = true;        return 0;    }    BYTE* d_ptr = dbdata  (m_Cmd, m_CurrItem + 1);    DBINT d_len = dbdatlen(m_Cmd, m_CurrItem + 1);    if (d_ptr == 0  ||  d_len < 1) { // NULL value        ++m_CurrItem;        m_Offset = 0;        if (is_null)            *is_null = true;        return 0;    }    if (is_null)        *is_null = false;    if ((size_t) (d_len - m_Offset) < buffer_size) {        buffer_size = d_len - m_Offset;    }    if (buffer)        memcpy(buffer, d_ptr + m_Offset, buffer_size);    m_Offset += buffer_size;    if (m_Offset >= d_len) {        m_Offset = 0;        ++m_CurrItem;    }    return buffer_size;}I_ITDescriptor* CTDS_RowResult::GetImageOrTextDescriptor(){    if ((unsigned int) m_CurrItem >= m_NofCols)        return 0;    return new CTDS_ITDescriptor(m_Cmd, m_CurrItem + 1);}bool CTDS_RowResult::SkipItem(){    if ((unsigned int) m_CurrItem < m_NofCols) {        ++m_CurrItem;        m_Offset = 0;        return true;    }    return false;}CTDS_RowResult::~CTDS_RowResult(){    if (m_ColFmt) {        delete[] m_ColFmt;        m_ColFmt = 0;    }    if (!m_EOR)        dbcanquery(m_Cmd);}/////////////////////////////////////////////////////////////////////////////////  CTDS_BlobResult::CTDS_BlobResult::CTDS_BlobResult(DBPROCESS* cmd)    : m_Cmd(cmd), m_CurrItem(-1), m_EOR(false){    m_CmdNum = DBCURCMD(cmd);    m_ColFmt.max_length = dbcollen(m_Cmd, 1);    m_ColFmt.data_type = s_GetDataType(m_Cmd, 1);    char* s = dbcolname(m_Cmd, 1);    m_ColFmt.col_name = s ? s : "";}EDB_ResType CTDS_BlobResult::ResultType() const{    return eDB_RowResult;}unsigned int CTDS_BlobResult::NofItems() const{    return 1;}const char* CTDS_BlobResult::ItemName(unsigned int item_num) const{    return item_num ? 0 : m_ColFmt.col_name.c_str();}size_t CTDS_BlobResult::ItemMaxSize(unsigned int item_num) const{    return item_num ? 0 : m_ColFmt.max_length;}EDB_Type CTDS_BlobResult::ItemDataType(unsigned int) const{    return m_ColFmt.data_type;}bool CTDS_BlobResult::Fetch(){    if (m_EOR)        return false;    STATUS s;    if (m_CurrItem == 0) {        while ((s = dbreadtext(m_Cmd, m_Buff, (DBINT) sizeof(m_Buff))) > 0)            ;        switch (s) {        case 0:            break;        case NO_MORE_ROWS:            m_EOR = true;            return false;        default:            throw CDB_ClientEx(eDB_Error, 280003, "CTDS_BlobResult::Fetch",                               "error in fetching row");        }    }    else {        m_CurrItem = 0;    }    s = dbreadtext(m_Cmd, m_Buff, (DBINT) sizeof(m_Buff));    if (s == NO_MORE_ROWS)        return false;    if (s < 0) {        throw CDB_ClientEx(eDB_Error, 280003, "CTDS_BlobResult::Fetch",                           "error in fetching row");    }    m_BytesInBuffer = s;    m_ReadedBytes = 0;    return true;}int CTDS_BlobResult::CurrentItemNo() const{    return m_CurrItem;}CDB_Object* CTDS_BlobResult::GetItem(CDB_Object* item_buff){    if (m_CurrItem)        return 0;    EDB_Type b_type = item_buff ? item_buff->GetType() : eDB_UnsupportedType;    if (item_buff  &&  b_type != eDB_Text  &&  b_type != eDB_Image) {        throw CDB_ClientEx(eDB_Error, 230020, "CTDS_BlobResult::GetItem",                           "wrong type of CDB_Object");    }    if (item_buff == 0) {        item_buff = m_ColFmt.data_type == eDB_Text            ? (CDB_Object*) new CDB_Text : (CDB_Object*) new CDB_Image;    }    CDB_Text* val = (CDB_Text*) item_buff;    // check if we do have something in buffer    if (m_ReadedBytes < m_BytesInBuffer) {        val->Append(m_Buff + m_ReadedBytes, m_BytesInBuffer - m_ReadedBytes);        m_ReadedBytes = m_BytesInBuffer;    }    if (m_BytesInBuffer == 0) {        return item_buff;    }    STATUS s;    while ((s = dbreadtext(m_Cmd, m_Buff, (DBINT) sizeof(m_Buff))) > 0) {        val->Append(m_Buff, (s < sizeof(m_Buff))? (size_t)s : sizeof(m_Buff));    }    switch (s) {    case NO_MORE_ROWS:        m_EOR = true;    case 0:        m_CurrItem = 1;        break;    default:        throw CDB_ClientEx(eDB_Error, 280003, "CTDS_BlobResult::GetItem",                           "dbreadtext failed");    }    return item_buff;}size_t CTDS_BlobResult::ReadItem(void* buffer, size_t buffer_size,                                 bool* is_null){    if (m_BytesInBuffer == 0)        m_CurrItem = 1;    if (m_CurrItem != 0) {        if (is_null)            *is_null = true;        return 0;    }    size_t l = 0;    // check if we do have something in buffer    if (m_ReadedBytes < m_BytesInBuffer) {        l = m_BytesInBuffer - m_ReadedBytes;        if (l >= buffer_size) {            memcpy(buffer, m_Buff + m_ReadedBytes, buffer_size);            m_ReadedBytes += buffer_size;            if (is_null)                *is_null = false;            return buffer_size;        }        memcpy(buffer, m_Buff + m_ReadedBytes, l);    }    STATUS s = dbreadtext(m_Cmd,                          (void*)((char*)buffer + l), (DBINT)(buffer_size-l));    switch (s) {    case NO_MORE_ROWS:        m_EOR = true;    case 0:        m_CurrItem = 1;        break;    case -1:        throw CDB_ClientEx(eDB_Error, 280003, "CTDS_BlobResult::ReadItem",                           "dbreadtext failed");    default:        break;    }    if (is_null) {        *is_null = (m_BytesInBuffer == 0  &&  s <= 0);    }    return (size_t) s + l;}I_ITDescriptor* CTDS_BlobResult::GetImageOrTextDescriptor(){    if (m_CurrItem != 0)        return 0;    return new CTDS_ITDescriptor(m_Cmd, 1);}bool CTDS_BlobResult::SkipItem(){    if (m_EOR  ||  m_CurrItem)        return false;    STATUS s;    while ((s = dbreadtext(m_Cmd, m_Buff, sizeof(m_Buff))) > 0)        continue;    switch (s) {    case NO_MORE_ROWS:        m_EOR = true;    case 0:        m_CurrItem = 1;        break;    default:        throw CDB_ClientEx(eDB_Error, 280003, "CTDS_BlobResult::SkipItem",                           "dbreadtext failed");    }    return true;}CTDS_BlobResult::~CTDS_BlobResult(){    if (!m_EOR)        dbcanquery(m_Cmd);}/////////////////////////////////////////////////////////////////////////////static EDB_Type s_RetGetDataType(DBPROCESS* cmd, int n){    switch (dbrettype(cmd, n)) {    case SYBBINARY:    return (dbretlen(cmd, n) > 255)? eDB_LongBinary :                                                         eDB_VarBinary;    case SYBBIT:       return eDB_Bit;    case SYBCHAR:      return (dbretlen(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 SYBFLT8:      return eDB_Double;    case SYBREAL:      return eDB_Float;    default:           return eDB_UnsupportedType;    }}// Aux. for CTDS_ParamResult::GetItem()static CDB_Object* s_RetGetItem(DBPROCESS* cmd, int item_no,                                STDS_ColDescr* fmt, CDB_Object* item_buff){    EDB_Type b_type = item_buff ? item_buff->GetType() : eDB_UnsupportedType;    BYTE* d_ptr = dbretdata(cmd, item_no);    DBINT d_len = dbretlen (cmd, item_no);    CDB_Object* val = s_GenericGetItem(fmt->data_type, item_buff,                                       b_type, d_ptr, d_len);    if (!val) {        throw CDB_ClientEx(eDB_Error, 230004, "s_RetGetItem",                           "unexpected result type");    }    return val;}/////////////////////////////////////////////////////////////////////////////////  CTDS_ParamResult:://CTDS_ParamResult::CTDS_ParamResult(DBPROCESS* cmd, int nof_params)    : CTDS_RowResult(cmd, 0, false){    m_NofCols = nof_params;    m_CmdNum = DBCURCMD(cmd);    m_ColFmt = new STDS_ColDescr[m_NofCols];    for (unsigned int n = 0;  n < m_NofCols;  n++) {        m_ColFmt[n].max_length = 255;        m_ColFmt[n].data_type = s_RetGetDataType(m_Cmd, n + 1);        const char* s = dbretname(m_Cmd, n + 1);        m_ColFmt[n].col_name = s ? s : "";    }    m_1stFetch = true;}EDB_ResType CTDS_ParamResult::ResultType() const{    return eDB_ParamResult;}bool CTDS_ParamResult::Fetch(){    if (m_1stFetch) { // we didn't get the items yet;        m_1stFetch = false;	m_CurrItem= 0;        return true;    }    return false;}CDB_Object* CTDS_ParamResult::GetItem(CDB_Object* item_buff){    if ((unsigned int) m_CurrItem >= m_NofCols) {        return 0;    }    CDB_Object* r = s_RetGetItem(m_Cmd, m_CurrItem + 1,                                 &m_ColFmt[m_CurrItem], item_buff);    ++m_CurrItem;    m_Offset = 0;    return r;}size_t CTDS_ParamResult::ReadItem(void* buffer, size_t buffer_size,                                  bool* is_null){    if ((unsigned int) m_CurrItem >= m_NofCols) {        if (is_null)            *is_null = true;        return 0;    }    BYTE* d_ptr = dbretdata(m_Cmd, m_CurrItem + 1);    DBINT d_len = dbretlen (m_Cmd, m_CurrItem + 1);    if (d_ptr == 0  ||  d_len < 1) { // NULL value        ++m_CurrItem;        m_Offset = 0;        if (is_null)            *is_null = true;        return 0;    }    if (is_null)        *is_null = false;    if ((size_t) (d_len - m_Offset) < buffer_size) {        buffer_size = d_len - m_Offset;    }    memcpy(buffer, d_ptr + m_Offset, buffer_size);    m_Offset += buffer_size;    if (m_Offset >= d_len) {        m_Offset = 0;        ++m_CurrItem;    }    return buffer_size;}

⌨️ 快捷键说明

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