summaryrefslogtreecommitdiff
path: root/datastore-leveldb/src/db.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'datastore-leveldb/src/db.cpp')
-rw-r--r--datastore-leveldb/src/db.cpp74
1 files changed, 74 insertions, 0 deletions
diff --git a/datastore-leveldb/src/db.cpp b/datastore-leveldb/src/db.cpp
new file mode 100644
index 0000000..991a82e
--- /dev/null
+++ b/datastore-leveldb/src/db.cpp
@@ -0,0 +1,74 @@
+#include "db.h"
+
+#include <iomanip>
+#include <iostream>
+#include <mutex>
+#include <unordered_map>
+#include <sstream>
+
+static std::unordered_map<std::string,leveldb::DB*> dbs;
+static std::mutex getDBmutex;
+
+static bool sensor_name_is_sane(std::string& name) {
+ for (auto it = name.begin(); it != name.end(); ++it) {
+ if (not ((*it >= '0' and *it <= '9') or
+ (*it >= 'A' and *it <= 'Z') or
+ (*it >= 'a' and *it <= 'z') or
+ (*it == '.'))) {
+ return false;
+ }
+ }
+ return true;
+}
+
+std::string db_make_key(const uint64_t timestamp) {
+ std::stringstream key;
+ key << "ts-";
+ key << std::setfill('0') << std::setw(20) << timestamp;
+ return key.str();
+}
+
+leveldb::DB *db_get(std::string& name) {
+ getDBmutex.lock();
+ if (dbs.find(name) == dbs.end()) {
+ if (not sensor_name_is_sane(name)) {
+ getDBmutex.unlock();
+ return nullptr;
+ }
+ leveldb::DB *db;
+ leveldb::Options options;
+ options.create_if_missing = true;
+ leveldb::Status status = leveldb::DB::Open(options, "data/"+name, &db);
+ if (not status.ok()) {
+ std::cout << status.ToString() << std::endl;
+ getDBmutex.unlock();
+ return nullptr;
+ }
+ dbs[name] = db;
+ getDBmutex.unlock();
+ return db;
+ } else {
+ getDBmutex.unlock();
+ return dbs.at(name);
+ }
+}
+
+
+bool db_insert(std::string& name, const uint64_t timestamp, std::string& value) {
+ leveldb::DB *db = db_get(name);
+ if (db == nullptr) return false;
+
+ auto status = db->Put(leveldb::WriteOptions(), db_make_key(timestamp), value);
+ return status.ok();
+}
+
+void db_close() {
+ auto it = dbs.begin();
+ while (it != dbs.end()) {
+ std::cout << "Close Database: " << (*it).first << std::endl;
+ delete (*it).second;
+ dbs.erase(it++); //post increment!
+ }
+ std::cout << std::endl;
+}
+