From 172ddd3e0fc0b2391e67604e78413d64d08ac6cb Mon Sep 17 00:00:00 2001 From: Rene Schallner Date: Thu, 19 Jan 2023 21:24:22 +0100 Subject: [PATCH] Endpoint better json handling --- examples/endpoint/endpoint.zig | 27 ++++++++++++++++++++------- src/util.zig | 8 ++++---- 2 files changed, 24 insertions(+), 11 deletions(-) diff --git a/examples/endpoint/endpoint.zig b/examples/endpoint/endpoint.zig index a7523e5..77c771a 100644 --- a/examples/endpoint/endpoint.zig +++ b/examples/endpoint/endpoint.zig @@ -64,18 +64,31 @@ fn getUser(e: *zap.SimpleEndpoint, r: zap.SimpleRequest) void { fn listUsers(e: *zap.SimpleEndpoint, r: zap.SimpleRequest) void { _ = e; + + // 1MB json buffer + var jsonbuf: [1024 * 1024]u8 = undefined; + var l: std.ArrayList(User) = std.ArrayList(User).init(alloc); if (users.list(&l)) {} else |_| { return; } - // attention: if you add too many users, this will not be enough - var jsonbuf: [1024 * 1024]u8 = undefined; - if (zap.stringifyArrayListBuf(&jsonbuf, User, &l, .{})) |maybe_json| { - if (maybe_json) |json| { - _ = r.sendJson(json); + var maybe_json: ?[]const u8 = null; + var maybe_free: ?std.ArrayList(u8) = null; + // if (users.count > 0) { + if (users.count > 20000) { + // if > 20000 users, 1MB might not be enough for json + if (zap.stringifyArrayListAlloc(alloc, User, &l, .{}) catch null) |string| { + maybe_free = string; + maybe_json = string.items; } - } else |_| { - return; + } else { + maybe_json = zap.stringifyArrayListBuf(&jsonbuf, User, &l, .{}) catch null; + } + if (maybe_json) |json| { + _ = r.sendJson(json); + } + if (maybe_free) |free| { + free.deinit(); } } diff --git a/src/util.zig b/src/util.zig index 237cf54..021524e 100644 --- a/src/util.zig +++ b/src/util.zig @@ -87,10 +87,10 @@ pub fn stringifyAlloc( a: std.mem.Allocator, value: anytype, options: std.json.StringifyOptions, -) ?[]const u8 { +) ?std.ArrayList(u8) { var string = std.ArrayList(u8).init(a); if (std.json.stringify(value, options, string.writer())) { - return string.items; + return string; } else |_| { // error return null; } @@ -102,7 +102,7 @@ pub fn stringifyArrayListAlloc( comptime T: anytype, list: *std.ArrayList(T), options: std.json.StringifyOptions, -) !?[]const u8 { +) !?std.ArrayList(u8) { var string = std.ArrayList(u8).init(a); var writer = string.writer(); try writer.writeByte('['); @@ -113,5 +113,5 @@ pub fn stringifyArrayListAlloc( try std.json.stringify(user, options, string.writer()); } try writer.writeByte(']'); - return string.items; + return string; }