55 lines
1.6 KiB
Rust
Raw Normal View History

2019-08-14 13:31:26 +03:00
use fluence::sdk::*;
use log::info;
fn init() {
logger::WasmLogger::init_with_level(log::Level::Info).unwrap();
}
#[invocation_handler(init_fn = init)]
2019-08-14 13:35:39 +03:00
fn azaza(arg: String) -> String {
2019-08-14 13:31:26 +03:00
println!("Hello, world!");
let query = "CREATE VIRTUAL TABLE users USING FTS5(body)";
unsafe {
let bytes = query.as_bytes();
let query_ptr = allocate(bytes.len());
for (i, byte) in bytes.iter().enumerate() {
let ptr = query_ptr as usize + 8*i;
store(ptr, *byte);
}
let result_ptr = invoke(query_ptr, bytes.len());
let mut result_size = 0;
2019-08-14 13:43:17 +03:00
for i in 0u8..4u8 {
let ptr = result_ptr as usize + 8*i as usize;
let b = load(ptr);
2019-08-14 13:31:26 +03:00
result_size = result_size | (b >> 8*i)
}
2019-08-14 13:43:17 +03:00
let mut result_bytes = vec![0; result_size as usize];
for i in 0u8..result_size {
let ptr = result_ptr as usize + 8*i as usize;
let b = load(ptr);
result_bytes[i as usize] = b;
2019-08-14 13:31:26 +03:00
}
2019-08-14 13:43:17 +03:00
let result_str = std::str::from_utf8(result_bytes.as_slice());
2019-08-14 13:31:26 +03:00
if result_str.is_err() {
2019-08-14 13:43:17 +03:00
info!("unable to decode result from result_bytes: {:?}", result_bytes);
2019-08-14 13:31:26 +03:00
}
2019-08-14 13:43:17 +03:00
info!("result is {:?}", result_str);
2019-08-14 13:31:26 +03:00
result_str.expect("unable to decode result").to_string()
}
}
#[link(wasm_import_module = "sqlite")]
extern "C" {
fn allocate(size: usize) -> i32;
2019-08-14 13:43:17 +03:00
fn deallocate(ptr: i32, size: usize);
2019-08-14 13:31:26 +03:00
fn invoke(ptr: i32, size: usize) -> i32;
2019-08-14 13:43:17 +03:00
fn store(ptr: usize, byte: u8);
2019-08-14 13:31:26 +03:00
fn load(ptr: usize) -> u8;
}