use new number type to be compatible with dynamo

This commit is contained in:
2026-02-16 08:45:30 -05:00
parent 089ef39bd9
commit f8b0b1c3ae
7 changed files with 680 additions and 45 deletions

View File

@@ -76,6 +76,13 @@ encode_attribute_value :: proc(buf: ^bytes.Buffer, attr: Attribute_Value) -> boo
encode_varint(buf, len(v))
bytes.buffer_write_string(buf, string(v))
case DDB_Number:
bytes.buffer_write_byte(buf, u8(Type_Tag.Number))
// Store as string in item encoding
num_str := format_ddb_number(v)
encode_varint(buf, len(num_str))
bytes.buffer_write_string(buf, num_str)
case Number:
bytes.buffer_write_byte(buf, u8(Type_Tag.Number))
encode_varint(buf, len(v))
@@ -94,6 +101,16 @@ encode_attribute_value :: proc(buf: ^bytes.Buffer, attr: Attribute_Value) -> boo
bytes.buffer_write_byte(buf, u8(Type_Tag.Null))
// NULL has no value bytes
case DDB_Number_Set:
bytes.buffer_write_byte(buf, u8(Type_Tag.Number_Set)) // Use Number_Set tag, not DDB_Number_Set
encode_varint(buf, len(v))
for num in v {
// Format the DDB_Number to a string
num_str := format_ddb_number(num)
encode_varint(buf, len(num_str))
bytes.buffer_write_string(buf, num_str)
}
case String_Set:
bytes.buffer_write_byte(buf, u8(Type_Tag.String_Set))
encode_varint(buf, len(v))
@@ -289,9 +306,15 @@ decode_attribute_value :: proc(decoder: ^Binary_Decoder) -> (Attribute_Value, bo
return nil, false
}
str := string(data)
owned := transmute(string)slice.clone(transmute([]byte)str)
return Number(owned), true
num_str := string(data)
// Parse into DDB_Number
ddb_num, num_ok := parse_ddb_number(num_str)
if !num_ok {
return nil, false
}
return ddb_num, true
case .Binary:
length, len_ok := decoder_read_varint(decoder)
@@ -359,32 +382,35 @@ decode_attribute_value :: proc(decoder: ^Binary_Decoder) -> (Attribute_Value, bo
return nil, false
}
numbers := make([]string, count)
numbers := make([]DDB_Number, count) // Changed to DDB_Number
for i in 0..<count {
length, len_ok := decoder_read_varint(decoder)
if !len_ok {
for j in 0..<i {
delete(numbers[j])
}
// No cleanup needed for DDB_Number (no heap allocations)
delete(numbers)
return nil, false
}
data, data_ok := decoder_read_bytes(decoder, length)
if !data_ok {
for j in 0..<i {
delete(numbers[j])
}
delete(numbers)
return nil, false
}
str := string(data)
numbers[i] = transmute(string)slice.clone(transmute([]byte)str)
num_str := string(data)
// Parse into DDB_Number
ddb_num, num_ok := parse_ddb_number(num_str)
if !num_ok {
delete(numbers)
return nil, false
}
numbers[i] = ddb_num
}
return Number_Set(numbers), true
return DDB_Number_Set(numbers), true
case .Binary_Set:
count, count_ok := decoder_read_varint(decoder)