Skip to content

Commit 6064e13

Browse files
committed
reduce memory usage
1 parent e5eca51 commit 6064e13

2 files changed

Lines changed: 72 additions & 45 deletions

File tree

app/src/metadata_reader.c

Lines changed: 67 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -511,6 +511,42 @@ parser_error_t read_array(parser_context_t *ctx, schema_array_t *schema_array) {
511511
return parser_ok;
512512
}
513513

514+
parser_error_t read_root_type_indices(parser_context_t *ctx, root_type_indices_t *root_type_indices) {
515+
CHECK_INPUT(root_type_indices);
516+
CHECK_INPUT(ctx);
517+
518+
// read length
519+
CHECK_ERROR(read_u32(ctx, &root_type_indices->qty));
520+
print_u32("root_type_indices.qty:", root_type_indices->qty);
521+
for (uint32_t i = 0; i < root_type_indices->qty; i++) {
522+
CHECK_ERROR(read_u64(ctx, &root_type_indices->indices[i]));
523+
print_u8("root_indice", i);
524+
print_u64("root_type:", root_type_indices->indices[i]);
525+
}
526+
527+
return parser_ok;
528+
}
529+
530+
parser_error_t read_chain_data(parser_context_t *ctx, chain_data_t *chain_data) {
531+
CHECK_INPUT(chain_data);
532+
CHECK_INPUT(ctx);
533+
534+
// read chain_id
535+
CHECK_ERROR(read_u64(ctx, &chain_data->chain_id));
536+
print_u64("chain_data.chain_id:", chain_data->chain_id);
537+
538+
// read chain_name
539+
CHECK_ERROR(read_u32(ctx, (uint32_t *)&chain_data->chain_name.len));
540+
if (chain_data->chain_name.len > 0) {
541+
chain_data->chain_name.ptr = ctx->buffer.ptr + ctx->offset;
542+
CTX_CHECK_AND_ADVANCE(ctx, chain_data->chain_name.len);
543+
}
544+
print_buffer(&chain_data->chain_name, "chain_name");
545+
print_buffer_str(&chain_data->chain_name, "chain_name_str");
546+
547+
return parser_ok;
548+
}
549+
514550
parser_error_t metadata_read(parser_context_t *ctx, parser_tx_t *txObj) {
515551
CHECK_INPUT(ctx);
516552
CHECK_INPUT(txObj);
@@ -524,35 +560,43 @@ parser_error_t metadata_read(parser_context_t *ctx, parser_tx_t *txObj) {
524560
for (uint32_t i = 0; i < txObj->schema.types.qty; i++) {
525561
// read type
526562
CHECK_ERROR(read_u8(ctx, (uint8_t *)&txObj->schema.types.schemes[i].type));
563+
uint16_t offset_mem = ctx->offset;
564+
const uint8_t *ptr_mem = ctx->buffer.ptr + ctx->offset;
527565
switch (txObj->schema.types.schemes[i].type) {
528566
case LINKING_SCHEME_ENUM:
529567
print_string("READING ENUM");
530-
CHECK_ERROR(read_enum(ctx, &txObj->schema.types.schemes[i].enum_type));
568+
schema_enum_t enum_type = {0};
569+
CHECK_ERROR(read_enum(ctx, &enum_type));
531570
print_string("READING ENUM DONE\n");
532571
break;
533572
case LINKING_SCHEME_STRUCT:
534573
print_string("READING STRUCT");
535-
CHECK_ERROR(read_struct(ctx, &txObj->schema.types.schemes[i].struct_type));
574+
schema_struct_t struct_type = {0};
575+
CHECK_ERROR(read_struct(ctx, &struct_type));
536576
print_string("READING STRUCT DONE\n");
537577
break;
538578
case LINKING_SCHEME_TUPLE:
539579
print_string("READING TUPLE");
540-
CHECK_ERROR(read_tuple(ctx, &txObj->schema.types.schemes[i].tuple_type));
580+
schema_tuple_t tuple_type = {0};
581+
CHECK_ERROR(read_tuple(ctx, &tuple_type));
541582
print_string("READING TUPLE DONE\n");
542583
break;
543584
case LINKING_SCHEME_OPTION:
544585
print_string("READING OPTION");
545-
CHECK_ERROR(read_link(ctx, &txObj->schema.types.schemes[i].option_type));
586+
link_t option_type = {0};
587+
CHECK_ERROR(read_link(ctx, &option_type));
546588
print_string("READING OPTION DONE\n");
547589
break;
548590
case LINKING_SCHEME_INTEGER:
549591
print_string("READING INTEGER");
550-
CHECK_ERROR(read_primitive_integer(ctx, &txObj->schema.types.schemes[i].integer_type));
592+
primitive_integer_t integer_type = {0};
593+
CHECK_ERROR(read_primitive_integer(ctx, &integer_type));
551594
print_string("READING INTEGER DONE\n");
552595
break;
553596
case LINKING_SCHEME_BYTE_ARRAY:
554597
print_string("READING BYTE ARRAY");
555-
CHECK_ERROR(read_primitive_byte_array(ctx, &txObj->schema.types.schemes[i].byte_array_type));
598+
primitive_byte_array_t byte_array_type = {0};
599+
CHECK_ERROR(read_primitive_byte_array(ctx, &byte_array_type));
556600
print_string("READING BYTE ARRAY DONE\n");
557601
break;
558602
case LINKING_SCHEME_FLOAT32:
@@ -569,55 +613,50 @@ parser_error_t metadata_read(parser_context_t *ctx, parser_tx_t *txObj) {
569613
break;
570614
case LINKING_SCHEME_SKIP:
571615
print_string("READING SKIP");
572-
CHECK_ERROR(read_u64(ctx, (uint64_t *)&txObj->schema.types.schemes[i].skip_type));
573-
print_u64("skip_type:", txObj->schema.types.schemes[i].skip_type);
616+
uint64_t skip_type = 0;
617+
CHECK_ERROR(read_u64(ctx, &skip_type));
618+
print_u64("skip_type:", skip_type);
574619
print_string("READING SKIP DONE\n");
575620
break;
576621
case LINKING_SCHEME_BYTE_VEC:
577622
print_string("READING BYTE VEC");
578-
CHECK_ERROR(read_byte_display(ctx, &txObj->schema.types.schemes[i].byte_vec_type));
623+
byte_display_t byte_vec_type = {0};
624+
CHECK_ERROR(read_byte_display(ctx, &byte_vec_type));
579625
print_string("READING BYTE VEC DONE\n");
580626
break;
581627
case LINKING_SCHEME_ARRAY:
582628
print_string("READING ARRAY");
583-
CHECK_ERROR(read_array(ctx, &txObj->schema.types.schemes[i].array_type));
629+
schema_array_t array_type = {0};
630+
CHECK_ERROR(read_array(ctx, &array_type));
584631
print_string("READING ARRAY DONE\n");
585632
break;
586633
case LINKING_SCHEME_VEC:
587634
print_string("READING VEC");
588-
CHECK_ERROR(read_link(ctx, &txObj->schema.types.schemes[i].vec_type));
635+
link_t vec_type = {0};
636+
CHECK_ERROR(read_link(ctx, &vec_type));
589637
print_string("READING VEC DONE\n");
590638
break;
591639
case LINKING_SCHEME_MAP:
592640
print_string("READING MAP");
593-
CHECK_ERROR(read_link(ctx, &txObj->schema.types.schemes[i].map_type.key));
594-
CHECK_ERROR(read_link(ctx, &txObj->schema.types.schemes[i].map_type.value));
641+
link_t key = {0};
642+
link_t value = {0};
643+
CHECK_ERROR(read_link(ctx, &key));
644+
CHECK_ERROR(read_link(ctx, &value));
595645
print_string("READING MAP DONE\n");
596646
break;
597647
default:
598648
print_u8("UNKNOWN TYPE:", txObj->schema.types.schemes[i].type);
599649
return parser_no_data;
600650
}
651+
txObj->schema.types.schemes[i].data.buffer.ptr = ptr_mem;
652+
txObj->schema.types.schemes[i].data.buffer.len = ctx->offset - offset_mem;
601653
}
602654

603655
// read root_type_indices
604-
CHECK_ERROR(read_u32(ctx, &txObj->schema.root_type_indices.qty));
605-
print_u32("root_type_indices.qty:", txObj->schema.root_type_indices.qty);
606-
for (uint32_t i = 0; i < txObj->schema.root_type_indices.qty; i++) {
607-
CHECK_ERROR(read_u64(ctx, &txObj->schema.root_type_indices.indices[i]));
608-
print_u64("root_type_indices[%d]:", txObj->schema.root_type_indices.indices[i]);
609-
}
656+
CHECK_ERROR(read_root_type_indices(ctx, &txObj->schema.root_type_indices));
610657

611658
// read chain_data
612-
CHECK_ERROR(read_u64(ctx, &txObj->schema.chain_data.chain_id));
613-
print_u64("chain_data.chain_id:", txObj->schema.chain_data.chain_id);
614-
CHECK_ERROR(read_u32(ctx, (uint32_t *)&txObj->schema.chain_data.chain_name.len));
615-
if (txObj->schema.chain_data.chain_name.len > 0) {
616-
txObj->schema.chain_data.chain_name.ptr = ctx->buffer.ptr + ctx->offset;
617-
CTX_CHECK_AND_ADVANCE(ctx, txObj->schema.chain_data.chain_name.len);
618-
print_buffer(&txObj->schema.chain_data.chain_name, "chain_name");
619-
print_buffer_str(&txObj->schema.chain_data.chain_name, "chain_name_str");
620-
}
659+
CHECK_ERROR(read_chain_data(ctx, &txObj->schema.chain_data));
621660

622661
// read extra_metadata_hash
623662
txObj->schema.extra_metadata_hash.len = 32;

app/src/txdefs/metadata_txdef.h

Lines changed: 5 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,7 @@ typedef struct {
154154
} primitive_t;
155155

156156
typedef struct {
157-
link_tag_t tag;
157+
uint8_t tag;
158158
union {
159159
uint64_t by_index;
160160
primitive_t immediate;
@@ -207,7 +207,7 @@ typedef struct {
207207
bytes_t structured_show_as;
208208
bool peekable;
209209
uint32_t fields_qty;
210-
unnamed_field_t fields[MAX_FIELDS_QTY];
210+
unnamed_field_t *fields;
211211
} schema_tuple_t;
212212

213213
typedef struct {
@@ -217,7 +217,7 @@ typedef struct {
217217
bytes_t structured_show_as;
218218
bool peekable;
219219
uint32_t fields_qty;
220-
unnamed_field_t fields[MAX_FIELDS_QTY];
220+
unnamed_field_t *fields;
221221
} schema_option_t;
222222

223223
typedef struct {
@@ -232,20 +232,8 @@ typedef struct {
232232

233233
// this struct is used to store where the schema starts in the input buffer
234234
typedef struct {
235-
linking_scheme_type_t type;
236-
union {
237-
schema_enum_t enum_type;
238-
schema_struct_t struct_type;
239-
schema_tuple_t tuple_type;
240-
link_t option_type;
241-
primitive_integer_t integer_type;
242-
primitive_byte_array_t byte_array_type;
243-
uint64_t skip_type;
244-
byte_display_t byte_vec_type;
245-
schema_array_t array_type;
246-
link_t vec_type;
247-
schema_map_t map_type;
248-
};
235+
uint8_t type;
236+
parser_context_t data;
249237
} linking_scheme_t;
250238

251239
typedef struct {

0 commit comments

Comments
 (0)