00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #ifndef RESOURCEPOOL_ORACLE_SELECTLISTMETADATA_HH
00025 #define RESOURCEPOOL_ORACLE_SELECTLISTMETADATA_HH
00026
00027 #ifndef OCI_ORACLE
00028 #include <oci.h>
00029 #endif
00030
00031 #ifndef RESOURCEPOOL_ORACLE_ORACLEREFTYPE_HH
00032 #include "oracleRefType.hh"
00033 #endif
00034
00035 #ifndef RESOURCEPOOL_ORACLE_SQLSELECTROW_HH
00036 #include "SQLSelectRow.hh"
00037 #endif
00038
00039 #ifndef RESOURCEPOOL_ORACLE_ORACLESTATEMENT_HH
00040 #include "oracleStatement.hh"
00041 #endif
00042
00043 #include "mm/RawBuffer.hh"
00044
00045 #include <vector>
00046 #include <string>
00047 #include <ostream>
00048
00049 namespace fatalmind {
00050 namespace oracle {
00051
00052 class ColumnMetaData {
00053 public:
00054 ColumnMetaData(const size_t offst);
00055
00056 ColumnMetaData(const ColumnMetaData& rho);
00057
00058 ub2 getType() const throw();
00059 ub2 getSize() const throw();
00060 size_t getOffset() const throw();
00061 bool bufferedDefine() const throw();
00062
00063
00064
00065
00066
00067 static bool needsBuffer(ub2) throw();
00068 bool piecewise() const throw();
00069
00070 private:
00071 const ub2* getTypePtr() const throw();
00072 const ub2* getSizePtr() const throw();
00073 void alignSize() throw();
00074 void setSize(ub2 s) throw();
00075
00076 ub2 _datatype;
00077 ub2 _datasize;
00078 size_t _offst;
00079 friend
00080 class SelectListMetaData;
00081 friend
00082 std::ostream& operator<<(std::ostream& s, const ColumnMetaData& rho);
00083 };
00084
00085 std::ostream& operator<<(std::ostream& s, const ColumnMetaData& rho);
00086
00087 class SelectListMetaData {
00088 public:
00089 SelectListMetaData(const OCIStatementHandle& sth
00090 , const oracleHandles& hand
00091 , const oracleStatement& SQL
00092 );
00093
00094 size_t getBufferSz() const throw();
00095 int getNumSelectListItems() const;
00096 const ColumnMetaData& getColumnMetaData(const int pos) const;
00097 const oracleStatement& getOraSQL() const;
00098
00099 private:
00100 typedef std::vector<ColumnMetaData> selectlist_t;
00101 selectlist_t _selectlist;
00102 oracleStatement _oraSQL;
00103 size_t _bufsz;
00104 friend
00105 std::ostream& operator<<(std::ostream& s, const SelectListMetaData& rho);
00106 };
00107
00108 std::ostream& operator<<(std::ostream& s, const SelectListMetaData& rho);
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123 class DefineMetaData {
00124 public:
00125 DefineMetaData(const ub2 bufsz, oracleRefType& out)
00126 : _bufsz(bufsz)
00127 , _out(out)
00128 , _dataPtr(this + 1)
00129 {
00130 }
00131
00132 ub2* getSizePtr_ub2() throw() {
00133 return &s._size_ub2;
00134 }
00135
00136 ub4* getSizePtr_ub4() throw() {
00137 return &s._size_ub4;
00138 }
00139
00140 void* getDataPtr() throw() {
00141 return _dataPtr;
00142 }
00143
00144 void resetSize() throw() {
00145 s._size_ub4 = _bufsz;
00146 }
00147
00148 ub2 getSize_ub2() const throw() {
00149 return s._size_ub2;
00150 }
00151
00152 ub4 getSize_ub4() const throw() {
00153 return s._size_ub4;
00154 }
00155
00156 void done(ub4 len, void* buf) {
00157 _out.done(len, buf);
00158 }
00159
00160 void setIndPtr(sb2* ind) {
00161 _ind = ind;
00162 }
00163 sb2* getIndPtr() const {
00164 return _ind;
00165 }
00166 private:
00167
00168
00169
00170
00171
00172
00173
00174 union size_union {
00175 ub2 _size_ub2;
00176 ub4 _size_ub4;
00177 } s;
00178 ub4 _bufsz;
00179 sb2* _ind;
00180 oracleRefType& _out;
00181 void* _dataPtr;
00182 };
00183
00184 class SelectListBuffer: private RawBuffer {
00185 public:
00186 SelectListBuffer(const gc_ptr<SelectListMetaData> slmd, oracleBindOut& bindout);
00187 ~SelectListBuffer();
00188
00189 int getNumSelectListItems() const;
00190 DefineMetaData* getDefineMetaData(const int pos) const;
00191 void* getDataPtr(const int pos) const;
00192 bool bufferedDefine(const int pos) const;
00193 bool piecewiseFetch(const int pos) const;
00194
00195 private:
00196 const gc_ptr<SelectListMetaData> _slmd;
00197 };
00198
00199
00200 }
00201 }
00202 #endif