* SOFTWARE.
*/
+#define BT_LOG_OUTPUT_LEVEL log_level
+#define BT_LOG_TAG "PLUGIN/SRC.CTF.FS/QUERY"
+#include "logging/log.h"
+
#include "query.h"
#include <stdbool.h>
#include "common/assert.h"
#include <babeltrace2/babeltrace.h>
#include "fs.h"
-#define BT_LOG_TAG "PLUGIN-CTF-FS-QUERY-SRC"
-#include "logging.h"
-
#define METADATA_TEXT_SIG "/* CTF 1.8"
struct range {
};
BT_HIDDEN
-bt_query_status metadata_info_query(
+bt_component_class_query_method_status metadata_info_query(
bt_self_component_class_source *comp_class,
- const bt_value *params,
+ const bt_value *params, bt_logging_level log_level,
const bt_value **user_result)
{
- bt_query_status status = BT_QUERY_STATUS_OK;
+ bt_component_class_query_method_status status =
+ BT_COMPONENT_CLASS_QUERY_METHOD_STATUS_OK;
bt_value *result = NULL;
const bt_value *path_value = NULL;
char *metadata_text = NULL;
result = bt_value_map_create();
if (!result) {
- status = BT_QUERY_STATUS_NOMEM;
+ status = BT_COMPONENT_CLASS_QUERY_METHOD_STATUS_MEMORY_ERROR;
goto error;
}
if (!bt_value_is_map(params)) {
BT_LOGE_STR("Query parameters is not a map value object.");
- status = BT_QUERY_STATUS_INVALID_PARAMS;
+ status = BT_COMPONENT_CLASS_QUERY_METHOD_STATUS_ERROR;
goto error;
}
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;
+ status = BT_COMPONENT_CLASS_QUERY_METHOD_STATUS_ERROR;
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;
+ status = BT_COMPONENT_CLASS_QUERY_METHOD_STATUS_ERROR;
goto error;
}
}
is_packetized = ctf_metadata_decoder_is_packetized(metadata_fp,
- &bo);
+ &bo, log_level, NULL);
if (is_packetized) {
ret = ctf_metadata_decoder_packetized_file_stream_to_buf(
- metadata_fp, &metadata_text, bo);
+ metadata_fp, &metadata_text, bo, NULL, NULL,
+ log_level, NULL);
if (ret) {
BT_LOGE("Cannot decode packetized metadata file: path=\"%s\"",
path);
result = NULL;
if (status >= 0) {
- status = BT_QUERY_STATUS_ERROR;
+ status = BT_COMPONENT_CLASS_QUERY_METHOD_STATUS_ERROR;
}
end:
const char *range_name)
{
int ret = 0;
- bt_value_status status;
+ bt_value_map_insert_entry_status status;
bt_value *range_map = NULL;
if (!range->set) {
status = bt_value_map_insert_signed_integer_entry(range_map, "begin",
range->begin_ns);
- if (status != BT_VALUE_STATUS_OK) {
+ if (status != BT_VALUE_MAP_INSERT_ENTRY_STATUS_OK) {
ret = -1;
goto end;
}
status = bt_value_map_insert_signed_integer_entry(range_map, "end",
range->end_ns);
- if (status != BT_VALUE_STATUS_OK) {
+ if (status != BT_VALUE_MAP_INSERT_ENTRY_STATUS_OK) {
ret = -1;
goto end;
}
status = bt_value_map_insert_entry(info, range_name,
range_map);
- if (status != BT_VALUE_STATUS_OK) {
+ if (status != BT_VALUE_MAP_INSERT_ENTRY_STATUS_OK) {
ret = -1;
goto end;
}
int add_stream_ids(bt_value *info, struct ctf_fs_ds_file_group *ds_file_group)
{
int ret = 0;
- bt_value_status status;
+ bt_value_map_insert_entry_status status;
if (ds_file_group->stream_id != UINT64_C(-1)) {
status = bt_value_map_insert_unsigned_integer_entry(info, "id",
ds_file_group->stream_id);
- if (status != BT_VALUE_STATUS_OK) {
+ if (status != BT_VALUE_MAP_INSERT_ENTRY_STATUS_OK) {
ret = -1;
goto end;
}
status = bt_value_map_insert_unsigned_integer_entry(info, "class-id",
ds_file_group->sc->id);
- if (status != BT_VALUE_STATUS_OK) {
+ if (status != BT_VALUE_MAP_INSERT_ENTRY_STATUS_OK) {
ret = -1;
goto end;
}
{
int ret = 0;
size_t file_idx;
- bt_value_status status;
+ bt_value_map_insert_entry_status insert_status;
+ bt_value_array_append_element_status append_status;
bt_value *file_paths;
struct ctf_fs_ds_index_entry *first_ds_index_entry, *last_ds_index_entry;
gchar *port_name = NULL;
g_ptr_array_index(group->ds_file_infos,
file_idx);
- status = bt_value_array_append_string_element(file_paths,
+ append_status = bt_value_array_append_string_element(file_paths,
info->path->str);
- if (status != BT_VALUE_STATUS_OK) {
+ if (append_status != BT_VALUE_ARRAY_APPEND_ELEMENT_STATUS_OK) {
ret = -1;
goto end;
}
goto end;
}
- status = bt_value_map_insert_entry(group_info, "paths",
+ insert_status = bt_value_map_insert_entry(group_info, "paths",
file_paths);
- if (status != BT_VALUE_STATUS_OK) {
+ if (insert_status != BT_VALUE_MAP_INSERT_ENTRY_STATUS_OK) {
ret = -1;
goto end;
}
goto end;
}
- status = bt_value_map_insert_string_entry(group_info, "port-name",
- port_name);
- if (status != BT_VALUE_STATUS_OK) {
+ insert_status = bt_value_map_insert_string_entry(group_info,
+ "port-name", port_name);
+ if (insert_status != BT_VALUE_MAP_INSERT_ENTRY_STATUS_OK) {
ret = -1;
goto end;
}
end:
+ g_free(port_name);
bt_value_put_ref(file_paths);
return ret;
}
{
int ret = 0;
size_t group_idx;
- bt_value_status status;
+ bt_value_map_insert_entry_status insert_status;
+ bt_value_array_append_element_status append_status;
bt_value *file_groups = NULL;
struct range trace_range = {
.begin_ns = INT64_MAX,
goto end;
}
- status = bt_value_map_insert_string_entry(trace_info, "name",
+ insert_status = bt_value_map_insert_string_entry(trace_info, "name",
trace->name->str);
- if (status != BT_VALUE_STATUS_OK) {
+ if (insert_status != BT_VALUE_MAP_INSERT_ENTRY_STATUS_OK) {
ret = -1;
goto end;
}
- status = bt_value_map_insert_string_entry(trace_info, "path",
+ insert_status = bt_value_map_insert_string_entry(trace_info, "path",
trace->path->str);
- if (status != BT_VALUE_STATUS_OK) {
+ if (insert_status != BT_VALUE_MAP_INSERT_ENTRY_STATUS_OK) {
ret = -1;
goto end;
}
goto end;
}
- status = bt_value_array_append_element(file_groups, group_info);
+ append_status = bt_value_array_append_element(file_groups,
+ group_info);
bt_value_put_ref(group_info);
- if (status != BT_VALUE_STATUS_OK) {
+ if (append_status != BT_VALUE_ARRAY_APPEND_ELEMENT_STATUS_OK) {
goto end;
}
}
}
- status = bt_value_map_insert_entry(trace_info, "streams",
+ insert_status = bt_value_map_insert_entry(trace_info, "streams",
file_groups);
BT_VALUE_PUT_REF_AND_RESET(file_groups);
- if (status != BT_VALUE_STATUS_OK) {
+ if (insert_status != BT_VALUE_MAP_INSERT_ENTRY_STATUS_OK) {
ret = -1;
goto end;
}
}
BT_HIDDEN
-bt_query_status trace_info_query(
+bt_component_class_query_method_status trace_info_query(
bt_self_component_class_source *comp_class,
- const bt_value *params,
+ const bt_value *params, bt_logging_level log_level,
const bt_value **user_result)
{
struct ctf_fs_component *ctf_fs = NULL;
- bt_query_status status = BT_QUERY_STATUS_OK;
+ bt_component_class_query_method_status status =
+ BT_COMPONENT_CLASS_QUERY_METHOD_STATUS_OK;
bt_value *result = NULL;
- const bt_value *paths_value = NULL;
+ const bt_value *inputs_value = NULL;
int ret = 0;
guint i;
if (!bt_value_is_map(params)) {
BT_LOGE("Query parameters is not a map value object.");
- status = BT_QUERY_STATUS_INVALID_PARAMS;
+ status = BT_COMPONENT_CLASS_QUERY_METHOD_STATUS_ERROR;
goto error;
}
- ctf_fs = ctf_fs_component_create();
+ ctf_fs = ctf_fs_component_create(log_level, NULL);
if (!ctf_fs) {
goto error;
}
- if (!read_src_fs_parameters(params, &paths_value, ctf_fs)) {
- status = BT_QUERY_STATUS_INVALID_PARAMS;
+ if (!read_src_fs_parameters(params, &inputs_value, ctf_fs)) {
+ status = BT_COMPONENT_CLASS_QUERY_METHOD_STATUS_ERROR;
goto error;
}
- if (ctf_fs_component_create_ctf_fs_traces(NULL, ctf_fs, paths_value)) {
+ if (ctf_fs_component_create_ctf_fs_traces(NULL, ctf_fs, inputs_value)) {
goto error;
}
result = bt_value_array_create();
if (!result) {
- status = BT_QUERY_STATUS_NOMEM;
+ status = BT_COMPONENT_CLASS_QUERY_METHOD_STATUS_MEMORY_ERROR;
goto error;
}
for (i = 0; i < ctf_fs->traces->len; i++) {
struct ctf_fs_trace *trace;
bt_value *trace_info;
- bt_value_status status;
+ bt_value_array_append_element_status append_status;
trace = g_ptr_array_index(ctf_fs->traces, i);
BT_ASSERT(trace);
goto error;
}
- status = bt_value_array_append_element(result, trace_info);
+ append_status = bt_value_array_append_element(result,
+ trace_info);
bt_value_put_ref(trace_info);
- if (status != BT_VALUE_STATUS_OK) {
+ if (append_status != BT_VALUE_ARRAY_APPEND_ELEMENT_STATUS_OK) {
goto error;
}
}
result = NULL;
if (status >= 0) {
- status = BT_QUERY_STATUS_ERROR;
+ status = BT_COMPONENT_CLASS_QUERY_METHOD_STATUS_ERROR;
}
end:
*user_result = result;
return status;
}
+
+BT_HIDDEN
+bt_component_class_query_method_status support_info_query(
+ bt_self_component_class_source *comp_class,
+ const bt_value *params, bt_logging_level log_level,
+ const bt_value **user_result)
+{
+ const bt_value *input_type_value;
+ const char *input_type;
+ bt_component_class_query_method_status status;
+ double weight = 0;
+ gchar *metadata_path = NULL;
+ bt_value *result = NULL;
+
+ input_type_value = bt_value_map_borrow_entry_value_const(params, "type");
+ BT_ASSERT(input_type_value);
+ BT_ASSERT(bt_value_get_type(input_type_value) == BT_VALUE_TYPE_STRING);
+ input_type = bt_value_string_get(input_type_value);
+
+ result = bt_value_map_create();
+ if (!result) {
+ status = BT_COMPONENT_CLASS_QUERY_METHOD_STATUS_MEMORY_ERROR;
+ goto end;
+ }
+
+ if (strcmp(input_type, "directory") == 0) {
+ const bt_value *input_value;
+ const char *path;
+
+ input_value = bt_value_map_borrow_entry_value_const(params, "input");
+ BT_ASSERT(input_value);
+ BT_ASSERT(bt_value_get_type(input_value) == BT_VALUE_TYPE_STRING);
+ path = bt_value_string_get(input_value);
+
+ metadata_path = g_build_filename(path, CTF_FS_METADATA_FILENAME, NULL);
+ if (!metadata_path) {
+ status = BT_COMPONENT_CLASS_QUERY_METHOD_STATUS_MEMORY_ERROR;
+ goto end;
+ }
+
+ /*
+ * If the metadata file exists in this directory, consider it to
+ * be a CTF trace.
+ */
+ if (g_file_test(metadata_path, G_FILE_TEST_EXISTS)) {
+ weight = 0.5;
+ }
+ }
+
+ if (bt_value_map_insert_real_entry(result, "weight", weight) != BT_VALUE_MAP_INSERT_ENTRY_STATUS_OK) {
+ status = BT_COMPONENT_CLASS_QUERY_METHOD_STATUS_MEMORY_ERROR;
+ goto end;
+ }
+
+ /*
+ * Use the arbitrary constant string "ctf" as the group, such that all
+ * found ctf traces are passed to the same instance of src.ctf.fs.
+ */
+ if (bt_value_map_insert_string_entry(result, "group", "ctf") != BT_VALUE_MAP_INSERT_ENTRY_STATUS_OK) {
+ status = BT_COMPONENT_CLASS_QUERY_METHOD_STATUS_MEMORY_ERROR;
+ goto end;
+ }
+
+ *user_result = result;
+ result = NULL;
+ status = BT_COMPONENT_CLASS_QUERY_METHOD_STATUS_OK;
+
+end:
+ g_free(metadata_path);
+ bt_value_put_ref(result);
+
+ return status;
+}