prefect server in zig
at main 108 lines 3.4 kB view raw
1const std = @import("std"); 2const Allocator = std.mem.Allocator; 3 4const backend = @import("backend.zig"); 5const log = @import("../logging.zig"); 6 7pub const BlockSchemaRow = struct { 8 id: []const u8, 9 created: []const u8, 10 updated: []const u8, 11 checksum: []const u8, 12 fields: []const u8, 13 capabilities: []const u8, 14 version: []const u8, 15 block_type_id: []const u8, 16}; 17 18pub fn insert( 19 id: []const u8, 20 checksum: []const u8, 21 fields: []const u8, 22 capabilities: []const u8, 23 version: []const u8, 24 block_type_id: []const u8, 25) !void { 26 backend.db.exec( 27 \\INSERT INTO block_schema (id, checksum, fields, capabilities, version, block_type_id) 28 \\VALUES (?, ?, ?, ?, ?, ?) 29 , .{ id, checksum, fields, capabilities, version, block_type_id }) catch |err| { 30 log.err("database", "insert block_schema error: {}", .{err}); 31 return err; 32 }; 33} 34 35pub fn getByChecksum( 36 alloc: Allocator, 37 checksum: []const u8, 38 version: ?[]const u8, 39) !?BlockSchemaRow { 40 if (version) |v| { 41 var rows = backend.db.query( 42 \\SELECT id, created, updated, checksum, fields, capabilities, version, block_type_id 43 \\FROM block_schema WHERE checksum = ? AND version = ? 44 , .{ checksum, v }) catch return null; 45 defer rows.deinit(); 46 47 if (rows.next()) |row| { 48 return rowToBlockSchema(alloc, row); 49 } 50 } else { 51 var rows = backend.db.query( 52 \\SELECT id, created, updated, checksum, fields, capabilities, version, block_type_id 53 \\FROM block_schema WHERE checksum = ? 54 , .{checksum}) catch return null; 55 defer rows.deinit(); 56 57 if (rows.next()) |row| { 58 return rowToBlockSchema(alloc, row); 59 } 60 } 61 return null; 62} 63 64pub fn getById(alloc: Allocator, id: []const u8) !?BlockSchemaRow { 65 var rows = backend.db.query( 66 \\SELECT id, created, updated, checksum, fields, capabilities, version, block_type_id 67 \\FROM block_schema WHERE id = ? 68 , .{id}) catch return null; 69 defer rows.deinit(); 70 71 if (rows.next()) |row| { 72 return rowToBlockSchema(alloc, row); 73 } 74 return null; 75} 76 77pub fn list(alloc: Allocator, limit: usize) ![]BlockSchemaRow { 78 var results = std.ArrayListUnmanaged(BlockSchemaRow){}; 79 errdefer results.deinit(alloc); 80 81 var rows = backend.db.query( 82 \\SELECT id, created, updated, checksum, fields, capabilities, version, block_type_id 83 \\FROM block_schema ORDER BY created DESC LIMIT ? 84 , .{@as(i64, @intCast(limit))}) catch |err| { 85 log.err("database", "list block_schemas error: {}", .{err}); 86 return err; 87 }; 88 defer rows.deinit(); 89 90 while (rows.next()) |row| { 91 try results.append(alloc, rowToBlockSchema(alloc, row)); 92 } 93 94 return results.toOwnedSlice(alloc); 95} 96 97fn rowToBlockSchema(alloc: Allocator, row: anytype) BlockSchemaRow { 98 return .{ 99 .id = alloc.dupe(u8, row.text(0)) catch "", 100 .created = alloc.dupe(u8, row.text(1)) catch "", 101 .updated = alloc.dupe(u8, row.text(2)) catch "", 102 .checksum = alloc.dupe(u8, row.text(3)) catch "", 103 .fields = alloc.dupe(u8, row.text(4)) catch "{}", 104 .capabilities = alloc.dupe(u8, row.text(5)) catch "[]", 105 .version = alloc.dupe(u8, row.text(6)) catch "1", 106 .block_type_id = alloc.dupe(u8, row.text(7)) catch "", 107 }; 108}