fix leaks
This commit is contained in:
@@ -243,7 +243,13 @@ serialize_table_metadata :: proc(metadata: ^Table_Metadata) -> ([]byte, bool) {
|
||||
|
||||
// Add other metadata
|
||||
meta_item["TableStatus"] = String(strings.clone(table_status_to_string(metadata.table_status)))
|
||||
meta_item["CreationDateTime"] = Number(fmt.aprint(metadata.creation_date_time))
|
||||
ts_str := fmt.aprint(metadata.creation_date_time)
|
||||
ts_num, ts_ok := parse_ddb_number(ts_str)
|
||||
if ts_ok {
|
||||
meta_item["CreationDateTime"] = ts_num
|
||||
} else {
|
||||
meta_item["CreationDateTime"] = String(strings.clone(ts_str))
|
||||
}
|
||||
|
||||
// Encode GSI definitions as JSON string
|
||||
if gsis, has_gsis := metadata.global_secondary_indexes.?; has_gsis && len(gsis) > 0 {
|
||||
@@ -314,8 +320,9 @@ deserialize_table_metadata :: proc(data: []byte, allocator: mem.Allocator) -> (T
|
||||
// Parse creation date time
|
||||
if time_val, found := meta_item["CreationDateTime"]; found {
|
||||
#partial switch v in time_val {
|
||||
case Number:
|
||||
val, parse_ok := strconv.parse_i64(string(v))
|
||||
case DDB_Number:
|
||||
num_str := format_ddb_number(v)
|
||||
val, parse_ok := strconv.parse_i64(num_str)
|
||||
metadata.creation_date_time = val if parse_ok else 0
|
||||
}
|
||||
}
|
||||
@@ -1226,6 +1233,44 @@ evaluate_sort_key_condition :: proc(item: Item, skc: ^Sort_Key_Condition) -> boo
|
||||
return false
|
||||
}
|
||||
|
||||
// Use numeric comparison if both sides are DDB_Number
|
||||
item_num, item_is_num := attr.(DDB_Number)
|
||||
cond_num, cond_is_num := skc.value.(DDB_Number)
|
||||
|
||||
if item_is_num && cond_is_num {
|
||||
cmp := compare_ddb_numbers(item_num, cond_num)
|
||||
|
||||
switch skc.operator {
|
||||
case .EQ:
|
||||
return cmp == 0
|
||||
case .LT:
|
||||
return cmp < 0
|
||||
case .LE:
|
||||
return cmp <= 0
|
||||
case .GT:
|
||||
return cmp > 0
|
||||
case .GE:
|
||||
return cmp >= 0
|
||||
case .BETWEEN:
|
||||
if v2, has_v2 := skc.value2.?; has_v2 {
|
||||
upper_num, upper_ok := v2.(DDB_Number)
|
||||
if !upper_ok {
|
||||
return false
|
||||
}
|
||||
cmp2 := compare_ddb_numbers(item_num, upper_num)
|
||||
return cmp >= 0 && cmp2 <= 0
|
||||
}
|
||||
return false
|
||||
case .BEGINS_WITH:
|
||||
// BEGINS_WITH on numbers: fall through to string comparison
|
||||
item_str := format_ddb_number(item_num)
|
||||
cond_str := format_ddb_number(cond_num)
|
||||
return strings.has_prefix(item_str, cond_str)
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
// Fallback: string comparison for S/B types
|
||||
item_sk_str, ok1 := attr_value_to_string_for_compare(attr)
|
||||
if !ok1 {
|
||||
return false
|
||||
@@ -1272,8 +1317,10 @@ attr_value_to_string_for_compare :: proc(attr: Attribute_Value) -> (string, bool
|
||||
#partial switch v in attr {
|
||||
case String:
|
||||
return string(v), true
|
||||
case Number:
|
||||
return string(v), true
|
||||
case DDB_Number:
|
||||
// Return formatted string for fallback string comparison
|
||||
// (actual numeric comparison is handled in compare_attribute_values)
|
||||
return format_ddb_number(v), true
|
||||
case Binary:
|
||||
return string(v), true
|
||||
}
|
||||
@@ -1318,7 +1365,7 @@ validate_item_key_types :: proc(
|
||||
#partial switch _ in attr {
|
||||
case String:
|
||||
match = (et == .S)
|
||||
case Number:
|
||||
case DDB_Number:
|
||||
match = (et == .N)
|
||||
case Binary:
|
||||
match = (et == .B)
|
||||
|
||||
Reference in New Issue
Block a user