3void PAHdb::connect(std::string_view database =
"", std::string_view host =
"",
4 std::string_view username =
"",
5 std::string_view password =
"",
int port = 0,
6 bool compress =
false,
int timeout = 0,
7 std::string_view socket =
"") {
11 _connection.connect(database.data(), socket.data(), username.data(),
12 password.data(), port);
13 }
catch (
const mysqlpp::ConnectionFailed &e) {
19std::vector<std::vector<std::pair<double, double>>>
20PAHdb::getTransitionsFromUIDsAndVersion(
const std::vector<int> &uids,
23 mysqlpp::Query query = _connection.query();
25 mysqlpp::StoreQueryResult result;
29 std::vector<std::vector<std::pair<double, double>>> vector;
31 std::pair<double, double> transition;
35 for (
const auto &uid : uids) {
39 query <<
"SELECT frequency, intensity FROM "
40 << pre[
static_cast<int>(_table)]
41 <<
"transitions WHERE specie_id=(SELECT id FROM "
42 << pre[
static_cast<int>(_table)]
43 <<
"species AS s1 WHERE status & 2 = 0 AND update_number=(SELECT "
44 "MAX(update_number) FROM "
45 << pre[
static_cast<int>(_table)]
46 <<
"species AS s2 WHERE update_number<=" << version
47 <<
" AND s1.uid=s2.uid) AND uid=" << uid <<
")";
49 result = query.store();
51 std::vector<std::pair<double, double>> transitions;
55 for (
const auto &row : result) {
57 transition.first = row[
"frequency"];
59 transition.second = row[
"intensity"];
61 transitions.push_back(transition);
63 }
catch (mysqlpp::BadFieldName &e) {
68 vector.push_back(transitions);
70 }
catch (
const mysqlpp::BadQuery &e) {
78std::vector<std::vector<std::pair<double, double>>>
79PAHdb::getTransitionsFromVersion(
int version, std::vector<int> &uids) {
83 mysqlpp::Query query = _connection.query();
85 mysqlpp::StoreQueryResult result;
95 query <<
"SELECT uid FROM " << pre[
static_cast<int>(_table)]
96 <<
"species AS s1 WHERE status & 2 = 0 AND update_number=(SELECT "
97 "MAX(update_number) FROM "
98 << pre[
static_cast<int>(_table)]
99 <<
"species AS s2 WHERE update_number <=" << version
100 <<
" AND s1.uid=s2.uid) ORDER BY uid";
102 result = query.store();
106 for (
const auto &row : result) {
108 uids.push_back(row[
"uid"]);
110 }
catch (mysqlpp::BadFieldName &e) {
114 }
catch (
const mysqlpp::BadQuery &e) {
119 return (PAHdb::getTransitionsFromUIDsAndVersion(uids, version));
122std::vector<std::vector<std::pair<double, double>>>
123PAHdb::getTransitionsFromIds(
const std::vector<int> &ids) {
125 mysqlpp::Query query = _connection.query();
127 mysqlpp::StoreQueryResult result;
131 std::vector<std::vector<std::pair<double, double>>> vector;
133 std::pair<double, double> transition;
137 for (
const auto &
id : ids) {
141 query <<
"SELECT frequency, intensity FROM "
142 << pre[
static_cast<int>(_table)]
143 <<
"transitions WHERE specie_id=" <<
id;
145 result = query.store();
147 std::vector<std::pair<double, double>> transitions;
151 for (
const auto &row : result) {
153 transition.first = row[
"frequency"];
155 transition.second = row[
"intensity"];
157 transitions.push_back(transition);
159 }
catch (mysqlpp::BadFieldName &e) {
164 vector.push_back(transitions);
166 }
catch (
const mysqlpp::BadQuery &e) {
174std::vector<std::vector<std::pair<double, double>>>
175PAHdb::getExperimentalAndTheoreticalTransitionsFromId(
int id) {
177 mysqlpp::Query query = _connection.query();
179 mysqlpp::StoreQueryResult result;
183 std::vector<std::vector<std::pair<double, double>>> vector;
185 std::vector<std::pair<double, double>> transitions;
187 std::pair<double, double> transition;
195 case PAHdb::Database::Experiment:
197 query <<
"SELECT frequency, intensity FROM "
198 <<
"exp_transitions WHERE specie_id=" << id;
202 case PAHdb::Database::Anharmonic:
203 case PAHdb::Database::Theory:
207 <<
"SELECT frequency, intensity FROM "
208 <<
"exp_transitions JOIN exp_species ON "
209 <<
"exp_transitions.specie_id=exp_species.id "
210 <<
" WHERE uid=(SELECT uid FROM " << pre[
static_cast<int>(_table)]
211 <<
"species WHERE id=" <<
id
212 <<
") AND update_number=(SELECT MAX(update_number) FROM exp_species "
213 <<
"WHERE status & 2 = 0 AND uid=(SELECT uid FROM "
214 << pre[
static_cast<int>(_table)] <<
"species WHERE id=" <<
id <<
"))";
217 result = query.store();
221 for (
const auto &row : result) {
223 transition.first = row[
"frequency"];
225 transition.second = row[
"intensity"];
227 transitions.push_back(transition);
229 }
catch (mysqlpp::BadFieldName &e) {
234 vector.push_back(transitions);
239 case PAHdb::Database::Theory:
241 query <<
"SELECT frequency, intensity FROM "
242 <<
"transitions WHERE specie_id=" << id;
246 case PAHdb::Database::Anharmonic:
247 case PAHdb::Database::Experiment:
250 query <<
"SELECT frequency, intensity FROM "
251 <<
"transitions JOIN species ON "
252 <<
"transitions.specie_id=species.id "
253 <<
" WHERE uid=(SELECT uid FROM " << pre[
static_cast<int>(_table)]
254 <<
"species WHERE id=" <<
id
255 <<
") AND update_number=(SELECT MAX(update_number) FROM species "
256 <<
"WHERE status & 2 = 0 AND uid=(SELECT uid FROM "
257 << pre[
static_cast<int>(_table)] <<
"species WHERE id=" <<
id
261 result = query.store();
267 for (
const auto &row : result) {
269 transition.first = row[
"frequency"];
271 transition.second = row[
"intensity"];
273 transitions.push_back(transition);
276 }
catch (mysqlpp::BadFieldName &e) {
281 vector.push_back(transitions);
287 case PAHdb::Database::Anharmonic:
289 query <<
"SELECT frequency, intensity FROM "
290 <<
"anharmonic_transitions WHERE specie_id=" << id;
294 case PAHdb::Database::Theory:
295 case PAHdb::Database::Experiment:
298 query <<
"SELECT frequency, intensity FROM "
299 <<
"anharmonic_transitions JOIN anharmonic_species ON "
300 <<
"anharmonic_transitions.specie_id=anharmonic_species.id "
301 <<
" WHERE uid=(SELECT uid FROM " << pre[
static_cast<int>(_table)]
302 <<
"species WHERE id=" <<
id
303 <<
") AND update_number=(SELECT MAX(update_number) FROM "
304 "anharmonic_species "
305 <<
"WHERE status & 2 = 0 AND uid=(SELECT uid FROM "
306 << pre[
static_cast<int>(_table)] <<
"species WHERE id=" <<
id
310 result = query.store();
316 for (
const auto &row : result) {
318 transition.first = row[
"frequency"];
320 transition.second = row[
"intensity"];
322 transitions.push_back(transition);
324 }
catch (mysqlpp::BadFieldName &e) {
329 vector.push_back(transitions);
331 }
catch (
const mysqlpp::BadQuery &e) {
339std::vector<PAHGeometry>
340PAHdb::getGeometriesFromIds(
const std::vector<int> &ids) {
342 mysqlpp::Query query = _connection.query();
344 mysqlpp::StoreQueryResult result;
348 std::vector<PAHGeometry> vector;
352 for (
const auto &
id : ids) {
358 case PAHdb::Database::Experiment:
360 query <<
"SELECT x, y, z, type FROM "
361 << pre[
static_cast<int>(PAHdb::Database::Theory)]
362 <<
"geometries JOIN species ON "
363 <<
"geometries.specie_id=species.id JOIN exp_species ON "
364 <<
"species.id=exp_species.theoretical_id WHERE exp_species.id="
369 case PAHdb::Database::Anharmonic:
370 case PAHdb::Database::Theory:
372 query <<
"SELECT * FROM " << pre[
static_cast<int>(_table)]
373 <<
"geometries WHERE specie_id=" <<
id <<
" ORDER BY position";
378 result = query.store();
380 std::vector<Atom> atoms;
384 for (
const auto &row : result) {
386 atoms.push_back(
Atom(row[
"x"], row[
"y"], row[
"z"], row[
"type"]));
388 }
catch (mysqlpp::BadFieldName &e) {
395 }
catch (
const mysqlpp::BadQuery &e) {
403std::vector<std::string>
404PAHdb::getFormulaeFromIds(
const std::vector<int> &ids) {
406 mysqlpp::Query query = _connection.query();
408 mysqlpp::StoreQueryResult result;
412 std::vector<std::string> vector;
416 for (
const auto &
id : ids) {
422 case PAHdb::Database::Experiment:
424 query <<
"SELECT formula, species.update_number FROM species JOIN "
425 <<
"exp_species ON species.uid=exp_species.uid WHERE "
426 <<
"exp_species.id=" <<
id
427 <<
" ORDER BY species.update_number DESC LIMIT 1";
431 case PAHdb::Database::Anharmonic:
432 case PAHdb::Database::Theory:
435 query <<
"SELECT formula FROM " << pre[
static_cast<int>(_table)]
436 <<
"species WHERE id=" <<
id;
440 result = query.store();
442 row = *result.begin();
446 vector.push_back(
static_cast<std::string
>(row[
"formula"]));
448 }
catch (mysqlpp::BadFieldName &e) {
453 }
catch (
const mysqlpp::BadQuery &e) {
461std::vector<sql_properties>
462PAHdb::getPropertiesByUIDsAndVersion(
const std::vector<int> &uids,
465 std::vector<sql_properties> properties;
467 mysqlpp::Query query = _connection.query();
473 query <<
"SELECT uid, n_h, n_c, n_n, n_o, n_mg, n_si, n_fe, charge, "
474 "n_solo, n_duo, n_trio, n_quartet, n_quintet, n_ch2, n_chx FROM "
475 << pre[
static_cast<int>(_table)]
476 <<
"species AS s1 WHERE status & 2 = 0 AND update_number=(SELECT "
477 "MAX(update_number) FROM "
478 << pre[
static_cast<int>(_table)]
479 <<
"species AS s2 WHERE update_number<=" << version
480 <<
" AND s1.uid=s2.uid) AND uid IN (" << uids.front();
482 std::for_each(std::next(uids.cbegin(), 1), uids.cend(),
483 [&](
auto &uid) { query <<
"," << uid; });
485 query <<
") ORDER BY FIELD(uid";
487 for (
const auto &uid : uids) {
494 query.storein(properties);
496 }
catch (
const mysqlpp::BadQuery &e) {
504std::vector<sql_properties>
505PAHdb::getPropertiesByIDs(
const std::vector<int> &ids) {
507 std::vector<sql_properties> properties;
509 mysqlpp::Query query = _connection.query();
517 case PAHdb::Database::Experiment:
519 query <<
"SELECT t1.uid, t2.n_h, t2.n_c, t2.n_n, t2.n_o, t2.n_mg, "
520 <<
"t2.n_si, t2.n_fe, t2.charge, t2.n_solo, t2.n_duo, t2.n_trio, "
521 <<
"t2.n_quartet, t2.n_quintet, t2.n_ch2, t2.n_chx FROM (SELECT * "
522 <<
"FROM " << pre[
static_cast<int>(_table)]
523 <<
"species AS s WHERE status & 2 = 0 AND id IN (" << ids.front();
527 case PAHdb::Database::Theory:
528 case PAHdb::Database::Anharmonic:
531 query <<
"SELECT uid, n_h, n_c, n_n, n_o, n_mg, n_si, n_fe, charge, "
532 <<
"n_solo, n_duo, n_trio, n_quartet, n_quintet, n_ch2, n_chx FROM "
533 << pre[
static_cast<int>(_table)] <<
"species WHERE id IN ("
537 std::for_each(std::next(ids.cbegin(), 1), ids.cend(),
538 [&](
auto &
id) { query <<
"," << id; });
542 if (_table == PAHdb::Database::Experiment) {
544 query <<
") AS t1, (SELECT * FROM species AS s1 WHERE status & 2 = 0 "
545 "AND update_number = (SELECT MAX(update_number) FROM species AS "
546 "s3 WHERE status & 2 = 0 AND s1.uid = s3.uid)) AS t2 WHERE "
550 query <<
" ORDER BY FIELD("
551 << (_table == PAHdb::Database::Experiment ?
"t1." :
"") <<
"id";
553 for (
const auto &
id : ids) {
560 query.storein(properties);
562 }
catch (
const mysqlpp::BadQuery &e) {
570void PAHdb::setProgress(
double progress) {
572 if (progress > 100 || progress < 0) {
574 throw(
Exception(
"progress can only be between 0 - 100"));
577 mysqlpp::Query query = _connection.query();
579 mysqlpp::StoreQueryResult result;
583 query <<
"UPDATE tasks SET ret_val = " << 100.0 - progress
584 <<
" WHERE pid = " << getpid();
586 result = query.store();
587 }
catch (
const mysqlpp::BadQuery &e) {
593void PAHdb::setError(
const char *error) {
595 mysqlpp::Query query = _connection.query();
597 mysqlpp::StoreQueryResult result;
601 query <<
"UPDATE tasks SET error = '" << error
602 <<
"' WHERE pid = " << getpid();
604 result = query.store();
605 }
catch (
const mysqlpp::BadQuery &e) {