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) {