8 #define SOCI_ODBC_SOURCE 26 throw soci_error(
"Vectors of size 0 are not allowed.");
29 indHolderVec_.resize(size);
30 indHolders_ = &indHolderVec_[0];
46 odbcType_ = SQL_C_SSHORT;
48 std::vector<short> *vp =
static_cast<std::vector<short> *
>(data);
49 std::vector<short> &v(*vp);
50 prepare_indicators(v.size());
56 odbcType_ = SQL_C_SLONG;
57 size =
sizeof(SQLINTEGER);
58 assert(
sizeof(SQLINTEGER) ==
sizeof(
int));
59 std::vector<int> *vp =
static_cast<std::vector<int> *
>(data);
60 std::vector<int> &v(*vp);
61 prepare_indicators(v.size());
67 std::vector<long long> *vp =
68 static_cast<std::vector<long long> *
>(data);
69 std::vector<long long> &v(*vp);
70 prepare_indicators(v.size());
71 if (use_string_for_bigint())
73 odbcType_ = SQL_C_CHAR;
74 size = max_bigint_length;
75 std::size_t bufSize = size * v.size();
77 buf_ =
new char[bufSize];
82 odbcType_ = SQL_C_SBIGINT;
83 size =
sizeof(
long long);
90 std::vector<unsigned long long> *vp =
91 static_cast<std::vector<unsigned long long> *
>(data);
92 std::vector<unsigned long long> &v(*vp);
93 prepare_indicators(v.size());
94 if (use_string_for_bigint())
96 odbcType_ = SQL_C_CHAR;
97 size = max_bigint_length;
98 std::size_t bufSize = size * v.size();
100 buf_ =
new char[bufSize];
105 odbcType_ = SQL_C_UBIGINT;
106 size =
sizeof(
unsigned long long);
113 odbcType_ = SQL_C_DOUBLE;
114 size =
sizeof(double);
115 std::vector<double> *vp =
static_cast<std::vector<double> *
>(data);
116 std::vector<double> &v(*vp);
117 prepare_indicators(v.size());
126 odbcType_ = SQL_C_CHAR;
129 =
static_cast<std::vector<char> *
>(data);
131 prepare_indicators(v->size());
133 size =
sizeof(char) * 2;
134 std::size_t bufSize = size * v->size();
138 buf_ =
new char[bufSize];
144 odbcType_ = SQL_C_CHAR;
145 std::vector<std::string> *v
146 =
static_cast<std::vector<std::string> *
>(data);
147 colSize_ = statement_.column_size(position) + 1;
148 std::size_t bufSize = colSize_ * v->size();
149 buf_ =
new char[bufSize];
151 prepare_indicators(v->size());
153 size =
static_cast<SQLINTEGER
>(colSize_);
159 odbcType_ = SQL_C_TYPE_TIMESTAMP;
160 std::vector<std::tm> *v
161 =
static_cast<std::vector<std::tm> *
>(data);
163 prepare_indicators(v->size());
165 size =
sizeof(TIMESTAMP_STRUCT);
168 std::size_t bufSize = size * v->size();
170 buf_ =
new char[bufSize];
181 = SQLBindCol(statement_.hstmt_, static_cast<SQLUSMALLINT>(position++),
182 odbcType_, static_cast<SQLPOINTER>(data), size, indHolders_);
186 "vector into type define by pos");
204 std::vector<char> *vp
205 =
static_cast<std::vector<char> *
>(data_);
207 std::vector<char> &v(*vp);
209 std::size_t
const vsize = v.size();
210 for (std::size_t i = 0; i != vsize; ++i)
218 std::vector<std::string> *vp
219 =
static_cast<std::vector<std::string> *
>(data_);
221 std::vector<std::string> &v(*vp);
224 std::size_t
const vsize = v.size();
225 for (std::size_t i = 0; i != vsize; ++i)
227 v[i].assign(pos, strlen(pos));
233 std::vector<std::tm> *vp
234 =
static_cast<std::vector<std::tm> *
>(data_);
236 std::vector<std::tm> &v(*vp);
238 std::size_t
const vsize = v.size();
239 for (std::size_t i = 0; i != vsize; ++i)
243 TIMESTAMP_STRUCT * ts =
reinterpret_cast<TIMESTAMP_STRUCT*
>(pos);
245 t.tm_year = ts->year - 1900;
246 t.tm_mon = ts->month - 1;
248 t.tm_hour = ts->hour;
249 t.tm_min = ts->minute;
250 t.tm_sec = ts->second;
258 else if (type_ ==
x_long_long && use_string_for_bigint())
260 std::vector<long long> *vp
261 =
static_cast<std::vector<long long> *
>(data_);
262 std::vector<long long> &v(*vp);
264 std::size_t
const vsize = v.size();
265 for (std::size_t i = 0; i != vsize; ++i)
269 throw soci_error(
"Failed to parse the returned 64-bit integer value");
276 std::vector<unsigned long long> *vp
277 =
static_cast<std::vector<unsigned long long> *
>(data_);
278 std::vector<unsigned long long> &v(*vp);
280 std::size_t
const vsize = v.size();
281 for (std::size_t i = 0; i != vsize; ++i)
285 throw soci_error(
"Failed to parse the returned 64-bit integer value");
294 std::size_t
const indSize = statement_.get_number_of_rows();
295 for (std::size_t i = 0; i != indSize; ++i)
297 if (indHolderVec_[i] > 0)
301 else if (indHolderVec_[i] == SQL_NULL_DATA)
313 std::size_t
const indSize = statement_.get_number_of_rows();
314 for (std::size_t i = 0; i != indSize; ++i)
316 if (indHolderVec_[i] == SQL_NULL_DATA)
320 "Null value fetched and no indicator defined.");
333 indHolderVec_.resize(sz);
339 std::vector<char> *v =
static_cast<std::vector<char> *
>(data_);
345 std::vector<short> *v =
static_cast<std::vector<short> *
>(data_);
351 std::vector<int> *v =
static_cast<std::vector<int> *
>(data_);
357 std::vector<long long> *v =
358 static_cast<std::vector<long long> *
>(data_);
364 std::vector<unsigned long long> *v =
365 static_cast<std::vector<unsigned long long> *
>(data_);
371 std::vector<double> *v
372 =
static_cast<std::vector<double> *
>(data_);
378 std::vector<std::string> *v
379 =
static_cast<std::vector<std::string> *
>(data_);
385 std::vector<std::tm> *v
386 =
static_cast<std::vector<std::tm> *
>(data_);
405 std::vector<char> *v =
static_cast<std::vector<char> *
>(data_);
411 std::vector<short> *v =
static_cast<std::vector<short> *
>(data_);
417 std::vector<int> *v =
static_cast<std::vector<int> *
>(data_);
423 std::vector<long long> *v =
424 static_cast<std::vector<long long> *
>(data_);
430 std::vector<unsigned long long> *v =
431 static_cast<std::vector<unsigned long long> *
>(data_);
437 std::vector<double> *v
438 =
static_cast<std::vector<double> *
>(data_);
444 std::vector<std::string> *v
445 =
static_cast<std::vector<std::string> *
>(data_);
451 std::vector<std::tm> *v
452 =
static_cast<std::vector<std::tm> *
>(data_);
virtual void post_fetch(bool gotData, indicator *ind)
virtual std::size_t size()
bool is_odbc_error(SQLRETURN rc)
void prepare_indicators(std::size_t size)
virtual void define_by_pos(int &position, void *data, details::exchange_type type)
virtual void resize(std::size_t sz)