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;
}