32 # ifndef DOXYGEN_SHOULD_SKIP_THIS 34 # include <agrum/tools/database/DBInitializerFromSQL.h> 43 template <
template <
typename >
class ALLOC >
44 void DBInitializerFromSQL< ALLOC >::connect__(
45 const std::string& connection_string,
50 bool agrum_connection = (connection_string.size() > 4)
51 && (connection_string.compare(0, 4,
"gum ") == 0);
54 if (!agrum_connection) {
55 connection__.connect(connection_string, timeout);
57 std::size_t deb_index, end_index;
58 const std::string delimiter =
"|";
60 deb_index = connection_string.find(delimiter, 0);
61 if (deb_index == std::string::npos)
62 GUM_ERROR(DatabaseError,
63 "could not determine the datasource from string " 64 << connection_string);
65 deb_index += std::size_t(1);
66 end_index = connection_string.find(delimiter, deb_index);
67 if (end_index == std::string::npos)
68 GUM_ERROR(DatabaseError,
69 "could not determine the datasource from string " 70 << connection_string);
71 std::string dataSource
72 = connection_string.substr(deb_index, end_index - deb_index);
74 deb_index = connection_string.find(delimiter, end_index + std::size_t(1));
75 if (deb_index == std::string::npos)
76 GUM_ERROR(DatabaseError,
77 "could not determine the database login from string " 78 << connection_string);
79 deb_index += std::size_t(1);
80 end_index = connection_string.find(delimiter, deb_index);
81 if (end_index == std::string::npos)
82 GUM_ERROR(DatabaseError,
83 "could not determine the database login from string " 84 << connection_string);
86 = connection_string.substr(deb_index, end_index - deb_index);
88 deb_index = connection_string.find(delimiter, end_index + std::size_t(1));
89 if (deb_index == std::string::npos)
90 GUM_ERROR(DatabaseError,
91 "could not determine the database password from string " 92 << connection_string);
93 deb_index += std::size_t(1);
94 end_index = connection_string.find(delimiter, deb_index);
95 if (end_index == std::string::npos)
96 GUM_ERROR(DatabaseError,
97 "could not determine the database password from string " 98 << connection_string);
100 = connection_string.substr(deb_index, end_index - deb_index);
102 connection__.connect(dataSource, login, password, timeout);
108 template <
template <
typename >
class ALLOC >
109 DBInitializerFromSQL< ALLOC >::DBInitializerFromSQL(
110 const std::string& connection_string,
111 const std::string& query,
113 const typename DBInitializerFromSQL< ALLOC >::allocator_type& alloc) :
114 IDBInitializer< ALLOC >(IDBInitializer< ALLOC >::InputType::STRING, alloc),
115 connection_string__(connection_string), query__(query), timeout__(timeout),
116 var_names__(alloc), parser__(alloc) {
119 const std::string current_locale = std::setlocale(LC_NUMERIC, NULL);
122 connect__(connection_string, timeout);
125 std::setlocale(LC_NUMERIC, current_locale.c_str());
128 parser__.useNewQuery(connection__, query__);
131 const std::size_t nb_cols = std::size_t(parser__.nbColumns());
132 for (std::size_t i = 0; i < nb_cols; ++i) {
133 var_names__.push_back(parser__.columnName(i));
136 GUM_CONSTRUCTOR(DBInitializerFromSQL);
141 template <
template <
typename >
class ALLOC >
142 DBInitializerFromSQL< ALLOC >::DBInitializerFromSQL(
143 const std::string& dataSource,
144 const std::string& login,
145 const std::string& password,
146 const std::string& query,
148 const typename DBInitializerFromSQL< ALLOC >::allocator_type& alloc) :
149 DBInitializerFromSQL< ALLOC >(
"gum datasource=|" + dataSource
150 +
"|; login=|" + login +
"|; password=|" 158 template <
template <
typename >
class ALLOC >
159 DBInitializerFromSQL< ALLOC >::DBInitializerFromSQL(
160 const DBInitializerFromSQL< ALLOC >& from,
161 const typename DBInitializerFromSQL< ALLOC >::allocator_type& alloc) :
162 DBInitializerFromSQL< ALLOC >(from.connection_string__,
169 template <
template <
typename >
class ALLOC >
170 DBInitializerFromSQL< ALLOC >::DBInitializerFromSQL(
171 const DBInitializerFromSQL< ALLOC >& from) :
172 DBInitializerFromSQL< ALLOC >(from, from.getAllocator()) {}
176 template <
template <
typename >
class ALLOC >
177 DBInitializerFromSQL< ALLOC >::DBInitializerFromSQL(
178 DBInitializerFromSQL< ALLOC >&& from,
179 const typename DBInitializerFromSQL< ALLOC >::allocator_type& alloc) :
180 DBInitializerFromSQL< ALLOC >(from.connection_string__,
186 template <
template <
typename >
class ALLOC >
187 DBInitializerFromSQL< ALLOC >::DBInitializerFromSQL(
188 DBInitializerFromSQL< ALLOC >&& from) :
189 DBInitializerFromSQL< ALLOC >(std::move(from), from.getAllocator()) {}
193 template <
template <
typename >
class ALLOC >
194 DBInitializerFromSQL< ALLOC >* DBInitializerFromSQL< ALLOC >::clone(
195 const typename DBInitializerFromSQL< ALLOC >::allocator_type& alloc)
const {
196 ALLOC< DBInitializerFromSQL< ALLOC > > allocator(alloc);
197 DBInitializerFromSQL< ALLOC >* new_initializer = allocator.allocate(1);
199 allocator.construct(new_initializer, *
this, alloc);
201 allocator.deallocate(new_initializer, 1);
205 return new_initializer;
210 template <
template <
typename >
class ALLOC >
211 DBInitializerFromSQL< ALLOC >* DBInitializerFromSQL< ALLOC >::clone()
const {
212 return clone(
this->getAllocator());
217 template <
template <
typename >
class ALLOC >
218 DBInitializerFromSQL< ALLOC >::~DBInitializerFromSQL() {
219 GUM_DESTRUCTOR(DBInitializerFromSQL);
224 template <
template <
typename >
class ALLOC >
225 DBInitializerFromSQL< ALLOC >& DBInitializerFromSQL< ALLOC >::operator=(
226 const DBInitializerFromSQL< ALLOC >& from) {
228 IDBInitializer< ALLOC >::operator=(from);
230 const bool connexion_changed
231 = (connection_string__ != from.connection_string__);
234 connection_string__ = from.connection_string__;
235 query__ = from.query__;
236 timeout__ = from.timeout__;
239 if (connexion_changed) {
240 if (connection__.connected()) connection__.disconnect();
241 connect__(connection_string__, timeout__);
245 parser__.useNewQuery(connection__, query__);
249 const std::size_t nb_cols = std::size_t(parser__.nbColumns());
250 for (std::size_t i = 0; i < nb_cols; ++i) {
251 var_names__.push_back(parser__.columnName(i));
260 template <
template <
typename >
class ALLOC >
261 DBInitializerFromSQL< ALLOC >& DBInitializerFromSQL< ALLOC >::operator=(
262 DBInitializerFromSQL< ALLOC >&& from) {
263 return operator=(from);
268 template <
template <
typename >
class ALLOC >
269 INLINE std::vector< std::string, ALLOC< std::string > >
270 DBInitializerFromSQL< ALLOC >::variableNames_() {
276 template <
template <
typename >
class ALLOC >
277 INLINE
const std::vector< std::string, ALLOC< std::string > >&
278 DBInitializerFromSQL< ALLOC >::currentStringRow_() {
279 return parser__.current();
284 template <
template <
typename >
class ALLOC >
285 INLINE
bool DBInitializerFromSQL< ALLOC >::nextRow_() {
286 return parser__.next();