From 455ea8d14b03013b025ec35231d6242f6f996a1f Mon Sep 17 00:00:00 2001 From: Nelson-He Date: Wed, 30 Nov 2022 17:34:02 +0800 Subject: [PATCH 01/15] =?UTF-8?q?=E5=A2=9E=E5=8A=A0namespace=E5=AD=97?= =?UTF-8?q?=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- wasm/wasm_executor--1.0.sql | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/wasm/wasm_executor--1.0.sql b/wasm/wasm_executor--1.0.sql index ff2d52c..4743d1d 100644 --- a/wasm/wasm_executor--1.0.sql +++ b/wasm/wasm_executor--1.0.sql @@ -12,7 +12,8 @@ CREATE TABLE wasm.instances( ); CREATE TABLE wasm.exported_functions( - instanceid bigint, + instanceid bigint, + namespace text, funcname text, inputs text, outputs text @@ -108,7 +109,7 @@ BEGIN -- Insert the wasm information to gloable table INSERT INTO wasm.instances SELECT id, wasm_file FROM wasm_get_instances() WHERE id = current_instance_id; - INSERT INTO wasm.exported_functions SELECT current_instance_id, funcname, inputs, outputs FROM wasm_get_exported_functions(current_instance_id); + INSERT INTO wasm.exported_functions SELECT current_instance_id, namespace, funcname, inputs, outputs FROM wasm_get_exported_functions(current_instance_id); -- Generate functions for each exported functions from the WebAssembly instance. FOR -- Gitee From 07c0b679c8c01d3ff1daaa10f965d60acd51d23b Mon Sep 17 00:00:00 2001 From: Nelson-He Date: Wed, 22 Mar 2023 11:59:26 +0800 Subject: [PATCH 02/15] add delete interface --- wasm/wasm_executor--1.0.sql | 40 +++++++++++++++++++++++++++++++++++++ wasm/wasm_executor.cpp | 29 +++++++++++++++++++++++++++ 2 files changed, 69 insertions(+) diff --git a/wasm/wasm_executor--1.0.sql b/wasm/wasm_executor--1.0.sql index 4743d1d..46e07f5 100644 --- a/wasm/wasm_executor--1.0.sql +++ b/wasm/wasm_executor--1.0.sql @@ -42,6 +42,11 @@ RETURNS int8 AS 'MODULE_PATHNAME', 'wasm_create_instance' LANGUAGE C STRICT; +CREATE FUNCTION wasm_drop_instance(int8) +RETURNS text +AS 'MODULE_PATHNAME', 'wasm_drop_instance' +LANGUAGE C STRICT; + CREATE FUNCTION wasm_invoke_function_0(text, text) RETURNS int8 AS 'MODULE_PATHNAME', 'wasm_invoke_function_0' @@ -164,4 +169,39 @@ BEGIN RETURN current_instance_id; END; +$$ LANGUAGE plpgsql; + +CREATE OR REPLACE FUNCTION wasm_delete_instance(delete_instance int8) RETURNS text AS $$ +DECLARE + instance_module_path text; + exported_function RECORD; +BEGIN + -- Create a new instance, and stores its ID in `current_instance_id`. + SELECT wasm_drop_instance(delete_instance) INTO STRICT instance_module_path; + + -- Generate functions for each exported functions from the WebAssembly instance. + FOR + exported_function + IN + SELECT + namespace, + funcname, + inputs + FROM + wasm.exported_functions WHERE instanceid = delete_instance + LOOP + + EXECUTE format( + 'DROP FUNCTION %I_%I(%3$s)', + exported_function.namespace, -- 1 + exported_function.funcname, -- 2 + exported_function.inputs + ); + END LOOP; + + DELETE FROM wasm.instances WHERE id = delete_instance; + DELETE FROM wasm.exported_functions WHERE instanceid = delete_instance; + + RETURN instance_module_path; +END; $$ LANGUAGE plpgsql; \ No newline at end of file diff --git a/wasm/wasm_executor.cpp b/wasm/wasm_executor.cpp index 00df1a8..2950a39 100644 --- a/wasm/wasm_executor.cpp +++ b/wasm/wasm_executor.cpp @@ -13,6 +13,7 @@ PG_MODULE_MAGIC; extern "C" Datum wasm_create_instance(PG_FUNCTION_ARGS); +extern "C" Datum wasm_drop_instance(PG_FUNCTION_ARGS); extern "C" Datum wasm_get_instances(PG_FUNCTION_ARGS); extern "C" Datum wasm_get_exported_functions(PG_FUNCTION_ARGS); extern "C" Datum wasm_invoke_function_0(PG_FUNCTION_ARGS); @@ -281,6 +282,34 @@ Datum wasm_create_instance(PG_FUNCTION_ARGS) return Int64GetDatum(uuid); } +PG_FUNCTION_INFO_V1(wasm_drop_instance); +Datum wasm_drop_instance(PG_FUNCTION_ARGS) +{ + int64 instanceid = PG_GETARG_INT64(0); + Datum module_path; + + if (!superuser()) + ereport(ERROR, + (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), (errmsg("wasm_executor: must be system admin to delete wasm instance")))); + + std::map::iterator institor = instances.begin(); + while (institor != instances.end() && institor->first != instanceid) { + institor++; + } + if (institor == instances.end()) { + ereport(ERROR, (errmsg("wasm_executor:instance with id=%ld not exist", instanceid))); + } + module_path = CStringGetTextDatum((institor->second).c_str()); + instances.erase(institor); + + std::map*>::iterator funcitor = exported_functions.begin(); + while (funcitor != exported_functions.end() && funcitor->first == instanceid) { + exported_functions.erase(funcitor++); + } + + return module_path; +} + PG_FUNCTION_INFO_V1(wasm_get_instances); Datum wasm_get_instances(PG_FUNCTION_ARGS) { -- Gitee From 876418beedab0a395169e44ef759cd904a1c8d83 Mon Sep 17 00:00:00 2001 From: Nelson-He Date: Wed, 22 Mar 2023 15:56:07 +0800 Subject: [PATCH 03/15] add rust toolchain --- README.md | 26 ++++++++++++++++++++++++-- docker/Dockerfile | 3 +++ 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 8f0cf0c..b9c0d59 100644 --- a/README.md +++ b/README.md @@ -57,6 +57,28 @@ pub extern fn sum(x: i32, y: i32) -> i32 { } ``` +For able to compile the rust code to wasm, the rust and wasm toolchain should be installed. +``` +curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh +rustup target add wasm32-unknown-unknown + +``` +And also install wasm-gc, which will be used to compress the .wasm file output +``` +cargo install wasm-gc +``` +Then create a project using cargo +``` +cargo new hello --lib +``` +Rust code lives in the src directory. Your new project contains the default file src/lib.rs. Replace its contents with the sum.rs. +And then compile the project to Wasm and shrink the wasm output. + +``` +cargo build --target wasm32-unknown-unknown --release +wasm-gc target/wasm32-unknown-unknown/release/hello.wasm +``` + Once compiled to WebAssembly, one obtains a similar WebAssembly binary to `examples/sum.wasm`. To use the `sum` exported function, first, create a new instance of the WebAssembly module, and second, @@ -122,11 +144,11 @@ To get your hands on openGauss with wasm, we recommend using the Docker image. Download the docker image firstlly. ```shell -docker pull opengaussofficial/opengauss-wasmedge:0.1.0 +docker pull opengauss/wasmedge:0.2.0 ``` Then run it. ```shell -docker run -it opengaussofficial/opengauss-wasmedge:0.1.0 bash +docker run -it opengauss/wasmedge:0.2.0 bash ``` And enjoy it. diff --git a/docker/Dockerfile b/docker/Dockerfile index 27da78b..a7821a1 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -30,6 +30,9 @@ RUN cp -f /home/opengauss/bashrc /home/opengauss/.bashrc && \ fi && \ tar -xf openGauss_third.tar.gz && mv openGauss-third_party_binarylibs* binarylibs && rm -f openGauss_third.tar.gz && \ curl -sSf https://raw.githubusercontent.com/WasmEdge/WasmEdge/master/utils/install.sh | bash -s -- -v 0.11.2 && source /home/opengauss/.wasmedge/env && \ + curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y && source "$HOME/.cargo/env" && \ + rustup target add wasm32-unknown-unknown && \ + cargo install wasm-gc && \ source /home/opengauss/.bashrc && git clone https://gitee.com/Nelson-He/openGauss-server.git && cd openGauss-server && \ ./configure --gcc-version=7.3.0 CC=g++ CFLAGS='-O2' \ --prefix=$GAUSSHOME --3rd=$BINARYLIBS \ -- Gitee From de9a9ac9b485796aebc5e46c89f4444191ed613f Mon Sep 17 00:00:00 2001 From: Nelson-He Date: Wed, 22 Mar 2023 16:47:57 +0800 Subject: [PATCH 04/15] add rust toolchain instructions for easy use --- README.md | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index b9c0d59..549237d 100644 --- a/README.md +++ b/README.md @@ -71,6 +71,20 @@ Then create a project using cargo ``` cargo new hello --lib ``` +The file Cargo.toml (aka "manifest") contains the project's configuration. Leave everything, but append a new block called [lib]. The result should look something this +``` +[package] +name = "hello" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] + +[lib] +crate-type = ["cdylib"] +``` Rust code lives in the src directory. Your new project contains the default file src/lib.rs. Replace its contents with the sum.rs. And then compile the project to Wasm and shrink the wasm output. @@ -150,7 +164,8 @@ Then run it. ```shell docker run -it opengauss/wasmedge:0.2.0 bash ``` -And enjoy it. +The rust and wasm toolchain have already installed in the docker image for quick use. +So just go ahead and enjoy it. ## Inspect a WebAssembly instance -- Gitee From 7b4a4f1d567c3b5b379bd56f531b860444064f31 Mon Sep 17 00:00:00 2001 From: Nelson-He Date: Thu, 11 May 2023 14:18:32 +0800 Subject: [PATCH 05/15] =?UTF-8?q?=E5=A2=9E=E5=8A=A0text=E7=B1=BB=E5=9E=8B?= =?UTF-8?q?=E6=94=AF=E6=8C=81=EF=BC=8C=E6=94=AF=E6=92=91ODD=E6=BC=94?= =?UTF-8?q?=E7=A4=BAdemo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- wasm/examples/demo/README | 20 ++++ wasm/examples/demo/decrypt.wasm | Bin 0 -> 59583 bytes wasm/examples/demo/encrypt.wasm | Bin 0 -> 62766 bytes wasm/examples/demo/lib.rs | 13 +++ wasm/wasm_executor--1.0.sql | 66 ++++++------ wasm/wasm_executor.cpp | 184 ++++++++++++++------------------ 6 files changed, 142 insertions(+), 141 deletions(-) create mode 100644 wasm/examples/demo/README create mode 100755 wasm/examples/demo/decrypt.wasm create mode 100755 wasm/examples/demo/encrypt.wasm create mode 100644 wasm/examples/demo/lib.rs diff --git a/wasm/examples/demo/README b/wasm/examples/demo/README new file mode 100644 index 0000000..ccfeaff --- /dev/null +++ b/wasm/examples/demo/README @@ -0,0 +1,20 @@ +CREATE TABLE users ( +user TEXT PRIMARY KEY, +email TEXT, +pass TEXT +); + +CREATE TABLE secrets(secret text); +INSERT INTO secrets VALUES ('s3cretk3y'); + +CREATE TRIGGER encrypt_pass AFTER INSERT ON users + BEGIN + UPDATE users SET pass = encrypt(new.pass, (SELECT secret FROM secrets LIMIT 1)) + WHERE user = new.user; + END; + + +INSERT INTO users VALUES ('peter', 'peter@huawei.com', 'role_ruler'); +INSERT INTO users VALUES ('josh', 'josh@huawei.com', 'turkey'); + +SELECT user, pass, decrypt(pass, (SELECT secret FROM secrets LIMIT 1)) AS decrypted FROM users; diff --git a/wasm/examples/demo/decrypt.wasm b/wasm/examples/demo/decrypt.wasm new file mode 100755 index 0000000000000000000000000000000000000000..31feb282b75b77ce4d3d5a44543020d0c1577170 GIT binary patch literal 59583 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�$QkkpF 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 String { + use magic_crypt::MagicCryptTrait; + let mc = magic_crypt::new_magic_crypt!(key, 256); + mc.encrypt_str_to_base64(data) +} + +#[no_mangle] +pub extern "C" fn decrypt(data: String, key: String) -> String { + use magic_crypt::MagicCryptTrait; + let mc = magic_crypt::new_magic_crypt!(key, 256); + mc.decrypt_base64_to_string(data).unwrap_or_else(|_| "ACCESS DENIED".to_string()) +} diff --git a/wasm/wasm_executor--1.0.sql b/wasm/wasm_executor--1.0.sql index 46e07f5..ef3ef46 100644 --- a/wasm/wasm_executor--1.0.sql +++ b/wasm/wasm_executor--1.0.sql @@ -47,59 +47,44 @@ RETURNS text AS 'MODULE_PATHNAME', 'wasm_drop_instance' LANGUAGE C STRICT; -CREATE FUNCTION wasm_invoke_function_0(text, text) +CREATE FUNCTION wasm_invoke_function_int8_0(text, text) RETURNS int8 -AS 'MODULE_PATHNAME', 'wasm_invoke_function_0' +AS 'MODULE_PATHNAME', 'wasm_invoke_function_int8_0' LANGUAGE C STRICT; -CREATE FUNCTION wasm_invoke_function_1(text, text, int8) +CREATE FUNCTION wasm_invoke_function_int8_1(text, text, int8) RETURNS int8 -AS 'MODULE_PATHNAME', 'wasm_invoke_function_1' +AS 'MODULE_PATHNAME', 'wasm_invoke_function_int8_1' LANGUAGE C STRICT; -CREATE FUNCTION wasm_invoke_function_2(text, text, int8, int8) +CREATE FUNCTION wasm_invoke_function_int8_2(text, text, int8, int8) RETURNS int8 -AS 'MODULE_PATHNAME', 'wasm_invoke_function_2' +AS 'MODULE_PATHNAME', 'wasm_invoke_function_int8_2' LANGUAGE C STRICT; -CREATE FUNCTION wasm_invoke_function_3(text, text, int8, int8, int8) +CREATE FUNCTION wasm_invoke_function_int8_3(text, text, int8, int8, int8) RETURNS int8 -AS 'MODULE_PATHNAME', 'wasm_invoke_function_3' +AS 'MODULE_PATHNAME', 'wasm_invoke_function_int8_3' LANGUAGE C STRICT; -CREATE FUNCTION wasm_invoke_function_4(text, text, int8, int8, int8, int8) +CREATE FUNCTION wasm_invoke_function_int8_4(text, text, int8, int8, int8, int8) RETURNS int8 -AS 'MODULE_PATHNAME', 'wasm_invoke_function_4' +AS 'MODULE_PATHNAME', 'wasm_invoke_function_int8_4' LANGUAGE C STRICT; -CREATE FUNCTION wasm_invoke_function_5(text, text, int8, int8, int8, int8, int8) +CREATE FUNCTION wasm_invoke_function_int8_5(text, text, int8, int8, int8, int8, int8) RETURNS int8 -AS 'MODULE_PATHNAME', 'wasm_invoke_function_5' +AS 'MODULE_PATHNAME', 'wasm_invoke_function_int8_5' LANGUAGE C STRICT; -CREATE FUNCTION wasm_invoke_function_6(text, text, int8, int8, int8, int8, int8, int8) -RETURNS int8 -AS 'MODULE_PATHNAME', 'wasm_invoke_function_6' -LANGUAGE C STRICT; - -CREATE FUNCTION wasm_invoke_function_7(text, text, int8, int8, int8, int8, int8, int8, int8) -RETURNS int8 -AS 'MODULE_PATHNAME', 'wasm_invoke_function_7' -LANGUAGE C STRICT; - -CREATE FUNCTION wasm_invoke_function_8(text, text, int8, int8, int8, int8, int8, int8, int8, int8) -RETURNS int8 -AS 'MODULE_PATHNAME', 'wasm_invoke_function_8' -LANGUAGE C STRICT; - -CREATE FUNCTION wasm_invoke_function_9(text, text, int8, int8, int8, int8, int8, int8, int8, int8, int8) -RETURNS int8 -AS 'MODULE_PATHNAME', 'wasm_invoke_function_9' +CREATE FUNCTION wasm_invoke_function_text_1(text, text, text) +RETURNS text +AS 'MODULE_PATHNAME', 'wasm_invoke_function_text_1' LANGUAGE C STRICT; -CREATE FUNCTION wasm_invoke_function_10(text, text, int8, int8, int8, int8, int8, int8, int8, int8, int8, int8) -RETURNS int8 -AS 'MODULE_PATHNAME', 'wasm_invoke_function_10' +CREATE FUNCTION wasm_invoke_function_text_2(text, text, text, text) +RETURNS text +AS 'MODULE_PATHNAME', 'wasm_invoke_function_text_2' LANGUAGE C STRICT; CREATE OR REPLACE FUNCTION wasm_new_instance(module_pathname text, namespace text) RETURNS text AS $$ @@ -108,6 +93,7 @@ DECLARE exported_function RECORD; exported_function_generated_inputs text; exported_function_generated_outputs text; + exported_function_bind_outputs text; BEGIN -- Create a new instance, and stores its ID in `current_instance_id`. SELECT wasm_create_new_instance(module_pathname) INTO STRICT current_instance_id; @@ -137,9 +123,10 @@ BEGIN exported_function_generated_inputs := ''; exported_function_generated_outputs := ''; + exported_function_bind_outputs :=''; FOR nth IN 1..exported_function.input_arity LOOP - exported_function_generated_inputs := exported_function_generated_inputs || format(', CAST($%s AS int8)', nth); + exported_function_generated_inputs := exported_function_generated_inputs || format(', $%s', nth); END LOOP; IF length(exported_function.outputs) > 0 THEN @@ -148,12 +135,18 @@ BEGIN exported_function_generated_outputs := 'integer'; END IF; + IF exported_function_generated_outputs == 'text' THEN + exported_function_bind_outputs := 'text'; + ELSE + exported_function_bind_outputs := 'int8'; + END IF; + EXECUTE format( 'CREATE OR REPLACE FUNCTION %I_%I(%3$s) RETURNS %5$s AS $F$' || 'DECLARE' || ' output %5$s;' || 'BEGIN' || - ' SELECT wasm_invoke_function_%4$s(%6$L, %2$L%7$s) INTO STRICT output;' || + ' SELECT wasm_invoke_function_%8$s_%4$s(%6$L, %2$L%7$s) INTO STRICT output;' || ' RETURN output;' || 'END;' || '$F$ LANGUAGE plpgsql;', @@ -163,7 +156,8 @@ BEGIN exported_function.input_arity, -- 4 exported_function_generated_outputs, -- 5 current_instance_id, -- 6 - exported_function_generated_inputs -- 7 + exported_function_generated_inputs, -- 7 + exported_function_bind_outputs --8 ); END LOOP; diff --git a/wasm/wasm_executor.cpp b/wasm/wasm_executor.cpp index 2950a39..5c685d7 100644 --- a/wasm/wasm_executor.cpp +++ b/wasm/wasm_executor.cpp @@ -16,17 +16,14 @@ extern "C" Datum wasm_create_instance(PG_FUNCTION_ARGS); extern "C" Datum wasm_drop_instance(PG_FUNCTION_ARGS); extern "C" Datum wasm_get_instances(PG_FUNCTION_ARGS); extern "C" Datum wasm_get_exported_functions(PG_FUNCTION_ARGS); -extern "C" Datum wasm_invoke_function_0(PG_FUNCTION_ARGS); -extern "C" Datum wasm_invoke_function_1(PG_FUNCTION_ARGS); -extern "C" Datum wasm_invoke_function_2(PG_FUNCTION_ARGS); -extern "C" Datum wasm_invoke_function_3(PG_FUNCTION_ARGS); -extern "C" Datum wasm_invoke_function_4(PG_FUNCTION_ARGS); -extern "C" Datum wasm_invoke_function_5(PG_FUNCTION_ARGS); -extern "C" Datum wasm_invoke_function_6(PG_FUNCTION_ARGS); -extern "C" Datum wasm_invoke_function_7(PG_FUNCTION_ARGS); -extern "C" Datum wasm_invoke_function_8(PG_FUNCTION_ARGS); -extern "C" Datum wasm_invoke_function_9(PG_FUNCTION_ARGS); -extern "C" Datum wasm_invoke_function_10(PG_FUNCTION_ARGS); +extern "C" Datum wasm_invoke_function_int8_0(PG_FUNCTION_ARGS); +extern "C" Datum wasm_invoke_function_int8_1(PG_FUNCTION_ARGS); +extern "C" Datum wasm_invoke_function_int8_2(PG_FUNCTION_ARGS); +extern "C" Datum wasm_invoke_function_int8_3(PG_FUNCTION_ARGS); +extern "C" Datum wasm_invoke_function_int8_4(PG_FUNCTION_ARGS); +extern "C" Datum wasm_invoke_function_int8_5(PG_FUNCTION_ARGS); +extern "C" Datum wasm_invoke_function_text_1(PG_FUNCTION_ARGS); +extern "C" Datum wasm_invoke_function_text_2(PG_FUNCTION_ARGS); typedef struct TupleInstanceState { TupleDesc tupd; @@ -149,6 +146,51 @@ static int64 wasm_invoke_function(char *instanceid_str, char* funcname, std::vec return ret_val; } +static char* wasm_invoke_function2(char *instanceid_str, char* funcname, vector params) +{ + int64 instanceid = atol(instanceid_str); + std::string wasm_file = find_wasm_file(instanceid); + if (wasm_file == "") { + ereport(ERROR, (errmsg("wasm_executor: instance with id %ld is not find", instanceid))); + } + WasmFuncInfo *funcinfo = find_exported_func(instanceid, funcname); + + WasmEdge_ConfigureContext *config_context = WasmEdge_ConfigureCreate(); + WasmEdge_ConfigureAddHostRegistration(config_context, WasmEdge_HostRegistration_Wasi); + WasmEdge_VMContext *vm_conext = WasmEdge_VMCreate(config_context, NULL); + + WasmEdge_Value params[args.size()]; + for (unsigned int i = 0; i < args.size(); ++i) { + if (funcinfo->inputs[i] == "integer") { + params[i] = WasmEdge_ValueGenI32(args[i]); + } else { + params[i] = WasmEdge_ValueGenI64(args[i]); + } + } + + WasmEdge_Value result[1]; + WasmEdge_String wasm_func = WasmEdge_StringCreateByCString(funcname); + WasmEdge_Result ret = WasmEdge_VMRunWasmFromFile(vm_conext, wasm_file.c_str(), wasm_func, params, args.size(), result, 1); + if (!WasmEdge_ResultOK(ret)) { + WasmEdge_VMDelete(vm_conext); + WasmEdge_ConfigureDelete(config_context); + WasmEdge_StringDelete(wasm_func); + ereport(ERROR, (errmsg("wasm_executor: call func %s failed", funcname))); + } + int64 ret_val = 0; + if (funcinfo->outputs == "integer") { + ret_val = WasmEdge_ValueGetI32(result[0]); + } else { + ret_val = WasmEdge_ValueGetI64(result[0]); + } + /* Resources deallocations. */ + WasmEdge_VMDelete(vm_conext); + WasmEdge_ConfigureDelete(config_context); + WasmEdge_StringDelete(wasm_func); + + return ret_val; +} + static void wasm_export_funcs_query(int64 instanceid, TupleFuncState* inter_call_data) { std::string wasm_file = find_wasm_file(instanceid); @@ -422,8 +464,8 @@ Datum wasm_get_exported_functions(PG_FUNCTION_ARGS) } } -PG_FUNCTION_INFO_V1(wasm_invoke_function_0); -Datum wasm_invoke_function_0(PG_FUNCTION_ARGS) +PG_FUNCTION_INFO_V1(wasm_invoke_function_int8_0); +Datum wasm_invoke_function_int8_0(PG_FUNCTION_ARGS) { char* instanceid = TextDatumGetCString(PG_GETARG_DATUM(0)); char* funcname = TextDatumGetCString(PG_GETARG_DATUM(1)); @@ -433,8 +475,8 @@ Datum wasm_invoke_function_0(PG_FUNCTION_ARGS) return Int64GetDatum(result); } -PG_FUNCTION_INFO_V1(wasm_invoke_function_1); -Datum wasm_invoke_function_1(PG_FUNCTION_ARGS) +PG_FUNCTION_INFO_V1(wasm_invoke_function_int8_1); +Datum wasm_invoke_function_int8_1(PG_FUNCTION_ARGS) { char* instanceid = TextDatumGetCString(PG_GETARG_DATUM(0)); char* funcname = TextDatumGetCString(PG_GETARG_DATUM(1)); @@ -445,8 +487,8 @@ Datum wasm_invoke_function_1(PG_FUNCTION_ARGS) return Int64GetDatum(result); } -PG_FUNCTION_INFO_V1(wasm_invoke_function_2); -Datum wasm_invoke_function_2(PG_FUNCTION_ARGS) +PG_FUNCTION_INFO_V1(wasm_invoke_function_int8_2); +Datum wasm_invoke_function_int8_2(PG_FUNCTION_ARGS) { char* instanceid = TextDatumGetCString(PG_GETARG_DATUM(0)); char* funcname = TextDatumGetCString(PG_GETARG_DATUM(1)); @@ -458,8 +500,8 @@ Datum wasm_invoke_function_2(PG_FUNCTION_ARGS) return Int64GetDatum(result); } -PG_FUNCTION_INFO_V1(wasm_invoke_function_3); -Datum wasm_invoke_function_3(PG_FUNCTION_ARGS) +PG_FUNCTION_INFO_V1(wasm_invoke_function_int8_3); +Datum wasm_invoke_function_int8_3(PG_FUNCTION_ARGS) { char* instanceid = TextDatumGetCString(PG_GETARG_DATUM(0)); char* funcname = TextDatumGetCString(PG_GETARG_DATUM(1)); @@ -472,8 +514,8 @@ Datum wasm_invoke_function_3(PG_FUNCTION_ARGS) return Int64GetDatum(result); } -PG_FUNCTION_INFO_V1(wasm_invoke_function_4); -Datum wasm_invoke_function_4(PG_FUNCTION_ARGS) +PG_FUNCTION_INFO_V1(wasm_invoke_function_int8_4); +Datum wasm_invoke_function_int8_4(PG_FUNCTION_ARGS) { char* instanceid = TextDatumGetCString(PG_GETARG_DATUM(0)); char* funcname = TextDatumGetCString(PG_GETARG_DATUM(1)); @@ -487,8 +529,8 @@ Datum wasm_invoke_function_4(PG_FUNCTION_ARGS) return Int64GetDatum(result); } -PG_FUNCTION_INFO_V1(wasm_invoke_function_5); -Datum wasm_invoke_function_5(PG_FUNCTION_ARGS) +PG_FUNCTION_INFO_V1(wasm_invoke_function_int8_5); +Datum wasm_invoke_function_int8_5(PG_FUNCTION_ARGS) { char* instanceid = TextDatumGetCString(PG_GETARG_DATUM(0)); char* funcname = TextDatumGetCString(PG_GETARG_DATUM(1)); @@ -503,97 +545,29 @@ Datum wasm_invoke_function_5(PG_FUNCTION_ARGS) return Int64GetDatum(result); } -PG_FUNCTION_INFO_V1(wasm_invoke_function_6); -Datum wasm_invoke_function_6(PG_FUNCTION_ARGS) +PG_FUNCTION_INFO_V1(wasm_invoke_function_text_1); +Datum wasm_invoke_function_text_1(PG_FUNCTION_ARGS) { char* instanceid = TextDatumGetCString(PG_GETARG_DATUM(0)); char* funcname = TextDatumGetCString(PG_GETARG_DATUM(1)); - std::vector params; - params.push_back(PG_GETARG_INT64(2)); - params.push_back(PG_GETARG_INT64(3)); - params.push_back(PG_GETARG_INT64(4)); - params.push_back(PG_GETARG_INT64(5)); - params.push_back(PG_GETARG_INT64(6)); - params.push_back(PG_GETARG_INT64(7)); - int64 result = wasm_invoke_function(instanceid, funcname, params); - return Int64GetDatum(result); -} - -PG_FUNCTION_INFO_V1(wasm_invoke_function_7); -Datum wasm_invoke_function_7(PG_FUNCTION_ARGS) -{ - char* instanceid = TextDatumGetCString(PG_GETARG_DATUM(0)); - char* funcname = TextDatumGetCString(PG_GETARG_DATUM(1)); - std::vector params; + std::vector params; + params.push_back(TextDatumGetCString(PG_GETARG_DATUM(2))); - params.push_back(PG_GETARG_INT64(2)); - params.push_back(PG_GETARG_INT64(3)); - params.push_back(PG_GETARG_INT64(4)); - params.push_back(PG_GETARG_INT64(5)); - params.push_back(PG_GETARG_INT64(6)); - params.push_back(PG_GETARG_INT64(7)); - params.push_back(PG_GETARG_INT64(8)); - int64 result = wasm_invoke_function(instanceid, funcname, params); - return Int64GetDatum(result); -} - -PG_FUNCTION_INFO_V1(wasm_invoke_function_8); -Datum wasm_invoke_function_8(PG_FUNCTION_ARGS) -{ - char* instanceid = TextDatumGetCString(PG_GETARG_DATUM(0)); - char* funcname = TextDatumGetCString(PG_GETARG_DATUM(1)); - std::vector params; - - params.push_back(PG_GETARG_INT64(2)); - params.push_back(PG_GETARG_INT64(3)); - params.push_back(PG_GETARG_INT64(4)); - params.push_back(PG_GETARG_INT64(5)); - params.push_back(PG_GETARG_INT64(6)); - params.push_back(PG_GETARG_INT64(7)); - params.push_back(PG_GETARG_INT64(8)); - params.push_back(PG_GETARG_INT64(9)); - int64 result = wasm_invoke_function(instanceid, funcname, params); - return Int64GetDatum(result); + char* result = wasm_invoke_function2(instanceid, funcname, params); + return CStringGetTextDatum(result); } -PG_FUNCTION_INFO_V1(wasm_invoke_function_9); -Datum wasm_invoke_function_9(PG_FUNCTION_ARGS) +PG_FUNCTION_INFO_V1(wasm_invoke_function_text_2); +Datum wasm_invoke_function_text_2(PG_FUNCTION_ARGS) { char* instanceid = TextDatumGetCString(PG_GETARG_DATUM(0)); char* funcname = TextDatumGetCString(PG_GETARG_DATUM(1)); - std::vector params; - - params.push_back(PG_GETARG_INT64(2)); - params.push_back(PG_GETARG_INT64(3)); - params.push_back(PG_GETARG_INT64(4)); - params.push_back(PG_GETARG_INT64(5)); - params.push_back(PG_GETARG_INT64(6)); - params.push_back(PG_GETARG_INT64(7)); - params.push_back(PG_GETARG_INT64(8)); - params.push_back(PG_GETARG_INT64(9)); - params.push_back(PG_GETARG_INT64(10)); - int64 result = wasm_invoke_function(instanceid, funcname, params); - return Int64GetDatum(result); -} -PG_FUNCTION_INFO_V1(wasm_invoke_function_10); -Datum wasm_invoke_function_10(PG_FUNCTION_ARGS) -{ - char* instanceid = TextDatumGetCString(PG_GETARG_DATUM(0)); - char* funcname = TextDatumGetCString(PG_GETARG_DATUM(1)); - std::vector params; + std::vector params; + params.push_back(TextDatumGetCString(PG_GETARG_DATUM(2))); + params.push_back(TextDatumGetCString(PG_GETARG_DATUM(3))); - params.push_back(PG_GETARG_INT64(2)); - params.push_back(PG_GETARG_INT64(3)); - params.push_back(PG_GETARG_INT64(4)); - params.push_back(PG_GETARG_INT64(5)); - params.push_back(PG_GETARG_INT64(6)); - params.push_back(PG_GETARG_INT64(7)); - params.push_back(PG_GETARG_INT64(8)); - params.push_back(PG_GETARG_INT64(9)); - params.push_back(PG_GETARG_INT64(10)); - params.push_back(PG_GETARG_INT64(11)); - int64 result = wasm_invoke_function(instanceid, funcname, params); - return Int64GetDatum(result); -} + char* result = wasm_invoke_function2(instanceid, funcname, params); + return CStringGetTextDatum(result); +} \ No newline at end of file -- Gitee From 1de1c513e634dc199392a56a081a624c6fd0acac Mon Sep 17 00:00:00 2001 From: Nelson-He Date: Wed, 17 May 2023 09:07:13 +0800 Subject: [PATCH 06/15] =?UTF-8?q?=E4=BD=BF=E7=94=A8wasm=5Fbindgen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 6 +++--- wasm/examples/demo/decrypt.wasm | Bin 59583 -> 48931 bytes wasm/examples/demo/encrypt.wasm | Bin 62766 -> 48556 bytes wasm/examples/demo/lib.rs | 10 ++++++---- 4 files changed, 9 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 549237d..d436673 100644 --- a/README.md +++ b/README.md @@ -63,9 +63,9 @@ curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh rustup target add wasm32-unknown-unknown ``` -And also install wasm-gc, which will be used to compress the .wasm file output +And also install wasm-opt, which will be used to optimize and compress the .wasm file output ``` -cargo install wasm-gc +cargo install wasm-opt ``` Then create a project using cargo ``` @@ -90,7 +90,7 @@ And then compile the project to Wasm and shrink the wasm output. ``` cargo build --target wasm32-unknown-unknown --release -wasm-gc target/wasm32-unknown-unknown/release/hello.wasm +wasm-opt -Os target/wasm32-unknown-unknown/release/hello.wasm -o hello.wasm ``` Once compiled to WebAssembly, one obtains a similar WebAssembly binary diff --git a/wasm/examples/demo/decrypt.wasm b/wasm/examples/demo/decrypt.wasm index 31feb282b75b77ce4d3d5a44543020d0c1577170..9bde91ba0a39e76f7fa32c32504fe07442f61dcb 100755 GIT binary patch literal 48931 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�$QkkpF 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 EAJ5A$DgXcg literal 62766 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 String { +use wasm_bindgen::prelude::* + +#[wasm_bindgen] +pub fn encrypt(data: String, key: String) -> String { use magic_crypt::MagicCryptTrait; let mc = magic_crypt::new_magic_crypt!(key, 256); mc.encrypt_str_to_base64(data) } -#[no_mangle] -pub extern "C" fn decrypt(data: String, key: String) -> String { +#[wasm_bindgen] +pub fn decrypt(data: String, key: String) -> String { use magic_crypt::MagicCryptTrait; let mc = magic_crypt::new_magic_crypt!(key, 256); mc.decrypt_base64_to_string(data).unwrap_or_else(|_| "ACCESS DENIED".to_string()) -- Gitee From 95b730797d2863414084fa3262771e7ef73e1163 Mon Sep 17 00:00:00 2001 From: Nelson-He Date: Thu, 18 May 2023 14:34:41 +0800 Subject: [PATCH 07/15] =?UTF-8?q?=E5=9F=BA=E4=BA=8Eopengauss=5Fbindgen?= =?UTF-8?q?=E8=BF=9B=E8=A1=8C=E7=A4=BA=E4=BE=8B=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- wasm/examples/demo/decrypt.wasm | Bin 48931 -> 0 bytes wasm/examples/demo/encrypt.wasm | Bin 48556 -> 0 bytes wasm/examples/encrypt_decrypt/Cargo.toml | 13 ++++++++ .../examples/{demo => encrypt_decrypt}/README | 0 wasm/examples/encrypt_decrypt/gen_wasm.sh | 30 ++++++++++++++++++ .../{demo => encrypt_decrypt/src}/lib.rs | 16 +++++----- 6 files changed, 51 insertions(+), 8 deletions(-) delete mode 100755 wasm/examples/demo/decrypt.wasm delete mode 100755 wasm/examples/demo/encrypt.wasm create mode 100644 wasm/examples/encrypt_decrypt/Cargo.toml rename wasm/examples/{demo => encrypt_decrypt}/README (100%) create mode 100755 wasm/examples/encrypt_decrypt/gen_wasm.sh rename wasm/examples/{demo => encrypt_decrypt/src}/lib.rs (31%) diff --git a/wasm/examples/demo/decrypt.wasm b/wasm/examples/demo/decrypt.wasm deleted file mode 100755 index 9bde91ba0a39e76f7fa32c32504fe07442f61dcb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 48931 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 EAJ5A$DgXcg diff --git a/wasm/examples/encrypt_decrypt/Cargo.toml b/wasm/examples/encrypt_decrypt/Cargo.toml new file mode 100644 index 0000000..68cc424 --- /dev/null +++ b/wasm/examples/encrypt_decrypt/Cargo.toml @@ -0,0 +1,13 @@ +[package] +name = "opengauss_encrypt_decrypt" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +opengauss_bindgen = { version = "0", path = "../../bindgen" } +magic-crypt = "3.1" + +[lib] +crate-type = ["cdylib"] diff --git a/wasm/examples/demo/README b/wasm/examples/encrypt_decrypt/README similarity index 100% rename from wasm/examples/demo/README rename to wasm/examples/encrypt_decrypt/README diff --git a/wasm/examples/encrypt_decrypt/gen_wasm.sh b/wasm/examples/encrypt_decrypt/gen_wasm.sh new file mode 100755 index 0000000..66fc9fd --- /dev/null +++ b/wasm/examples/encrypt_decrypt/gen_wasm.sh @@ -0,0 +1,30 @@ +#!/usr/bin/env bash + +set -e + +# if [ "$#" -ne 1 ]; then +# echo "Usage: $0 " +# exit 1 +# fi + +OPENGAUSS_EXPORTED_FUNC=$1 +OPENGAUSS_COMPILED_WASM=opengauss-target/wasm32-unknown-unknown/release/opengauss_encrypt_decrypt.wasm +OPENGAUSS_OPTIMIZED_WASM=opengauss-target/opengauss_encrypt_decrypt_optimized.wasm +OPENGAUSS_TARGET_FILE=opengauss-target/create_${OPENGAUSS_EXPORTED_FUNC}.sql + +CARGO_TARGET_DIR=opengauss-target cargo build --release --target wasm32-unknown-unknown +wasm-opt -Os $OPENGAUSS_COMPILED_WASM -o $OPENGAUSS_OPTIMIZED_WASM || : +# echo ".init_wasm_func_table -- only needed for shell" > $OPENGAUSS_TARGET_FILE +# echo "DROP FUNCTION IF EXISTS $1;" >> $OPENGAUSS_TARGET_FILE +# echo "CREATE FUNCTION $1 LANGUAGE wasm AS '" >> $OPENGAUSS_TARGET_FILE +# wasm2wat $OPENGAUSS_OPTIMIZED_WASM | sed "s/'/''/g" >> $OPENGAUSS_TARGET_FILE +# echo "';" >> $OPENGAUSS_TARGET_FILE + +# if ! grep "export \"$OPENGAUSS_EXPORTED_FUNC\"" $OPENGAUSS_TARGET_FILE; then +# echo "Error: function $OPENGAUSS_EXPORTED_FUNC not exported from the WebAssembly module" +# exit 1 +# fi +# if ! grep "export \"memory\"" $OPENGAUSS_TARGET_FILE; then +# echo "Error: memory not exported from the WebAssembly module" +# exit 1 +# fi diff --git a/wasm/examples/demo/lib.rs b/wasm/examples/encrypt_decrypt/src/lib.rs similarity index 31% rename from wasm/examples/demo/lib.rs rename to wasm/examples/encrypt_decrypt/src/lib.rs index f51df2c..847e89a 100644 --- a/wasm/examples/demo/lib.rs +++ b/wasm/examples/encrypt_decrypt/src/lib.rs @@ -1,15 +1,15 @@ -use wasm_bindgen::prelude::* +use opengauss_bindgen::*; +use magic_crypt::{new_magic_crypt, MagicCryptTrait}; -#[wasm_bindgen] +#[opengauss_bindgen::opengauss_bindgen] pub fn encrypt(data: String, key: String) -> String { - use magic_crypt::MagicCryptTrait; - let mc = magic_crypt::new_magic_crypt!(key, 256); + let mc = new_magic_crypt!(key, 256); mc.encrypt_str_to_base64(data) } -#[wasm_bindgen] +#[opengauss_bindgen::opengauss_bindgen] pub fn decrypt(data: String, key: String) -> String { - use magic_crypt::MagicCryptTrait; - let mc = magic_crypt::new_magic_crypt!(key, 256); - mc.decrypt_base64_to_string(data).unwrap_or_else(|_| "ACCESS DENIED".to_string()) + let mc = new_magic_crypt!(key, 256); + mc.decrypt_base64_to_string(data) + .unwrap_or("[ACCESS DENIED]".to_owned()) } -- Gitee From bb194542b898a06511eb69cb37a7cd1ebcf653fb Mon Sep 17 00:00:00 2001 From: Nelson-He Date: Thu, 18 May 2023 15:37:04 +0800 Subject: [PATCH 08/15] =?UTF-8?q?odd=E6=BC=94=E7=A4=BAdemo=E6=94=AF?= =?UTF-8?q?=E6=8C=81varchar=E7=B1=BB=E5=9E=8B=EF=BC=8C=E6=95=B0=E5=80=BC?= =?UTF-8?q?=E7=B1=BB=E5=9E=8B=E4=BB=85=E6=94=AF=E6=8C=81bigint=E7=B1=BB?= =?UTF-8?q?=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- wasm/examples/encrypt_decrypt/gen_wasm.sh | 21 +--------------- wasm/wasm_executor--1.0.sql | 2 +- wasm/wasm_executor.cpp | 30 +++++++++++------------ 3 files changed, 16 insertions(+), 37 deletions(-) diff --git a/wasm/examples/encrypt_decrypt/gen_wasm.sh b/wasm/examples/encrypt_decrypt/gen_wasm.sh index 66fc9fd..3a31fa2 100755 --- a/wasm/examples/encrypt_decrypt/gen_wasm.sh +++ b/wasm/examples/encrypt_decrypt/gen_wasm.sh @@ -2,29 +2,10 @@ set -e -# if [ "$#" -ne 1 ]; then -# echo "Usage: $0 " -# exit 1 -# fi - OPENGAUSS_EXPORTED_FUNC=$1 OPENGAUSS_COMPILED_WASM=opengauss-target/wasm32-unknown-unknown/release/opengauss_encrypt_decrypt.wasm -OPENGAUSS_OPTIMIZED_WASM=opengauss-target/opengauss_encrypt_decrypt_optimized.wasm -OPENGAUSS_TARGET_FILE=opengauss-target/create_${OPENGAUSS_EXPORTED_FUNC}.sql +OPENGAUSS_OPTIMIZED_WASM=opengauss-target/encrypt_decrypt.wasm CARGO_TARGET_DIR=opengauss-target cargo build --release --target wasm32-unknown-unknown wasm-opt -Os $OPENGAUSS_COMPILED_WASM -o $OPENGAUSS_OPTIMIZED_WASM || : -# echo ".init_wasm_func_table -- only needed for shell" > $OPENGAUSS_TARGET_FILE -# echo "DROP FUNCTION IF EXISTS $1;" >> $OPENGAUSS_TARGET_FILE -# echo "CREATE FUNCTION $1 LANGUAGE wasm AS '" >> $OPENGAUSS_TARGET_FILE -# wasm2wat $OPENGAUSS_OPTIMIZED_WASM | sed "s/'/''/g" >> $OPENGAUSS_TARGET_FILE -# echo "';" >> $OPENGAUSS_TARGET_FILE -# if ! grep "export \"$OPENGAUSS_EXPORTED_FUNC\"" $OPENGAUSS_TARGET_FILE; then -# echo "Error: function $OPENGAUSS_EXPORTED_FUNC not exported from the WebAssembly module" -# exit 1 -# fi -# if ! grep "export \"memory\"" $OPENGAUSS_TARGET_FILE; then -# echo "Error: memory not exported from the WebAssembly module" -# exit 1 -# fi diff --git a/wasm/wasm_executor--1.0.sql b/wasm/wasm_executor--1.0.sql index ef3ef46..f207eb1 100644 --- a/wasm/wasm_executor--1.0.sql +++ b/wasm/wasm_executor--1.0.sql @@ -118,7 +118,7 @@ BEGIN (SELECT * FROM wasm_get_exported_functions(current_instance_id)) LOOP IF exported_function.input_arity > 10 THEN - RAISE EXCEPTION 'WebAssembly exported function `%` has an arity greater than 10, which is not supported yet.', exported_function.funcname; + RAISE EXCEPTION 'WebAssembly exported function `%` has an arity greater than 5, which is not supported yet.', exported_function.funcname; END IF; exported_function_generated_inputs := ''; diff --git a/wasm/wasm_executor.cpp b/wasm/wasm_executor.cpp index 5c685d7..64dbc9f 100644 --- a/wasm/wasm_executor.cpp +++ b/wasm/wasm_executor.cpp @@ -25,6 +25,8 @@ extern "C" Datum wasm_invoke_function_int8_5(PG_FUNCTION_ARGS); extern "C" Datum wasm_invoke_function_text_1(PG_FUNCTION_ARGS); extern "C" Datum wasm_invoke_function_text_2(PG_FUNCTION_ARGS); +static const char * const malloc_func = "opengauss_malloc"; + typedef struct TupleInstanceState { TupleDesc tupd; std::map::iterator currindex; @@ -44,7 +46,7 @@ typedef struct TupleFuncState { } TupleFuncState; #define BUF_LEN 256 -#define MAX_PARAMS 10 +#define MAX_PARAMS 5 #define MAX_RETURNS 1 // Store the wasm file info globally @@ -116,11 +118,7 @@ static int64 wasm_invoke_function(char *instanceid_str, char* funcname, std::vec WasmEdge_Value params[args.size()]; for (unsigned int i = 0; i < args.size(); ++i) { - if (funcinfo->inputs[i] == "integer") { - params[i] = WasmEdge_ValueGenI32(args[i]); - } else { - params[i] = WasmEdge_ValueGenI64(args[i]); - } + params[i] = WasmEdge_ValueGenI64(args[i]); } WasmEdge_Value result[1]; @@ -133,11 +131,7 @@ static int64 wasm_invoke_function(char *instanceid_str, char* funcname, std::vec ereport(ERROR, (errmsg("wasm_executor: call func %s failed", funcname))); } int64 ret_val = 0; - if (funcinfo->outputs == "integer") { - ret_val = WasmEdge_ValueGetI32(result[0]); - } else { - ret_val = WasmEdge_ValueGetI64(result[0]); - } + ret_val = WasmEdge_ValueGetI64(result[0]); /* Resources deallocations. */ WasmEdge_VMDelete(vm_conext); WasmEdge_ConfigureDelete(config_context); @@ -224,9 +218,13 @@ static void wasm_export_funcs_query(int64 instanceid, TupleFuncState* inter_call */ uint32_t rel_func_num = WasmEdge_VMGetFunctionList(vm_cxt, func_name_list, func_type_list, BUF_LEN); for (unsigned int i = 0; i < rel_func_num && i < BUF_LEN; ++i) { - char tmp_buffer[BUF_LEN]; + char tmp_buffer[BUF_LEN] = {0}; uint32_t func_name_len = WasmEdge_StringCopy(func_name_list[i], tmp_buffer, sizeof(tmp_buffer)); elog(DEBUG1, "wasm_executor: exported function string length: %u, name: %s\n", func_name_len, tmp_buffer); + if (strcmp(temp_buffer, malloc_func) == 0) { + elog((DEBUG1, "wasm_executor: opengauss_malloc is not need to export to user\n");) + continue; + } uint32_t param_nums = WasmEdge_FunctionTypeGetParametersLength(func_type_list[i]); if (param_nums > MAX_PARAMS) { @@ -244,11 +242,11 @@ static void wasm_export_funcs_query(int64 instanceid, TupleFuncState* inter_call WasmFuncInfo *funcinfo = new(std::nothrow)WasmFuncInfo(); - enum WasmEdge_ValType param_buffer[10]; // we allow max 10 parameters - param_nums = WasmEdge_FunctionTypeGetParameters(func_type_list[i], param_buffer, 10); + enum WasmEdge_ValType param_buffer[MAX_PARAMS]; // we allow max 10 parameters + param_nums = WasmEdge_FunctionTypeGetParameters(func_type_list[i], param_buffer, MAX_PARAMS); for (unsigned int j = 0; j < param_nums; ++j) { if (param_buffer[j] == WasmEdge_ValType_I32) { - funcinfo->inputs.push_back("integer"); + funcinfo->inputs.push_back("varchar"); } else if (param_buffer[j] == WasmEdge_ValType_I64) { funcinfo->inputs.push_back("bigint"); } else { @@ -260,7 +258,7 @@ static void wasm_export_funcs_query(int64 instanceid, TupleFuncState* inter_call return_num = WasmEdge_FunctionTypeGetReturns(func_type_list[i], param_buffer, 10); if (param_buffer[0] == WasmEdge_ValType_I32) { - funcinfo->outputs = "integer"; + funcinfo->outputs = "varchar"; } else if (param_buffer[0] == WasmEdge_ValType_I64) { funcinfo->outputs = "bigint"; } else { -- Gitee From fd09cbeb2e937708897ba77ca8fafbecfe3a5b45 Mon Sep 17 00:00:00 2001 From: Nelson-He Date: Thu, 18 May 2023 16:26:22 +0800 Subject: [PATCH 09/15] =?UTF-8?q?ODD=E6=BC=94=E7=A4=BAdemo=E6=94=AF?= =?UTF-8?q?=E6=8C=81text=E7=B1=BB=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- wasm/wasm_executor--1.0.sql | 2 +- wasm/wasm_executor.cpp | 103 +++++++++++++++++++++--------------- 2 files changed, 62 insertions(+), 43 deletions(-) diff --git a/wasm/wasm_executor--1.0.sql b/wasm/wasm_executor--1.0.sql index f207eb1..6c5ffa1 100644 --- a/wasm/wasm_executor--1.0.sql +++ b/wasm/wasm_executor--1.0.sql @@ -135,7 +135,7 @@ BEGIN exported_function_generated_outputs := 'integer'; END IF; - IF exported_function_generated_outputs == 'text' THEN + IF exported_function_generated_outputs = 'text' THEN exported_function_bind_outputs := 'text'; ELSE exported_function_bind_outputs := 'int8'; diff --git a/wasm/wasm_executor.cpp b/wasm/wasm_executor.cpp index 64dbc9f..19de01d 100644 --- a/wasm/wasm_executor.cpp +++ b/wasm/wasm_executor.cpp @@ -26,6 +26,7 @@ extern "C" Datum wasm_invoke_function_text_1(PG_FUNCTION_ARGS); extern "C" Datum wasm_invoke_function_text_2(PG_FUNCTION_ARGS); static const char * const malloc_func = "opengauss_malloc"; +static const char OPENGAUSS_TEXT = 3; typedef struct TupleInstanceState { TupleDesc tupd; @@ -81,22 +82,6 @@ static std::vector* find_exported_func_list(int64 instanceid) return NULL; } -static WasmFuncInfo* find_exported_func(int64 instanceid, std::string funcname) -{ - std::vector* functions = find_exported_func_list(instanceid); - if (functions == NULL) { - ereport(ERROR, (errmsg("wasm_executor: function infos of instance %ld is not find", instanceid))); - } - for (std::vector::iterator curr = functions->begin(); curr != functions->end(); curr++) { - if ((*curr)->funcname == funcname) { - return *curr; - } - } - - ereport(ERROR, (errmsg("wasm_executor: function %s not exist in instance %ld ", funcname.c_str(), instanceid))); - return NULL; -} - static int64 generate_uuid(Datum input) { Datum uuid = DirectFunctionCall1(hashtext, input); @@ -110,7 +95,6 @@ static int64 wasm_invoke_function(char *instanceid_str, char* funcname, std::vec if (wasm_file == "") { ereport(ERROR, (errmsg("wasm_executor: instance with id %ld is not find", instanceid))); } - WasmFuncInfo *funcinfo = find_exported_func(instanceid, funcname); WasmEdge_ConfigureContext *config_context = WasmEdge_ConfigureCreate(); WasmEdge_ConfigureAddHostRegistration(config_context, WasmEdge_HostRegistration_Wasi); @@ -140,49 +124,84 @@ static int64 wasm_invoke_function(char *instanceid_str, char* funcname, std::vec return ret_val; } -static char* wasm_invoke_function2(char *instanceid_str, char* funcname, vector params) +static char* wasm_invoke_function2(char *instanceid_str, char* funcname, std::vector args) { int64 instanceid = atol(instanceid_str); std::string wasm_file = find_wasm_file(instanceid); if (wasm_file == "") { ereport(ERROR, (errmsg("wasm_executor: instance with id %ld is not find", instanceid))); } - WasmFuncInfo *funcinfo = find_exported_func(instanceid, funcname); WasmEdge_ConfigureContext *config_context = WasmEdge_ConfigureCreate(); WasmEdge_ConfigureAddHostRegistration(config_context, WasmEdge_HostRegistration_Wasi); WasmEdge_VMContext *vm_conext = WasmEdge_VMCreate(config_context, NULL); + WasmEdge_Result res = WasmEdge_VMLoadWasmFromFile(vm_conext, wasm_file.c_str()); + if (!WasmEdge_ResultOK(res)) { + ereport(ERROR, (errmsg("wasm_executor: wasm vm load failed"))); + } + + const WasmEdge_ModuleInstanceContext* instance_ctx = WasmEdge_VMGetActiveModule(vm_conext); + WasmEdge_String mem_name = WasmEdge_StringCreateByCString("memory"); + WasmEdge_MemoryInstanceContext* mem_ctx = WasmEdge_ModuleInstanceFindMemory(instance_ctx, mem_name); + WasmEdge_StringDelete(mem_name); + + WasmEdge_Value results[1]; + WasmEdge_Value malloc_param[1]; WasmEdge_Value params[args.size()]; + + int mem_size = WasmEdge_MemoryInstanceGetPageSize(mem_ctx) * 65536; + int mem_offset = mem_size; + for (unsigned int i = 0; i < args.size(); ++i) { - if (funcinfo->inputs[i] == "integer") { - params[i] = WasmEdge_ValueGenI32(args[i]); - } else { - params[i] = WasmEdge_ValueGenI64(args[i]); + int text_len = strlen(args[i]); + const char *text = args[i]; + malloc_param[0] = WasmEdge_ValueGenI32(text_len + 2); + WasmEdge_String wasmedge_func_name = WasmEdge_StringCreateByCString("opengauss_malloc"); + res = WasmEdge_VMExecute(vm_conext, wasmedge_func_name, malloc_param, 1, results, 1); + WasmEdge_StringDelete(wasmedge_func_name); + if (!WasmEdge_ResultOK(res)) { + ereport(ERROR, (errmsg("wasm_executor: call opengauss malloc failed"))); } + mem_offset = WasmEdge_ValueGetI32(results[0]); + + uint8_t *data = WasmEdge_MemoryInstanceGetPointer(mem_ctx, mem_offset, text_len + 2); + data[0] = OPENGAUSS_TEXT; + memcpy(data + 1, text, text_len); + data[1 + text_len] = '\0'; + params[i] = WasmEdge_ValueGenI32(mem_offset); } - WasmEdge_Value result[1]; - WasmEdge_String wasm_func = WasmEdge_StringCreateByCString(funcname); - WasmEdge_Result ret = WasmEdge_VMRunWasmFromFile(vm_conext, wasm_file.c_str(), wasm_func, params, args.size(), result, 1); - if (!WasmEdge_ResultOK(ret)) { - WasmEdge_VMDelete(vm_conext); - WasmEdge_ConfigureDelete(config_context); - WasmEdge_StringDelete(wasm_func); + WasmEdge_String wasmedge_func_name = WasmEdge_StringCreateByCString(funcname); + res = WasmEdge_VMExecute(vm_conext, wasmedge_func_name, params, args.size(), results, 1); + WasmEdge_StringDelete(wasmedge_func_name); + if (!WasmEdge_ResultOK(res)) { ereport(ERROR, (errmsg("wasm_executor: call func %s failed", funcname))); - } - int64 ret_val = 0; - if (funcinfo->outputs == "integer") { - ret_val = WasmEdge_ValueGetI32(result[0]); - } else { - ret_val = WasmEdge_ValueGetI64(result[0]); } + + int type_offset = WasmEdge_ValueGetI32(results[0]); + char *type_ptr = (char *)WasmEdge_MemoryInstanceGetPointer(mem_ctx, type_offset, 1); + if (!type_ptr) { + ereport(ERROR, (errmsg("Unexpected end of Wasm memory when trying to fetch results"))); + } + char type = *type_ptr; + if (type != OPENGAUSS_TEXT) { + ereport(ERROR, (errmsg("Unsupported type of wasm: %d", type))); + } + + const char *wasm_result = type_ptr + 1; + size_t wasm_result_len = strlen(wasm_result); + char *result = (char *)pg_malloc(wasm_result_len + 1); + if (!result) { + ereport(ERROR, (errmsg("malloc memory for result failed, size: %ld", wasm_result_len))); + } + memcpy(result, wasm_result, wasm_result_len); + /* Resources deallocations. */ WasmEdge_VMDelete(vm_conext); WasmEdge_ConfigureDelete(config_context); - WasmEdge_StringDelete(wasm_func); - return ret_val; + return result; } static void wasm_export_funcs_query(int64 instanceid, TupleFuncState* inter_call_data) @@ -221,8 +240,8 @@ static void wasm_export_funcs_query(int64 instanceid, TupleFuncState* inter_call char tmp_buffer[BUF_LEN] = {0}; uint32_t func_name_len = WasmEdge_StringCopy(func_name_list[i], tmp_buffer, sizeof(tmp_buffer)); elog(DEBUG1, "wasm_executor: exported function string length: %u, name: %s\n", func_name_len, tmp_buffer); - if (strcmp(temp_buffer, malloc_func) == 0) { - elog((DEBUG1, "wasm_executor: opengauss_malloc is not need to export to user\n");) + if (strcmp(tmp_buffer, malloc_func) == 0) { + elog(DEBUG1, "wasm_executor: opengauss_malloc is not need to export to user\n"); continue; } @@ -246,7 +265,7 @@ static void wasm_export_funcs_query(int64 instanceid, TupleFuncState* inter_call param_nums = WasmEdge_FunctionTypeGetParameters(func_type_list[i], param_buffer, MAX_PARAMS); for (unsigned int j = 0; j < param_nums; ++j) { if (param_buffer[j] == WasmEdge_ValType_I32) { - funcinfo->inputs.push_back("varchar"); + funcinfo->inputs.push_back("text"); } else if (param_buffer[j] == WasmEdge_ValType_I64) { funcinfo->inputs.push_back("bigint"); } else { @@ -258,7 +277,7 @@ static void wasm_export_funcs_query(int64 instanceid, TupleFuncState* inter_call return_num = WasmEdge_FunctionTypeGetReturns(func_type_list[i], param_buffer, 10); if (param_buffer[0] == WasmEdge_ValType_I32) { - funcinfo->outputs = "varchar"; + funcinfo->outputs = "text"; } else if (param_buffer[0] == WasmEdge_ValType_I64) { funcinfo->outputs = "bigint"; } else { -- Gitee From d55b155659173d4b5ff26b101230213a2b26e756 Mon Sep 17 00:00:00 2001 From: Nelson-He Date: Thu, 18 May 2023 17:41:55 +0800 Subject: [PATCH 10/15] =?UTF-8?q?=E5=AE=8C=E5=96=84demo=E5=86=85=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- wasm/examples/encrypt_decrypt/README | 21 ++++++++++++++------- wasm/examples/encrypt_decrypt/gen_wasm.sh | 2 +- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/wasm/examples/encrypt_decrypt/README b/wasm/examples/encrypt_decrypt/README index ccfeaff..5a9f761 100644 --- a/wasm/examples/encrypt_decrypt/README +++ b/wasm/examples/encrypt_decrypt/README @@ -1,20 +1,27 @@ +CREATE EXTENSION wasm_executor; + +SELECT wasm_new_instance('/home/opengauss/encypt_decrypt.wasm', 'gs'); + CREATE TABLE users ( -user TEXT PRIMARY KEY, +username TEXT PRIMARY KEY, email TEXT, -pass TEXT +passwd TEXT ); CREATE TABLE secrets(secret text); INSERT INTO secrets VALUES ('s3cretk3y'); -CREATE TRIGGER encrypt_pass AFTER INSERT ON users +CREATE OR REPLACE FUNCTION encrypt_password() RETURNS TRIGGER AS +$$ + DECLARE BEGIN - UPDATE users SET pass = encrypt(new.pass, (SELECT secret FROM secrets LIMIT 1)) - WHERE user = new.user; - END; + INSERT INTO users(username, email, passwd) values(NEW.username, NEW.email, gs_encrypt(NEW.passwd, (SELECT secret FROM secrets LIMIT 1))) + END +$$ LANGUAGE PLPGSQL; +CREATE TRIGGER insert_trigger AFTER INSERT ON users FOR EACH ROW EXECUTE PROCEDURE encrypt_password(); INSERT INTO users VALUES ('peter', 'peter@huawei.com', 'role_ruler'); INSERT INTO users VALUES ('josh', 'josh@huawei.com', 'turkey'); -SELECT user, pass, decrypt(pass, (SELECT secret FROM secrets LIMIT 1)) AS decrypted FROM users; +SELECT username, passwd, decrypt(passwd, (SELECT secret FROM secrets LIMIT 1)) AS decrypted FROM users; diff --git a/wasm/examples/encrypt_decrypt/gen_wasm.sh b/wasm/examples/encrypt_decrypt/gen_wasm.sh index 3a31fa2..558691b 100755 --- a/wasm/examples/encrypt_decrypt/gen_wasm.sh +++ b/wasm/examples/encrypt_decrypt/gen_wasm.sh @@ -3,7 +3,7 @@ set -e OPENGAUSS_EXPORTED_FUNC=$1 -OPENGAUSS_COMPILED_WASM=opengauss-target/wasm32-unknown-unknown/release/opengauss_encrypt_decrypt.wasm +OPENGAUSS_COMPILED_WASM=opengauss-target/wasm32-unknown-unknown/release/encrypt_decrypt.wasm OPENGAUSS_OPTIMIZED_WASM=opengauss-target/encrypt_decrypt.wasm CARGO_TARGET_DIR=opengauss-target cargo build --release --target wasm32-unknown-unknown -- Gitee From 105c6621604cf5bd015510f8d0e4e3bdd8bd7506 Mon Sep 17 00:00:00 2001 From: Nelson-He Date: Fri, 19 May 2023 09:01:18 +0800 Subject: [PATCH 11/15] =?UTF-8?q?=E5=B0=9D=E8=AF=95=E4=BF=AE=E5=A4=8Dwasm?= =?UTF-8?q?=E5=87=BD=E6=95=B0=E6=97=A0=E6=B3=95=E6=89=A7=E8=A1=8C=E7=9A=84?= =?UTF-8?q?BUG?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- wasm/examples/encrypt_decrypt/README | 8 +++++--- wasm/wasm_executor.cpp | 13 ++++++++++++- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/wasm/examples/encrypt_decrypt/README b/wasm/examples/encrypt_decrypt/README index 5a9f761..ace550b 100644 --- a/wasm/examples/encrypt_decrypt/README +++ b/wasm/examples/encrypt_decrypt/README @@ -1,6 +1,6 @@ CREATE EXTENSION wasm_executor; -SELECT wasm_new_instance('/home/opengauss/encypt_decrypt.wasm', 'gs'); +SELECT wasm_new_instance('/home/opengauss/encrypt_decrypt.wasm', 'gs'); CREATE TABLE users ( username TEXT PRIMARY KEY, @@ -15,9 +15,11 @@ CREATE OR REPLACE FUNCTION encrypt_password() RETURNS TRIGGER AS $$ DECLARE BEGIN - INSERT INTO users(username, email, passwd) values(NEW.username, NEW.email, gs_encrypt(NEW.passwd, (SELECT secret FROM secrets LIMIT 1))) + INSERT INTO users(username, email, passwd) + values (NEW.username, NEW.email, gs_encrypt(NEW.passwd, (SELECT secret FROM secrets LIMIT 1))); + RETURN NEW; END -$$ LANGUAGE PLPGSQL; +$$LANGUAGE PLPGSQL; CREATE TRIGGER insert_trigger AFTER INSERT ON users FOR EACH ROW EXECUTE PROCEDURE encrypt_password(); diff --git a/wasm/wasm_executor.cpp b/wasm/wasm_executor.cpp index 19de01d..0192b8e 100644 --- a/wasm/wasm_executor.cpp +++ b/wasm/wasm_executor.cpp @@ -134,11 +134,22 @@ static char* wasm_invoke_function2(char *instanceid_str, char* funcname, std::ve WasmEdge_ConfigureContext *config_context = WasmEdge_ConfigureCreate(); WasmEdge_ConfigureAddHostRegistration(config_context, WasmEdge_HostRegistration_Wasi); + WasmEdge_ConfigureAddHostRegistration(config_context, WasmEdge_HostRegistration_WasiNN); WasmEdge_VMContext *vm_conext = WasmEdge_VMCreate(config_context, NULL); WasmEdge_Result res = WasmEdge_VMLoadWasmFromFile(vm_conext, wasm_file.c_str()); if (!WasmEdge_ResultOK(res)) { - ereport(ERROR, (errmsg("wasm_executor: wasm vm load failed"))); + ereport(ERROR, (errmsg("wasm_executor: wasm vm load failed: %s", WasmEdge_ResultGetMessage(res)))); + } + + res = WasmEdge_VMValidate(vm_conext); + if (!WasmEdge_ResultOK(res)) { + ereport(ERROR, (errmsg("wasm_executor: wasm vm validate failed: %s", WasmEdge_ResultGetMessage(res)))); + } + + res = WasmEdge_VMInstantiate(vm_conext); + if (!WasmEdge_ResultOK(res)) { + ereport(ERROR, (errmsg("wasm_executor: wasm vm initialize failed: %s", WasmEdge_ResultGetMessage(res)))); } const WasmEdge_ModuleInstanceContext* instance_ctx = WasmEdge_VMGetActiveModule(vm_conext); -- Gitee From c219c5378dcc536ecb3b19f2b73927e4f51e5b97 Mon Sep 17 00:00:00 2001 From: Nelson-He Date: Fri, 19 May 2023 10:06:16 +0800 Subject: [PATCH 12/15] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E8=B0=83=E6=B5=8B?= =?UTF-8?q?=E6=97=A5=E5=BF=97=E8=BF=9B=E8=A1=8C=E9=94=99=E8=AF=AF=E8=B0=83?= =?UTF-8?q?=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- wasm/wasm_executor.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/wasm/wasm_executor.cpp b/wasm/wasm_executor.cpp index 0192b8e..44475e5 100644 --- a/wasm/wasm_executor.cpp +++ b/wasm/wasm_executor.cpp @@ -167,6 +167,7 @@ static char* wasm_invoke_function2(char *instanceid_str, char* funcname, std::ve for (unsigned int i = 0; i < args.size(); ++i) { int text_len = strlen(args[i]); const char *text = args[i]; + elog(LOG, "param %d content =%s, len=%d", i, text, text_len); malloc_param[0] = WasmEdge_ValueGenI32(text_len + 2); WasmEdge_String wasmedge_func_name = WasmEdge_StringCreateByCString("opengauss_malloc"); res = WasmEdge_VMExecute(vm_conext, wasmedge_func_name, malloc_param, 1, results, 1); @@ -207,6 +208,7 @@ static char* wasm_invoke_function2(char *instanceid_str, char* funcname, std::ve ereport(ERROR, (errmsg("malloc memory for result failed, size: %ld", wasm_result_len))); } memcpy(result, wasm_result, wasm_result_len); + elog(LOG, "wasm_result=%s, len=%d", wasm_result, wasm_result_len); /* Resources deallocations. */ WasmEdge_VMDelete(vm_conext); -- Gitee From 01219da6adf31645da7f13b9ee580a34ff884e59 Mon Sep 17 00:00:00 2001 From: Nelson-He Date: Fri, 19 May 2023 10:13:59 +0800 Subject: [PATCH 13/15] =?UTF-8?q?=E5=88=A0=E9=99=A4=E8=B0=83=E6=B5=8B?= =?UTF-8?q?=E6=97=A5=E5=BF=97=EF=BC=8C=E5=AE=8C=E5=96=84demo=E7=94=A8?= =?UTF-8?q?=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- wasm/examples/encrypt_decrypt/README | 11 +++++------ wasm/wasm_executor.cpp | 3 +-- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/wasm/examples/encrypt_decrypt/README b/wasm/examples/encrypt_decrypt/README index ace550b..a8d5950 100644 --- a/wasm/examples/encrypt_decrypt/README +++ b/wasm/examples/encrypt_decrypt/README @@ -15,15 +15,14 @@ CREATE OR REPLACE FUNCTION encrypt_password() RETURNS TRIGGER AS $$ DECLARE BEGIN - INSERT INTO users(username, email, passwd) - values (NEW.username, NEW.email, gs_encrypt(NEW.passwd, (SELECT secret FROM secrets LIMIT 1))); + UPDATE users SET passwd = gs_encrypt(NEW.passwd, (SELECT secret FROM secrets LIMIT 1)) WHERE username = NEW.username; RETURN NEW; END $$LANGUAGE PLPGSQL; -CREATE TRIGGER insert_trigger AFTER INSERT ON users FOR EACH ROW EXECUTE PROCEDURE encrypt_password(); +CREATE TRIGGER encrypt_passwd_trigger AFTER INSERT ON users FOR EACH ROW EXECUTE PROCEDURE encrypt_password(); -INSERT INTO users VALUES ('peter', 'peter@huawei.com', 'role_ruler'); -INSERT INTO users VALUES ('josh', 'josh@huawei.com', 'turkey'); +INSERT INTO users VALUES ('peter', 'peter@huawei.com', 'roe-deer'); +INSERT INTO users VALUES ('josh', 'josh@huawei.com', 'turso'); -SELECT username, passwd, decrypt(passwd, (SELECT secret FROM secrets LIMIT 1)) AS decrypted FROM users; +SELECT username, passwd, gs_decrypt(passwd, (SELECT secret FROM secrets LIMIT 1)) AS decrypted FROM users; diff --git a/wasm/wasm_executor.cpp b/wasm/wasm_executor.cpp index 44475e5..87513aa 100644 --- a/wasm/wasm_executor.cpp +++ b/wasm/wasm_executor.cpp @@ -167,7 +167,6 @@ static char* wasm_invoke_function2(char *instanceid_str, char* funcname, std::ve for (unsigned int i = 0; i < args.size(); ++i) { int text_len = strlen(args[i]); const char *text = args[i]; - elog(LOG, "param %d content =%s, len=%d", i, text, text_len); malloc_param[0] = WasmEdge_ValueGenI32(text_len + 2); WasmEdge_String wasmedge_func_name = WasmEdge_StringCreateByCString("opengauss_malloc"); res = WasmEdge_VMExecute(vm_conext, wasmedge_func_name, malloc_param, 1, results, 1); @@ -208,7 +207,7 @@ static char* wasm_invoke_function2(char *instanceid_str, char* funcname, std::ve ereport(ERROR, (errmsg("malloc memory for result failed, size: %ld", wasm_result_len))); } memcpy(result, wasm_result, wasm_result_len); - elog(LOG, "wasm_result=%s, len=%d", wasm_result, wasm_result_len); + result[wasm_result_len] = '\0'; /* Resources deallocations. */ WasmEdge_VMDelete(vm_conext); -- Gitee From 043ede31937128e252611b85b410a681d6469f00 Mon Sep 17 00:00:00 2001 From: Nelson-He Date: Fri, 19 May 2023 11:06:56 +0800 Subject: [PATCH 14/15] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=BC=94=E7=A4=BAdemo?= =?UTF-8?q?=E7=9A=84wasm=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../encrypt_decrypt/encrypt_decrypt.wasm | Bin 0 -> 164051 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 wasm/examples/encrypt_decrypt/encrypt_decrypt.wasm diff --git a/wasm/examples/encrypt_decrypt/encrypt_decrypt.wasm b/wasm/examples/encrypt_decrypt/encrypt_decrypt.wasm new file mode 100644 index 0000000000000000000000000000000000000000..2179154507dcd5cf426deece6b6f4760ecac8d9e GIT binary patch literal 164051 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όF4C!j2Jtxc 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 literal 0 HcmV?d00001 -- Gitee From 49961fd4723878951560c71388da046c9b90a88b Mon Sep 17 00:00:00 2001 From: Nelson-He Date: Fri, 19 May 2023 11:36:49 +0800 Subject: [PATCH 15/15] =?UTF-8?q?=E4=BF=AE=E6=94=B9openGauss=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E4=B8=BA5.0.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docker/Dockerfile | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index a7821a1..830d498 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -2,7 +2,7 @@ FROM openeuler/openeuler:22.03-lts MAINTAINER openGauss-ml@openguass.org LABEL MAIL="heguofeng@huawei.com" \ CREATE_DATE="2022-10" \ - GAUSS_SERVER="openGauss-3.1.0" + GAUSS_SERVER="openGauss-5.0.0" RUN \ sed -i "s/gpgcheck=1/gpgcheck=0/g" /etc/yum.repos.d/openEuler.repo && \ @@ -24,29 +24,30 @@ USER opengauss:opengauss RUN cp -f /home/opengauss/bashrc /home/opengauss/.bashrc && \ cd /home/opengauss && \ if [ "`uname -m`" == "x86_64" ]; then \ - wget -q https://opengauss.obs.cn-south-1.myhuaweicloud.com/3.1.0/binarylibs/openGauss-third_party_binarylibs_openEuler_x86_64.tar.gz -O openGauss_third.tar.gz; \ + wget -q https://opengauss.obs.cn-south-1.myhuaweicloud.com/5.0.0/binarylibs/openGauss-third_party_binarylibs_openEuler_x86_64.tar.gz -O openGauss_third.tar.gz; \ else \ - wget -q https://opengauss.obs.cn-south-1.myhuaweicloud.com/3.1.0/binarylibs/openGauss-third_party_binarylibs_openEuler_arm.tar.gz -O openGauss_third.tar.gz; \ + wget -q https://opengauss.obs.cn-south-1.myhuaweicloud.com/5.0.0/binarylibs/openGauss-third_party_binarylibs_openEuler_arm.tar.gz -O openGauss_third.tar.gz; \ fi && \ tar -xf openGauss_third.tar.gz && mv openGauss-third_party_binarylibs* binarylibs && rm -f openGauss_third.tar.gz && \ curl -sSf https://raw.githubusercontent.com/WasmEdge/WasmEdge/master/utils/install.sh | bash -s -- -v 0.11.2 && source /home/opengauss/.wasmedge/env && \ curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y && source "$HOME/.cargo/env" && \ rustup target add wasm32-unknown-unknown && \ - cargo install wasm-gc && \ - source /home/opengauss/.bashrc && git clone https://gitee.com/Nelson-He/openGauss-server.git && cd openGauss-server && \ + cargo install wasm-gc && source /home/opengauss/.bashrc && \ + wget -q https://gitee.com/opengauss/openGauss-server/repository/archive/v5.0.0.zip && unzip -q v5.0.0.zip && rm -rf v5.0.0.zip && \ + cd openGauss-server-v5.0.0 && \ ./configure --gcc-version=7.3.0 CC=g++ CFLAGS='-O2' \ --prefix=$GAUSSHOME --3rd=$BINARYLIBS \ --enable-cassert --enable-thread-safety \ --without-readline --without-zlib && \ make -sj 8 && make install -sj 8 && \ cd /home/opengauss && git clone https://gitee.com/Nelson-He/openGauss-wasm.git -b wasmedge && \ - cp -rf openGauss-wasm/wasm openGauss-server/contrib && \ - cd openGauss-server/contrib/wasm && make && make install && \ + cp -rf openGauss-wasm/wasm openGauss-server-v5.0.0/contrib && \ + cd openGauss-server-v5.0.0/contrib/wasm && make && make install && \ cd /home/opengauss && \ chmod +x /home/opengauss/entrypoint.sh && \ - cp /home/opengauss/openGauss-server/contrib/wasm/examples/* /home/opengauss && \ + cp /home/opengauss/openGauss-server-v5.0.0/contrib/wasm/examples/* /home/opengauss && \ sudo rm -rf /home/opengauss/binarylibs && \ - sudo rm -rf /home/opengauss/openGauss-server && \ + sudo rm -rf /home/opengauss/openGauss-server-v5.0.0 && \ sudo rm -rf /home/opengauss/openGauss-wasm && \ sudo yum remove -y make cmake git && \ sudo yum clean all -- Gitee