MCPcopy Create free account
hub / github.com/apache/fory / ReadMetaStringBytes

Method ReadMetaStringBytes

go/fory/meta_string_resolver.go:123–235  ·  view source on GitHub ↗

ReadMetaStringBytes reads a string from buffer, handling dynamic references

(buf *ByteBuffer, ctxErr *Error)

Source from the content-addressed store, hash-verified

121
122// ReadMetaStringBytes reads a string from buffer, handling dynamic references
123func (r *MetaStringResolver) ReadMetaStringBytes(buf *ByteBuffer, ctxErr *Error) (*MetaStringBytes, error) {
124 // ReadData header containing length/reference info (uses VarUint32Small7 to match Java)
125 header := buf.ReadVarUint32Small7(ctxErr)
126 if ctxErr.HasError() {
127 return nil, *ctxErr
128 }
129
130 lengthValue := header >> 1
131 if header&1 != 0 {
132 if lengthValue == 0 || uint64(lengthValue) > uint64(MaxInt) {
133 return nil, fmt.Errorf("invalid dynamic index: %d", lengthValue)
134 }
135 index := int(lengthValue) - 1
136 if index < 0 || index >= len(r.dynamicIDToEnumString) {
137 return nil, fmt.Errorf("invalid dynamic index: %d", index)
138 }
139 return r.dynamicIDToEnumString[index], nil
140 }
141 if lengthValue > uint32(MaxInt16) {
142 return nil, fmt.Errorf("meta string length %d exceeds maximum supported length %d", lengthValue, MaxInt16)
143 }
144 length := int(lengthValue)
145
146 var (
147 hashcode int64
148 key smallMetaStringKey
149 data []byte
150 encoding meta.Encoding
151 )
152
153 // Small string optimization
154 if length <= SmallStringThreshold {
155 if length == 0 {
156 r.dynamicIDToEnumString = append(r.dynamicIDToEnumString, emptyMetaStringBytes)
157 return emptyMetaStringBytes, nil
158 }
159 encByte := buf.ReadByte(ctxErr)
160 var encErr error
161 encoding, encErr = meta.EncodingFromByte(encByte)
162 if encErr != nil {
163 return nil, encErr
164 }
165
166 if !buf.CheckReadable(length, ctxErr) {
167 return nil, *ctxErr
168 }
169 data = make([]byte, length)
170 _, err := buf.Read(data)
171 if err != nil {
172 return nil, err
173 }
174
175 words := smallMetaStringWords(data)
176 key = smallMetaStringKey{
177 v1: words[0],
178 v2: words[1],
179 compactKey: byte(((length - 1) << smallMetaStringEncodingBits) | int(encoding)),
180 }

Calls 11

smallMetaStringWordsFunction · 0.85
ComputeMetaStringHashFunction · 0.85
NewMetaStringBytesFunction · 0.85
ReadVarUint32Small7Method · 0.80
CheckReadableMethod · 0.80
ReadMethod · 0.65
uint64Function · 0.50
uint32Function · 0.50
HasErrorMethod · 0.45
ReadByteMethod · 0.45