add IT support

This commit is contained in:
vms 2020-09-14 21:00:27 +03:00
parent e39cf0d2ff
commit 483c82e02c
6 changed files with 80 additions and 28 deletions

3
.gitignore vendored
View File

@ -4,3 +4,6 @@
# Wasm files
*.wasm
*.wat
# REPL history
.repl_history

6
Config.toml Normal file
View File

@ -0,0 +1,6 @@
modules_dir = "./"
[[module]]
name = "sqlite3"
mem_pages_count = 100
logger_enabled = true

View File

@ -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\

View File

@ -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
View 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))

View File

@ -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;
}