firebird/vector-into-type.cpp
Go to the documentation of this file.
1 //
2 // Copyright (C) 2004-2006 Maciej Sobczak, Stephen Hutton, Rafal Bobrowski
3 // Distributed under the Boost Software License, Version 1.0.
4 // (See accompanying file LICENSE_1_0.txt or copy at
5 // http://www.boost.org/LICENSE_1_0.txt)
6 //
7 
8 #define SOCI_FIREBIRD_SOURCE
9 #include "soci-firebird.h"
10 #include "common.h"
11 
12 using namespace soci;
13 using namespace soci::details;
14 using namespace soci::details::firebird;
15 
17  int & position, void * data, exchange_type type)
18 {
19  position_ = position-1;
20  data_ = data;
21  type_ = type;
22 
23  ++position;
24 
25  statement_.intoType_ = eVector;
26  statement_.intos_.push_back(static_cast<void*>(this));
27 
28  XSQLVAR *var = statement_.sqldap_->sqlvar+position_;
29 
30  buf_ = allocBuffer(var);
31  var->sqldata = buf_;
32  var->sqlind = &indISCHolder_;
33 }
34 
36 {
37  // Nothing to do here.
38 }
39 
40 namespace // anonymous
41 {
42 template <typename T>
43 void setIntoVector(void *p, std::size_t indx, T const &val)
44 {
45  std::vector<T> *dest =
46  static_cast<std::vector<T> *>(p);
47 
48  std::vector<T> &v = *dest;
49  v[indx] = val;
50 }
51 
52 } // namespace anonymous
53 
54 // this will exchange data with vector user buffers
56 {
57  XSQLVAR *var = statement_.sqldap_->sqlvar+position_;
58 
59  switch (type_)
60  {
61  // simple cases
62  case x_char:
63  setIntoVector(data_, row, getTextParam(var)[0]);
64  break;
65  case x_short:
66  {
67  short tmp = from_isc<short>(var);
68  setIntoVector(data_, row, tmp);
69  }
70  break;
71  case x_integer:
72  {
73  int tmp = from_isc<int>(var);
74  setIntoVector(data_, row, tmp);
75  }
76  break;
77  case x_long_long:
78  {
79  long long tmp = from_isc<long long>(var);
80  setIntoVector(data_, row, tmp);
81  }
82  break;
83  case x_double:
84  {
85  double tmp = from_isc<double>(var);
86  setIntoVector(data_, row, tmp);
87  }
88  break;
89 
90  // cases that require adjustments and buffer management
91  case x_stdstring:
92  setIntoVector(data_, row, getTextParam(var));
93  break;
94  case x_stdtm:
95  {
96  std::tm data;
97  tmDecode(var->sqltype, buf_, &data);
98  setIntoVector(data_, row, data);
99  }
100  break;
101 
102  default:
103  throw soci_error("Into vector element used with non-supported type.");
104  } // switch
105 
106 }
107 
109  bool gotData, indicator * ind)
110 {
111  // Here we have to set indicators only. Data was exchanged with user
112  // buffers during fetch()
113  if (gotData)
114  {
115  std::size_t rows = statement_.rowsFetched_;
116 
117  for (std::size_t i = 0; i<rows; ++i)
118  {
119  if (statement_.inds_[position_][i] == i_null && (ind == NULL))
120  {
121  throw soci_error("Null value fetched and no indicator defined.");
122  }
123  else if (ind != NULL)
124  {
125  ind[i] = statement_.inds_[position_][i];
126  }
127  }
128  }
129 }
130 
132 {
133  switch (type_)
134  {
135  case x_char:
136  resizeVector<char> (data_, sz);
137  break;
138  case x_short:
139  resizeVector<short> (data_, sz);
140  break;
141  case x_integer:
142  resizeVector<int> (data_, sz);
143  break;
144  case x_long_long:
145  resizeVector<long long> (data_, sz);
146  break;
147  case x_double:
148  resizeVector<double> (data_, sz);
149  break;
150  case x_stdstring:
151  resizeVector<std::string> (data_, sz);
152  break;
153  case x_stdtm:
154  resizeVector<std::tm> (data_, sz);
155  break;
156 
157  default:
158  throw soci_error("Into vector element used with non-supported type.");
159  }
160 }
161 
163 {
164  std::size_t sz = 0; // dummy initialization to please the compiler
165  switch (type_)
166  {
167  // simple cases
168  case x_char:
169  sz = getVectorSize<char> (data_);
170  break;
171  case x_short:
172  sz = getVectorSize<short> (data_);
173  break;
174  case x_integer:
175  sz = getVectorSize<int> (data_);
176  break;
177  case x_long_long:
178  sz = getVectorSize<long long> (data_);
179  break;
180  case x_double:
181  sz = getVectorSize<double> (data_);
182  break;
183  case x_stdstring:
184  sz = getVectorSize<std::string> (data_);
185  break;
186  case x_stdtm:
187  sz = getVectorSize<std::tm> (data_);
188  break;
189 
190  default:
191  throw soci_error("Into vector element used with non-supported type.");
192  }
193 
194  return sz;
195 }
196 
198 {
199  if (buf_ != NULL)
200  {
201  delete [] buf_;
202  buf_ = NULL;
203  }
204  std::vector<void*>::iterator it =
205  std::find(statement_.intos_.begin(), statement_.intos_.end(), this);
206  if (it != statement_.intos_.end())
207  statement_.intos_.erase(it);
208 }
virtual void define_by_pos(int &position, void *data, details::exchange_type type)
Definition: row.h:41
char * allocBuffer(XSQLVAR *var)
void tmDecode(short type, void *src, std::tm *dst)
virtual void post_fetch(bool gotData, indicator *ind)
std::string getTextParam(XSQLVAR const *var)


asr_lib_ism
Author(s): Hanselmann Fabian, Heller Florian, Heizmann Heinrich, Kübler Marcel, Mehlhaus Jonas, Meißner Pascal, Qattan Mohamad, Reckling Reno, Stroh Daniel
autogenerated on Wed Jan 8 2020 04:02:41