@@ -83,7 +83,7 @@ fn inspect_input_binary(env: ?*c.ErlNifEnv, term: c.ERL_NIF_TERM) ?[]const u8 {
8383}
8484
8585fn is_safe_name (name : []const u8 ) bool {
86- if (name .len == 0 ) return false ;
86+ if (name .len == 0 or name . len > 255 ) return false ;
8787 for (name ) | ch | {
8888 if (std .ascii .isAlphanumeric (ch )) continue ;
8989 if (ch == '_' or ch == '-' or ch == '.' ) continue ;
@@ -109,20 +109,21 @@ fn nif_reason_from_semantic_error(err: semantic.SemanticError) [*:0]const u8 {
109109}
110110
111111fn is_stub_mode () bool {
112- const mode = std .process .getEnvVarOwned (c_allocator , "QDB_NIF_MODE" ) catch | err | switch (err ) {
113- error .EnvironmentVariableNotFound = > return true ,
114- else = > return true ,
115- };
116- defer c_allocator .free (mode );
117- return ! std .ascii .eqlIgnoreCase (mode , "live" );
112+ const mode = std .c .getenv ("QDB_NIF_MODE" );
113+ if (mode == null ) {
114+ std .debug .print ("DEBUG: QDB_NIF_MODE is null\n " , .{});
115+ return true ;
116+ }
117+ const mode_slice = std .mem .span (mode .? );
118+ std .debug .print ("DEBUG: QDB_NIF_MODE is '{s}'\n " , .{mode_slice });
119+ if (mode_slice .len == 0 ) return true ;
120+ return ! std .ascii .eqlIgnoreCase (mode_slice , "live" );
118121}
119122
120123fn get_base_url () HostCallError ! []u8 {
121- return std .process .getEnvVarOwned (c_allocator , "QDB_API_BASE_URL" ) catch | err | switch (err ) {
122- error .EnvironmentVariableNotFound = > c_allocator .dupe (u8 , "http://127.0.0.1:8080" ) catch error .OutOfMemory ,
123- error .OutOfMemory = > error .OutOfMemory ,
124- else = > error .InternalError ,
125- };
124+ const url_c = std .c .getenv ("QDB_API_BASE_URL" );
125+ const url = if (url_c != null ) std .mem .span (url_c .? ) else "http://127.0.0.1:8080" ;
126+ return c_allocator .dupe (u8 , url ) catch error .OutOfMemory ;
126127}
127128
128129fn build_endpoint_url (path_prefix : []const u8 , name : []const u8 ) HostCallError ! []u8 {
@@ -131,12 +132,18 @@ fn build_endpoint_url(path_prefix: []const u8, name: []const u8) HostCallError![
131132 const base_url = try get_base_url ();
132133 defer c_allocator .free (base_url );
133134
134- const trimmed = std .mem .trimRight (u8 , base_url , "/" );
135+ const trimmed = std .mem .trimEnd (u8 , base_url , "/" );
135136 return std .fmt .allocPrint (c_allocator , "{s}{s}{s}" , .{ trimmed , path_prefix , name }) catch error .OutOfMemory ;
136137}
137138
138139fn fetch_json (url : []const u8 , body : * std.Io.Writer.Allocating ) HostCallError ! void {
139- var client : std.http.Client = .{ .allocator = c_allocator };
140+ var threaded_io = std .Io .Threaded .init (c_allocator , .{});
141+ defer threaded_io .deinit ();
142+
143+ var client : std.http.Client = .{
144+ .allocator = c_allocator ,
145+ .io = threaded_io .io (),
146+ };
140147 defer client .deinit ();
141148
142149 const result = client .fetch (.{
@@ -301,6 +308,8 @@ pub export fn qdb_semantic_lookup(name_ptr: [*]const u8, name_len: usize, out_de
301308 const url = build_endpoint_url ("/api/semantic/" , name ) catch | err | return status_from_host_error (err );
302309 defer c_allocator .free (url );
303310
311+ std .debug .print ("DEBUG NIF FETCH: {s}\n " , .{url });
312+
304313 fetch_json (url , & body ) catch | err | return status_from_host_error (err );
305314
306315 var parsed = std .json .parseFromSlice (LookupApiResponse , c_allocator , body .written (), .{
0 commit comments