diff options
Diffstat (limited to 'apps/sm-db-insert.cpp')
-rw-r--r-- | apps/sm-db-insert.cpp | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/apps/sm-db-insert.cpp b/apps/sm-db-insert.cpp new file mode 100644 index 0000000..b93be09 --- /dev/null +++ b/apps/sm-db-insert.cpp @@ -0,0 +1,89 @@ +#include <boost/optional.hpp> +#include <boost/lexical_cast.hpp> +#include <pqxx/connection.hxx> +#include <pqxx/transaction.hxx> +#include "json.hpp" +#include "apps.h" +#include <fstream> + +namespace trygvis { +namespace apps { + +template <class T> +using o = boost::optional<T>; +using namespace std; +using json = nlohmann::json; + +class sm_db_insert : public app { +public: + sm_db_insert() : app("sm-db-insert") {} + + ~sm_db_insert() = default; + + void add_options(po::options_description_easy_init &options) override { + options("file", po::value<string>()->required(), "The file to read"); + } + + int main(app_execution &execution) override { + auto file = execution.vm["file"].as<string>(); + 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.size()) { + 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>(); + + 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.size()) { + 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<int>(); + + unsigned long timestamp = get<unsigned long>(j, "timestamp"); + unsigned int value = get<unsigned int>(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); +} |