From cf9af571611dfd26e9a77397b044641056a8ea44 Mon Sep 17 00:00:00 2001 From: Ugric Date: Sat, 1 Aug 2026 13:32:04 +0100 Subject: [PATCH] change to return dictionaries instead of arrays --- src/Makefile | 116 ----------------------------------------------- src/init.ar | 14 ++---- src/native/lib.c | 75 ++++++++++++++---------------- 3 files changed, 38 insertions(+), 167 deletions(-) delete mode 100644 src/Makefile diff --git a/src/Makefile b/src/Makefile deleted file mode 100644 index 6751e1d..0000000 --- a/src/Makefile +++ /dev/null @@ -1,116 +0,0 @@ -# SPDX-FileCopyrightText: 2025, 2026 William Bell -# -# SPDX-License-Identifier: MIT - -# ------------------------------------------------------------ -# Stdlib metadata -# ------------------------------------------------------------ -LIB := sqlite -SRC_DIR := native -BIN_DIR := native/bin - -# ------------------------------------------------------------ -# Target OS -# posix = Linux / FreeBSD / macOS -# windows = Windows (via MinGW-w64) -# ------------------------------------------------------------ -TARGET_OS ?= posix -UNAME_S := $(shell uname -s) - -# ------------------------------------------------------------ -# Toolchain & platform specifics -# ------------------------------------------------------------ -ifeq ($(TARGET_OS),windows) - - CC := x86_64-w64-mingw32-gcc - LIB_EXT := dll - - SHARED_LDFLAGS := -shared - PLATFORM_LDFLAGS := -lsqlite3 - - PLATFORM_CFLAGS := - -else ifeq ($(UNAME_S),Darwin) - - CC := gcc - LIB_EXT := dylib - - SHARED_LDFLAGS := \ - -dynamiclib \ - -Wl,-install_name,@rpath/$(LIB).dylib - - PLATFORM_LDFLAGS := - PLATFORM_CFLAGS := - -else - - # Linux / FreeBSD - CC := gcc - LIB_EXT := so - - SHARED_LDFLAGS := -shared - PLATFORM_LDFLAGS := -lsqlite3 -lpthread -ldl - PLATFORM_CFLAGS := - -endif - -# ------------------------------------------------------------ -# Common flags -# ------------------------------------------------------------ -COMMON_CFLAGS := \ - -fPIC \ - -fvisibility=hidden \ - -Wall -Wextra \ - -Werror=unused-result - -ARGON_INCLUDE ?= ../../include - -# ------------------------------------------------------------ -# Sources -# ------------------------------------------------------------ -SRC := $(wildcard $(SRC_DIR)/*.c) -OUT := $(BIN_DIR)/$(LIB).$(LIB_EXT) - -# ------------------------------------------------------------ -# Phony targets -# ------------------------------------------------------------ -.PHONY: all debug full-debug native clean - -# ------------------------------------------------------------ -# Default target -# ------------------------------------------------------------ -all: $(OUT) - -# ------------------------------------------------------------ -# Build rule -# ------------------------------------------------------------ -$(OUT): $(SRC) - @echo "==> Building stdlib: $(LIB) ($(TARGET_OS))" - @mkdir -p $(BIN_DIR) - $(CC) \ - $(COMMON_CFLAGS) \ - $(PLATFORM_CFLAGS) \ - $(CFLAGS) \ - -I$(ARGON_INCLUDE) \ - $(SHARED_LDFLAGS) \ - -o $@ \ - $^ \ - $(PLATFORM_LDFLAGS) - -# ------------------------------------------------------------ -# Build variants -# ------------------------------------------------------------ -debug: - $(MAKE) CFLAGS="-g" all - -full-debug: - $(MAKE) CFLAGS="-g -fsanitize=address -fno-omit-frame-pointer" all - -native: - $(MAKE) CFLAGS="-march=native" all - -# ------------------------------------------------------------ -# Cleanup -# ------------------------------------------------------------ -clean: - rm -rf $(BIN_DIR) diff --git a/src/init.ar b/src/init.ar index 3f523ee..b5725a9 100644 --- a/src/init.ar +++ b/src/init.ar @@ -14,16 +14,12 @@ class execute do self.__stmt__ = stmt __native__.execute_statement(db, stmt, values, SqliteError) this.__iter__(self) = self - this.__next__(self) = do - let output = [] - __native__.statement_fetch(self.__db__, self.__stmt__, output.append, SqliteError) - return output + this.__next__(self) = __native__.statement_fetch(self.__db__, self.__stmt__, SqliteError) this.fetch_one(self) = do - let result = self.__next__() - if (result == signals.end_iteration) do - term.log("no more rows! throw") # todo: add error throwing please ffs me - return - return result + try do + return self.__next__() + catch (StopIteration) do + throw SqliteError("out of rows") this.fetch_many(self) = do let result = [] for (row in self) do diff --git a/src/native/lib.c b/src/native/lib.c index 01496d4..86f78be 100644 --- a/src/native/lib.c +++ b/src/native/lib.c @@ -2,10 +2,10 @@ // // SPDX-License-Identifier: MIT +#include "sqlite/sqlite3.h" #include #include #include -#include "sqlite/sqlite3.h" #include #include #include @@ -88,8 +88,7 @@ ARGON_FUNCTION(new_statement, { (const char **)&query.data); if (rc) { - return api->throw_argon_error(err, argv[2], "%s", - sqlite3_errmsg(*db)); + return api->throw_argon_error(err, argv[2], "%s", sqlite3_errmsg(*db)); } return statement_obj; @@ -114,8 +113,7 @@ ARGON_FUNCTION(finalise_statement, { int rc = sqlite3_finalize(*stmt); if (rc) { - return api->throw_argon_error(err, argv[2], "%s", - sqlite3_errmsg(*db)); + return api->throw_argon_error(err, argv[2], "%s", sqlite3_errmsg(*db)); } return api->ARGON_NULL; @@ -155,8 +153,7 @@ ARGON_FUNCTION(execute_statement, { int rc = sqlite3_bind_text(*stmt, i + 1, str.data, str.length, SQLITE_TRANSIENT); if (rc != SQLITE_OK) { - return api->throw_argon_error(err, argv[3], "%s", - sqlite3_errmsg(*db)); + return api->throw_argon_error(err, argv[3], "%s", sqlite3_errmsg(*db)); } break; } @@ -188,8 +185,7 @@ ARGON_FUNCTION(execute_statement, { int rc = sqlite3_bind_int64(*stmt, i + 1, item == api->ARGON_TRUE ? 1 : 0); if (rc != SQLITE_OK) { - return api->throw_argon_error(err, argv[3], "%s", - sqlite3_errmsg(*db)); + return api->throw_argon_error(err, argv[3], "%s", sqlite3_errmsg(*db)); } break; } @@ -200,16 +196,14 @@ ARGON_FUNCTION(execute_statement, { int rc = sqlite3_bind_blob(*stmt, i + 1, buf.data, buf.size, SQLITE_TRANSIENT); if (rc != SQLITE_OK) { - return api->throw_argon_error(err, argv[3], "%s", - sqlite3_errmsg(*db)); + return api->throw_argon_error(err, argv[3], "%s", sqlite3_errmsg(*db)); } break; } case TYPE_NULL: { int rc = sqlite3_bind_null(*stmt, i + 1); if (rc != SQLITE_OK) { - return api->throw_argon_error(err, argv[3], "%s", - sqlite3_errmsg(*db)); + return api->throw_argon_error(err, argv[3], "%s", sqlite3_errmsg(*db)); } break; } @@ -220,8 +214,7 @@ ARGON_FUNCTION(execute_statement, { int rc = sqlite3_step(*stmt); if (rc != SQLITE_DONE) { - return api->throw_argon_error(err, argv[3], "%s", - sqlite3_errmsg(*db)); + return api->throw_argon_error(err, argv[3], "%s", sqlite3_errmsg(*db)); } } @@ -229,7 +222,7 @@ ARGON_FUNCTION(execute_statement, { }) ARGON_FUNCTION(statement_fetch, { - if (api->fix_to_arg_size(4, argc, err)) { + if (api->fix_to_arg_size(3, argc, err)) { return api->ARGON_NULL; } @@ -240,7 +233,6 @@ ARGON_FUNCTION(statement_fetch, { struct buffer statment = api->argon_buffer_to_buffer(argv[1], err); if (api->is_error(err)) return api->ARGON_NULL; - ArgonObject *append = argv[2]; sqlite3 **db = (sqlite3 **)db_buffer.data; sqlite3_stmt **stmt = (sqlite3_stmt **)statment.data; @@ -249,29 +241,29 @@ ARGON_FUNCTION(statement_fetch, { if (rc == SQLITE_ROW) { int num_cols = sqlite3_column_count(*stmt); + ArgonHashmap *hashmap = api->create_hashmap(); + for (int i = 0; i < num_cols; i++) { const char *col_name = sqlite3_column_name(*stmt, i); int col_type = sqlite3_column_type(*stmt, i); switch (col_type) { case SQLITE_INTEGER: - api->call(append, 1, - (ArgonObject *[]){ - api->i64_to_argon(sqlite3_column_int64(*stmt, i))}, NULL, - err, state); + api->add_to_hashmap_string_key( + hashmap, (char *)col_name, + api->i64_to_argon(sqlite3_column_int64(*stmt, i))); break; case SQLITE_FLOAT: - api->call(append, 1, - (ArgonObject *[]){ - api->double_to_argon(sqlite3_column_double(*stmt, i))}, NULL, - err, state); + api->add_to_hashmap_string_key( + hashmap, (char *)col_name, + api->double_to_argon(sqlite3_column_double(*stmt, i))); break; case SQLITE_TEXT: { char *str = (char *)sqlite3_column_text(*stmt, i); - api->call(append, 1, - (ArgonObject *[]){ - api->string_to_argon((struct string){str, strlen(str)})}, NULL, - err, state); + + api->add_to_hashmap_string_key( + hashmap, (char *)col_name, + api->string_to_argon((struct string){str, strlen(str)})); break; } case SQLITE_BLOB: { @@ -282,29 +274,28 @@ ARGON_FUNCTION(statement_fetch, { break; const void *blob_buf = sqlite3_column_blob(*stmt, i); memcpy(buf.data, blob_buf, size); - api->call(append, 1, (ArgonObject *[]){buffer_obj}, NULL, err, state); + + api->add_to_hashmap_string_key(hashmap, (char *)col_name, buffer_obj); break; } case SQLITE_NULL: - api->call(append, 1, (ArgonObject *[]){api->ARGON_NULL}, NULL, err, state); + api->add_to_hashmap_string_key(hashmap, (char *)col_name, + api->ARGON_NULL); break; } } - return api->ARGON_NULL; + return api->hashmap_to_dictionary(hashmap); } else if (rc != SQLITE_DONE) { - return api->throw_argon_error(err, argv[3], "%s", - sqlite3_errmsg(*db)); + return api->throw_argon_error(err, argv[2], "%s", sqlite3_errmsg(*db)); } return api->throw_argon_signal(err, api->SignalStopIteration); }) INIT_ARGON_MODULE({ - REGISTER_ARGON_FUNCTION(connect_database) - REGISTER_ARGON_FUNCTION(close_database) - - REGISTER_ARGON_FUNCTION(new_statement) - REGISTER_ARGON_FUNCTION(finalise_statement) - - REGISTER_ARGON_FUNCTION(execute_statement) - REGISTER_ARGON_FUNCTION(statement_fetch) + REGISTER_ARGON_FUNCTION(connect_database); + REGISTER_ARGON_FUNCTION(close_database); + REGISTER_ARGON_FUNCTION(new_statement); + REGISTER_ARGON_FUNCTION(finalise_statement); + REGISTER_ARGON_FUNCTION(execute_statement); + REGISTER_ARGON_FUNCTION(statement_fetch); }) \ No newline at end of file