summaryrefslogtreecommitdiff
path: root/src/persistence_client_library_db_access.c
diff options
context:
space:
mode:
authorIngo Huerner <ingo.huerner@xse.de>2013-11-14 14:04:56 +0100
committerIngo Huerner <ingo.huerner@xse.de>2013-11-14 14:04:56 +0100
commit2f2acbe254924c9b967ab7143cb92c04f043a593 (patch)
treef3f5de23ac3426ea1f958a5dd6bdf905d9d66799 /src/persistence_client_library_db_access.c
parent883ee527415d6e49e202a8e0532266db46530bbf (diff)
downloadpersistence-client-library-2f2acbe254924c9b967ab7143cb92c04f043a593.tar.gz
Move from mulit-threaded to single-threaded dbus communication
Diffstat (limited to 'src/persistence_client_library_db_access.c')
-rw-r--r--src/persistence_client_library_db_access.c157
1 files changed, 52 insertions, 105 deletions
diff --git a/src/persistence_client_library_db_access.c b/src/persistence_client_library_db_access.c
index 1cc34a8..e9a8689 100644
--- a/src/persistence_client_library_db_access.c
+++ b/src/persistence_client_library_db_access.c
@@ -28,6 +28,7 @@
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
+#include <errno.h>
/// definition of a key-value pair stored in the database
@@ -602,128 +603,74 @@ int pers_db_delete_key(char* dbPath, char* key, PersistenceInfo_s* info)
}
-int persistence_notify_on_change(char* dbPath, char* key, unsigned int ldbid, unsigned int user_no, unsigned int seat_no,
+int persistence_notify_on_change(char* key, unsigned int ldbid, unsigned int user_no, unsigned int seat_no,
pclChangeNotifyCallback_t callback, PersNotifyRegPolicy_e regPolicy)
{
int rval = 0;
- char ruleChanged[DbusMatchRuleSize];
- char ruleDeleted[DbusMatchRuleSize];
- char ruleCreated[DbusMatchRuleSize];
- DBusConnection* conn = get_dbus_connection();
+ uint64_t cmd;
- // add match for c h a n g e
- snprintf(ruleChanged, DbusMatchRuleSize, "type='signal',interface='org.genivi.persistence.adminconsumer',member='PersistenceResChange',path='/org/genivi/persistence/adminconsumer',arg0='%s',arg1='%u',arg2='%u',arg3='%u'",
- key, ldbid, user_no, seat_no);
- // add match for d e l e t e
- snprintf(ruleDeleted, DbusMatchRuleSize, "type='signal',interface='org.genivi.persistence.adminconsumer',member='PersistenceResDelete',path='/org/genivi/persistence/adminconsumer',arg0='%s',arg1='%u',arg2='%u',arg3='%u'",
- key, ldbid, user_no, seat_no);
- // add match for c r e a t e
- snprintf(ruleCreated, DbusMatchRuleSize, "type='signal',interface='org.genivi.persistence.adminconsumer',member='PersistenceResCreate',path='/org/genivi/persistence/adminconsumer',arg0='%s',arg1='%u',arg2='%u',arg3='%u'",
- key, ldbid, user_no, seat_no);
-
- if(regPolicy == Notify_register)
+ if(regPolicy < Notify_lastEntry)
{
- // assign callback
- gChangeNotifyCallback = callback;
+ snprintf(gRegNotifykey, DbKeyMaxLen, "%s", key);
+ gRegNotifyLdbid = ldbid; // to do: pass correct ==> JUST TESTING!!!!
+ gRegNotifyUserNo = user_no;
+ gRegNotifySeatNo = seat_no;
+ gRegNotifyPolicy = regPolicy;
- dbus_bus_add_match(conn, ruleChanged, NULL);
- dbus_bus_add_match(conn, ruleDeleted, NULL);
- dbus_bus_add_match(conn, ruleCreated, NULL);
+ if(regPolicy == Notify_lastEntry)
+ {
+ // assign callback
+ gChangeNotifyCallback = callback;
+ }
+ else if(regPolicy == Notify_unregister)
+ {
+ // remove callback
+ gChangeNotifyCallback = NULL;
+ }
+
+ // add command and data to queue
+ cmd = (uint64_t)CMD_REG_NOTIFY_SIGNAL;
+
+ if(-1 == write(gEfds, &cmd, (sizeof(uint64_t))))
+ {
+ DLT_LOG(gDLTContext, DLT_LOG_ERROR, DLT_STRING("persistence_notify_on_change => failed to write to pipe"), DLT_INT(errno));
+ rval = -1;
+ }
}
- else if(regPolicy == Notify_unregister)
+ else
{
- // remove callback
- gChangeNotifyCallback = NULL;
-
- dbus_bus_remove_match(conn, ruleChanged, NULL);
- dbus_bus_remove_match(conn, ruleDeleted, NULL);
- dbus_bus_remove_match(conn, ruleCreated, NULL);
+ rval = -1;
}
- dbus_connection_flush(conn); // flush the connection to add the match
-
return rval;
}
+
+
+
+
int pers_send_Notification_Signal(const char* key, PersistenceDbContext_s* context, pclNotifyStatus_e reason)
{
- DBusMessage* message;
- dbus_bool_t ret;
- int rval = 0;
- char ldbid_array[DbusSubMatchSize] = {0};
- char user_array[DbusSubMatchSize] = {0};
- char seat_array[DbusSubMatchSize] = {0};
- const char* ldbid_ptr = ldbid_array;
- const char* user_ptr = user_array;
- const char* seat_ptr = seat_array;
-
- char* changeSignal = "PersistenceResChange";
- char* deleteSignal = "PersistenceResDelete";
- char* createSignal = "PersistenceResCreate";
- char* theReason = NULL;
-
- DBusConnection* conn = get_dbus_connection();
-
-
- // dbus_bus_add_match is used for the notification mechanism,
- // and this works only for type DBUS_TYPE_STRING as message arguments
- // this is the reason to use string instead of integer types directly
- snprintf(ldbid_array, DbusSubMatchSize, "%d", context->ldbid);
- snprintf(user_array, DbusSubMatchSize, "%d", context->user_no);
- snprintf(seat_array, DbusSubMatchSize, "%d", context->seat_no);
-
- switch(reason)
- {
- case pclNotifyStatus_deleted:
- theReason = deleteSignal;
- break;
- case pclNotifyStatus_created:
- theReason = createSignal;
- break;
- case pclNotifyStatus_changed:
- theReason = changeSignal;
- break;
- default:
- theReason = changeSignal;
- break;
- }
-
- if(theReason != NULL)
- {
- message = dbus_message_new_signal("/org/genivi/persistence/adminconsumer", // const char *path,
- "org.genivi.persistence.adminconsumer", // const char *interface,
- theReason); // const char *name
-
- ret = dbus_message_append_args(message,
- DBUS_TYPE_STRING, &key,
- DBUS_TYPE_STRING, &ldbid_ptr,
- DBUS_TYPE_STRING, &user_ptr,
- DBUS_TYPE_STRING, &seat_ptr,
- DBUS_TYPE_INVALID);
- if(ret == TRUE)
- {
- // Send the signal
- if(conn != NULL)
- {
- if(dbus_connection_send(conn, message, 0) == TRUE)
- {
- // Free the signal now we have finished with it
- dbus_message_unref(message);
- }
- else
- {
- rval = EPERS_NOTIFY_SIG;
- }
- }
- else
- {
- DLT_LOG(gDLTContext, DLT_LOG_ERROR, DLT_STRING("pers_send_Notification_Signal ==> E R R O R C O N E C T I O N NULL!!"));
- }
- }
- else
+ int rval = 1;
+ if(reason < pclNotifyStatus_lastEntry)
+ {
+ snprintf(gSendNotifykey, DbKeyMaxLen, "%s", key);
+
+ gSendNotifyLdbid = context->ldbid; // to do: pass correct ==> JUST TESTING!!!!
+ gSendNotifyUserNo = context->user_no;
+ gSendNotifySeatNo = context->seat_no;
+ gSendNotifyReason = reason;
+
+ //printf("pers_send_Notification_Signal => key: %s | lbid: %d | gUserNo: %d | gSeatNo: %d | gReason: %d \n", key, gLdbid, gUserNo, gSeatNo, gReason);
+
+ uint64_t cmd;
+ // add command and data to queue
+ cmd = (uint64_t)CMD_SEND_NOTIFY_SIGNAL;
+
+ if(-1 == write(gEfds, &cmd, (sizeof(uint64_t))))
{
- DLT_LOG(gDLTContext, DLT_LOG_ERROR, DLT_STRING("pers_send_Notification_Signal ==> ERROR dbus_message_append_args"));
+ DLT_LOG(gDLTContext, DLT_LOG_ERROR, DLT_STRING("pers_send_Notification_Signal => failed to write to pipe"), DLT_INT(errno));
rval = EPERS_NOTIFY_SIG;
}
}