Crate prevayler_rs[][src]

Prevayler-rs

This is a simple implementation of a system prevalance proposed by Klaus Wuestefeld in Rust. Other examples are the prevayler for Java and prevayler-clj for Clojure.

The idea is to save in a redolog all modifications to the prevailed data. If the system restarts, it will re-apply all transactions from the redolog restoring the system state. The system may also write snapshots from time to time to speed-up the recover process.

Here is an example of a program that creates a prevailed state using an u8, increments it, print the value to the screen and closes the program.

use prevayler_rs::{
    error::PrevaylerResult,
    PrevaylerBuilder,
    Prevayler,
    serializer::JsonSerializer,
    Transaction
};
use serde::{Deserialize, Serialize};

#[derive(Serialize, Deserialize)]
struct Increment {
    increment: u8
}

impl Transaction<u8> for Increment {
    fn execute(self, data: &mut u8) {
        *data += self.increment;
    }
}

#[async_std::main]
async fn main() -> PrevaylerResult<()> {
    let mut prevayler: Prevayler<Increment, _, _> = PrevaylerBuilder::new()
      .path(".")
      .serializer(JsonSerializer::new())
      .data(0 as u8)
      .build().await?;
    prevayler.execute_transaction(Increment{increment: 1}).await?;
    println!("{}", prevayler.query());
    Ok(())
}

In most cases, you probably will need more than one transcation. The way that we have to do this now is to use an Enum as a main transaction that will be saved into the redolog. All transactions executed will then be converted into it.

For more examples, take a look at the project tests

Modules

error
serializer

This module handles serialization and deserialization of the redolog and snapshots

Structs

Prevayler

The main Prevayler struct. This wrapper your data and save each executed transaction to the redolog. Avoid creating it directly. Use PrevaylerBuilder instead.

PrevaylerBuilder

Builder of the Prevayler struct

Traits

Transaction

The trait that defines the transaction behaivour. You must implement it to all your transactions.

TransactionWithQuery

This trait is similar to the Transaction. But, it also returns a value. All the same rules of the Transaction trait must be true to a TrascationWithQuery.