Created
February 1, 2020 22:52
-
-
Save desttinghim/230e5ece5702f01a14cbd0b6e3407e9f to your computer and use it in GitHub Desktop.
Zig Sqlite
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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