diff --git a/odd/encrypt_decrypt/10_check_result b/odd/encrypt_decrypt/10_check_result new file mode 100644 index 0000000000000000000000000000000000000000..da2c923933dc4bfbfbc3af1b414e11004e822c48 --- /dev/null +++ b/odd/encrypt_decrypt/10_check_result @@ -0,0 +1 @@ +SELECT username, passwd, gs_decrypt(passwd, (SELECT secret FROM secrets LIMIT 1)) AS decrypted FROM users; diff --git a/odd/encrypt_decrypt/1_compile_to_wasm b/odd/encrypt_decrypt/1_compile_to_wasm new file mode 100755 index 0000000000000000000000000000000000000000..1aba0753bf6a455f0a3713677dbd8682e0f4700d --- /dev/null +++ b/odd/encrypt_decrypt/1_compile_to_wasm @@ -0,0 +1,10 @@ +#!/usr/bin/env bash + +set -e + +echo "cargo build --release --target wasm32-unknown-unknown" +cargo build --release --target wasm32-unknown-unknown + +echo "wasm-opt -Os target/wasm32-unknown-unknown/release/opengauss_encrypt_decrypt.wasm -o encrypt_decrypt.wasm" +wasm-opt -Os target/wasm32-unknown-unknown/release/opengauss_encrypt_decrypt.wasm -o encrypt_decrypt.wasm + diff --git a/odd/encrypt_decrypt/2_create_extension b/odd/encrypt_decrypt/2_create_extension new file mode 100644 index 0000000000000000000000000000000000000000..a5488356d201ee955e2e6e97c3c31732ba4f6a4b --- /dev/null +++ b/odd/encrypt_decrypt/2_create_extension @@ -0,0 +1 @@ +CREATE EXTENSION wasm_executor; diff --git a/odd/encrypt_decrypt/3_load_wasm_func b/odd/encrypt_decrypt/3_load_wasm_func new file mode 100644 index 0000000000000000000000000000000000000000..875395f4e35496deac6c8f8c008df9cff6f9cfc8 --- /dev/null +++ b/odd/encrypt_decrypt/3_load_wasm_func @@ -0,0 +1 @@ +SELECT wasm_new_instance('/home/opengauss/odd/encrypt_decrypt/encrypt_decrypt.wasm', 'gs'); diff --git a/odd/encrypt_decrypt/4_show_exported_func b/odd/encrypt_decrypt/4_show_exported_func new file mode 100644 index 0000000000000000000000000000000000000000..3c40ca26ed125361be87b1905441578eb533ae40 --- /dev/null +++ b/odd/encrypt_decrypt/4_show_exported_func @@ -0,0 +1 @@ +select * from wasm.exported_functions; diff --git a/odd/encrypt_decrypt/5_create_user_table b/odd/encrypt_decrypt/5_create_user_table new file mode 100644 index 0000000000000000000000000000000000000000..d262edf82eda416cd96505ae4083f9803c2acd10 --- /dev/null +++ b/odd/encrypt_decrypt/5_create_user_table @@ -0,0 +1,5 @@ +CREATE TABLE users ( + username TEXT PRIMARY KEY, + email TEXT, + passwd TEXT +); diff --git a/odd/encrypt_decrypt/6_init_secret_key b/odd/encrypt_decrypt/6_init_secret_key new file mode 100644 index 0000000000000000000000000000000000000000..cf9bdeaff262a2a1f2dc2ac157238aca143e40a4 --- /dev/null +++ b/odd/encrypt_decrypt/6_init_secret_key @@ -0,0 +1,2 @@ +CREATE TABLE secrets(secret text); +INSERT INTO secrets VALUES ('s3cretk3y'); diff --git a/odd/encrypt_decrypt/7_create_trigger_func b/odd/encrypt_decrypt/7_create_trigger_func new file mode 100644 index 0000000000000000000000000000000000000000..69bc2c4740f8b61069bc17a58a0a229d1e3341f7 --- /dev/null +++ b/odd/encrypt_decrypt/7_create_trigger_func @@ -0,0 +1,8 @@ +CREATE OR REPLACE FUNCTION encrypt_password() RETURNS TRIGGER AS +$$ + DECLARE + BEGIN + UPDATE users SET passwd = gs_encrypt(NEW.passwd, (SELECT secret FROM secrets LIMIT 1)) WHERE username = NEW.username; + RETURN NEW; + END +$$LANGUAGE PLPGSQL; diff --git a/odd/encrypt_decrypt/8_create_trigger b/odd/encrypt_decrypt/8_create_trigger new file mode 100644 index 0000000000000000000000000000000000000000..0be0972fac3bf4410f5b328b904a63a7e98ee3a6 --- /dev/null +++ b/odd/encrypt_decrypt/8_create_trigger @@ -0,0 +1 @@ +CREATE TRIGGER encrypt_passwd_trigger AFTER INSERT ON users FOR EACH ROW EXECUTE PROCEDURE encrypt_password(); diff --git a/odd/encrypt_decrypt/9_insert_user_data b/odd/encrypt_decrypt/9_insert_user_data new file mode 100644 index 0000000000000000000000000000000000000000..05be3b9877219cf1cc51888e247752fa22baebed --- /dev/null +++ b/odd/encrypt_decrypt/9_insert_user_data @@ -0,0 +1,11 @@ +INSERT INTO users VALUES + ('nel', 'nel@xx.com', 'nelson_passwd'); +INSERT INTO users VALUES + ('mic', 'mic@xx.com', 'mickle_passwd'); +INSERT INTO users VALUES + ('jay', 'jay@xx.com', 'jackson_passwd'); +INSERT INTO users VALUES + ('lily', 'lily@xx.com', 'lily_passwd'); +INSERT INTO users VALUES + ('anna', 'anna@xx.com', 'anna_passwd'); + diff --git a/odd/encrypt_decrypt/Cargo.toml b/odd/encrypt_decrypt/Cargo.toml new file mode 100644 index 0000000000000000000000000000000000000000..37f550008682aa3a817023daa3e1ee3eb75a6dc5 --- /dev/null +++ b/odd/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 = "0.1.0" +magic-crypt = "3.1" + +[lib] +crate-type = ["cdylib"] diff --git a/odd/encrypt_decrypt/src/lib.rs b/odd/encrypt_decrypt/src/lib.rs new file mode 100644 index 0000000000000000000000000000000000000000..847e89a8b904ea9eb82457a1393be51304b711f7 --- /dev/null +++ b/odd/encrypt_decrypt/src/lib.rs @@ -0,0 +1,15 @@ +use opengauss_bindgen::*; +use magic_crypt::{new_magic_crypt, MagicCryptTrait}; + +#[opengauss_bindgen::opengauss_bindgen] +pub fn encrypt(data: String, key: String) -> String { + let mc = new_magic_crypt!(key, 256); + mc.encrypt_str_to_base64(data) +} + +#[opengauss_bindgen::opengauss_bindgen] +pub fn decrypt(data: String, key: String) -> String { + let mc = new_magic_crypt!(key, 256); + mc.decrypt_base64_to_string(data) + .unwrap_or("[ACCESS DENIED]".to_owned()) +} diff --git a/odd/fib/1_compile_to_wasm b/odd/fib/1_compile_to_wasm new file mode 100755 index 0000000000000000000000000000000000000000..97e2c5522cb994d1b678befdc33dc7ead2a2149c --- /dev/null +++ b/odd/fib/1_compile_to_wasm @@ -0,0 +1,9 @@ +#!/usr/bin/env bash + +set -e + +echo "cargo build --release --target wasm32-unknown-unknown" +cargo build --release --target wasm32-unknown-unknown + +echo "wasm-opt -Os target/wasm32-unknown-unknown/release/fib.wasm -o fib.wasm" +wasm-opt -Os target/wasm32-unknown-unknown/release/fib.wasm -o fib.wasm diff --git a/odd/fib/2_create_sql_func b/odd/fib/2_create_sql_func new file mode 100644 index 0000000000000000000000000000000000000000..dcdef58f12fe24ee1b3158baa0d391a6820c6c10 --- /dev/null +++ b/odd/fib/2_create_sql_func @@ -0,0 +1,20 @@ +CREATE OR REPLACE FUNCTION sql_fib (n integer) RETURNS decimal AS $$ +DECLARE + counter bigint := 1; + i decimal := 0; + j decimal := 1; +BEGIN + IF (n <= 1) THEN + RETURN n; + END IF; + + WHILE counter <= n LOOP + counter := counter + 1; + SELECT j, i + j INTO i, j; + END LOOP; + + RETURN i; +END; +$$ LANGUAGE plpgsql; + + diff --git a/odd/fib/3_load_wasm_func b/odd/fib/3_load_wasm_func new file mode 100644 index 0000000000000000000000000000000000000000..a96790154056d1b03c7e8865dab0dccd4bb77db3 --- /dev/null +++ b/odd/fib/3_load_wasm_func @@ -0,0 +1 @@ +SELECT wasm_new_instance('/home/opengauss/odd/fib/fib.wasm', 'gs'); diff --git a/odd/fib/4_show_exported_func b/odd/fib/4_show_exported_func new file mode 100644 index 0000000000000000000000000000000000000000..3c40ca26ed125361be87b1905441578eb533ae40 --- /dev/null +++ b/odd/fib/4_show_exported_func @@ -0,0 +1 @@ +select * from wasm.exported_functions; diff --git a/odd/fib/5_timing_sql b/odd/fib/5_timing_sql new file mode 100644 index 0000000000000000000000000000000000000000..c574eecaf9b4b0c1eda594bd39fabffc9f542713 --- /dev/null +++ b/odd/fib/5_timing_sql @@ -0,0 +1,14 @@ +\timing + +select sql_fib(10); + +select sql_fib(30); + +select sql_fib(50); + +select sql_fib(70); + +select sql_fib(90); + +\timing + diff --git a/odd/fib/6_timing_wasm b/odd/fib/6_timing_wasm new file mode 100644 index 0000000000000000000000000000000000000000..63a9362ba9f9164c79f0b55707498256919b2e13 --- /dev/null +++ b/odd/fib/6_timing_wasm @@ -0,0 +1,14 @@ +\timing + +select gs_fib(10); + +select gs_fib(30); + +select gs_fib(50); + +select gs_fib(70); + +select gs_fib(90); + +\timing + diff --git a/odd/fib/Cargo.toml b/odd/fib/Cargo.toml new file mode 100644 index 0000000000000000000000000000000000000000..a3bfce995f76d83a3f8fadf7cc5f2766684b9f39 --- /dev/null +++ b/odd/fib/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "fib" +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 = "0.1.0" + +[lib] +crate-type = ["cdylib"] diff --git a/odd/fib/src/lib.rs b/odd/fib/src/lib.rs new file mode 100644 index 0000000000000000000000000000000000000000..3eb7704194b2814a99ae885c5980889e46b9475a --- /dev/null +++ b/odd/fib/src/lib.rs @@ -0,0 +1,18 @@ +#[opengauss_bindgen::opengauss_bindgen] +fn fib(n: u64) -> u64 { + if n <= 1 { + n + } else { + let mut accumulator = 0; + let mut last = 0; + let mut current = 1; + + for _i in 1..n { + accumulator = last + current; + last = current; + current = accumulator; + } + + accumulator + } +} diff --git a/wasm/examples/encrypt_decrypt/Cargo.toml b/wasm/examples/encrypt_decrypt/Cargo.toml index 68cc4249424efbae67c1e6f7676b02ed12b00262..37f550008682aa3a817023daa3e1ee3eb75a6dc5 100644 --- a/wasm/examples/encrypt_decrypt/Cargo.toml +++ b/wasm/examples/encrypt_decrypt/Cargo.toml @@ -6,7 +6,7 @@ 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" } +opengauss_bindgen = "0.1.0" magic-crypt = "3.1" [lib] diff --git a/wasm/examples/encrypt_decrypt/README b/wasm/examples/encrypt_decrypt/README index d72c98d03af1210271239b6fbc5804b51103dd68..a962c3fdf5c941ad080b1a0767f0f9c0ed0f2ac3 100644 --- a/wasm/examples/encrypt_decrypt/README +++ b/wasm/examples/encrypt_decrypt/README @@ -1,11 +1,12 @@ + CREATE EXTENSION wasm_executor; SELECT wasm_new_instance('/home/opengauss/encrypt_decrypt.wasm', 'gs'); CREATE TABLE users ( -username TEXT PRIMARY KEY, -email TEXT, -passwd TEXT + username TEXT PRIMARY KEY, + email TEXT, + passwd TEXT ); CREATE TABLE secrets(secret text);