void * EbRecord::GetField(EbUint32 fid) { // check fid EB_ASSERT(fid < NumberOfFields()); DecodeField(fid); return _lField[fid]._decodedData; }
EbUint32 EbRecord::FieldSize(EbUint32 fid, EbUint32 option) { // check fid if (fid >= NumberOfFields()) { EB_ASSERT (0 == "EBE_INVALID_FIELD"); } DataDriver *pDriver = _pEbase->_lpDataDriver[fid]; DecodeField(fid); return pDriver->DecodedDataSize(_lField[fid]._decodedData); }
static uint8_t* DeserializeRec(DecodeState& ds, TxtNode *firstNode, TxtNode *defaultFirstNode, StructMetadata *def) { bool ok = true; if (!firstNode) return NULL; uint8_t *res = AllocArray<uint8_t>(def->size); for (int i = 0; i < def->nFields; i++) { ok = DecodeField(ds, firstNode, defaultFirstNode, def->fields + i, res); if (!ok) goto Error; } return res; Error: FreeStruct(res, def); return NULL; }
static uint8_t* DeserializeRec(DecodeState& ds, TxtNode *firstNode, const StructMetadata *def) { bool ok = true; if (!firstNode) return NULL; uint8_t *res = AllocArray<uint8_t>(def->size); const StructMetadata **defPtr = (const StructMetadata**)res; *defPtr = def; const char *fieldName = def->fieldNames; for (int i = 0; i < def->nFields; i++) { ok = DecodeField(ds, firstNode, fieldName, def->fields + i, res); if (!ok) goto Error; seqstrings::SkipStr(fieldName); } return res; Error: FreeStruct(res, def); return NULL; }
void * EbRecord::GetFieldAlloc(EbUint32 fid) { // check fid EB_ASSERT(fid < NumberOfFields()); void * newData; DataDriver *pDriver = _pEbase->_lpDataDriver[fid]; if (_lField[fid]._changed == EB_TRUE) { // this field is modified, we need to clone the decoded data newData = pDriver->CloneDecodedData(_lField[fid]._decodedData); } else { DecodeField(fid); EB_ASSERT(_lField[fid]._decoded == EB_TRUE); // this field is now decoded, we simple "steal" the data. newData = _lField[fid]._decodedData; _lField[fid]._decodedData = NULL; _lField[fid]._decoded = EB_FALSE; } return newData; }