database logging properties now configurable
authorKevron Rees <kevron_m_rees@linux.intel.com>
Tue, 11 Dec 2012 23:25:41 +0000 (15:25 -0800)
committerKevron Rees <kevron_m_rees@linux.intel.com>
Tue, 11 Dec 2012 23:25:41 +0000 (15:25 -0800)
ambd/pluginloader.cpp
examples/databaseconfig
plugins/database/databasesink.cpp
plugins/database/databasesink.h

index 55ae6b7..b51fc96 100644 (file)
@@ -56,14 +56,7 @@ PluginLoader::PluginLoader(string configFile, AbstractRoutingEngine* re): f_crea
                throw std::runtime_error("Unable to create JSON reader");
        
        DebugOut()<<"Config members: "<<json_reader_count_members(reader)<<endl;
-       
-       gchar** members = json_reader_list_members(reader);
-       
-       for(int i=0; i< json_reader_count_members(reader); i++)
-       {
-               cout<<"member: "<<members[i]<<endl;
-       }
-       
+               
        json_reader_read_member(reader,"sources");
        
        const GError * srcReadError = json_reader_get_error(reader);
index 0615022..9007fe5 100644 (file)
@@ -8,7 +8,8 @@
        "sinks": [
                {
                        "name" : "Database",
-                       "path" : "/usr/lib/automotive-message-broker/databasesinkplugin.so"
+                       "path" : "/usr/lib/automotive-message-broker/databasesinkplugin.so",
+                       "properties" : "{ 'properties' : ['VehicleSpeed'] }"
                },
                {
                        "name" : "Example Sink",
index eb4a0a5..5b20173 100644 (file)
@@ -1,6 +1,8 @@
 #include "databasesink.h"
 #include "abstractroutingengine.h"
 
+#include <json-glib/json-glib.h>
+
 extern "C" AbstractSinkManager * create(AbstractRoutingEngine* routingengine, map<string, string> config)
 {
        return new DatabaseSinkManager(routingengine, config);
@@ -15,15 +17,6 @@ DatabaseSink::DatabaseSink(AbstractRoutingEngine *engine, map<std::string, std::
        shared = new Shared;
        shared->db->init(databaseName, tablename, tablecreate);
 
-       engine->subscribeToProperty(VehicleProperty::EngineSpeed, this);
-       engine->subscribeToProperty(VehicleProperty::VehicleSpeed, this);
-
-       PropertyList props;
-       props.push_back(VehicleProperty::EngineSpeed);
-       props.push_back(VehicleProperty::VehicleSpeed);
-
-       engine->setSupported(supported(),this);
-
        auto cb = [](gpointer data)
        {
                Shared *shared = (Shared*)data;
@@ -61,6 +54,13 @@ DatabaseSink::DatabaseSink(AbstractRoutingEngine *engine, map<std::string, std::
 
        thread = g_thread_new("dbthread", cb, shared);
 
+       parseConfig();
+
+       for(auto itr=propertiesToSubscribeTo.begin();itr!=propertiesToSubscribeTo.end();itr++)
+       {
+               engine->subscribeToProperty(*itr,this);
+       }
+
 }
 
 DatabaseSink::~DatabaseSink()
@@ -91,6 +91,46 @@ PropertyList DatabaseSink::supported()
        return props;
 }
 
+void DatabaseSink::parseConfig()
+{
+       JsonParser* parser = json_parser_new();
+       GError* error = nullptr;
+       if(!json_parser_load_from_data(parser, configuration["properties"].c_str(),configuration["properties"].size(), &error))
+       {
+               DebugOut()<<"Failed to load config: "<<error->message;
+               throw std::runtime_error("Failed to load config");
+       }
+
+       JsonNode* node = json_parser_get_root(parser);
+
+       if(node == nullptr)
+               throw std::runtime_error("Unable to get JSON root object");
+
+       JsonReader* reader = json_reader_new(node);
+
+       if(reader == nullptr)
+               throw std::runtime_error("Unable to create JSON reader");
+
+       json_reader_read_member(reader,"properties");
+
+       g_assert(json_reader_is_array(reader));
+
+       for(int i=0; i < json_reader_count_elements(reader); i++)
+       {
+               json_reader_read_element(reader, i);
+               std::string prop = json_reader_get_string_value(reader);
+               propertiesToSubscribeTo.push_back(prop);
+               json_reader_end_element(reader);
+
+               DebugOut()<<"DatabaseSink logging: "<<prop<<endl;
+       }
+
+       if(error) g_error_free(error);
+
+       g_object_unref(reader);
+       g_object_unref(parser);
+}
+
 void DatabaseSink::propertyChanged(VehicleProperty::Property property, AbstractPropertyType *value, std::string uuid)
 {
        DBObject* obj = new DBObject;
@@ -150,7 +190,7 @@ void DatabaseSink::getRangePropertyAsync(AsyncRangePropertyReply *reply)
                dbobj.time = boost::lexical_cast<double>(data[i][3]);
                dbobj.sequence = boost::lexical_cast<double>(data[i][4]);
 
-               AbstractPropertyType* property = VehicleProperty::getPropertyTypeForPropertyNameValue(dbobj.key,dbobj.value);
+               AbstractPropertyType* property = VehicleProperty::getPropertyTypeForPropertyNameValue(dbobj.key, dbobj.value);
                if(property)
                {
                        property->timestamp = dbobj.time;
index 2ff4fc5..8311773 100644 (file)
@@ -127,6 +127,10 @@ public:
        virtual PropertyList supported();
        int supportedOperations() { return GetRanged; }
 
+private: //methods:
+
+       void parseConfig();
+
 private:
        PropertyList mSubscriptions;
        Shared *shared;
@@ -134,6 +138,7 @@ private:
        std::string databaseName;
        std::string tablename;
        std::string tablecreate;
+       std::list<VehicleProperty::Property> propertiesToSubscribeTo;
 };
 
 class DatabaseSinkManager: public AbstractSinkManager