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

📄 bytestreambuf.cpp

📁 ncbi源码
💻 CPP
字号:
/* * =========================================================================== * PRODUCTION $Log: bytestreambuf.cpp,v $ * PRODUCTION Revision 1000.1  2004/06/01 19:18:12  gouriano * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.9 * PRODUCTION * =========================================================================== *//*  $Id: bytestreambuf.cpp,v 1000.1 2004/06/01 19:18:12 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: Michael Kholodov** File Description: streambuf implementation for BLOBs** ---------------------------------------------------------------------------* $Log: bytestreambuf.cpp,v $* Revision 1000.1  2004/06/01 19:18:12  gouriano* PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.9** Revision 1.9  2004/05/17 21:10:28  gorelenk* Added include of PCH ncbi_pch.hpp** Revision 1.8  2002/07/12 13:34:11  kholodov* Fixed: incorrect length reported for NULL BLOB** Revision 1.7  2002/06/21 14:41:32  kholodov* Fixed: reset total bytes written for debug output** Revision 1.6  2002/05/16 22:09:19  kholodov* Fixed: incorrect start of BLOB column** Revision 1.5  2002/05/14 19:51:47  kholodov* Fixed: incorrect column no handling for detecting end of column** Revision 1.4  2002/05/13 19:11:53  kholodov* Modified: added proper handling of EOFs while reading column data using CDB_Result::CurrentItemNo().** Revision 1.3  2002/04/03 20:06:25  ucko* Always return >= 1 from showmanyc() to avoid spurious "EOF"s.* Pass status messages to _TRACE rather than writing them to cout.* #if out buggy code in destructor.** Revision 1.2  2002/02/14 00:59:40  vakatov* Clean-up: warning elimination, fool-proofing, fine-tuning, identation, etc.** Revision 1.1  2002/01/30 14:51:21  kholodov* User DBAPI implementation, first commit**** ===========================================================================*/#include <ncbi_pch.hpp>#include <exception>#include <algorithm>#include "bytestreambuf.hpp"#include <dbapi/driver/exception.hpp>#include <dbapi/driver/interfaces.hpp>#include <dbapi/driver/public.hpp>BEGIN_NCBI_SCOPEstatic const streamsize DEF_BUFSIZE = 2048;CByteStreamBuf::CByteStreamBuf(streamsize bufsize)    : m_buf(0),     m_size(bufsize > 0 ? bufsize : DEF_BUFSIZE),     m_len(0), m_rs(0), m_cmd(0), m_column(-1){     m_buf = new CT_CHAR_TYPE[m_size * 2]; // read and write buffer in one    setg(0, 0, 0); // call underflow on the first read    setp(getPBuf(), getPBuf() + m_size);    _TRACE("I/O buffer size: " << m_size);}CByteStreamBuf::~CByteStreamBuf(){#if 0 // misbehaves    if( m_rs != 0 && m_len > 0 )        m_rs->SkipItem();#endif    delete[] m_buf;    delete m_cmd;}CT_CHAR_TYPE* CByteStreamBuf::getGBuf(){    return m_buf;}CT_CHAR_TYPE* CByteStreamBuf::getPBuf() {    return m_buf + m_size;}void CByteStreamBuf::SetCmd(CDB_SendDataCmd* cmd) {    delete m_cmd;    m_cmd = cmd;}void CByteStreamBuf::SetRs(CDB_Result* rs) {    delete m_rs;    m_rs = rs;    m_column = m_rs->CurrentItemNo();}CT_INT_TYPE CByteStreamBuf::underflow(){    if( m_rs == 0 )        throw runtime_error("CByteStreamBuf::underflow(): CDB_Result* is null");      static size_t total = 0;    if( m_column < 0 || m_column != m_rs->CurrentItemNo() ) {        if( m_column < 0 ) {            _TRACE("Column for ReadItem not set, current column: "                   << m_rs->CurrentItemNo());#ifdef _DEBUG            _ASSERT(0);#endif        }        else            _TRACE("Total read from ReadItem: " << total);        total = 0;        m_column = m_rs->CurrentItemNo();        return CT_EOF;    }    else {        m_len = m_rs->ReadItem(getGBuf(), m_size);        _TRACE("Column: " << m_column << ", Bytes read to buffer: " << m_len);        if( m_len == 0 )            return CT_EOF;        total += m_len;        setg(getGBuf(), getGBuf(), getGBuf() + m_len);        return CT_TO_INT_TYPE(*getGBuf());    }    }CT_INT_TYPE CByteStreamBuf::overflow(CT_INT_TYPE c){    if( m_cmd == 0 ) {        throw runtime_error            ("CByteStreamBuf::overflow(): CDB_SendDataCmd* is null");    }    static size_t total = 0;    size_t put = m_cmd->SendChunk(pbase(), pptr() - pbase());    total += put;    if( put > 0 ) {        setp(getPBuf(), getPBuf() + m_size );        if( ! CT_EQ_INT_TYPE(c, CT_EOF) )            sputc(CT_TO_CHAR_TYPE(c));        return c;    }    else {        _TRACE("Total sent: " << total);        total = 0;        return CT_EOF;    }    }int CByteStreamBuf::sync(){    overflow(CT_EOF);    return 0;}streambuf* CByteStreamBuf::setbuf(CT_CHAR_TYPE* /*p*/, streamsize /*n*/){    throw runtime_error("CByteStreamBuf::setbuf(): not allowed");}streamsize CByteStreamBuf::showmanyc() {    streamsize left = egptr() - gptr();    return min(left, (streamsize)1);}//======================================================END_NCBI_SCOPE

⌨️ 快捷键说明

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