summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--doc/property_replacer.html4
-rw-r--r--runtime/msg.c8
-rw-r--r--template.c5
-rw-r--r--template.h1
4 files changed, 18 insertions, 0 deletions
diff --git a/doc/property_replacer.html b/doc/property_replacer.html
index 86a07474..367603b7 100644
--- a/doc/property_replacer.html
+++ b/doc/property_replacer.html
@@ -486,6 +486,10 @@ Useful for secure pathname generation (with dynafiles).
Useful for secure pathname generation (with dynafiles).
</td>
</tr>
+<tr>
+<td><b>optional-field</b></td>
+<td>In templates that are used for building field lists (in particular, ommongodb), completely remove this field if the corresponding property is not present. Currently implemented only for the <b>$!&lt;name&gt;</b> properties.</td>
+</tr>
</tbody>
</table>
<p>To use multiple options, simply place them one after each other with a comma delmimiting
diff --git a/runtime/msg.c b/runtime/msg.c
index 0d01f5e1..0ee78ae0 100644
--- a/runtime/msg.c
+++ b/runtime/msg.c
@@ -3500,6 +3500,14 @@ rsRetVal MsgAppendFields(msg_t *pMsg, struct templateEntry *pTpe,
}
}
} else {
+ /* FIXME: this performs a duplicate lookup, which wastes
+ time. */
+ if(pTpe->data.field.options.bOptionalField
+ && (pMsg->event == NULL
+ || ee_getEventField(pMsg->event,
+ pTpe->data.field.propName) == NULL))
+ FINALIZE; /* Nothing to do */
+
CHKiRet(FBSensureSpace(state));
dst = state->fields + state->nextField;
diff --git a/template.c b/template.c
index d9ca0710..298f813c 100644
--- a/template.c
+++ b/template.c
@@ -669,6 +669,8 @@ static void doOptions(unsigned char **pp, struct templateEntry *pTpe)
} else {
pTpe->data.field.options.bJSONf = 1;
}
+ } else if(!strcmp((char*)Buf, "optional-field")) {
+ pTpe->data.field.options.bOptionalField = 1;
} else {
dbgprintf("Invalid field option '%s' specified - ignored.\n", Buf);
}
@@ -1984,6 +1986,9 @@ void tplPrintList(rsconf_t *conf)
if(pTpe->data.field.options.bJSONf) {
dbgprintf("[format as JSON field] ");
}
+ if(pTpe->data.field.options.bOptionalField) {
+ dbgprintf("[optional field - skip in field template if not present] ");
+ }
if(pTpe->data.field.options.bDropLastLF) {
dbgprintf("[drop last LF in msg] ");
}
diff --git a/template.h b/template.h
index 218f8b27..75e46351 100644
--- a/template.h
+++ b/template.h
@@ -114,6 +114,7 @@ struct templateEntry {
unsigned bCSV: 1; /* format field in CSV (RFC 4180) format */
unsigned bJSON: 1; /* format field JSON escaped */
unsigned bJSONf: 1; /* format field JSON *field* (n/v pair) */
+ unsigned bOptionalField: 1; /* optional field - skip in field template if not present */
} options; /* options as bit fields */
} field;
} data;