record_fields: Include information about optionality of fields

This was reported as a wish for log schema generation, so add it...
This commit is contained in:
Arne Welzel 2023-04-27 21:10:24 +02:00
parent 0374d0fe42
commit f4bb8fae33
6 changed files with 61 additions and 52 deletions

3
NEWS
View file

@ -201,6 +201,9 @@ New Functionality
- Environment variables for the execution of log rotation postprocessors can
be set via ``Log::default_rotation_postprocessor_cmd_env``.
- The ``record_field`` record was extended by ``optional`` and ``record_fields()``
can now be used to determine the optionality of record fields.
Changed Functionality
---------------------

View file

@ -891,6 +891,7 @@ type record_field: record {
## :zeek:see:`record_fields` (if it has one).
value: any &optional;
default_val: any &optional; ##< The value of the :zeek:attr:`&default` attribute if defined.
optional: bool; ##< True if the field is :zeek:attr:`&optional`, else false.
};
## Table type used to map record field declarations to meta-information

View file

@ -1348,6 +1348,7 @@ TableValPtr RecordType::GetRecordFieldsVal(const RecordVal* rv) const
nr->Assign(1, logged);
nr->Assign(2, std::move(fv));
nr->Assign(3, FieldDefault(i));
nr->Assign(4, fd->GetAttr(detail::ATTR_OPTIONAL) != detail::Attr::nil);
auto field_name = make_intrusive<StringVal>(FieldName(i));
rval->Assign(std::move(field_name), std::move(nr));
}

View file

@ -1,66 +1,68 @@
### BTest baseline data generated by btest-diff. Do not edit. Use "btest -U/-u" to update. Requires BTest >= 0.63.
[a=42, b=Foo, c=<uninitialized>, d=Bar, e=tt]
{
[a] = [type_name=count, log=F, value=42, default_val=<uninitialized>],
[d] = [type_name=string, log=T, value=Bar, default_val=<uninitialized>],
[b] = [type_name=string, log=F, value=Foo, default_val=Foo],
[c] = [type_name=double, log=F, value=<uninitialized>, default_val=<uninitialized>],
[e] = [type_name=any, log=F, value=tt, default_val=<uninitialized>]
[a] = [type_name=count, log=F, value=42, default_val=<uninitialized>, optional=F],
[d] = [type_name=string, log=T, value=Bar, default_val=<uninitialized>, optional=F],
[b] = [type_name=string, log=F, value=Foo, default_val=Foo, optional=T],
[c] = [type_name=double, log=F, value=<uninitialized>, default_val=<uninitialized>, optional=T],
[e] = [type_name=any, log=F, value=tt, default_val=<uninitialized>, optional=F]
}
F
c value, F
c default , F
c optional, T
{
[a] = [type_name=bool, log=F, value=<uninitialized>, default_val=<uninitialized>],
[d] = [type_name=string, log=T, value=<uninitialized>, default_val=<uninitialized>],
[f] = [type_name=enum Monochrome::color, log=T, value=<uninitialized>, default_val=<uninitialized>],
[b] = [type_name=string, log=F, value=<uninitialized>, default_val=Bar],
[c] = [type_name=double, log=F, value=<uninitialized>, default_val=<uninitialized>],
[m] = [type_name=record myrec, log=F, value=<uninitialized>, default_val=<uninitialized>],
[e] = [type_name=enum color, log=F, value=<uninitialized>, default_val=BLUE]
[a] = [type_name=bool, log=F, value=<uninitialized>, default_val=<uninitialized>, optional=F],
[d] = [type_name=string, log=T, value=<uninitialized>, default_val=<uninitialized>, optional=F],
[f] = [type_name=enum Monochrome::color, log=T, value=<uninitialized>, default_val=<uninitialized>, optional=F],
[b] = [type_name=string, log=F, value=<uninitialized>, default_val=Bar, optional=T],
[c] = [type_name=double, log=F, value=<uninitialized>, default_val=<uninitialized>, optional=T],
[m] = [type_name=record myrec, log=F, value=<uninitialized>, default_val=<uninitialized>, optional=F],
[e] = [type_name=enum color, log=F, value=<uninitialized>, default_val=BLUE, optional=T]
}
{
[a] = [type_name=bool, log=F, value=<uninitialized>, default_val=<uninitialized>],
[d] = [type_name=string, log=T, value=<uninitialized>, default_val=<uninitialized>],
[f] = [type_name=enum Monochrome::color, log=T, value=<uninitialized>, default_val=<uninitialized>],
[b] = [type_name=string, log=F, value=<uninitialized>, default_val=Bar],
[c] = [type_name=double, log=F, value=<uninitialized>, default_val=<uninitialized>],
[m] = [type_name=record myrec, log=F, value=<uninitialized>, default_val=<uninitialized>],
[e] = [type_name=enum color, log=F, value=<uninitialized>, default_val=BLUE]
[a] = [type_name=bool, log=F, value=<uninitialized>, default_val=<uninitialized>, optional=F],
[d] = [type_name=string, log=T, value=<uninitialized>, default_val=<uninitialized>, optional=F],
[f] = [type_name=enum Monochrome::color, log=T, value=<uninitialized>, default_val=<uninitialized>, optional=F],
[b] = [type_name=string, log=F, value=<uninitialized>, default_val=Bar, optional=T],
[c] = [type_name=double, log=F, value=<uninitialized>, default_val=<uninitialized>, optional=T],
[m] = [type_name=record myrec, log=F, value=<uninitialized>, default_val=<uninitialized>, optional=F],
[e] = [type_name=enum color, log=F, value=<uninitialized>, default_val=BLUE, optional=T]
}
{
[a] = [type_name=count, log=F, value=42, default_val=<uninitialized>],
[d] = [type_name=string, log=T, value=Bar, default_val=<uninitialized>],
[b] = [type_name=string, log=F, value=Foo, default_val=Foo],
[c] = [type_name=double, log=F, value=<uninitialized>, default_val=<uninitialized>],
[e] = [type_name=any, log=F, value=mystring, default_val=<uninitialized>]
[a] = [type_name=count, log=F, value=42, default_val=<uninitialized>, optional=F],
[d] = [type_name=string, log=T, value=Bar, default_val=<uninitialized>, optional=F],
[b] = [type_name=string, log=F, value=Foo, default_val=Foo, optional=T],
[c] = [type_name=double, log=F, value=<uninitialized>, default_val=<uninitialized>, optional=T],
[e] = [type_name=any, log=F, value=mystring, default_val=<uninitialized>, optional=F]
}
{
}
{
[myfield] = [type_name=bool, log=F, value=<uninitialized>, default_val=<uninitialized>]
[myfield] = [type_name=bool, log=F, value=<uninitialized>, default_val=<uninitialized>, optional=F]
}
{
[a] = [type_name=bool, log=F, value=<uninitialized>, default_val=<uninitialized>],
[d] = [type_name=string, log=T, value=<uninitialized>, default_val=<uninitialized>],
[f] = [type_name=enum Monochrome::color, log=T, value=<uninitialized>, default_val=<uninitialized>],
[b] = [type_name=string, log=F, value=<uninitialized>, default_val=Bar],
[c] = [type_name=double, log=F, value=<uninitialized>, default_val=<uninitialized>],
[m] = [type_name=record myrec, log=F, value=<uninitialized>, default_val=<uninitialized>],
[e] = [type_name=enum color, log=F, value=<uninitialized>, default_val=BLUE]
[a] = [type_name=bool, log=F, value=<uninitialized>, default_val=<uninitialized>, optional=F],
[d] = [type_name=string, log=T, value=<uninitialized>, default_val=<uninitialized>, optional=F],
[f] = [type_name=enum Monochrome::color, log=T, value=<uninitialized>, default_val=<uninitialized>, optional=F],
[b] = [type_name=string, log=F, value=<uninitialized>, default_val=Bar, optional=T],
[c] = [type_name=double, log=F, value=<uninitialized>, default_val=<uninitialized>, optional=T],
[m] = [type_name=record myrec, log=F, value=<uninitialized>, default_val=<uninitialized>, optional=F],
[e] = [type_name=enum color, log=F, value=<uninitialized>, default_val=BLUE, optional=T]
}
{
[a] = [type_name=count, log=F, value=<uninitialized>, default_val=<uninitialized>],
[d] = [type_name=string, log=T, value=<uninitialized>, default_val=<uninitialized>],
[b] = [type_name=string, log=F, value=<uninitialized>, default_val=Foo],
[c] = [type_name=double, log=F, value=<uninitialized>, default_val=<uninitialized>],
[e] = [type_name=any, log=F, value=<uninitialized>, default_val=<uninitialized>]
[a] = [type_name=count, log=F, value=<uninitialized>, default_val=<uninitialized>, optional=F],
[d] = [type_name=string, log=T, value=<uninitialized>, default_val=<uninitialized>, optional=F],
[b] = [type_name=string, log=F, value=<uninitialized>, default_val=Foo, optional=T],
[c] = [type_name=double, log=F, value=<uninitialized>, default_val=<uninitialized>, optional=T],
[e] = [type_name=any, log=F, value=<uninitialized>, default_val=<uninitialized>, optional=F]
}
{
[a] = [type_name=set[double], log=F, value=<uninitialized>, default_val=<uninitialized>],
[d] = [type_name=table[double,string] of table[string] of vector of string, log=F, value=<uninitialized>, default_val=<uninitialized>],
[f] = [type_name=vector of enum color, log=F, value=<uninitialized>, default_val=<uninitialized>],
[b] = [type_name=set[double,string], log=F, value=<uninitialized>, default_val=<uninitialized>],
[c] = [type_name=set[double,record tt], log=F, value=<uninitialized>, default_val=<uninitialized>],
[g] = [type_name=table[string] of enum color, log=F, value=<uninitialized>, default_val=<uninitialized>],
[e] = [type_name=vector of vector of string, log=F, value=<uninitialized>, default_val=<uninitialized>]
[a] = [type_name=set[double], log=F, value=<uninitialized>, default_val=<uninitialized>, optional=F],
[d] = [type_name=table[double,string] of table[string] of vector of string, log=F, value=<uninitialized>, default_val=<uninitialized>, optional=F],
[f] = [type_name=vector of enum color, log=F, value=<uninitialized>, default_val=<uninitialized>, optional=F],
[b] = [type_name=set[double,string], log=F, value=<uninitialized>, default_val=<uninitialized>, optional=F],
[c] = [type_name=set[double,record tt], log=F, value=<uninitialized>, default_val=<uninitialized>, optional=F],
[g] = [type_name=table[string] of enum color, log=F, value=<uninitialized>, default_val=<uninitialized>, optional=F],
[e] = [type_name=vector of vector of string, log=F, value=<uninitialized>, default_val=<uninitialized>, optional=F]
}

View file

@ -1,10 +1,10 @@
### BTest baseline data generated by btest-diff. Do not edit. Use "btest -U/-u" to update. Requires BTest >= 0.63.
Info record_fields\x0a, {
[extra1] = [type_name=string, log=F, value=<uninitialized>, default_val=<uninitialized>],
[extra2] = [type_name=string, log=F, value=<uninitialized>, default_val=<uninitialized>],
[ts] = [type_name=time, log=T, value=<uninitialized>, default_val=<uninitialized>],
[extra3] = [type_name=string, log=T, value=<uninitialized>, default_val=<uninitialized>],
[msg] = [type_name=string, log=T, value=<uninitialized>, default_val=<uninitialized>],
[extra4] = [type_name=string, log=T, value=<uninitialized>, default_val=<uninitialized>]
[extra1] = [type_name=string, log=F, value=<uninitialized>, default_val=<uninitialized>, optional=T],
[extra2] = [type_name=string, log=F, value=<uninitialized>, default_val=<uninitialized>, optional=T],
[ts] = [type_name=time, log=T, value=<uninitialized>, default_val=<uninitialized>, optional=F],
[extra3] = [type_name=string, log=T, value=<uninitialized>, default_val=<uninitialized>, optional=T],
[msg] = [type_name=string, log=T, value=<uninitialized>, default_val=<uninitialized>, optional=F],
[extra4] = [type_name=string, log=T, value=<uninitialized>, default_val=<uninitialized>, optional=T]
}
Info record, [ts=XXXXXXXXXX.XXXXXX, msg=msg, extra1=extra1 value, extra2=extra2 value, extra3=extra3 value, extra4=extra4 value]

View file

@ -52,7 +52,9 @@ event zeek_init()
local t: record_field_table;
t = record_fields(x);
print t;
print t["c"]?$value;
print "c value", t["c"]?$value;
print "c default ", t["c"]?$default_val;
print "c optional", t["c"]$optional;
t = record_fields(x$e);
print t;