1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
|
const std = @import("std");
const zqlite = @import("zqlite");
const nanoid = @import("../lib/nanoid.zig");
pub const Marker = struct {
id: []const u8,
lat: f64,
lng: f64,
color: []const u8,
name: []const u8,
description: []const u8,
icon: []const u8,
radius: i64,
};
pub fn get_markers(allocator: std.mem.Allocator, conn: zqlite.Conn, map_id: []const u8) !std.ArrayList(Marker) {
const query =
\\SELECT id, lat, lng, color, name, description, icon, radius
\\FROM markers
\\WHERE map_id = ?
;
var rows = try conn.rows(query, .{map_id});
defer rows.deinit();
var list = std.ArrayList(Marker).init(allocator);
while (rows.next()) |row| {
try list.append(Marker{
.id = try allocator.dupe(u8, row.text(0)),
.lat = row.float(1),
.lng = row.float(2),
.color = try allocator.dupe(u8, row.text(3)),
.name = try allocator.dupe(u8, row.text(4)),
.description = try allocator.dupe(u8, row.text(5)),
.icon = try allocator.dupe(u8, row.text(6)),
.radius = row.int(7),
});
}
if (rows.err) |err| return err;
return list;
}
pub const Payload = struct {
lat: f64,
lng: f64,
color: []const u8,
name: []const u8,
description: []const u8,
icon: []const u8,
radius: i64,
};
pub fn create(allocator: std.mem.Allocator, conn: zqlite.Conn, map_id: []const u8, p: Payload) !Marker {
const query =
\\INSERT INTO markers(id, map_id, lat, lng, color, name, description, icon, radius)
\\VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
;
const id: []const u8 = &nanoid.generate(std.crypto.random);
try conn.exec(query, .{ id, map_id, p.lat, p.lng, p.color, p.name, p.description, p.icon, p.radius });
return Marker{
.id = try allocator.dupe(u8, id),
.lat = p.lat,
.lng = p.lng,
.color = p.color,
.name = p.name,
.description = p.description,
.icon = p.icon,
.radius = p.radius,
};
}
pub fn update(conn: zqlite.Conn, id: []const u8, p: Payload) !Marker {
const query =
\\UPDATE markers
\\SET lat = ?, lng = ?, color = ?, name = ?, description = ?, icon = ?, radius = ?, updated_at = datetime()
\\WHERE id = ?
;
try conn.exec(query, .{ p.lat, p.lng, p.color, p.name, p.description, p.icon, p.radius, id });
return Marker{
.id = id,
.lat = p.lat,
.lng = p.lng,
.color = p.color,
.name = p.name,
.description = p.description,
.icon = p.icon,
.radius = p.radius,
};
}
pub fn delete(conn: zqlite.Conn, id: []const u8) !void {
const query =
\\DELETE FROM markers
\\WHERE id = ?
;
try conn.exec(query, .{id});
}
pub fn delete_by_map_id(conn: zqlite.Conn, map_id: []const u8) !void {
const query =
\\DELETE FROM markers
\\WHERE map_id = ?
;
try conn.exec(query, .{map_id});
}
|