summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRainer Gerhards <rgerhards@adiscon.com>2013-10-23 13:08:56 +0200
committerRainer Gerhards <rgerhards@adiscon.com>2013-10-23 13:08:56 +0200
commiteb9adf9baad5dca9dc2f30f45dc6eaf7607ac8f8 (patch)
tree5d3dfa111070759f6cc9b2bcbdda1b66f9f6b6e4
parent7d39740b3d88dbd0432806e5f8da32c49cdb69f1 (diff)
downloadrsyslog-eb9adf9baad5dca9dc2f30f45dc6eaf7607ac8f8.tar.gz
rsyslog-eb9adf9baad5dca9dc2f30f45dc6eaf7607ac8f8.tar.bz2
rsyslog-eb9adf9baad5dca9dc2f30f45dc6eaf7607ac8f8.zip
refactor: simplify JSON variable access
-rw-r--r--grammar/rainerscript.c8
-rw-r--r--grammar/rainerscript.h1
-rw-r--r--runtime/msg.c45
-rw-r--r--runtime/msg.h7
-rw-r--r--runtime/typedefs.h1
-rw-r--r--template.c30
6 files changed, 32 insertions, 60 deletions
diff --git a/grammar/rainerscript.c b/grammar/rainerscript.c
index 3caa585c..e4a2caa0 100644
--- a/grammar/rainerscript.c
+++ b/grammar/rainerscript.c
@@ -1606,9 +1606,10 @@ evalVar(struct cnfvar *var, void *usrptr, struct var *ret)
rsRetVal localRet;
struct json_object *json;
- if(var->name[0] == '$' && var->name[1] == '!') {
-#warning chace strlen()?
- localRet = msgGetCEEPropJSON((msg_t*)usrptr, (uchar*)var->name+1, strlen(var->name)-1, &json);
+ if(var->prop.id == PROP_CEE ||
+ var->prop.id == PROP_LOCAL_VAR ||
+ var->prop.id == PROP_GLOBAL_VAR ) {
+ localRet = msgGetJSONPropJSON((msg_t*)usrptr, &var->prop, &json);
ret->datatype = 'J';
ret->d.json = (localRet == RS_RET_OK) ? json : NULL;
} else {
@@ -2543,6 +2544,7 @@ cnfvarNew(char *name)
if((var = malloc(sizeof(struct cnfvar))) != NULL) {
var->nodetype = 'V';
var->name = name;
+ msgPropDescrFill(&var->prop, (uchar*)name, strlen(name));
}
return var;
}
diff --git a/grammar/rainerscript.h b/grammar/rainerscript.h
index 7a4f1ac9..001dff4e 100644
--- a/grammar/rainerscript.h
+++ b/grammar/rainerscript.h
@@ -208,6 +208,7 @@ struct cnfstringval {
struct cnfvar {
unsigned nodetype;
char *name;
+ msgPropDescr_t prop;
};
struct cnfarray {
diff --git a/runtime/msg.c b/runtime/msg.c
index b1b912a4..407fee72 100644
--- a/runtime/msg.c
+++ b/runtime/msg.c
@@ -2578,54 +2578,43 @@ getGlobalVarPropVal(uchar *propName, int propNameLen, uchar **pRes, rs_size_t *b
/* Get a JSON-based-variable as native json object */
rsRetVal
-msgGetJSONPropJSON(struct json_object *jroot, uchar *propName, int propNameLen, struct json_object **pjson)
+msgGetJSONPropJSON(msg_t *pMsg, msgPropDescr_t *pProp, struct json_object **pjson)
{
+ struct json_object *jroot;
uchar *leaf;
struct json_object *parent;
DEFiRet;
- if(jroot == NULL) {
+ if(pProp->id == PROP_CEE) {
+ jroot = pMsg->json;
+ } else if(pProp->id == PROP_LOCAL_VAR) {
+ jroot = pMsg->localvars;
+ } else if(pProp->id == PROP_GLOBAL_VAR) {
+ pthread_rwlock_rdlock(&glblVars_rwlock);
+ jroot = global_var_root;
+ } else {
+ DBGPRINTF("msgGetJSONPropJSON; invalid property id %d\n",
+ pProp->id);
ABORT_FINALIZE(RS_RET_NOT_FOUND);
}
- if(!strcmp((char*)propName, "!") ||
- !strcmp((char*)propName, ".") ||
- !strcmp((char*)propName, "/") ) {
+ if(!strcmp((char*)pProp->name, "!")) {
*pjson = jroot;
FINALIZE;
}
- leaf = jsonPathGetLeaf(propName, propNameLen);
- CHKiRet(jsonPathFindParent(jroot, propName, leaf, &parent, 1));
+ leaf = jsonPathGetLeaf(pProp->name, pProp->nameLen);
+ CHKiRet(jsonPathFindParent(jroot, pProp->name, leaf, &parent, 1));
*pjson = json_object_object_get(parent, (char*)leaf);
if(*pjson == NULL) {
ABORT_FINALIZE(RS_RET_NOT_FOUND);
}
finalize_it:
+ if(pProp->id == PROP_GLOBAL_VAR)
+ pthread_rwlock_unlock(&glblVars_rwlock);
RETiRet;
}
-rsRetVal
-msgGetCEEPropJSON(msg_t *pM, uchar *propName, int propNameLen, struct json_object **pjson)
-{
- return msgGetJSONPropJSON(pM->json, propName, propNameLen, pjson);
-}
-
-rsRetVal
-msgGetLocalVarJSON(msg_t *pM, uchar *propName, int propNameLen, struct json_object **pjson)
-{
- return msgGetJSONPropJSON(pM->localvars, propName, propNameLen, pjson);
-}
-
-rsRetVal
-msgGetGlobalVarJSON(uchar *propName, int propNameLen, struct json_object **pjson)
-{
- DEFiRet;
- pthread_rwlock_rdlock(&glblVars_rwlock);
- iRet = msgGetJSONPropJSON(global_var_root, propName, propNameLen, pjson);
- pthread_rwlock_unlock(&glblVars_rwlock);
- RETiRet;
-}
/* Encode a JSON value and add it to provided string. Note that
* the string object may be NULL. In this case, it is created
diff --git a/runtime/msg.h b/runtime/msg.h
index 4dcc0579..3e6bf767 100644
--- a/runtime/msg.h
+++ b/runtime/msg.h
@@ -214,10 +214,11 @@ uchar *getProgramName(msg_t *pM, sbool bLockMutex);
uchar *getRcvFrom(msg_t *pM);
rsRetVal propNameToID(uchar *pName, propid_t *pPropID);
uchar *propIDToName(propid_t propID);
-rsRetVal msgGetCEEPropJSON(msg_t *pM, uchar *propName, int propNameLen, struct json_object **pjson);
+rsRetVal msgGetCEEPropJSON(msg_t *pM, msgPropDescr_t *pProp, struct json_object **pjson);
rsRetVal getGlobalVarPropVal(uchar *propName, int propNameLen, uchar **pRes, rs_size_t *buflen, unsigned short *pbMustBeFreed);
-rsRetVal msgGetLocalVarJSON(msg_t *pM, uchar *propName, int propNameLen, struct json_object **pjson);
-rsRetVal msgGetGlobalVarJSON(uchar *propName, int propNameLen, struct json_object **pjson);
+rsRetVal msgGetLocalVarJSON(msg_t *pM, msgPropDescr_t *pProp, struct json_object **pjson);
+rsRetVal msgGetGlobalVarJSON(msgPropDescr_t *pProp, struct json_object **pjson);
+rsRetVal msgGetJSONPropJSON(msg_t *pMsg, msgPropDescr_t *pProp, struct json_object **pjson);
rsRetVal msgSetJSONFromVar(msg_t *pMsg, uchar *varname, struct var *var);
rsRetVal msgDelJSON(msg_t *pMsg, uchar *varname);
rsRetVal jsonFind(struct json_object *jroot, uchar *propName, int propNameLen, struct json_object **jsonres);
diff --git a/runtime/typedefs.h b/runtime/typedefs.h
index 22fc23d8..2efd7d65 100644
--- a/runtime/typedefs.h
+++ b/runtime/typedefs.h
@@ -209,6 +209,7 @@ typedef uintTiny propid_t;
#define PROP_CEE 200
#define PROP_CEE_ALL_JSON 201
#define PROP_LOCAL_VAR 202
+#define PROP_GLOBAL_VAR 203
/* types of configuration handlers
*/
diff --git a/template.c b/template.c
index 8afb01f0..e97428db 100644
--- a/template.c
+++ b/template.c
@@ -343,8 +343,10 @@ tplToJSON(struct template *pTpl, msg_t *pMsg, struct json_object **pjson, struct
jsonf = json_object_new_string((char*) pTpe->data.constant.pConstant);
json_object_object_add(json, (char*)pTpe->fieldName, jsonf);
} else if(pTpe->eEntryType == FIELD) {
- if(pTpe->data.field.msgProp.id == PROP_CEE) {
- localRet = msgGetCEEPropJSON(pMsg, pTpe->data.field.msgProp.name, pTpe->data.field.msgProp.nameLen, &jsonf);
+ if(pTpe->data.field.msgProp.id == PROP_CEE ||
+ pTpe->data.field.msgProp.id == PROP_LOCAL_VAR ||
+ pTpe->data.field.msgProp.id == PROP_GLOBAL_VAR ) {
+ localRet = msgGetJSONPropJSON(pMsg, &pTpe->data.field.msgProp, &jsonf);
if(localRet == RS_RET_OK) {
json_object_object_add(json, (char*)pTpe->fieldName, json_object_get(jsonf));
} else {
@@ -354,30 +356,6 @@ tplToJSON(struct template *pTpl, msg_t *pMsg, struct json_object **pjson, struct
json_object_object_add(json, (char*)pTpe->fieldName, NULL);
}
}
- } else if(pTpe->data.field.msgProp.id == PROP_LOCAL_VAR) {
- localRet = msgGetLocalVarJSON(pMsg, pTpe->data.field.msgProp.name, pTpe->data.field.msgProp.nameLen, &jsonf);
- if(localRet == RS_RET_OK) {
- json_object_object_add(json, (char*)pTpe->fieldName, json_object_get(jsonf));
- } else {
- DBGPRINTF("tplToJSON: error %d looking up local variable %s\n",
- localRet, pTpe->fieldName);
- if(pTpe->data.field.options.bMandatory) {
- json_object_object_add(json, (char*)pTpe->fieldName, NULL);
- }
- }
-#if 0 /* do not remove this code *for the moment* -- rgerhards, 2013-10-22 */
- } else if(pTpe->data.field.msgProp.id == PROP_GLOBAL_VAR) {
- localRet = msgGetGlobalVarJSON(pTpe->data.field.msgProp.name, pTpe->data.field.msgProp.nameLen, &jsonf);
- if(localRet == RS_RET_OK) {
- json_object_object_add(json, (char*)pTpe->fieldName, json_object_get(jsonf));
- } else {
- DBGPRINTF("tplToJSON: error %d looking up local variable %s\n",
- localRet, pTpe->fieldName);
- if(pTpe->data.field.options.bMandatory) {
- json_object_object_add(json, (char*)pTpe->fieldName, NULL);
- }
- }
-#endif
} else {
pVal = (uchar*) MsgGetProp(pMsg, pTpe, &pTpe->data.field.msgProp,
&propLen, &bMustBeFreed, ttNow);