mgtzm/src/request.zig

95 lines
2.4 KiB
Zig

const std = @import("std");
const sqlite = @import("sqlite");
const Db = @import("Db.zig");
const Item = @import("Item.zig");
const Tag = @import("Tag.zig");
const json = @import("json.zig");
pub fn process(jobj: *json.Obj, db: *sqlite.Db) !void {
var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator);
defer arena.deinit();
const allocator = arena.allocator();
var jret = json.Obj.newObject();
defer jret.deinit();
// Test the action to carry and pass the object
if (jobj.objectGet("add") catch null) |*jaction| {
var ret = try add(jaction, db, allocator);
jret.objectAdd("added", &ret);
}
if (jobj.objectGet("query") catch null) |*jaction| {
var ret = try query(jaction, db, allocator);
jret.objectAdd("queried", &ret);
}
std.debug.print("{s}", .{ jret.toString() });
}
pub fn add(jobj: *json.Obj, db: *sqlite.Db, allocator: std.mem.Allocator) !json.Obj {
// TODO: Maybe return error when no items in the array?
// Freed by the caller
var jret = json.Obj.newArray();
var iter = jobj.arrayGetIterator();
while(iter.next()) |*jtags| {
var item = Item {
.id = null,
.tags = try Item.tagsFromJson(jtags, allocator),
};
item.deinit();
// Insert new items into the DB
try item.persist(db);
// Add item to new json array (Makes a deep copy, freed with jret.deinit())
jret.arrayAdd(&item.toJson());
}
return jret;
}
pub fn query(jobj: *json.Obj, db: *sqlite.Db, allocator: std.mem.Allocator) !json.Obj {
_ = db;
var jret = json.Obj.newArray();
const query_string = jobj.getString();
var keywords = std.ArrayList([]const u8).init(allocator);
var sql = std.ArrayList(u8).init(allocator);
try sql.appendSlice("SELECT * FROM item_tag WHERE");
var iter = std.mem.split(u8, query_string, " ");
var i: usize = 0;
while(iter.next()) |tag| {
defer i += 1;
try keywords.append(tag);
// Just put AND between keywords
if (i > 0) {
try sql.appendSlice(" AND");
}
// Exclude tags that start with !
try sql.appendSlice(" tag ");
if (tag[0] == '-') {
try sql.append('!');
}
try sql.appendSlice("= ?");
}
std.debug.print("{s}\n", .{sql.items});
//var stmt = try db.prepareDynamic();
//defer stmt.deinit();
//
return jret;
}