Module: Datadog::CI::FileSerialization
- Defined in:
- lib/datadog/ci/file_serialization.rb,
ext/datadog_ci_native/file_serialization.c
Overview
Native fast path for serializing large lists of file paths. Implementation in ext/datadog_ci_native/file_serialization.c.
Class Method Summary collapse
Class Method Details
.pack_files(primary_files, additional_files, root) ⇒ Object
194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 |
# File 'ext/datadog_ci_native/file_serialization.c', line 194
static VALUE file_serialization_pack_files(VALUE module, VALUE primary_files,
VALUE additional_files,
VALUE root) {
Check_Type(primary_files, T_HASH);
Check_Type(additional_files, T_ARRAY);
if (!RB_TYPE_P(root, T_STRING) || rb_obj_class(root) != rb_cString ||
RSTRING_LEN(root) == 0 || !string_bytes_are_ascii(root)) {
return Qnil;
}
long additional_files_len = RARRAY_LEN(additional_files);
struct packed_files_context context = {
.root = root,
.packed = rb_str_buf_new(4096),
.root_len = RSTRING_LEN(root),
.files_count = 0,
.fast_path_supported = true};
rb_str_resize(context.packed, 5);
rb_hash_foreach(primary_files, pack_primary_file_i, (VALUE)&context);
if (!context.fast_path_supported) {
return Qnil;
}
for (long i = 0; i < additional_files_len; i++) {
if (!packed_files_append_entry(&context,
rb_ary_entry(additional_files, i), true)) {
return Qnil;
}
}
packed_files_write_array_header(&context);
return context.packed;
}
|