libsql 0.5.0

libSQL library: the main gateway for interacting with the database
Documentation
use libsql::{Builder, Cipher, EncryptionConfig, Value};
use std::time::Duration;

#[tokio::main]
async fn main() {
    tracing_subscriber::fmt::init();

    let db_dir = tempfile::tempdir().unwrap();
    let db_file = db_dir.path().join("data.db");
    println!("Database {}", db_file.display());

    let auth_token = std::env::var("LIBSQL_AUTH_TOKEN").unwrap_or_else(|_| {
        println!("Using empty token since LIBSQL_TOKEN was not set");
        "".to_string()
    });

    let url = std::env::var("LIBSQL_URL")
        .unwrap_or_else(|_| {
            println!("Using http://localhost:8080 LIBSQL_URL was not set");
            "http://localhost:8080".to_string()
        })
        .replace("libsql", "https");

    let db = if cfg!(feature = "encryption") {
        let encryption_config = EncryptionConfig {
            cipher: Cipher::Aes256Cbc,
            encryption_key: "s3cr3t".into(),
        };
        Builder::new_remote_replica(&db_file, url, auth_token)
            .encryption_config(encryption_config)
            .build()
            .await
            .unwrap()
    } else {
        Builder::new_remote_replica(&db_file, url, auth_token)
            .build()
            .await
            .unwrap()
    };

    let conn = db.connect().unwrap();

    let f = db.sync().await.unwrap();
    println!("inital sync complete, frame no: {f:?}");

    conn.execute("CREATE TABLE IF NOT EXISTS foo (x TEXT)", ())
        .await
        .unwrap();

    db.sync().await.unwrap();

    let mut jh = tokio::spawn(async move {
        let mut rows = conn
            .query(
                "INSERT INTO foo (x) VALUES (?1) RETURNING *",
                vec![Value::from(
                    "this value was written by an embedded replica!",
                )],
            )
            .await
            .unwrap();

        println!("Rows insert call");
        while let Some(row) = rows.next().await.unwrap() {
            println!("Row: {}", row.get_str(0).unwrap());
        }

        println!("--------");

        let mut rows = conn.query("SELECT * FROM foo", ()).await.unwrap();

        println!("Rows coming from a read after write call");
        while let Some(row) = rows.next().await.unwrap() {
            println!("Row: {}", row.get_str(0).unwrap());
        }

        println!("--------");
    });

    loop {
        tokio::select! {
            _ = tokio::time::sleep(Duration::from_secs(1)) => {
                let r = db.sync().await.unwrap();
                println!("replicated until index {r:?}");
            }

            r = &mut jh => {
                r.unwrap();
                return;
            }
        }
    }
}