<
refentry id="sd_journal_query_unique">
<
title>sd_journal_query_unique</
title>
<
productname>systemd</
productname>
<
contrib>Developer</
contrib>
<
firstname>Lennart</
firstname>
<
surname>Poettering</
surname>
<
email>lennart@poettering.net</
email>
<
refentrytitle>sd_journal_query_unique</
refentrytitle>
<
refname>sd_journal_query_unique</
refname>
<
refname>sd_journal_enumerate_unique</
refname>
<
refname>sd_journal_restart_unique</
refname>
<
refname>SD_JOURNAL_FOREACH_UNIQUE</
refname>
<
refpurpose>Read unique data fields from the journal</
refpurpose>
<
funcdef>int <
function>sd_journal_query_unique</
function></
funcdef>
<
paramdef>sd_journal *<
parameter>j</
parameter></
paramdef>
<
paramdef>const char *<
parameter>field</
parameter></
paramdef>
<
funcdef>int <
function>sd_journal_enumerate_unique</
function></
funcdef>
<
paramdef>sd_journal *<
parameter>j</
parameter></
paramdef>
<
paramdef>const void **<
parameter>data</
parameter></
paramdef>
<
paramdef>size_t *<
parameter>length</
parameter></
paramdef>
<
funcdef>void <
function>sd_journal_restart_unique</
function></
funcdef>
<
paramdef>sd_journal *<
parameter>j</
parameter></
paramdef>
<
funcdef><
function>SD_JOURNAL_FOREACH_UNIQUE</
function></
funcdef>
<
paramdef>sd_journal *<
parameter>j</
parameter></
paramdef>
<
paramdef>const void *<
parameter>data</
parameter></
paramdef>
<
paramdef>size_t <
parameter>length</
parameter></
paramdef>
<
title>Description</
title>
<
para><
function>sd_journal_query_unique()</
function> queries the
journal for all unique values the specified field can take. It
takes two arguments: the journal to query and the field name to
look for. Well-known field names are listed on
Field names must be specified without a trailing '='. After this
function has been executed successfully the field values may be
queried using <
function>sd_journal_enumerate_unique()</
function>.
Invoking this call a second time will change the field name being
queried and reset the enumeration index to the first field value
<
para><
function>sd_journal_enumerate_unique()</
function> may be
used to iterate through all data fields which match the previously
selected field name as set with
<
function>sd_journal_query_unique()</
function>. On each invocation
the next field data matching the field name is returned. The order
of the returned data fields is not defined. It takes three
arguments: the journal context object, plus a pair of pointers to
pointer/
size variables where the data object and its size shall be
stored in. The returned data is in a read-only memory map and is
only valid until the next invocation of
<
function>sd_journal_enumerate_unique()</
function>. Note that the
data returned will be prefixed with the field name and '='. Note
that this call is subject to the data field size threshold as
<
function>sd_journal_set_data_threshold()</
function>.</
para>
<
para><
function>sd_journal_restart_unique()</
function> resets the
data enumeration index to the beginning of the list. The next
invocation of <
function>sd_journal_enumerate_unique()</
function>
will return the first field data matching the field name
<
function>SD_JOURNAL_FOREACH_UNIQUE()</
function> macro may be used
as a handy wrapper around
<
function>sd_journal_restart_unique()</
function> and
<
function>sd_journal_enumerate_unique()</
function>.</
para>
<
para>Note that these functions currently are not influenced by
matches set with <
function>sd_journal_add_match()</
function> but
this might change in a later version of this software.</
para>
<
title>Return Value</
title>
<
para><
function>sd_journal_query_unique()</
function> returns 0 on
success or a negative errno-style error code.
<
function>sd_journal_enumerate_unique()</
function> returns a
positive integer if the next field data has been read, 0 when no
more fields are known, or a negative errno-style error code.
<
function>sd_journal_restart_unique()</
function> returns
<
para>The <
function>sd_journal_query_unique()</
function>,
<
function>sd_journal_enumerate_unique()</
function> and
<
function>sd_journal_restart_unique()</
function> interfaces are
available as a shared library, which can be compiled and linked to
<
constant>libsystemd</
constant> <
citerefentry project='die-net'><
refentrytitle>pkg-config</
refentrytitle><
manvolnum>1</
manvolnum></
citerefentry>
<
para>Use the <
function>SD_JOURNAL_FOREACH_UNIQUE</
function> macro
to iterate through all values a field of the journal can take. The
following example lists all unit names referenced in the
<
programlisting>#include <
stdio.h>
int main(int argc, char *argv[]) {
r = sd_journal_open(&j, SD_JOURNAL_LOCAL_ONLY);
fprintf(stderr, "Failed to open journal: %s\n", strerror(-r));
r = sd_journal_query_unique(j, "_SYSTEMD_UNIT");
fprintf(stderr, "Failed to query journal: %s\n", strerror(-r));
SD_JOURNAL_FOREACH_UNIQUE(j, d, l)
printf("%.*s\n", (int) l, (const char*) d);
<
citerefentry><
refentrytitle>systemd</
refentrytitle><
manvolnum>1</
manvolnum></
citerefentry>,
<
citerefentry><
refentrytitle>sd-journal</
refentrytitle><
manvolnum>3</
manvolnum></
citerefentry>,
<
citerefentry><
refentrytitle>sd_journal_open</
refentrytitle><
manvolnum>3</
manvolnum></
citerefentry>,
<
citerefentry><
refentrytitle>sd_journal_get_data</
refentrytitle><
manvolnum>3</
manvolnum></
citerefentry>,
<
citerefentry><
refentrytitle>sd_journal_add_match</
refentrytitle><
manvolnum>3</
manvolnum></
citerefentry>