From d851c8f908fcae670424c50336d1ebf3675dfc3e Mon Sep 17 00:00:00 2001 From: MrBounty Date: Sat, 19 Oct 2024 18:43:39 +0200 Subject: [PATCH] DELETE UPDATE and ADD now send the list of affected uuid --- src/fileEngine.zig | 3 --- src/stuffs/errors.zig | 1 + src/ziqlParser.zig | 60 +++++++++++++++++++++++++++++++------------ 3 files changed, 44 insertions(+), 20 deletions(-) diff --git a/src/fileEngine.zig b/src/fileEngine.zig index a2502f6..92dee92 100644 --- a/src/fileEngine.zig +++ b/src/fileEngine.zig @@ -307,9 +307,6 @@ pub const FileEngine = struct { out_writer.print("{s}", .{output_fbs.getWritten()[0..36]}) catch return FileEngineError.WriteError; out_writer.writeAll("\", ") catch return FileEngineError.WriteError; for (try self.structName2structMembers(struct_name), try self.structName2DataType(struct_name)) |member_name, member_type| { - std.debug.print("Member name to send: {s}\n", .{self.locToSlice(member_name)}); - std.debug.print("Additional data: {d}\n", .{additional_data.member_to_find.items.len}); - token = data_toker.next(); // FIXME: When relationship will be implemented, need to check if the len of NON link is 0 if (!(additional_data.member_to_find.items.len == 0 or additional_data.contains(self.locToSlice(member_name)))) continue; diff --git a/src/stuffs/errors.zig b/src/stuffs/errors.zig index c0574f3..0eb1d01 100644 --- a/src/stuffs/errors.zig +++ b/src/stuffs/errors.zig @@ -6,6 +6,7 @@ pub const ZiQlParserError = error{ FeatureMissing, ParsingValueError, ConditionError, + WriteError, }; pub const SchemaParserError = error{ diff --git a/src/ziqlParser.zig b/src/ziqlParser.zig index 7ad2f91..c746ffb 100644 --- a/src/ziqlParser.zig +++ b/src/ziqlParser.zig @@ -100,6 +100,22 @@ pub const Parser = struct { send("{s}", .{buffer.items}); } + pub fn sendUUIDs(self: *Parser, uuid_list: []UUID) ZiQlParserError!void { + var buffer = std.ArrayList(u8).init(self.allocator); + defer buffer.deinit(); + + const writer = buffer.writer(); + writer.writeByte('[') catch return ZiQlParserError.WriteError; + for (uuid_list) |uuid| { + writer.writeByte('"') catch return ZiQlParserError.WriteError; + writer.writeAll(&uuid.format_uuid()) catch return ZiQlParserError.WriteError; + writer.writeAll("\", ") catch return ZiQlParserError.WriteError; + } + writer.writeByte(']') catch return ZiQlParserError.WriteError; + + send("{s}", .{buffer.items}); + } + pub fn parse(self: *Parser) !void { var token = self.toker.next(); var keep_next = false; // Use in the loop to prevent to get the next token when continue. Just need to make it true and it is reset at every loop @@ -217,9 +233,9 @@ pub const Parser = struct { // TODO: Optimize so it doesnt use parseFilter but just parse the file and directly check the condition. Here I end up parsing 2 times. .filter_and_update => switch (token.tag) { .l_brace => { - var array = std.ArrayList(UUID).init(self.allocator); - defer array.deinit(); - token = try self.parseFilter(&array, self.struct_name, true); + var uuids = std.ArrayList(UUID).init(self.allocator); + defer uuids.deinit(); + token = try self.parseFilter(&uuids, self.struct_name, true); if (token.tag != .keyword_to) return printError( "Error: Expected TO", @@ -242,7 +258,8 @@ pub const Parser = struct { defer data_map.deinit(); try self.parseNewData(&data_map); - try self.file_engine.updateEntities(self.struct_name, array.items, data_map); + try self.file_engine.updateEntities(self.struct_name, uuids.items, data_map); + try self.sendUUIDs(uuids.items); self.state = .end; }, .keyword_to => { @@ -277,21 +294,19 @@ pub const Parser = struct { .filter_and_delete => switch (token.tag) { .l_brace => { - var array = std.ArrayList(UUID).init(self.allocator); - defer array.deinit(); - _ = try self.parseFilter(&array, self.struct_name, true); - - const deleted_count = try self.file_engine.deleteEntities(self.struct_name, array.items); - std.debug.print("Successfully deleted {d} {s}\n", .{ deleted_count, self.struct_name }); + var uuids = std.ArrayList(UUID).init(self.allocator); + defer uuids.deinit(); + _ = try self.parseFilter(&uuids, self.struct_name, true); + _ = try self.file_engine.deleteEntities(self.struct_name, uuids.items); + try self.sendUUIDs(uuids.items); self.state = .end; }, .eof => { - var array = std.ArrayList(UUID).init(self.allocator); - defer array.deinit(); - try self.file_engine.getAllUUIDList(self.struct_name, &array); - - const deleted_count = try self.file_engine.deleteEntities(self.struct_name, array.items); - std.debug.print("Successfully deleted all {d} {s}\n", .{ deleted_count, self.struct_name }); + var uuids = std.ArrayList(UUID).init(self.allocator); + defer uuids.deinit(); + try self.file_engine.getAllUUIDList(self.struct_name, &uuids); + _ = try self.file_engine.deleteEntities(self.struct_name, uuids.items); + try self.sendUUIDs(uuids.items); self.state = .end; }, else => return printError( @@ -338,7 +353,18 @@ pub const Parser = struct { send("ZipponDB error: Couln't write new data to file", .{}); continue; }; - send("Successfully added new {s} with UUID: {s}", .{ self.struct_name, uuid.format_uuid() }); + + var buffer = std.ArrayList(u8).init(self.allocator); + defer buffer.deinit(); + + const writer = buffer.writer(); + writer.writeByte('[') catch return ZiQlParserError.WriteError; + writer.writeByte('"') catch return ZiQlParserError.WriteError; + writer.writeAll(&uuid.format_uuid()) catch return ZiQlParserError.WriteError; + writer.writeAll("\"") catch return ZiQlParserError.WriteError; + writer.writeByte(']') catch return ZiQlParserError.WriteError; + send("{s}", .{buffer.items}); + self.state = .end; },