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

📄 datahandler.h.svn-base

📁 絲路server源碼 Silk Road server source
💻 SVN-BASE
字号:
/*   This file is part of libodbc++.   Copyright (C) 1999-2000 Manush Dodunekov <manush@stendahls.net>   This library is free software; you can redistribute it and/or   modify it under the terms of the GNU Library General Public   License as published by the Free Software Foundation; either   version 2 of the License, or (at your option) any later version.   This library is distributed in the hope that it will be useful,   but WITHOUT ANY WARRANTY; without even the implied warranty of   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU   Library General Public License for more details.   You should have received a copy of the GNU Library General Public License   along with this library; see the file COPYING.  If not, write to   the Free Software Foundation, Inc., 59 Temple Place - Suite 330,   Boston, MA 02111-1307, USA.*/#ifndef __DATAHANDLER_H#define __DATAHANDLER_H#if defined(ODBCXX_HAVE_ISTREAM)# include <istream>#else# include <iostream>#endif#include <odbc++/types.h>#if defined(ODBCXX_QT)# include <qiodevice.h>#endifnamespace odbc {  class ODBCXX_EXPORT DataHandler {    friend class ResultSet;    friend class PreparedStatement;    friend class Rowset;  private:    //actual buffer size is rows_ * bufferSize_    unsigned int& currentRow_;    size_t rows_;    char* buffer_;    size_t bufferSize_;    SQLINTEGER* dataStatus_;    bool isStreamed_;    ODBCXX_STREAM* stream_;    bool ownStream_;    int sqlType_;    int cType_;    int precision_;    int scale_;    bool use3_;    void setupBuffer(size_t s);    //this returns a ptr to the current row's storage    char* data() {      return &buffer_[bufferSize_*currentRow_];    }    void resetStream() {      if(isStreamed_) {	if(ownStream_) {	  delete stream_;	  ownStream_=false;	}	stream_=NULL;      } else {	assert(stream_==NULL);      }    }    //same, const version    const char* data() const {      return &buffer_[bufferSize_*currentRow_];    }    void setDataStatus(SQLINTEGER i) {      dataStatus_[currentRow_]=i;    }    SQLINTEGER getDataStatus() const {      return dataStatus_[currentRow_];    }  public:    DataHandler(unsigned int& cr, size_t rows,		int sqlType, int precision, int scale, bool use3);    ~DataHandler() {      this->resetStream();      this->setupBuffer(0);      delete[] dataStatus_;    }    int getSQLType() const {      return sqlType_;    }    bool getBoolean() const;    signed char getByte() const;    ODBCXX_BYTES getBytes() const;    short getShort() const;    int getInt() const;    Long getLong() const;    float getFloat() const;    double getDouble() const;    Date getDate() const;    Time getTime() const;    Timestamp getTimestamp() const;    ODBCXX_STRING getString() const;    ODBCXX_STREAM* getStream() const;    void setNull() {      this->resetStream();      this->setDataStatus(SQL_NULL_DATA);    }    bool isNull() const {      return this->getDataStatus()==SQL_NULL_DATA;    }    void setBoolean(bool b);    void setByte(signed char b);    void setBytes(const ODBCXX_BYTES& b);    void setShort(short s);    void setInt(int i);    void setLong(Long l);    void setFloat(float f);    void setDouble(double d);    void setDate(const Date& d);    void setTime(const Time& t);    void setTimestamp(const Timestamp& ts);    void setString(const ODBCXX_STRING& s);    //this is called by ResultSet for a fetch - does not touch the data status    void setStream(ODBCXX_STREAM* s);    //this is called for a set - sets the data status to    //data-at-exec(len)    void setStream(ODBCXX_STREAM* s, int len);    //this is called when the rowset moves to another row    void rowChanged() {      this->resetStream();    }    //this is called after an insert/update has been done    //using the rowset    void afterUpdate() {      this->resetStream();    }    static int defaultPrecisionFor(int sqlType) {      int prec=0;      switch(sqlType) {      case Types::CHAR:      case Types::VARCHAR:      case Types::BINARY:      case Types::VARBINARY:	prec=255;	break;      case Types::TIMESTAMP:	prec=19;	break;      }      return prec;    }  };  class ODBCXX_EXPORT Rowset {  private:    typedef std::vector<DataHandler*> DataHandlerList;    DataHandlerList dataHandlers_;    size_t rows_;    unsigned int currentRow_;    bool use3_;    DataHandler* _createColumn(int sqlType, int precision, int scale) {      return new DataHandler	(currentRow_,rows_,sqlType,precision,scale,use3_);    }  public:    Rowset(size_t rows, bool use3)      :rows_(rows),       currentRow_(0),       use3_(use3) {      assert(rows_>0);    }    ~Rowset() {      while(!dataHandlers_.empty()) {	DataHandlerList::iterator i=dataHandlers_.begin();	delete *i;	dataHandlers_.erase(i);      }    }    void addColumn(int sqlType, int precision, int scale) {      dataHandlers_.insert(dataHandlers_.end(),			   this->_createColumn(sqlType,precision,scale));    }    void replaceColumn(int idx, int sqlType, int precision, int scale) {      assert(idx>0 && idx<=(int)dataHandlers_.size());      DataHandler* h=this->_createColumn(sqlType,precision,scale);      delete dataHandlers_[idx-1];      dataHandlers_[idx-1]=h;    }    unsigned int getCurrentRow() const {      return currentRow_;    }    void setCurrentRow(unsigned int rowNumber) {      assert(rowNumber<rows_);      currentRow_=rowNumber;      for(DataHandlerList::iterator i=dataHandlers_.begin();	  i!=dataHandlers_.end(); i++) {	(*i)->rowChanged();      }    }    DataHandler* getColumn(unsigned int idx) {      assert(idx>0 && idx<=dataHandlers_.size());      return dataHandlers_[idx-1];    }    size_t getRows() const {      return rows_;    }    size_t getColumns() const {      return dataHandlers_.size();    }    void afterUpdate() {      for(DataHandlerList::iterator i=dataHandlers_.begin();	  i!=dataHandlers_.end(); i++) {	(*i)->afterUpdate();      }    }  };} // namespace odbc#endif // __DATAHANDLER_H

⌨️ 快捷键说明

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