8 #define soci_ORACLE_SOURCE 19 #pragma warning(disable:4355) 20 #define snprintf _snprintf 31 throw soci_error(
"Vectors of size 0 are not allowed.");
34 indOCIHolderVec_.resize(size);
35 indOCIHolders_ = &indOCIHolderVec_[0];
39 void *&data, sb4 &size, ub2 &oracleType)
46 oracleType = SQLT_AFC;
48 std::vector<char> *vp =
static_cast<std::vector<char> *
>(data);
49 std::vector<char> &v(*vp);
50 prepare_indicators(v.size());
56 oracleType = SQLT_INT;
58 std::vector<short> *vp =
static_cast<std::vector<short> *
>(data);
59 std::vector<short> &v(*vp);
60 prepare_indicators(v.size());
66 oracleType = SQLT_INT;
68 std::vector<int> *vp =
static_cast<std::vector<int> *
>(data);
69 std::vector<int> &v(*vp);
70 prepare_indicators(v.size());
76 oracleType = SQLT_FLT;
77 size =
sizeof(double);
78 std::vector<double> *vp =
static_cast<std::vector<double> *
>(data);
79 std::vector<double> &v(*vp);
80 prepare_indicators(v.size());
89 std::vector<long long> *vp
90 =
static_cast<std::vector<long long> *
>(data);
91 std::vector<long long> &v(*vp);
93 std::size_t
const vecSize = v.size();
94 std::size_t
const entrySize = 100;
95 std::size_t
const bufSize = entrySize * vecSize;
96 buf_ =
new char[bufSize];
98 oracleType = SQLT_STR;
102 prepare_indicators(vecSize);
107 std::vector<unsigned long long> *vp
108 =
static_cast<std::vector<unsigned long long> *
>(data);
109 std::vector<unsigned long long> &v(*vp);
111 std::size_t
const vecSize = v.size();
112 std::size_t
const entrySize = 100;
113 std::size_t
const bufSize = entrySize * vecSize;
114 buf_ =
new char[bufSize];
116 oracleType = SQLT_STR;
120 prepare_indicators(vecSize);
125 std::vector<std::string> *vp
126 =
static_cast<std::vector<std::string> *
>(data);
127 std::vector<std::string> &v(*vp);
129 std::size_t maxSize = 0;
130 std::size_t
const vecSize = v.size();
131 prepare_indicators(vecSize);
132 for (std::size_t i = 0; i != vecSize; ++i)
134 std::size_t sz = v[i].length();
135 sizes_.push_back(static_cast<ub2>(sz));
136 maxSize = sz > maxSize ? sz : maxSize;
139 buf_ =
new char[maxSize * vecSize];
141 for (std::size_t i = 0; i != vecSize; ++i)
143 strncpy(pos, v[i].c_str(), v[i].length());
147 oracleType = SQLT_CHR;
149 size =
static_cast<sb4
>(maxSize);
154 std::vector<std::tm> *vp
155 =
static_cast<std::vector<std::tm> *
>(data);
157 prepare_indicators(vp->size());
160 buf_ =
new char[dlen * vp->size()];
162 oracleType = SQLT_DAT;
183 prepare_for_bind(data, size, oracleType);
191 sword res = OCIBindByPos(statement_.stmtp_, &bindp_,
192 statement_.session_.errhp_,
193 position++, data, size, oracleType,
194 indOCIHolders_, sizesP, 0, 0, 0, OCI_DEFAULT);
195 if (res != OCI_SUCCESS)
210 prepare_for_bind(data, size, oracleType);
218 sword res = OCIBindByName(statement_.stmtp_, &bindp_,
219 statement_.session_.errhp_,
220 reinterpret_cast<text*>(const_cast<char*>(name.c_str())),
221 static_cast<sb4
>(name.size()),
222 data, size, oracleType,
223 indOCIHolders_, sizesP, 0, 0, 0, OCI_DEFAULT);
224 if (res != OCI_SUCCESS)
241 std::vector<long long> *vp
242 =
static_cast<std::vector<long long> *
>(data_);
243 std::vector<long long> &v(*vp);
246 std::size_t
const entrySize = 100;
247 std::size_t
const vecSize = v.size();
248 for (std::size_t i = 0; i != vecSize; ++i)
256 std::vector<unsigned long long> *vp
257 =
static_cast<std::vector<unsigned long long> *
>(data_);
258 std::vector<unsigned long long> &v(*vp);
261 std::size_t
const entrySize = 100;
262 std::size_t
const vecSize = v.size();
263 for (std::size_t i = 0; i != vecSize; ++i)
271 std::vector<std::tm> *vp
272 =
static_cast<std::vector<std::tm> *
>(data_);
273 std::vector<std::tm> &v(*vp);
275 ub1* pos =
reinterpret_cast<ub1*
>(buf_);
276 std::size_t
const vsize = v.size();
277 for (std::size_t i = 0; i != vsize; ++i)
279 *pos++ =
static_cast<ub1
>(100 + (1900 + v[i].tm_year) / 100);
280 *pos++ =
static_cast<ub1
>(100 + v[i].tm_year % 100);
281 *pos++ =
static_cast<ub1
>(v[i].tm_mon + 1);
282 *pos++ =
static_cast<ub1
>(v[i].tm_mday);
283 *pos++ =
static_cast<ub1
>(v[i].tm_hour + 1);
284 *pos++ =
static_cast<ub1
>(v[i].tm_min + 1);
285 *pos++ =
static_cast<ub1
>(v[i].tm_sec + 1);
292 std::size_t
const vsize = size();
293 for (std::size_t i = 0; i != vsize; ++i, ++ind)
297 indOCIHolderVec_[i] = -1;
301 indOCIHolderVec_[i] = 0;
308 std::size_t
const vsize = size();
309 for (std::size_t i = 0; i != vsize; ++i, ++ind)
311 indOCIHolderVec_[i] = 0;
324 std::vector<char> *vp =
static_cast<std::vector<char> *
>(data_);
330 std::vector<short> *vp =
static_cast<std::vector<short> *
>(data_);
336 std::vector<int> *vp =
static_cast<std::vector<int> *
>(data_);
342 std::vector<long long> *vp
343 =
static_cast<std::vector<long long> *
>(data_);
349 std::vector<unsigned long long> *vp
350 =
static_cast<std::vector<unsigned long long> *
>(data_);
356 std::vector<double> *vp
357 =
static_cast<std::vector<double> *
>(data_);
363 std::vector<std::string> *vp
364 =
static_cast<std::vector<std::string> *
>(data_);
370 std::vector<std::tm> *vp
371 =
static_cast<std::vector<std::tm> *
>(data_);
394 OCIHandleFree(bindp_, OCI_HTYPE_DEFINE);
void prepare_indicators(std::size_t size)
virtual void bind_by_name(std::string const &name, void *data, details::exchange_type type)
virtual void pre_use(indicator const *ind)
virtual void bind_by_pos(int &position, void *data, details::exchange_type type)
void prepare_for_bind(void *&data, sb4 &size, ub2 &oracleType)
virtual std::size_t size()
void throw_oracle_soci_error(sword res, OCIError *errhp)