Skip to content

Commit e2fba68

Browse files
committed
On Apple systems use NSURLSession instead of libcurl
1 parent 1a93601 commit e2fba68

File tree

5 files changed

+313
-62
lines changed

5 files changed

+313
-62
lines changed

Makefile

Lines changed: 37 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
OMIT_LOCAL_ENGINE ?= 0
66
OMIT_REMOTE_ENGINE ?= 0
77
OMIT_IO ?= 0
8+
OMIT_CURL ?= 0
89
LLAMA ?=
910
CURL_VERSION ?= 8.12.1
1011
MBEDTLS_VERSION ?= 3.6.5
@@ -268,30 +269,38 @@ ifeq ($(OMIT_LOCAL_ENGINE),0)
268269
LINKER := $(CXX)
269270
BUILD_DEPS := llama
270271
else
271-
DEFINES += -DDBMEM_OMIT_LOCAL_ENGINE
272+
override DEFINES += -DDBMEM_OMIT_LOCAL_ENGINE
272273
LLAMA_LIBS :=
273274
LINKER := $(CC)
274275
BUILD_DEPS :=
275276
endif
276277

277278
ifeq ($(OMIT_REMOTE_ENGINE),0)
278279
C_SOURCES += $(SRC_DIR)/dbmem-rembed.c
279-
INCLUDES += -I$(CURL_DIR)/include
280-
CURL_DEPS := $(CURL_LIB)
281-
LDFLAGS += $(CURL_SSL_LIBS)
282-
ifeq ($(PLATFORM),windows)
283-
CFLAGS += -DCURL_STATICLIB
280+
ifeq ($(OMIT_CURL),1)
281+
override DEFINES += -DDBMEM_OMIT_CURL
282+
OBJC_SOURCES := $(SRC_DIR)/dbmem-http.m
283+
LDFLAGS += -framework Foundation
284+
CURL_DEPS :=
285+
else
286+
INCLUDES += -I$(CURL_DIR)/include
287+
CURL_DEPS := $(CURL_LIB)
288+
LDFLAGS += $(CURL_SSL_LIBS)
289+
ifeq ($(PLATFORM),windows)
290+
CFLAGS += -DCURL_STATICLIB
291+
endif
284292
endif
285293
else
286-
DEFINES += -DDBMEM_OMIT_REMOTE_ENGINE
294+
override DEFINES += -DDBMEM_OMIT_REMOTE_ENGINE
287295
CURL_DEPS :=
288296
endif
289297

290298
ifeq ($(OMIT_IO),1)
291-
DEFINES += -DDBMEM_OMIT_IO
299+
override DEFINES += -DDBMEM_OMIT_IO
292300
endif
293301

294302
C_OBJECTS := $(patsubst $(SRC_DIR)/%.c,$(BUILD_DIR)/%.o,$(C_SOURCES))
303+
OBJC_OBJECTS := $(patsubst $(SRC_DIR)/%.m,$(BUILD_DIR)/%.o,$(OBJC_SOURCES))
295304

296305
TARGET := $(DIST_DIR)/$(OUTPUT_NAME).$(EXT)
297306

@@ -342,9 +351,13 @@ $(BUILD_DIR)/%.o: $(SRC_DIR)/%.c | $(BUILD_DIR)
342351
@echo "Compiling $<..."
343352
@$(CC) $(CFLAGS) $(DEFINES) $(INCLUDES) -c $< -o $@
344353

345-
$(TARGET): $(C_OBJECTS) $(LLAMA_LIBS) $(CURL_DEPS) | $(DIST_DIR)
354+
$(BUILD_DIR)/%.o: $(SRC_DIR)/%.m | $(BUILD_DIR)
355+
@echo "Compiling $<..."
356+
@$(CC) $(CFLAGS) $(DEFINES) $(INCLUDES) -fobjc-arc -c $< -o $@
357+
358+
$(TARGET): $(C_OBJECTS) $(OBJC_OBJECTS) $(LLAMA_LIBS) $(CURL_DEPS) | $(DIST_DIR)
346359
@echo "Linking $(TARGET)..."
347-
@$(LINKER) $(C_OBJECTS) $(LLAMA_LIBS) $(CURL_DEPS) $(LDFLAGS) -o $(TARGET)
360+
@$(LINKER) $(C_OBJECTS) $(OBJC_OBJECTS) $(LLAMA_LIBS) $(CURL_DEPS) $(LDFLAGS) -o $(TARGET)
348361
$(STRIP_CMD)
349362
@echo "Build complete: $(TARGET)"
350363

@@ -375,7 +388,11 @@ ifeq ($(OMIT_LOCAL_ENGINE),0)
375388
endif
376389
endif
377390
ifeq ($(OMIT_REMOTE_ENGINE),0)
378-
TEST_LINK_EXTRAS += $(CURL_LIB) $(CURL_SSL_LIBS)
391+
ifneq ($(OMIT_CURL),1)
392+
TEST_LINK_EXTRAS += $(CURL_LIB) $(CURL_SSL_LIBS)
393+
else
394+
TEST_LINK_EXTRAS += -framework Foundation
395+
endif
379396
endif
380397

381398
# Android: compile SQLite amalgamation into unittest (set SQLITE_AMALGAM=path/to/sqlite3.c)
@@ -393,25 +410,30 @@ $(BUILD_DIR)/test-%.o: $(SRC_DIR)/%.c | $(BUILD_DIR)
393410
@echo "Compiling $< (for test)..."
394411
@$(CC) $(CFLAGS) $(TEST_DEFINES) $(DEFINES) $(INCLUDES) -c $< -o $@
395412

413+
$(BUILD_DIR)/test-%.o: $(SRC_DIR)/%.m | $(BUILD_DIR)
414+
@echo "Compiling $< (for test)..."
415+
@$(CC) $(CFLAGS) $(TEST_DEFINES) $(DEFINES) $(INCLUDES) -fobjc-arc -c $< -o $@
416+
396417
$(BUILD_DIR)/test-sqlite3.o: $(SQLITE_AMALGAM) | $(BUILD_DIR)
397418
@echo "Compiling sqlite3.c (amalgamation)..."
398419
@$(CC) $(CFLAGS) -DSQLITE_ENABLE_FTS5 -c $< -o $@
399420

400421
TEST_C_OBJECTS := $(patsubst $(SRC_DIR)/%.c,$(BUILD_DIR)/test-%.o,$(C_SOURCES))
422+
TEST_OBJC_OBJECTS := $(patsubst $(SRC_DIR)/%.m,$(BUILD_DIR)/test-%.o,$(OBJC_SOURCES))
401423

402-
$(BUILD_DIR)/unittest: $(BUILD_DIR)/unittest.o $(TEST_C_OBJECTS) $(TEST_SQLITE_OBJ) $(LLAMA_LIBS) $(CURL_DEPS) | $(BUILD_DIR)
424+
$(BUILD_DIR)/unittest: $(BUILD_DIR)/unittest.o $(TEST_C_OBJECTS) $(TEST_OBJC_OBJECTS) $(TEST_SQLITE_OBJ) $(LLAMA_LIBS) $(CURL_DEPS) | $(BUILD_DIR)
403425
@echo "Linking unittest..."
404-
@$(LINKER) $(BUILD_DIR)/unittest.o $(TEST_C_OBJECTS) $(TEST_SQLITE_OBJ) $(LLAMA_LIBS) \
426+
@$(LINKER) $(BUILD_DIR)/unittest.o $(TEST_C_OBJECTS) $(TEST_OBJC_OBJECTS) $(TEST_SQLITE_OBJ) $(LLAMA_LIBS) \
405427
$(TEST_LDFLAGS) $(FRAMEWORKS) $(TEST_LINK_EXTRAS) \
406428
-o $@
407429

408430
$(BUILD_DIR)/e2e.o: $(TEST_DIR)/e2e.c | $(BUILD_DIR)
409431
@echo "Compiling e2e.c..."
410432
@$(CC) $(CFLAGS) $(TEST_DEFINES) $(DEFINES) $(INCLUDES) -c $< -o $@
411433

412-
$(BUILD_DIR)/e2e: $(BUILD_DIR)/e2e.o $(TEST_C_OBJECTS) $(TEST_SQLITE_OBJ) $(LLAMA_LIBS) $(CURL_DEPS) | $(BUILD_DIR)
434+
$(BUILD_DIR)/e2e: $(BUILD_DIR)/e2e.o $(TEST_C_OBJECTS) $(TEST_OBJC_OBJECTS) $(TEST_SQLITE_OBJ) $(LLAMA_LIBS) $(CURL_DEPS) | $(BUILD_DIR)
413435
@echo "Linking e2e..."
414-
@$(LINKER) $(BUILD_DIR)/e2e.o $(TEST_C_OBJECTS) $(TEST_SQLITE_OBJ) $(LLAMA_LIBS) \
436+
@$(LINKER) $(BUILD_DIR)/e2e.o $(TEST_C_OBJECTS) $(TEST_OBJC_OBJECTS) $(TEST_SQLITE_OBJ) $(LLAMA_LIBS) \
415437
$(TEST_LDFLAGS) $(FRAMEWORKS) $(TEST_LINK_EXTRAS) \
416438
-o $@
417439

src/dbmem-http.h

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
//
2+
// dbmem-http.h
3+
// sqlitememory
4+
//
5+
// Created by Marco Bambini on 17/03/26.
6+
//
7+
8+
#ifndef __DBMEM_HTTP__
9+
#define __DBMEM_HTTP__
10+
11+
#include <stddef.h>
12+
13+
#ifdef __cplusplus
14+
extern "C" {
15+
#endif
16+
17+
// Synchronous HTTP POST using NSURLSession.
18+
// Returns 0 on success, -1 on error.
19+
// On success: *out_data is malloc'd response body (caller frees), *out_size is its length, *out_http_code is the status.
20+
// On error: err_msg is filled with a description.
21+
int dbmem_http_post(const char *url, const char *api_key, const char *body,
22+
void **out_data, size_t *out_size, long *out_http_code,
23+
char *err_msg, size_t err_msg_size);
24+
25+
#ifdef __cplusplus
26+
}
27+
#endif
28+
29+
#endif

src/dbmem-http.m

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
//
2+
// dbmem-http.m
3+
// sqlitememory
4+
//
5+
// Created by Marco Bambini on 17/03/26.
6+
//
7+
8+
#import <Foundation/Foundation.h>
9+
#include "dbmem-http.h"
10+
#include <string.h>
11+
#include <stdlib.h>
12+
13+
int dbmem_http_post(const char *url, const char *api_key, const char *body,
14+
void **out_data, size_t *out_size, long *out_http_code,
15+
char *err_msg, size_t err_msg_size) {
16+
@autoreleasepool {
17+
NSURL *nsurl = [NSURL URLWithString:[NSString stringWithUTF8String:url]];
18+
if (!nsurl) {
19+
snprintf(err_msg, err_msg_size, "Invalid URL: %s", url);
20+
return -1;
21+
}
22+
23+
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:nsurl];
24+
request.HTTPMethod = @"POST";
25+
request.timeoutInterval = 30;
26+
27+
NSString *auth = [NSString stringWithFormat:@"Bearer %s", api_key];
28+
[request setValue:auth forHTTPHeaderField:@"Authorization"];
29+
[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
30+
31+
request.HTTPBody = [NSData dataWithBytes:body length:strlen(body)];
32+
33+
dispatch_semaphore_t sem = dispatch_semaphore_create(0);
34+
__block NSData *responseData = nil;
35+
__block NSHTTPURLResponse *httpResponse = nil;
36+
__block NSError *requestError = nil;
37+
38+
NSURLSessionDataTask *task = [[NSURLSession sharedSession]
39+
dataTaskWithRequest:request
40+
completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
41+
responseData = data;
42+
httpResponse = (NSHTTPURLResponse *)response;
43+
requestError = error;
44+
dispatch_semaphore_signal(sem);
45+
}];
46+
[task resume];
47+
dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);
48+
49+
if (requestError) {
50+
snprintf(err_msg, err_msg_size, "%s", requestError.localizedDescription.UTF8String);
51+
return -1;
52+
}
53+
54+
*out_http_code = httpResponse.statusCode;
55+
*out_size = responseData.length;
56+
*out_data = malloc(responseData.length + 1);
57+
if (!*out_data) {
58+
snprintf(err_msg, err_msg_size, "Failed to allocate response buffer");
59+
return -1;
60+
}
61+
memcpy(*out_data, responseData.bytes, responseData.length);
62+
((char *)*out_data)[responseData.length] = '\0';
63+
64+
return 0;
65+
}
66+
}

0 commit comments

Comments
 (0)