From 483c82e02c9dc2465f97069a32363d8c1fe09380 Mon Sep 17 00:00:00 2001 From: vms Date: Mon, 14 Sep 2020 21:00:27 +0300 Subject: [PATCH] add IT support --- .gitignore | 3 +++ Config.toml | 6 ++++++ Makefile | 8 +++++--- sdk/logger.h | 2 +- sqlite3.wit | 44 ++++++++++++++++++++++++++++++++++++++++++++ src/wrapper.c | 45 +++++++++++++++++++++------------------------ 6 files changed, 80 insertions(+), 28 deletions(-) create mode 100644 Config.toml create mode 100644 sqlite3.wit diff --git a/.gitignore b/.gitignore index f1c5605..6a8e533 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,6 @@ # Wasm files *.wasm *.wat + +# REPL history +.repl_history diff --git a/Config.toml b/Config.toml new file mode 100644 index 0000000..93f6737 --- /dev/null +++ b/Config.toml @@ -0,0 +1,6 @@ +modules_dir = "./" + +[[module]] + name = "sqlite3" + mem_pages_count = 100 + logger_enabled = true diff --git a/Makefile b/Makefile index 2869651..4873073 100644 --- a/Makefile +++ b/Makefile @@ -7,9 +7,11 @@ LDFLAGS = -Wl,--no-entry,--demangle,--allow-undefined EXPORT_FUNCS = \ --export=allocate,$\ --export=deallocate,$\ - --export=invoke,$\ - --export=load,$\ - --export=store + --export=set_result_size,$\ + --export=set_result_ptr,$\ + --export=get_result_size,$\ + --export=get_result_ptr,$\ + --export=invoke SQLITE_SRC = \ src/alter.c\ src/analyze.c\ diff --git a/sdk/logger.h b/sdk/logger.h index 0b93d39..35e1839 100644 --- a/sdk/logger.h +++ b/sdk/logger.h @@ -2,7 +2,7 @@ #define FLUENCE_C_SDK_LOGGER_H #define __LOGGER_IMPORT(name) \ - __attribute__((__import_module__("logger"), __import_name__(#name))) + __attribute__((__import_module__("host"), __import_name__(#name))) /** * Writes provided utf8 string to Wasm VM logger. diff --git a/sqlite3.wit b/sqlite3.wit new file mode 100644 index 0000000..c5c3796 --- /dev/null +++ b/sqlite3.wit @@ -0,0 +1,44 @@ +;; Fluence SQLite fork Wasm Interface Types + +;; allocate +(@interface type (func (param i32) (result i32))) ;; 0 + +;; deallocate +(@interface type (func (param i32 i32))) ;; 1 + +;; invoke +(@interface type (func (param string) (result string))) ;; 2 + +;; get_result_ptr/get_result_size +(@interface type (func (result i32))) ;; 3 + +;; set_result_ptr/set_result_size +(@interface type (func (param i32))) ;; 4 + + +(@interface export "allocate" (func 0)) ;; 0 +(@interface export "deallocate" (func 1)) ;; 1 +(@interface export "invoke" (func 2)) ;; 2 +(@interface export "get_result_size" (func 3)) ;; 3 +(@interface export "get_result_ptr" (func 3)) ;; 4 +(@interface export "set_result_size" (func 4)) ;; 5 +(@interface export "set_result_ptr" (func 4)) ;; 6 + +;; adapter for export invoke function +(@interface func (type 2) + arg.get 0 + string.size + call-core 0 ;; call allocate + arg.get 0 + string.lower_memory + call-core 2 ;; call invoke + call-core 4 ;; call get_result_size + call-core 3 ;; call get_result_ptr + string.lift_memory + call-core 4 ;; call get_result_size + call-core 3 ;; call get_result_ptr + call-core 1 ;; call deallocate +) + +;; Implementations +(@interface implement (func 2) (func 2)) diff --git a/src/wrapper.c b/src/wrapper.c index 32c5c36..c2d9a26 100644 --- a/src/wrapper.c +++ b/src/wrapper.c @@ -3,6 +3,8 @@ #include "sqliteInt.h" sqlite3 *state; +char *RESULT_PTR; +int RESULT_SIZE; int init() { const int rc = sqlite3_initialize(); @@ -15,14 +17,6 @@ int init() { int g_isInited = 0; -void store(char *ptr, unsigned char byte) { - *ptr = byte; -} - -unsigned char load(const unsigned char *ptr) { - return *ptr; -} - void* allocate(size_t size) { return malloc(size + 1); } @@ -31,15 +25,20 @@ void deallocate(void *ptr, int size) { free(ptr); } -char *write_response(char *response, int response_size) { - char *result_response = allocate(response_size + 4); +void set_result_ptr(char *ptr) { + RESULT_PTR = ptr; +} - for(int i = 0; i < 4; ++i) { - result_response[i] = (response_size >> 8*i) & 0xFF; - } +void set_result_size(int size) { + RESULT_SIZE = size; +} - memcpy(result_response + 4, response, response_size); - return result_response; +int get_result_size(void) { + return RESULT_SIZE; +} + +char *get_result_ptr() { + return RESULT_PTR; } typedef struct ShellText ShellText; @@ -114,7 +113,7 @@ static int captureOutputCallback(void *pArg, int nArg, char **azArg, char **az){ return 0; } -const char *invoke(char *request, int request_size) { +void invoke(char *request, int request_size) { if(g_isInited == 0) { // TODO: check the return code init(); @@ -141,19 +140,17 @@ const char *invoke(char *request, int request_size) { char *response = 0; if(rc || errorMessage) { - response = write_response(errorMessage, strlen(errorMessage)); + RESULT_PTR = errorMessage; + RESULT_SIZE = strlen(errorMessage); } else { if(str.n != 0) { - response = write_response(str.z, str.n); + RESULT_PTR = str.z; + RESULT_SIZE = str.n; } else { // if a request was successfull, sqlite doesn't return anything as the result string - const char success_result[] = "OK"; - response = write_response((char *)success_result, strlen(success_result)); + RESULT_PTR = strdup("OK"); + RESULT_SIZE = 2; } } - - freeText(&str); - - return response; }