32 # ifndef DOXYGEN_SHOULD_SKIP_THIS 34 # include <agrum/tools/database/DBInitializerFromSQL.h> 43 template <
template <
typename >
class ALLOC >
44 void DBInitializerFromSQL< ALLOC >::_connect_(
const std::string& connection_string,
50 = (connection_string.size() > 4) && (connection_string.compare(0, 4,
"gum ") == 0);
53 if (!agrum_connection) {
54 _connection_.connect(connection_string, timeout);
56 std::size_t deb_index, end_index;
57 const std::string delimiter =
"|";
59 deb_index = connection_string.find(delimiter, 0);
60 if (deb_index == std::string::npos)
61 GUM_ERROR(DatabaseError,
62 "could not determine the datasource from string " << connection_string);
63 deb_index += std::size_t(1);
64 end_index = connection_string.find(delimiter, deb_index);
65 if (end_index == std::string::npos)
66 GUM_ERROR(DatabaseError,
67 "could not determine the datasource from string " << connection_string);
68 std::string dataSource = connection_string.substr(deb_index, end_index - deb_index);
70 deb_index = connection_string.find(delimiter, end_index + std::size_t(1));
71 if (deb_index == std::string::npos)
72 GUM_ERROR(DatabaseError,
73 "could not determine the database login from string " << connection_string);
74 deb_index += std::size_t(1);
75 end_index = connection_string.find(delimiter, deb_index);
76 if (end_index == std::string::npos)
77 GUM_ERROR(DatabaseError,
78 "could not determine the database login from string " << connection_string);
79 std::string login = connection_string.substr(deb_index, end_index - deb_index);
81 deb_index = connection_string.find(delimiter, end_index + std::size_t(1));
82 if (deb_index == std::string::npos)
83 GUM_ERROR(DatabaseError,
84 "could not determine the database password from string " << connection_string);
85 deb_index += std::size_t(1);
86 end_index = connection_string.find(delimiter, deb_index);
87 if (end_index == std::string::npos)
88 GUM_ERROR(DatabaseError,
89 "could not determine the database password from string " << connection_string);
90 std::string password = connection_string.substr(deb_index, end_index - deb_index);
92 _connection_.connect(dataSource, login, password, timeout);
98 template <
template <
typename >
class ALLOC >
99 DBInitializerFromSQL< ALLOC >::DBInitializerFromSQL(
100 const std::string& connection_string,
101 const std::string& query,
103 const typename DBInitializerFromSQL< ALLOC >::allocator_type& alloc) :
104 IDBInitializer< ALLOC >(IDBInitializer< ALLOC >::InputType::STRING, alloc),
105 _connection_string_(connection_string), _query_(query), _timeout_(timeout),
106 _var_names_(alloc), _parser_(alloc) {
109 const std::string current_locale = std::setlocale(LC_NUMERIC, NULL);
112 _connect_(connection_string, timeout);
115 std::setlocale(LC_NUMERIC, current_locale.c_str());
118 _parser_.useNewQuery(_connection_, _query_);
121 const std::size_t nb_cols = std::size_t(_parser_.nbColumns());
122 for (std::size_t i = 0; i < nb_cols; ++i) {
123 _var_names_.push_back(_parser_.columnName(i));
126 GUM_CONSTRUCTOR(DBInitializerFromSQL);
131 template <
template <
typename >
class ALLOC >
132 DBInitializerFromSQL< ALLOC >::DBInitializerFromSQL(
133 const std::string& dataSource,
134 const std::string& login,
135 const std::string& password,
136 const std::string& query,
138 const typename DBInitializerFromSQL< ALLOC >::allocator_type& alloc) :
139 DBInitializerFromSQL< ALLOC >(
"gum datasource=|" + dataSource +
"|; login=|" + login
140 +
"|; password=|" + password +
"|",
147 template <
template <
typename >
class ALLOC >
148 DBInitializerFromSQL< ALLOC >::DBInitializerFromSQL(
149 const DBInitializerFromSQL< ALLOC >& from,
150 const typename DBInitializerFromSQL< ALLOC >::allocator_type& alloc) :
151 DBInitializerFromSQL< ALLOC >(from._connection_string_,
158 template <
template <
typename >
class ALLOC >
159 DBInitializerFromSQL< ALLOC >::DBInitializerFromSQL(
const DBInitializerFromSQL< ALLOC >& from) :
160 DBInitializerFromSQL< ALLOC >(from, from.getAllocator()) {}
164 template <
template <
typename >
class ALLOC >
165 DBInitializerFromSQL< ALLOC >::DBInitializerFromSQL(
166 DBInitializerFromSQL< ALLOC >&& from,
167 const typename DBInitializerFromSQL< ALLOC >::allocator_type& alloc) :
168 DBInitializerFromSQL< ALLOC >(from._connection_string_,
174 template <
template <
typename >
class ALLOC >
175 DBInitializerFromSQL< ALLOC >::DBInitializerFromSQL(DBInitializerFromSQL< ALLOC >&& from) :
176 DBInitializerFromSQL< ALLOC >(std::move(from), from.getAllocator()) {}
180 template <
template <
typename >
class ALLOC >
181 DBInitializerFromSQL< ALLOC >* DBInitializerFromSQL< ALLOC >::clone(
182 const typename DBInitializerFromSQL< ALLOC >::allocator_type& alloc)
const {
183 ALLOC< DBInitializerFromSQL< ALLOC > > allocator(alloc);
184 DBInitializerFromSQL< ALLOC >* new_initializer = allocator.allocate(1);
186 allocator.construct(new_initializer, *
this, alloc);
188 allocator.deallocate(new_initializer, 1);
192 return new_initializer;
197 template <
template <
typename >
class ALLOC >
198 DBInitializerFromSQL< ALLOC >* DBInitializerFromSQL< ALLOC >::clone()
const {
199 return clone(
this->getAllocator());
204 template <
template <
typename >
class ALLOC >
205 DBInitializerFromSQL< ALLOC >::~DBInitializerFromSQL() {
206 GUM_DESTRUCTOR(DBInitializerFromSQL);
211 template <
template <
typename >
class ALLOC >
212 DBInitializerFromSQL< ALLOC >&
213 DBInitializerFromSQL< ALLOC >::operator=(
const DBInitializerFromSQL< ALLOC >& from) {
215 IDBInitializer< ALLOC >::operator=(from);
217 const bool connexion_changed = (_connection_string_ != from._connection_string_);
220 _connection_string_ = from._connection_string_;
221 _query_ = from._query_;
222 _timeout_ = from._timeout_;
225 if (connexion_changed) {
226 if (_connection_.connected()) _connection_.disconnect();
227 _connect_(_connection_string_, _timeout_);
231 _parser_.useNewQuery(_connection_, _query_);
235 const std::size_t nb_cols = std::size_t(_parser_.nbColumns());
236 for (std::size_t i = 0; i < nb_cols; ++i) {
237 _var_names_.push_back(_parser_.columnName(i));
246 template <
template <
typename >
class ALLOC >
247 DBInitializerFromSQL< ALLOC >&
248 DBInitializerFromSQL< ALLOC >::operator=(DBInitializerFromSQL< ALLOC >&& from) {
249 return operator=(from);
254 template <
template <
typename >
class ALLOC >
255 INLINE std::vector< std::string, ALLOC< std::string > >
256 DBInitializerFromSQL< ALLOC >::variableNames_() {
262 template <
template <
typename >
class ALLOC >
263 INLINE
const std::vector< std::string, ALLOC< std::string > >&
264 DBInitializerFromSQL< ALLOC >::currentStringRow_() {
265 return _parser_.current();
270 template <
template <
typename >
class ALLOC >
271 INLINE
bool DBInitializerFromSQL< ALLOC >::nextRow_() {
272 return _parser_.next();