aboutsummaryrefslogtreecommitdiff
path: root/apps/sm-db-insert.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'apps/sm-db-insert.cpp')
-rw-r--r--apps/sm-db-insert.cpp89
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);
+}