Skip to content

Instantly share code, notes, and snippets.

@desttinghim
Created February 1, 2020 22:52
Show Gist options
  • Save desttinghim/230e5ece5702f01a14cbd0b6e3407e9f to your computer and use it in GitHub Desktop.
Save desttinghim/230e5ece5702f01a14cbd0b6e3407e9f to your computer and use it in GitHub Desktop.
Zig Sqlite
const std = @import("std");
usingnamespace @cImport({
@cInclude("sqlite3.h");
});
const Error = error{
CantOpen,
Error,
Busy,
Done,
Row,
Misuse,
Unimplemented,
};
fn cb(data: ?*c_void, argc: c_int, argv: [*c][*c]u8, azColName: [*c][*c]u8) callconv(.C) c_int {
var i: usize = 0;
while (i < argc) {
if (argv[i] != null) {
std.debug.warn("{s} = {s}\n", .{ azColName[i], argv[i] });
} else {
std.debug.warn("{s} = {}\n", .{ azColName[i], "NULL" });
}
i += 1;
}
std.debug.warn("\n", .{});
return 0;
}
pub fn main() anyerror!void {
var raw_db: ?*sqlite3 = undefined;
if (sqlite3_open("test.db", &raw_db) != 0) {
std.debug.warn("Could not open sqlite database.", .{});
return Error.CantOpen;
}
defer _ = sqlite3_close(raw_db);
var db: *sqlite3 = @ptrCast(*sqlite3, raw_db);
var tb_create_sql: [*:0]const u8 =
\\ CREATE TABLE IF NOT EXISTS COMPANY(
\\ ID INT PRIMARY KEY NOT NULL,
\\ NAME TEXT NOT NULL,
\\ AGE INT NOT NULL,
\\ ADDRESS CHAR(50),
\\ SALARY REAL );
;
exec(db, tb_create_sql, cb) catch {
std.debug.warn("Failed to create table.\n", .{});
};
var insert_sql: [*:0]const u8 =
\\ INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
\\ VALUES (1, 'Paul', 32, 'California', 20000.00);
\\ INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
\\ VALUES (2, 'Allen', 25, 'Texas', 15000.00);
\\ INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
\\ VALUES (3, 'Teddy', 23, 'Norway', 20000.00);
\\ INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
\\ VALUES (3, 'Mark', 25, 'Rich-Mond', 65000.00);
;
exec(db, insert_sql, cb) catch {
std.debug.warn("Failed to insert values.\n", .{});
};
var select_sql: [*:0]const u8 = "SELECT * from COMPANY";
exec(db, select_sql, cb) catch {
std.debug.warn("Failed to select values.\n", .{});
};
}
pub fn exec(db: *sqlite3, sql: [*:0]const u8, callback: fn(?*c_void, c_int, [*c][*c]u8, [*c][*c]u8) callconv(.C) c_int) !void {
var errmsg: ?[*:0]u8 = undefined;
var rc = sqlite3_exec(db, sql, callback, null, &errmsg);
switch (rc) {
SQLITE_OK => {
return;
},
SQLITE_ERROR => {
return Error.Error;
},
else => {
std.debug.warn("{}: {s}\n", .{rc, errmsg});
return Error.Unimplemented;
},
}
if (rc != SQLITE_OK) {
sqlite3_free(errmsg);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment