#json #bson #embedded-database #database #ffi #format-json

bin+lib ejdb2

Binding for EJDB2, a single file embedded no-sql database

6 releases

Uses old Rust 2015

0.0.6 Oct 12, 2021
0.0.5 Oct 12, 2021

#209 in Database implementations

MIT license

1.5MB
38K SLoC

C 28K SLoC // 0.1% comments Java 4K SLoC // 0.2% comments Dart 1.5K SLoC // 0.1% comments JavaScript 1K SLoC // 0.4% comments Rust 1K SLoC // 0.0% comments Forge Config 748 SLoC // 0.7% comments Swift 500 SLoC Shell 363 SLoC // 0.0% comments Batch 359 SLoC TypeScript 207 SLoC // 0.8% comments Prolog 14 SLoC Objective-C 10 SLoC // 0.2% comments Xcode Config 3 SLoC

rust binding for ejdb2

EJDB2 is a single-file embedded document database in c. This project provides a rust binding for it (version 2.61).

Installation

[dependencies]
ejdb2-sys = "2.61.0"
ejdb2 = "0.0.5"
serde_json = "1.0"

Example

extern crate serde_json;
extern crate ejdb2;
extern crate ejdb2_sys;


use ejdb2::ejdbquery::{EJDBQuery, SetPlaceholder};
use ejdb2::ejdb::EJDB;
use serde_json::json;

fn main() {
    EJDB::init().unwrap();
    let mut db = EJDB::new();

    db.open("test.db").unwrap();

    let data = json!({
        "serde_key" : 32,
        "test_val" : [1,2,3],
        "nested" : { "test" : "str"}
    });

    let id = db.put_new("test", &data).unwrap();

    let meta:serde_json::Value = db.info().unwrap();

    println!("db meta {}", meta);

    let result:String = db.get("test", id).unwrap();

    println!("get {}, {}",1, result);

    let mut query: EJDBQuery = EJDBQuery::new("test", "/* | limit :limit skip :skip ");
    query.init().unwrap();

    query.set_placeholder("limit", 0, 3 as i64).unwrap();
    query.set_placeholder("skip", 0, 3 as i64).unwrap();

    let mut result = Vec::<(i64, serde_json::Value)>::new();

    db.exec::<serde_json::Value>(&query, &mut result).unwrap();
    println!("after exec {}", result.len());

    for (id, r) in result {
        println!("id {}, value {}", id, r);
    }
}

Internally EJDB uses JBL as a binary format for json. This rust binding supports serde_json <-> JBL conversion. If serde_json is not the json library you use, you could provide your own format convertor.

Implement:

pub trait EJDBSerializable<T> {
    fn from_jbl(jbl: ejdb2_sys::JBL) -> Result<T, ejdb2_sys::iwrc> ;

    fn to_jbl(&self) -> Result<ejdb2_sys::JBL, ejdb2_sys::iwrc>;
}

This binding also supports convertion between a string and a JBL. You can also serialize your format into a json string and convert it to JBL. But this will be slower.

Dependencies

~0.5–3.5MB
~65K SLoC