prefect server in zig
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}