void Freezer_serialize_varray(Vector *array, OutStream *outstream) { uint32_t last_valid_tick = 0; // Skip size check. uint32_t size = (uint32_t)Vec_Get_Size(array); OutStream_Write_CU32(outstream, size); for (uint32_t i = 0; i < size; i++) { Obj *elem = Vec_Fetch(array, i); if (elem) { OutStream_Write_CU32(outstream, i - last_valid_tick); FREEZE(elem, outstream); last_valid_tick = i; } } // Terminate. OutStream_Write_CU32(outstream, size - last_valid_tick); }
void Freezer_serialize_hash(Hash *hash, OutStream *outstream) { // Skip size check. uint32_t hash_size = (uint32_t)Hash_Get_Size(hash); OutStream_Write_CU32(outstream, hash_size); HashIterator *iter = HashIter_new(hash); while (HashIter_Next(iter)) { String *key = HashIter_Get_Key(iter); Obj *val = HashIter_Get_Value(iter); Freezer_serialize_string(key, outstream); FREEZE(val, outstream); } DECREF(iter); }
void DocWriter_Add_Inverted_Doc_IMP(DocWriter *self, Inverter *inverter, int32_t doc_id) { DocWriterIVARS *const ivars = DocWriter_IVARS(self); OutStream *dat_out = S_lazy_init(self); OutStream *ix_out = ivars->ix_out; uint32_t num_stored = 0; int64_t start = OutStream_Tell(dat_out); int64_t expected = OutStream_Tell(ix_out) / 8; // Verify doc id. if (doc_id != expected) { THROW(ERR, "Expected doc id %i64 but got %i32", expected, doc_id); } // Write the number of stored fields. Inverter_Iterate(inverter); while (Inverter_Next(inverter)) { FieldType *type = Inverter_Get_Type(inverter); if (FType_Stored(type)) { num_stored++; } } OutStream_Write_CU32(dat_out, num_stored); Inverter_Iterate(inverter); while (Inverter_Next(inverter)) { // Only store fields marked as "stored". FieldType *type = Inverter_Get_Type(inverter); if (FType_Stored(type)) { String *field = Inverter_Get_Field_Name(inverter); Obj *value = Inverter_Get_Value(inverter); Freezer_serialize_string(field, dat_out); switch (FType_Primitive_ID(type) & FType_PRIMITIVE_ID_MASK) { case FType_TEXT: { const char *buf = Str_Get_Ptr8((String*)value); size_t size = Str_Get_Size((String*)value); if (size > INT32_MAX) { THROW(ERR, "Field %o over 2GB: %u64", field, (uint64_t)size); } OutStream_Write_CU32(dat_out, (uint32_t)size); OutStream_Write_Bytes(dat_out, buf, size); break; } case FType_BLOB: { const char *buf = Blob_Get_Buf((Blob*)value); size_t size = Blob_Get_Size((Blob*)value); if (size > INT32_MAX) { THROW(ERR, "Field %o over 2GB: %u64", field, (uint64_t)size); } OutStream_Write_CU32(dat_out, (uint32_t)size); OutStream_Write_Bytes(dat_out, buf, size); break; } case FType_INT32: { int32_t val = (int32_t)Int_Get_Value((Integer*)value); OutStream_Write_CI32(dat_out, val); break; } case FType_INT64: { int64_t val = Int_Get_Value((Integer*)value); OutStream_Write_CI64(dat_out, val); break; } case FType_FLOAT32: { float val = (float)Float_Get_Value((Float*)value); OutStream_Write_F32(dat_out, val); break; } case FType_FLOAT64: { double val = Float_Get_Value((Float*)value); OutStream_Write_F64(dat_out, val); break; } default: THROW(ERR, "Unrecognized type: %o", type); } } } // Write file pointer. OutStream_Write_I64(ix_out, start); }