#include "query.h"
#include <stdbool.h>
-#include <babeltrace/assert-internal.h>
+#include <babeltrace2/assert-internal.h>
#include "metadata.h"
#include "../common/metadata/decoder.h"
-#include <babeltrace/common-internal.h>
-#include <babeltrace/babeltrace-internal.h>
-#include <babeltrace/babeltrace.h>
+#include <babeltrace2/common-internal.h>
+#include <babeltrace2/babeltrace-internal.h>
+#include <babeltrace2/babeltrace.h>
#include "fs.h"
#define BT_LOG_TAG "PLUGIN-CTF-FS-QUERY-SRC"
}
path_value = bt_value_map_borrow_entry_value_const(params, "path");
+ if (!path_value) {
+ BT_LOGE_STR("Mandatory `path` parameter missing");
+ status = BT_QUERY_STATUS_INVALID_PARAMS;
+ goto error;
+ }
+
+ if (!bt_value_is_string(path_value)) {
+ BT_LOGE_STR("`path` parameter is required to be a string value");
+ status = BT_QUERY_STATUS_INVALID_PARAMS;
+ goto error;
+ }
+
path = bt_value_string_get(path_value);
BT_ASSERT(path);
goto end;
}
- status = bt_value_map_insert_integer_entry(range_map, "begin",
+ status = bt_value_map_insert_signed_integer_entry(range_map, "begin",
range->begin_ns);
if (status != BT_VALUE_STATUS_OK) {
ret = -1;
goto end;
}
- status = bt_value_map_insert_integer_entry(range_map, "end",
+ status = bt_value_map_insert_signed_integer_entry(range_map, "end",
range->end_ns);
if (status != BT_VALUE_STATUS_OK) {
ret = -1;
bt_value_status status;
if (ds_file_group->stream_id != UINT64_C(-1)) {
- status = bt_value_map_insert_integer_entry(info, "id",
- (int64_t) ds_file_group->stream_id);
+ status = bt_value_map_insert_unsigned_integer_entry(info, "id",
+ ds_file_group->stream_id);
if (status != BT_VALUE_STATUS_OK) {
ret = -1;
goto end;
}
}
- status = bt_value_map_insert_integer_entry(info, "class-id",
- (int64_t) ds_file_group->sc->id);
+ status = bt_value_map_insert_unsigned_integer_entry(info, "class-id",
+ ds_file_group->sc->id);
if (status != BT_VALUE_STATUS_OK) {
ret = -1;
goto end;
size_t file_idx;
bt_value_status status;
bt_value *file_paths;
-
- stream_range->begin_ns = INT64_MAX;
- stream_range->end_ns = 0;
+ struct ctf_fs_ds_index_entry *first_ds_index_entry, *last_ds_index_entry;
+ gchar *port_name = NULL;
file_paths = bt_value_array_create();
if (!file_paths) {
}
for (file_idx = 0; file_idx < group->ds_file_infos->len; file_idx++) {
- int64_t file_begin_epoch, file_end_epoch;
struct ctf_fs_ds_file_info *info =
g_ptr_array_index(group->ds_file_infos,
file_idx);
- if (!info->index || info->index->entries->len == 0) {
- BT_LOGW("Cannot determine range of unindexed stream file \'%s\'",
- info->path->str);
- ret = -1;
- goto end;
- }
-
status = bt_value_array_append_string_element(file_paths,
info->path->str);
if (status != BT_VALUE_STATUS_OK) {
ret = -1;
goto end;
}
-
- /*
- * file range is from timestamp_begin of the first entry to the
- * timestamp_end of the last entry.
- */
- file_begin_epoch = ((struct ctf_fs_ds_index_entry *) &g_array_index(info->index->entries,
- struct ctf_fs_ds_index_entry, 0))->timestamp_begin_ns;
- file_end_epoch = ((struct ctf_fs_ds_index_entry *) &g_array_index(info->index->entries,
- struct ctf_fs_ds_index_entry, info->index->entries->len - 1))->timestamp_end_ns;
-
- stream_range->begin_ns = min(stream_range->begin_ns, file_begin_epoch);
- stream_range->end_ns = max(stream_range->end_ns, file_end_epoch);
- stream_range->set = true;
}
- if (stream_range->set) {
- ret = add_range(group_info, stream_range, "range-ns");
- if (ret) {
- goto end;
- }
+ /*
+ * Since each `struct ctf_fs_ds_file_group` has a sorted array of
+ * `struct ctf_fs_ds_index_entry`, we can compute the stream range from
+ * the timestamp_begin of the first index entry and the timestamp_end
+ * of the last index entry.
+ */
+ BT_ASSERT(group->index);
+ BT_ASSERT(group->index->entries);
+ BT_ASSERT(group->index->entries->len > 0);
+
+ /* First entry. */
+ first_ds_index_entry = (struct ctf_fs_ds_index_entry *) g_ptr_array_index(
+ group->index->entries, 0);
+
+ /* Last entry. */
+ last_ds_index_entry = (struct ctf_fs_ds_index_entry *) g_ptr_array_index(
+ group->index->entries, group->index->entries->len - 1);
+
+ stream_range->begin_ns = first_ds_index_entry->timestamp_begin_ns;
+ stream_range->end_ns = last_ds_index_entry->timestamp_end_ns;
+
+ /*
+ * If any of the begin and end timestamps is not set it means that
+ * packets don't include `timestamp_begin` _and_ `timestamp_end` fields
+ * in their packet context so we can't set the range.
+ */
+ stream_range->set = stream_range->begin_ns != UINT64_C(-1) &&
+ stream_range->end_ns != UINT64_C(-1);
+
+ ret = add_range(group_info, stream_range, "range-ns");
+ if (ret) {
+ goto end;
}
status = bt_value_map_insert_entry(group_info, "paths",
if (ret) {
goto end;
}
+
+ port_name = ctf_fs_make_port_name(group);
+ if (!port_name) {
+ ret = -1;
+ goto end;
+ }
+
+ status = bt_value_map_insert_string_entry(group_info, "port-name",
+ port_name);
+ if (status != BT_VALUE_STATUS_OK) {
+ ret = -1;
+ goto end;
+ }
+
end:
bt_value_put_ref(file_paths);
return ret;
goto end;
}
+ status = bt_value_array_append_element(file_groups, group_info);
+ bt_value_put_ref(group_info);
+ if (status != BT_VALUE_STATUS_OK) {
+ goto end;
+ }
+
if (group_range.set) {
trace_range.begin_ns = min(trace_range.begin_ns,
group_range.begin_ns);
trace_intersection.end_ns = min(trace_intersection.end_ns,
group_range.end_ns);
trace_intersection.set = true;
- status = bt_value_array_append_element(
- file_groups,
- group_info);
- bt_value_put_ref(group_info);
- if (status != BT_VALUE_STATUS_OK) {
- goto end;
- }
}
}
goto error;
}
- paths_value = bt_value_map_borrow_entry_value_const(params, "paths");
- if (!validate_paths_parameter(paths_value)) {
+ ctf_fs = ctf_fs_component_create();
+ if (!ctf_fs) {
goto error;
}
- ctf_fs = ctf_fs_component_create();
- if (!ctf_fs) {
+ if (!read_src_fs_parameters(params, &paths_value, ctf_fs)) {
+ status = BT_QUERY_STATUS_INVALID_PARAMS;
goto error;
}