#include #include #include #include #include #include "apps.h" #include namespace trygvis { namespace apps { using namespace std; using json = nlohmann::json; class sm_db_insert : public app { public: sm_db_insert() : app("sm-db-insert") {} ~sm_db_insert() override = default; void add_options(po::options_description_easy_init &options) override { options("file", po::value()->required(), "The file to read"); } int main(app_execution &execution) override { auto file = execution.vm["file"].as(); cout << "reading from " << file << endl; fstream f(file); json j; j << f; pqxx::connection c("host=localhost dbname=soil-moisture"); pqxx::work work(c); string mac = j["mac"]; // "aa:bb:cc:dd:ee:ff"; auto select_device = "select id from soil_moisture_device where mac=$1"; auto rs = work.parameterized(select_device)(mac).exec(); if (rs.empty()) { cout << "New device: " << mac << endl; auto insert_device = "insert into soil_moisture_device(mac) values($1) returning id"; rs = work.parameterized(insert_device)(mac).exec(); } auto deviceId = rs.begin()["id"].as(); int sensor = j["sensor"]; auto select_sensor = "select id from soil_moisture_sensor where device=$1 and sensor=$2"; rs = work.parameterized(select_sensor)(deviceId)(sensor).exec(); if (rs.empty()) { cout << "New sensor: " << sensor << endl; auto insert_sensor = "insert into soil_moisture_sensor(device, sensor) values($1, $2) returning id"; rs = work.parameterized(insert_sensor)(deviceId)(sensor).exec(); } auto sensorId = rs.begin()["id"].as(); auto timestamp = get(j, "timestamp"); auto value = get(j, "value"); auto insert_sample = "insert into soil_moisture_sample(sensor, timestamp, value) values($1, $2, $3)"; work.parameterized(insert_sample)(sensorId)(timestamp)(value).exec(); cout << "Sample inserted" << endl; work.commit(); return EXIT_SUCCESS; } }; } } int main(int argc, const char *argv[]) { using namespace trygvis::apps; return real_main(new sm_db_insert(), argc, argv); }