Crate struct_db

source ·
Expand description

Struct DB is a Rust library that provides a simple, fast, and embedded database solution, focusing on maintaining coherence between Rust types and stored data with minimal boilerplate. It supports multiple indexes, real-time watch with filters, schema migration.

Use macro struct_db:

  • required: fn_primary_key(<function name>) associates a function of the struct that generates the primary key of the struct. Allows only one fn_primary_key declaration.
  • optional: fn_secondary_key(<function name>) associates a function of the struct that generates a secondary key of the struct. Allows multiple fn_secondary_key declarations.

struct_db generates an enum <your_type> with the suffix Key that contains all the secondary keys like: E.g. <your_type>Key::<your_secondary_key> more details here.

API

Example

use serde::{Deserialize, Serialize};
use struct_db::*;

#[derive(Serialize, Deserialize, PartialEq, Debug)]
#[struct_db(
    fn_primary_key(p_key),
    fn_secondary_key(s_key),
)]
struct Data(u32, String);

impl Data {
    // `p_key` returns the primary key of the `Data` struct as a vector of bytes.
    // In this case, it is the big-endian byte representation of the `i32` value.
    // Using big-endian representation for the primary key maintains a consistent
    // lexicographical ordering of the keys, which is useful for ordered key-value
    // stores and efficient range queries.
   pub fn p_key(&self) -> Vec<u8> {
       self.0.to_be_bytes().to_vec()
   }
   
    // `s_key` generates a secondary key for the `Data` struct as a vector of bytes.
    // The secondary key consists of the big-endian byte representation of the `i32` value
    // (the primary key) followed by the String field. This combined key allows for more
    // versatile querying options.
   pub fn s_key(&self) -> Vec<u8> {
       let mut p_key = self.p_key();
       p_key.extend(self.1.as_bytes());
       p_key
   }
}

fn main() {
    let mut db = Db::init_tmp("my_db_example").unwrap();
    // Initialize the schema
    db.add_schema(Data::struct_db_schema());

    let data = Data(1,"test".to_string());
    // Insert data
    let txn = db.transaction().unwrap();
    {
      let mut tables = txn.tables();
      tables.insert(&txn, data).unwrap();
    }
    txn.commit().unwrap();

    // Get data
    let txn_read = db.read_transaction().unwrap();
    let retrieve_data: Data = txn_read.tables().primary_get(&txn_read, &1_u32.to_be_bytes()).unwrap().unwrap();
    assert_eq!(&retrieve_data, &Data(1,"test".to_string()));
   
    // Remove data
    let txn = db.transaction().unwrap();
    {
      let mut tables = txn.tables();
      tables.remove(&txn, retrieve_data).unwrap();
    }
    txn.commit().unwrap();
}

Modules

Structs

Enums

Traits

Functions

Type Definitions

Attribute Macros