Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/danbugs/dancing_sql
This is an incoming SQLite clone compiled to WebAssembly.
https://github.com/danbugs/dancing_sql
c sql webassembly
Last synced: about 1 month ago
JSON representation
This is an incoming SQLite clone compiled to WebAssembly.
- Host: GitHub
- URL: https://github.com/danbugs/dancing_sql
- Owner: danbugs
- License: agpl-3.0
- Created: 2021-09-05T20:11:25.000Z (over 3 years ago)
- Default Branch: main
- Last Pushed: 2021-09-11T18:04:42.000Z (over 3 years ago)
- Last Synced: 2024-05-01T17:01:16.512Z (8 months ago)
- Topics: c, sql, webassembly
- Language: C
- Homepage: https://danbugs.github.io/dancing_sql/
- Size: 324 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE.md
Awesome Lists containing this project
README
# DanCing SQL 💃📂 (DCS)
This is an **incoming** SQLite clone compiled to WebAssembly — heavily inspired by [this](https://cstack.github.io/db_tutorial/).
## Getting Started
Dancing SQL is now distributed with the [Tarantella Package Manager](https://github.com/danbugs/tarantella) — a tool I've made to simplify setup of projects like these!
To install the Tarantella Package Manager, you need the Rust toolchain — for instructions on how to install it, see [this](https://www.rust-lang.org/tools/install). Once you're done with that, you can install Tarantella by running: `cargo install tarantella`.
To start-off, setup a new main module WASM project with: `tapm new my-first-project --server`. This will start a new C WASM project with:
- a build folder,
- a dependencies folder,
- an index.js,
- a `Makefile`,
- a releases folder,
- a src folder with some starting code in `main.c`, and a
- `Tarantella.toml` file.Next, add the latest version of Dancing SQL as a dependency with: `tapm add "danbugs/dancing_sql"`. This will automatically download DCS to your dependencies folder, add it to your `Tarantella.toml` list of dependencies, and append `dependencies/dcs/dcs.o` to the `DEPENDENCIES` variable of your `Makefile` to facilitate compilation.
Now, replace the content of `src/main.c`with:
```C
#include
#include
#include "../dependencies/dcs/dcs.h"
// ^^^ adds necessary structs and definitions from DCSextern Statement execute_sql(sql_t raw_sql, Table *table);
extern Table *open_table(char *table_name);
extern void close_table(Table *table);
// ^^^ group of functions coming from ../dependencies/dcs/dcs.oint main()
{
Table *table = open_table("mytable");
// ^^^ creating a new default table.
// Default Structure:
// - INTEGER id, and
// - VARCHAR(255) content ~ meant to contain all necessary info in sort of a JSON.stringify-ed way.
// Notes:
// - content will be trucated at 255 characters.
// - just like VARCHAR, you content does not
// need to have 255 bytes but; regardless,
// 255 will still be allocated for that field.sql_t insert_s = SQL(INSERT 0 '{"name":"dan"}');
// ^^^ un-executed insert statement.
// Notes:
// - 'INSERT' must be upper-case, the VM
// is case-sensitive.
// - There are currently no checks to ensure
// the ID is unique.sql_t select_s = SQL(SELECT);
// ^^^ un-executed select statement.
// Note: 'SELECT' must be upper-case, the VM
// is case-sensitive.Statement insert_r = execute_sql(insert_s, table);
Statement select_r = execute_sql(select_s, table);
printf("select: %s\n", select_r.select_result);
// ^^^ executes SQL statements and
// prints results to console.close_table(table);
// ^^^ frees malloc-ed table and its'
// attributes and saves data to database file.
}
```Next, in your `Makefile`, change the `EMCC_CFLAGS` to:
```Makefile
EMCC_CFLAGS=-s MAIN_MODULE=1 -lnodefs.js -s EXIT_RUNTIME=1
```Now, to finish off, run `tapm build` to compile our code and `tapm run` to test it out. You should see the following in your console:
![getting-started-result](https://i.imgur.com/SFGtWBc.png)Your information will be persisted to a file at `db/mytable.db`.
You can view the `mytable.db` file directly w/ a hex editor. In VSCode, you can install [this](https://marketplace.visualstudio.com/items?itemName=slevesque.vscode-hexdump) extension, right click the `mytable.db` file and select "Show hexdump". You should see:
![getting-started-hexdump-of-db-file](https://i.imgur.com/QxhZhtg.png)
## Notes to Self
Use: `emcc .\src\main.c ..\src\dcs.c -l"nodefs.js" -s EXIT_RUNTIME=1 -fsanitize=address
-s ALLOW_MEMORY_GROWTH -gsource-map --source-map-base http://localhost:3000/test -o
test/example.js` to check for mem-leaks and whatnot.