change to return dictionaries instead of arrays
This commit is contained in:
1 parent
1be586dc8c
commit
cf9af57161
3 files changed
+38
-167
No files matched your search
-116
@@ -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
@@ -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
@@ -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);
|
||||
})
|
||||
Reference in new issue
Block a user