bluemonkey database module
authorKevron Rees <tripzero.kev@gmail.com>
Thu, 20 Nov 2014 04:39:34 +0000 (20:39 -0800)
committerKevron Rees <tripzero.kev@gmail.com>
Thu, 20 Nov 2014 15:15:37 +0000 (07:15 -0800)
plugins/bluemonkey/CMakeLists.txt
plugins/bluemonkey/bluemonkey.cpp
plugins/bluemonkey/bluemonkey.h
plugins/bluemonkey/config.js
plugins/bluemonkey/db.cpp [new file with mode: 0644]
plugins/bluemonkey/db.h [new file with mode: 0644]

index 8edad58..6fdbae3 100644 (file)
@@ -29,6 +29,15 @@ if(communi)
   install(TARGETS bluemonkeyIrcModule LIBRARY DESTINATION ${PLUGIN_INSTALL_PATH})
 endif(communi)
 
+find_package(Qt5Sql)
+
+if(Qt5Sql_FOUND)
+  message(STATUS "enabling database bluemonkey module")
+  add_library(bluemonkeyDbModule MODULE db.cpp)
+  set_target_properties(bluemonkeyDbModule PROPERTIES PREFIX "")
+  target_link_libraries(bluemonkeyDbModule ${link_libraries} ${QT_LIBRARIES} ${Qt5Sql_LIBRARIES})
+  install(TARGETS bluemonkeyDbModule LIBRARY DESTINATION ${PLUGIN_INSTALL_PATH})
+endif()
 
 include_directories(${CMAKE_SOURCE_DIR}/lib ${include_dirs} ${communi_INCLUDE_DIRS} ${QT_INCLUDE_DIRS} ${CMAKE_SOURCE_DIR}/plugins/common)
 
index 632f26f..081ec31 100644 (file)
@@ -102,6 +102,7 @@ BluemonkeySink::BluemonkeySink(AbstractRoutingEngine* e, map<string, string> con
        auth = new Authenticate(config, this);
 
        qmlRegisterType<QTimer>("", 1, 0, "QTimer");
+       qmlRegisterType<QObject>("", 1, 0, "QObject");
 }
 
 
@@ -275,6 +276,11 @@ QObject *BluemonkeySink::createTimer()
        return new QTimer(this);
 }
 
+QObject *BluemonkeySink::createQObject()
+{
+       return new QObject(this);
+}
+
 void BluemonkeySink::getHistory(QStringList properties, QDateTime begin, QDateTime end, QJSValue cbFunction)
 {
        double b = (double)begin.toMSecsSinceEpoch() / 1000.0;
index 99cbf63..8617f7e 100644 (file)
@@ -99,8 +99,6 @@ public:
        virtual void propertyChanged(AbstractPropertyType* value);
        virtual const std::string uuid() const;
 
-       QJSEngine* engine;
-
        virtual int supportedOperations();
 
 private: //source privates
@@ -133,6 +131,7 @@ public Q_SLOTS:
        void log(QString str);
 
        QObject* createTimer();
+       QObject* createQObject();
 
        void getHistory(QStringList properties, QDateTime begin, QDateTime end, QJSValue cbFunction);
 
@@ -149,6 +148,7 @@ public Q_SLOTS:
        void createCustomProperty(QString name, QJSValue defaultValue, int zone);
 
 private:
+       QJSEngine* engine;
        QStringList configsToLoad;
 
        Authenticate* auth;
index 15cd0de..c4a6987 100644 (file)
@@ -12,6 +12,7 @@ var Zone = {
   BackSide : 1 << 9
 };
 
+bluemonkey.loadModule("");
 
 bluemonkey.createCustomProperty("VehicleSpeed", 10);
 bluemonkey.createCustomProperty("EngineSpeed", 5000);
diff --git a/plugins/bluemonkey/db.cpp b/plugins/bluemonkey/db.cpp
new file mode 100644 (file)
index 0000000..07bb9e3
--- /dev/null
@@ -0,0 +1,90 @@
+#include "db.h"
+
+#include <debugout.h>
+
+#include <QObject>
+#include <QSqlError>
+#include <QSqlRecord>
+#include <QtQml>
+
+extern "C" std::map<std::string, QObject*> create(std::map<std::string, std::string> config, QObject* parent)
+{
+       std::map<std::string, QObject*> moduleInstances;
+       moduleInstances["database"] = new BluemonkeyDatabaseModule(parent);
+       return moduleInstances;
+}
+
+bool Database::open(QString connectionName, QString filename)
+{
+       db = QSqlDatabase::addDatabase("QSQLITE", connectionName);
+       db.setDatabaseName(filename);
+       return db.open();
+}
+
+void Database::close()
+{
+       if(db.isOpen())
+       {
+               db.close();
+       }
+}
+
+QObject *Database::exec(QString query)
+{
+       return new Query(db.exec(query), this);
+}
+
+QString Database::lastError()
+{
+       return db.lastError().text();
+}
+
+
+Query::Query(QSqlQuery q, QObject* parent)
+       :QObject(parent)
+{
+       query = q;
+}
+
+Query::Query(QString connectionName)
+{
+       setConnectionName(connectionName);
+}
+
+void Query::setConnectionName(QString connectionName)
+{
+       mConnectionName = connectionName;
+       db = QSqlDatabase::database(connectionName);
+       query = QSqlQuery(db);
+}
+
+bool Query::exec(QString queryStr)
+{
+       query.setNumericalPrecisionPolicy(QSql::HighPrecision);
+       return query.exec(queryStr);
+}
+
+QVariantList Query::results()
+{
+       QVariantList results;
+
+       QSqlRecord r = query.record();
+
+       while(query.next())
+       {
+
+               QVariantMap prop;
+               ///iterate on the properties:
+               for(int i=0; i< r.count(); i++)
+               {
+                       QString name = r.fieldName(i);
+
+                       QVariant val = query.value(i);
+                               prop[name] = val;
+               }
+
+               results << prop;
+       }
+
+       return results;
+}
diff --git a/plugins/bluemonkey/db.h b/plugins/bluemonkey/db.h
new file mode 100644 (file)
index 0000000..32716df
--- /dev/null
@@ -0,0 +1,69 @@
+#include <QObject>
+#include <QSqlDatabase>
+#include <QSqlQuery>
+#include <QVariant>
+#include <QVariantList>
+
+class Database;
+class Query;
+
+class Database: public QObject
+{
+       Q_OBJECT
+public:
+       Database(QObject* parent = nullptr):QObject(parent){ }
+       ~Database() { close(); }
+
+       QSqlDatabase database() { return db; }
+
+public Q_SLOTS:
+
+       bool open(QString connectionName, QString filename);
+       void close();
+
+       QObject* exec(QString query);
+
+       QString lastError();
+
+private:
+       QSqlDatabase db;
+};
+
+class Query: public QObject
+{
+       Q_OBJECT
+public:
+       Query(QObject* parent = nullptr):QObject(parent){}
+       Query(QSqlQuery q, QObject* parent = nullptr);
+       Q_INVOKABLE Query(QString connectionName);
+public Q_SLOTS:
+       void setConnectionName(QString connectionName);
+
+       bool exec(QString queryStr);
+
+       QVariantList results();
+
+private:
+       QSqlQuery query;
+       QString mConnectionName;
+       QSqlDatabase db;
+};
+
+
+class BluemonkeyDatabaseModule : public QObject
+{
+       Q_OBJECT
+public:
+       BluemonkeyDatabaseModule(QObject* parent = nullptr): QObject(parent) { }
+
+public Q_SLOTS:
+       QObject* createNewDatabase()
+       {
+               return new Database(this);
+       }
+
+       QObject* createNewQuery()
+       {
+               return new Query(this);
+       }
+};