mirror of
https://github.com/fluencelabs/sqlite
synced 2025-04-24 08:52:15 +00:00
add IT support
This commit is contained in:
parent
e39cf0d2ff
commit
483c82e02c
3
.gitignore
vendored
3
.gitignore
vendored
@ -4,3 +4,6 @@
|
||||
# Wasm files
|
||||
*.wasm
|
||||
*.wat
|
||||
|
||||
# REPL history
|
||||
.repl_history
|
||||
|
6
Config.toml
Normal file
6
Config.toml
Normal file
@ -0,0 +1,6 @@
|
||||
modules_dir = "./"
|
||||
|
||||
[[module]]
|
||||
name = "sqlite3"
|
||||
mem_pages_count = 100
|
||||
logger_enabled = true
|
8
Makefile
8
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\
|
||||
|
@ -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.
|
||||
|
44
sqlite3.wit
Normal file
44
sqlite3.wit
Normal file
@ -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))
|
@ -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;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user