From 8296486eaa66d26ee55462abe01c566c0bf37cc4 Mon Sep 17 00:00:00 2001 From: vms Date: Thu, 17 Sep 2020 21:46:53 +0300 Subject: [PATCH] add sqlite example --- .gitignore | 1 + Cargo.lock | 51 ++++++++++---- Cargo.toml | 3 +- engine/src/module/type_converters.rs | 2 +- examples/sqlite/Cargo.toml | 13 ++++ examples/sqlite/Config.toml | 11 +++ examples/sqlite/artifacts/sqlite_test.wasm | Bin 0 -> 103715 bytes examples/sqlite/build.sh | 10 +++ examples/sqlite/src/main.rs | 76 +++++++++++++++++++++ 9 files changed, 153 insertions(+), 14 deletions(-) create mode 100644 examples/sqlite/Cargo.toml create mode 100644 examples/sqlite/Config.toml create mode 100755 examples/sqlite/artifacts/sqlite_test.wasm create mode 100755 examples/sqlite/build.sh create mode 100644 examples/sqlite/src/main.rs diff --git a/.gitignore b/.gitignore index dab3949d..3be503c9 100644 --- a/.gitignore +++ b/.gitignore @@ -16,6 +16,7 @@ target/ !/examples/greeting/artifacts/*.wasm !/examples/ipfs_node/artifacts/*.wasm !/examples/records/artifacts/*.wasm +!/examples/sqlite/artifacts/sqlite_test.wasm # Allowed Wasm files for test !/fluence-faas/tests/json_wasm_tests/arguments_passing/artifacts/effector.wasm diff --git a/Cargo.lock b/Cargo.lock index 39dbd8b5..bba1b121 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -43,7 +43,7 @@ checksum = "6b602bfe940d21c130f3895acd65221e8a61270debe89d628b9cb4e3ccb8569b" name = "arguments-passing-test" version = "0.1.0" dependencies = [ - "fluence", + "fluence 0.2.3 (git+https://github.com/fluencelabs/rust-sdk)", "safe-transmute", ] @@ -166,7 +166,7 @@ checksum = "0e4cec68f03f32e44924783795810fa50a7035d8c8ebe78580ad7e6c703fba38" name = "call_parameters" version = "0.1.0" dependencies = [ - "fluence", + "fluence 0.2.3 (git+https://github.com/fluencelabs/rust-sdk)", ] [[package]] @@ -375,7 +375,7 @@ dependencies = [ name = "curl" version = "0.1.0" dependencies = [ - "fluence", + "fluence 0.2.3 (git+https://github.com/fluencelabs/rust-sdk)", "log", ] @@ -619,6 +619,15 @@ dependencies = [ "wasmer-wasi-fl", ] +[[package]] +name = "fce-sqlite-connector" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3931a7a9f133e94246ff2c36a14b66d3ea16e8460e715b982bd8974e56151b7b" +dependencies = [ + "fluence 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "fce-wit-generator" version = "0.1.6" @@ -673,6 +682,16 @@ dependencies = [ "fluence-sdk-main 0.2.3 (git+https://github.com/fluencelabs/rust-sdk)", ] +[[package]] +name = "fluence" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47a382fa3506247e84d799645523c56ebfcb4cdefb45671dd31f8664cfc86007" +dependencies = [ + "fluence-sdk-macro 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "fluence-sdk-main 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "fluence-app-service" version = "0.1.6" @@ -1106,7 +1125,7 @@ dependencies = [ name = "inner-records-test" version = "0.1.0" dependencies = [ - "fluence", + "fluence 0.2.3 (git+https://github.com/fluencelabs/rust-sdk)", "safe-transmute", ] @@ -1145,7 +1164,7 @@ dependencies = [ name = "ipfs-effector" version = "0.1.0" dependencies = [ - "fluence", + "fluence 0.2.3 (git+https://github.com/fluencelabs/rust-sdk)", "log", ] @@ -1153,7 +1172,7 @@ dependencies = [ name = "ipfs-pure" version = "0.1.0" dependencies = [ - "fluence", + "fluence 0.2.3 (git+https://github.com/fluencelabs/rust-sdk)", "log", ] @@ -1232,7 +1251,7 @@ checksum = "f2f96b10ec2560088a8e76961b00d47107b3a625fecb76dedb29ee7ccbf98235" name = "local_storage" version = "0.1.0" dependencies = [ - "fluence", + "fluence 0.2.3 (git+https://github.com/fluencelabs/rust-sdk)", "log", ] @@ -1721,7 +1740,7 @@ dependencies = [ name = "record-effector" version = "0.1.0" dependencies = [ - "fluence", + "fluence 0.2.3 (git+https://github.com/fluencelabs/rust-sdk)", "test-record", ] @@ -1729,7 +1748,7 @@ dependencies = [ name = "record-pure" version = "0.1.0" dependencies = [ - "fluence", + "fluence 0.2.3 (git+https://github.com/fluencelabs/rust-sdk)", "test-record", ] @@ -2014,7 +2033,7 @@ name = "site-storage" version = "0.1.0" dependencies = [ "anyhow", - "fluence", + "fluence 0.2.3 (git+https://github.com/fluencelabs/rust-sdk)", "log", ] @@ -2158,7 +2177,7 @@ dependencies = [ name = "test-record" version = "0.1.0" dependencies = [ - "fluence", + "fluence 0.2.3 (git+https://github.com/fluencelabs/rust-sdk)", ] [[package]] @@ -2593,7 +2612,15 @@ checksum = "1d649a3145108d7d3fbcde896a468d1bd636791823c9921135218ad89be08307" name = "wasm-greeting" version = "0.1.0" dependencies = [ - "fluence", + "fluence 0.2.3 (git+https://github.com/fluencelabs/rust-sdk)", +] + +[[package]] +name = "wasm-sqlite-test" +version = "0.1.0" +dependencies = [ + "fce-sqlite-connector", + "fluence 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index a55a3a8e..0729652c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,6 +4,7 @@ members = [ "crates/wit-interfaces", "crates/wit-parser", "engine", + "examples/call_parameters", "examples/greeting", "examples/ipfs-node/effector", "examples/ipfs-node/pure", @@ -13,7 +14,7 @@ members = [ "examples/site-storage/site-storage", "examples/site-storage/curl", "examples/site-storage/local_storage", - "examples/call_parameters", + "examples/sqlite", "fluence-app-service", "fluence-faas", "fluence-faas/tests/json_wasm_tests/arguments_passing", diff --git a/engine/src/module/type_converters.rs b/engine/src/module/type_converters.rs index f9ae60cd..6c1a1730 100644 --- a/engine/src/module/type_converters.rs +++ b/engine/src/module/type_converters.rs @@ -44,7 +44,7 @@ pub(super) fn itype_to_wtype(ty: &IType) -> WType { ty => { eprintln!("trying to convert {:?}", ty); unimplemented!() - }, + } } } diff --git a/examples/sqlite/Cargo.toml b/examples/sqlite/Cargo.toml new file mode 100644 index 00000000..f6ddd7d9 --- /dev/null +++ b/examples/sqlite/Cargo.toml @@ -0,0 +1,13 @@ +[package] +name = "wasm-sqlite-test" +version = "0.1.0" +authors = ["Fluence Labs"] +edition = "2018" + +[[bin]] +name = "sqlite_test" +path = "src/main.rs" + +[dependencies] +fluence = "0.2.3" +fce-sqlite-connector = "0.1.0" diff --git a/examples/sqlite/Config.toml b/examples/sqlite/Config.toml new file mode 100644 index 00000000..4274a1f5 --- /dev/null +++ b/examples/sqlite/Config.toml @@ -0,0 +1,11 @@ +modules_dir = "artifacts/" + +[[module]] + name = "sqlite3" + mem_pages_count = 100 + logger_enabled = false + +[[module]] +name = "sqlite_test" + mem_pages_count = 1 + logger_enabled = false diff --git a/examples/sqlite/artifacts/sqlite_test.wasm b/examples/sqlite/artifacts/sqlite_test.wasm new file mode 100755 index 0000000000000000000000000000000000000000..0d280b82037dbca3f373370c80aaaa6539052a17 GIT binary patch literal 103715 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 literal 0 HcmV?d00001 diff --git a/examples/sqlite/build.sh b/examples/sqlite/build.sh new file mode 100755 index 00000000..60e5c938 --- /dev/null +++ b/examples/sqlite/build.sh @@ -0,0 +1,10 @@ +#!/bin/sh + +# This script builds all subprojects and puts all created Wasm modules in one dir +cargo update +fce build --release + +rm artifacts/* +cp ../../target/wasm32-wasi/release/sqlite_test.wasm artifacts/ +wget https://github.com/fluencelabs/sqlite/releases/download/v0.7.0_w/sqlite3.wasm +mv sqlite3.wasm artifacts/ diff --git a/examples/sqlite/src/main.rs b/examples/sqlite/src/main.rs new file mode 100644 index 00000000..50b86fac --- /dev/null +++ b/examples/sqlite/src/main.rs @@ -0,0 +1,76 @@ +/* + * Copyright 2020 Fluence Labs Limited + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +use fluence::fce; +use fce_sqlite_connector; +use fce_sqlite_connector::State; + +pub fn main() {} + +#[fce] +pub fn test1() { + let connection = fce_sqlite_connector::open(":memory:").unwrap(); + + connection + .execute( + " + CREATE TABLE users (name TEXT, age INTEGER); + INSERT INTO users VALUES ('Alice', 42); + INSERT INTO users VALUES ('Bob', 69); + ", + ) + .unwrap(); + + let mut statement = connection + .prepare("SELECT * FROM users WHERE age > ?") + .unwrap(); + + statement.bind(1, 50).unwrap(); + + while let State::Row = statement.next().unwrap() { + println!("name = {}", statement.read::(0).unwrap()); + println!("age = {}", statement.read::(1).unwrap()); + } +} + +#[fce] +pub fn test2() { + use fce_sqlite_connector::Value; + + let connection = fce_sqlite_connector::open(":memory:").unwrap(); + + connection + .execute( + " + CREATE TABLE users (name TEXT, age INTEGER); + INSERT INTO users VALUES ('Alice', 42); + INSERT INTO users VALUES ('Bob', 69); + ", + ) + .unwrap(); + + let mut cursor = connection + .prepare("SELECT * FROM users WHERE age > ?") + .unwrap() + .cursor(); + + cursor.bind(&[Value::Integer(50)]).unwrap(); + + while let Some(row) = cursor.next().unwrap() { + println!("name = {}", row[0].as_string().unwrap()); + println!("age = {}", row[1].as_integer().unwrap()); + } +}