datastore: typed value retrieval

This commit is contained in:
2026-09-01 00:42:48 +02:00
parent 1093209328
commit 084512258c

View File

@@ -165,12 +165,20 @@ pub const Database = struct {
return row_id; return row_id;
} }
pub fn getValue(self: *Database, table_id: TableId, column_id: ColumnId, row_id: RowId) !TaggedValue { pub fn getTaggedValue(self: *Database, table_id: TableId, column_id: ColumnId, row_id: RowId) !TaggedValue {
const table = self.tables.getPtr(table_id) orelse return error.TableNotFound; const table = self.tables.getPtr(table_id) orelse return error.TableNotFound;
const column = table.columns.getPtr(column_id) orelse return error.ColumnNotFound; const column = table.columns.getPtr(column_id) orelse return error.ColumnNotFound;
if (row_id.toInt() >= table.next_row_id.toInt()) return error.RowIdNotFound; if (row_id.toInt() >= table.next_row_id.toInt()) return error.RowIdNotFound;
return column.get(row_id); return column.getTagged(row_id);
}
pub fn getValue(self: *Database, comptime T: type, table_id: TableId, column_id: ColumnId, row_id: RowId) !TaggedValue {
const table = self.tables.getPtr(table_id) orelse return error.TableNotFound;
const column = table.columns.getPtr(column_id) orelse return error.ColumnNotFound;
if (row_id.toInt() >= table.next_row_id.toInt()) return error.RowIdNotFound;
return column.get(T, row_id);
} }
}; };
@@ -248,7 +256,7 @@ pub const Column = struct {
self.* = undefined; self.* = undefined;
} }
pub fn get(self: *Column, row_id: RowId) TaggedValue { pub fn getTagged(self: *Column, row_id: RowId) TaggedValue {
const values_per_page = self.type.valuesPerPage(page_size); const values_per_page = self.type.valuesPerPage(page_size);
const page_index = @as(usize, row_id.toInt() / values_per_page); const page_index = @as(usize, row_id.toInt() / values_per_page);
@@ -294,7 +302,7 @@ pub const Column = struct {
}; };
} }
pub fn getBool(self: *Column, row_id: RowId) !bool { pub fn get(self: *Column, comptime T: type, row_id: RowId) !T {
const values_per_page = self.type.valuesPerPage(page_size); const values_per_page = self.type.valuesPerPage(page_size);
const page_index = @as(usize, row_id.toInt() / values_per_page); const page_index = @as(usize, row_id.toInt() / values_per_page);
@@ -302,10 +310,114 @@ pub const Column = struct {
const page = &self.pages.items[page_index]; const page = &self.pages.items[page_index];
return switch (self.type) { return switch (T) {
.bool => page.get(bool, value_index), bool => switch (self.type) {
.bit => page.getBit(value_index), .bool => page.get(bool, value_index),
else => error.TypeError, .bit => page.getBit(value_index),
else => error.TypeError,
},
u8 => switch (self.type) {
.u8 => page.get(u8, value_index),
else => error.TypeError,
},
u16 => switch (self.type) {
.u16 => page.get(u16, value_index),
else => error.TypeError,
},
u32 => switch (self.type) {
.u32 => page.get(u32, value_index),
else => error.TypeError,
},
u64 => switch (self.type) {
.u64 => page.get(u64, value_index),
else => error.TypeError,
},
i8 => switch (self.type) {
.i8 => page.get(i8, value_index),
else => error.TypeError,
},
i16 => switch (self.type) {
.i16 => page.get(i16, value_index),
else => error.TypeError,
},
i32 => switch (self.type) {
.i32 => page.get(i32, value_index),
else => error.TypeError,
},
i64 => switch (self.type) {
.i64 => page.get(i64, value_index),
else => error.TypeError,
},
f32 => switch (self.type) {
.f32 => page.get(f32, value_index),
else => error.TypeError,
},
f64 => switch (self.type) {
.f64 => page.get(f64, value_index),
else => error.TypeError,
},
vm.Color => switch (self.type) {
.color => page.get(vm.Color, value_index),
else => error.TypeError,
},
vm.ColorHdr => switch (self.type) {
.color_hdr => page.get(vm.ColorHdr, value_index),
else => error.TypeError,
},
vm.Matrix3x2 => switch (self.type) {
.mat3x2 => page.getClustered(vm.Matrix3x2, 8, value_index),
else => error.TypeError,
},
vm.Matrix4x4 => switch (self.type) {
.mat4x4 => page.getClustered(vm.Matrix4x4, 8, value_index),
else => error.TypeError,
},
vm.Complex => switch (self.type) {
.complex => page.getClustered(vm.Complex, 8, value_index),
else => error.TypeError,
},
vm.Quaternion => switch (self.type) {
.quaternion => page.getClustered(vm.Quaternion, 8, value_index),
else => error.TypeError,
},
vm.Vector2 => switch (self.type) {
.vec2 => page.getClustered(vm.Vector2, 8, value_index),
else => error.TypeError,
},
vm.Vector2Int => switch (self.type) {
.vec2i => page.getClustered(vm.Vector2Int, 8, value_index),
else => error.TypeError,
},
vm.Vector3 => switch (self.type) {
.vec3 => page.getClustered(vm.Vector3, 8, value_index),
else => error.TypeError,
},
vm.Vector3Int => switch (self.type) {
.vec3i => page.getClustered(vm.Vector3Int, 8, value_index),
else => error.TypeError,
},
vm.Vector4 => switch (self.type) {
.vec4 => page.getClustered(vm.Vector4, 8, value_index),
else => error.TypeError,
},
vm.Vector4Int => switch (self.type) {
.vec4i => page.getClustered(vm.Vector4Int, 8, value_index),
else => error.TypeError,
},
[]const u8 => switch (self.type) {
.str8 => page.getPtr(FixedString(u8, 8), value_index).slice(),
.str16 => page.getPtr(FixedString(u8, 16), value_index).slice(),
.str32 => page.getPtr(FixedString(u8, 32), value_index).slice(),
.str64 => page.getPtr(FixedString(u8, 64), value_index).slice(),
.str128 => page.getPtr(FixedString(u8, 128), value_index).slice(),
.str256 => page.getPtr(FixedString(u8, 256), value_index).slice(),
.str512 => page.getPtr(FixedString(u16, 512), value_index).slice(),
.str1k => page.getPtr(FixedString(u16, 1024), value_index).slice(),
.str2k => page.getPtr(FixedString(u16, 2048), value_index).slice(),
.str4k => page.getPtr(FixedString(u16, 4096), value_index).slice(),
else => error.TypeError,
},
else => @compileError("Type " ++ @typeName(T) ++ " not supported."),
}; };
} }
@@ -612,15 +724,15 @@ test {
}, },
}); });
const admin_username = try db.getValue(table_ids.users, column_ids.username, admin_id); const admin_username = try db.getValue([]const u8, table_ids.users, column_ids.username, admin_id);
const admin_color = try db.getValue(table_ids.users, column_ids.color, admin_id); const admin_color = try db.getValue(vm.Color, table_ids.users, column_ids.color, admin_id);
const user_username = try db.getValue(table_ids.users, column_ids.username, user_id); const user_username = try db.getValue([]const u8, table_ids.users, column_ids.username, user_id);
const user_color = try db.getValue(table_ids.users, column_ids.color, user_id); const user_color = try db.getValue(vm.Color, table_ids.users, column_ids.color, user_id);
try std.testing.expectEqualStrings("admin", admin_username.str); try std.testing.expectEqualStrings("admin", admin_username);
try std.testing.expectEqual(vm.Color.red, admin_color.color); try std.testing.expectEqual(vm.Color.red, admin_color);
try std.testing.expectEqualStrings("user", user_username.str); try std.testing.expectEqualStrings("user", user_username);
try std.testing.expectEqual(vm.Color.blue, user_color.color); try std.testing.expectEqual(vm.Color.blue, user_color);
} }