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
|
const std = @import("std");
const sqlite = @import("sqlite");
pub export fn main() callconv(.C) void {
zigMain() catch unreachable;
}
pub fn zigMain() !void {
var gpa = std.heap.GeneralPurposeAllocator(.{}){};
defer std.debug.assert(gpa.deinit() == false);
const allocator = gpa.allocator();
// Read the data from stdin
const stdin = std.io.getStdIn();
const data = try stdin.readToEndAlloc(allocator, std.math.maxInt(usize));
defer allocator.free(data);
var db = try sqlite.Db.init(.{
.mode = .Memory,
.open_flags = .{
.write = true,
.create = true,
},
});
defer db.deinit();
try db.exec("CREATE TABLE test(id integer primary key, name text, data blob)", .{}, .{});
db.execDynamic(data, .{}, .{}) catch |err| switch (err) {
error.SQLiteError => return,
error.ExecReturnedData => return,
else => return err,
};
db.execDynamic(
"INSERT INTO test(name, data) VALUES($name, $data)",
.{},
.{
.name = data,
.data = data,
},
) catch |err| switch (err) {
error.SQLiteError => return,
else => return err,
};
var stmt = db.prepareDynamic("SELECT name, data FROM test") catch |err| switch (err) {
error.SQLiteError => return,
else => return err,
};
defer stmt.deinit();
var rows_arena = std.heap.ArenaAllocator.init(allocator);
defer rows_arena.deinit();
const row_opt = stmt.oneAlloc(
struct {
name: sqlite.Text,
data: sqlite.Blob,
},
rows_arena.allocator(),
.{},
.{},
) catch |err| switch (err) {
error.SQLiteError => return,
else => return err,
};
if (row_opt) |row| {
if (!std.mem.eql(u8, row.name.data, data)) return error.InvalidNameField;
if (!std.mem.eql(u8, row.data.data, data)) return error.InvalidDataField;
} else {
return error.NoRowsFound;
}
}
|