change to return dictionaries instead of arrays

This commit is contained in:
Ugric committed 2026-08-01 13:32:04 +01:00
1 parent 1be586dc8c
commit cf9af57161
3 files changed
+38 -167

No files matched your search

-116
View File
@@ -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)
+5 -9
View File
@@ -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
+33 -42
View File
@@ -2,10 +2,10 @@
//
// SPDX-License-Identifier: MIT
#include "sqlite/sqlite3.h"
#include <Argon.h>
#include <ArgonFunction.h>
#include <ArgonTypes.h>
#include "sqlite/sqlite3.h"
#include <stddef.h>
#include <stdint.h>
#include <stdio.h>
@@ -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);
})