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; }