gluesql 0.3.0

GlueSQL - Open source SQL database engine fully written in Rust with pure functional execution layer, easily swappable storage and web assembly support!
Documentation

GlueSQL

crates.io docs.rs LICENSE Rust

SQL Database Engine as a Library

GlueSQL is a SQL database library written in Rust which provides parser (sqlparser-rs), execution layer, and an optional storage (sled).
Developers can use GlueSQL to build their own SQL databases or they can simply use GlueSQL as an embedded SQL database using default storage.

Standalone Mode

You can simply use GlueSQL as an embedded SQL database, GlueSQL provides sled as a default storage engine.

Installation

In your Cargo.toml

[dependencies]
gluesql = "0.3"

Usage

use gluesql::{parse, Glue, SledStorage};

fn main() {
    let storage = SledStorage::new("data.db").unwrap();
    let mut glue = Glue::new(storage);

    let sqls = "
        CREATE TABLE Glue (id INTEGER);
        INSERT INTO Glue VALUES (100);
        INSERT INTO Glue VALUES (200);
        SELECT * FROM Glue WHERE id > 100;
        DROP TABLE Glue;
    ";
    
    for query in parse(sqls).unwrap() {
        glue.execute(&query).unwrap();
    }
}

SQL Library Mode (For Custom Storage)

Installation

Now you don't need to include sled-storage. So in Cargo.toml,

[dependencies]
gluesql = { version = "0.3", default-features = false, features = ["alter-table"] }

# alter-table is optional.
# If your DB does not have plan to support ALTER TABLE, then use this below.
gluesql = { version = "0.3", default-features = false }

Usage

All you only need to do is implementing 2 traits: Store and StoreMut! In src/store/mod.rs,

pub trait Store<T: Debug> {
    async fn fetch_schema(..) -> ..;
    async fn scan_data(..) -> ..;
}

pub trait StoreMut<T: Debug> where Self: Sized {
    async fn generate_id(..) -> ..;
    async fn insert_schema(..) -> ..;
    async fn delete_schema(..) -> ..;
    async fn insert_data(..) -> ..;
    async fn delete_data(..) -> ..;
}

And a single optional trait, whether implementing this is all up to you! In src/store/alter_table.rs,

pub trait AlterTable where Self: Sized {
    async fn rename_schema(..) -> ..;
    async fn rename_column(..) -> ..;
    async fn add_column(..) -> ..;
    async fn drop_column(..) -> ..;
}

Examples - GlueSQL-js

Use SQL in web browsers!
GlueSQL-js provides 3 storage options,

  • in-memory
  • localStorage
  • sessionStorage.

SQL Features

GlueSQL currently supports limited queries, it's in very early stage.

  • CREATE with 4 types: INTEGER, FLOAT, BOOLEAN, TEXT with an optional NULL attribute.
  • ALTER TABLE with 4 operations: ADD COLUMN, DROP COLUMN, RENAME COLUMN and RENAME TO.
  • INSERT, UPDATE, DELETE, SELECT, DROP TABLE
  • GROUP BY, HAVING
  • Nested select, join, aggregations ...

You can see current query supports in src/tests/*.

Other expected use cases

  • Run SQL in web browsers - gluesql-js It would be cool to make state management library using gluesql-js.
  • Add SQL layer to NoSQL databases: Redis, CouchDB...
  • Build new SQL database management system

Contribution

It's very early stage, please feel free to do whatever you want to.
Only the thing you need to be aware of is...

  • Except for src/glue.rs, src/tests/ and src/utils/, there is no place to use mut keyword.