Skip to content

Instantly share code, notes, and snippets.

@the2pizza
Created March 25, 2025 15:35
Show Gist options
  • Select an option

  • Save the2pizza/3b4b1379c237cd4fde77cee3bcb6f90e to your computer and use it in GitHub Desktop.

Select an option

Save the2pizza/3b4b1379c237cd4fde77cee3bcb6f90e to your computer and use it in GitHub Desktop.
use uuid::Uuid;
use worktable::prelude::*;
use worktable::worktable;
worktable!(
name: User,
persist: true,
columns: {
id: i64 primary_key autoincrement,
name: String,
email: String,
password_hash: String,
phone_number: String,
role: i64,
is_active: bool,
verified_email: bool,
last_login: i64,
created_at: i64,
updated_at: i64,
token: String,
},
indexes: {
idx_user_email: email unique,
idx_role: role,
},
queries: {
update: {
NameByEmail(name) by email,
PasswordHashByEmail(password_hash) by email,
PhoneNumberByEmail(phone_number) by email,
RoleByEmail(role) by email,
IsActiveByEmail(is_active) by email,
VerifiedEmailByEmail(verified_email) by email,
LastLoginByEmail(last_login) by email,
UpdatedAtByEmail(updated_at) by email,
TokenByEmail(token) by email,
},
delete: {
ByEmail() by email,
ByRole() by role,
}
}
);
#[tokio::main]
async fn main() {
let config = PersistenceConfig::new("test_db", "test_db");
let table = UserWorkTable::load_from_file(config).await.unwrap();
let mut misha = build_user("Misha", "misha@example.com", "pw123", "+100200300", 1);
misha.id = table.get_next_pk().into();
//println!("MISHA {:?}", misha);
if let Some(user) = table.select_by_email("misha@example.com".to_string()) {
println!("USER {:?}", user);
} else {
table.insert(misha.clone()).unwrap();
table.wait_for_ops().await;
let _ = table.persist().await;
};
let found_misha = table.select_by_email("misha@example.com".to_string());
println!("Found {:?}", found_misha);
assert!(found_misha.is_some(), "User was not found");
}
fn build_user(name: &str, email: &str, password_hash: &str, phone: &str, role: i64) -> UserRow {
UserRow {
id: 0,
name: name.to_string(),
email: email.to_string(),
password_hash: password_hash.to_string(),
phone_number: phone.to_string(),
role,
is_active: true,
verified_email: false,
last_login: 0,
created_at: 1675129294,
updated_at: 1675129294,
token: Uuid::nil().to_string(),
}
}
## First run
--> c run
Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.21s
Running `/Users/2pizza/C/j/insolvent/WorkTable/target/debug/wt-examples`
[/Users/2pizza/C/j/insolvent/DataBucket/src/page/util.rs:85:5] page.header.data_length = 56
[/Users/2pizza/C/j/insolvent/DataBucket/src/page/util.rs:85:5] page.header.data_length = 48
[/Users/2pizza/C/j/insolvent/DataBucket/src/page/util.rs:85:5] page.header.data_length = 48
[/Users/2pizza/C/j/insolvent/DataBucket/src/page/util.rs:85:5] page.header.data_length = 48
[/Users/2pizza/C/j/insolvent/DataBucket/src/page/util.rs:85:5] page.header.data_length = 0
[/Users/2pizza/C/j/insolvent/DataBucket/src/page/util.rs:85:5] page.header.data_length = 100
[/Users/2pizza/C/j/insolvent/DataBucket/src/page/util.rs:85:5] page.header.data_length = 16334
[/Users/2pizza/C/j/insolvent/DataBucket/src/page/util.rs:85:5] page.header.data_length = 56
[/Users/2pizza/C/j/insolvent/DataBucket/src/page/util.rs:85:5] page.header.data_length = 100
[/Users/2pizza/C/j/insolvent/DataBucket/src/page/util.rs:85:5] page.header.data_length = 16334
[/Users/2pizza/C/j/insolvent/DataBucket/src/page/util.rs:85:5] page.header.data_length = 108
[/Users/2pizza/C/j/insolvent/DataBucket/src/page/util.rs:85:5] page.header.data_length = 13866
[/Users/2pizza/C/j/insolvent/DataBucket/src/page/util.rs:85:5] page.header.data_length = 48
[/Users/2pizza/C/j/insolvent/DataBucket/src/page/util.rs:85:5] page.header.data_length = 100
[/Users/2pizza/C/j/insolvent/DataBucket/src/page/util.rs:85:5] page.header.data_length = 16334
[/Users/2pizza/C/j/insolvent/DataBucket/src/page/util.rs:85:5] page.header.data_length = 56
[/Users/2pizza/C/j/insolvent/DataBucket/src/page/util.rs:85:5] page.header.data_length = 100
[/Users/2pizza/C/j/insolvent/DataBucket/src/page/util.rs:85:5] page.header.data_length = 16386
[/Users/2pizza/C/j/insolvent/DataBucket/src/page/util.rs:85:5] page.header.data_length = 56
[/Users/2pizza/C/j/insolvent/DataBucket/src/page/util.rs:85:5] page.header.data_length = 108
[/Users/2pizza/C/j/insolvent/DataBucket/src/page/util.rs:85:5] page.header.data_length = 13910
[/Users/2pizza/C/j/insolvent/DataBucket/src/page/util.rs:85:5] page.header.data_length = 56
[/Users/2pizza/C/j/insolvent/DataBucket/src/page/util.rs:85:5] page.header.data_length = 168
Found Some(UserRow { created_at: 1675129294, password_hash: "pw123", phone_number: "+100200300", is_active: true, last_login: 0, role: 1, id: 0, name: "Misha", updated_at: 1675129294, verified_email: false, email: "misha@example.com", token: "00000000-0000-0000-0000-000000000000" })
## Second run
--> c run
Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.15s
Running `/Users/2pizza/C/j/insolvent/WorkTable/target/debug/wt-examples`
[/Users/2pizza/C/j/insolvent/DataBucket/src/page/index/page.rs:400:9] size = 627
[/Users/2pizza/C/j/insolvent/DataBucket/src/page/index/page.rs:400:9] utility_length = 1276
[/Users/2pizza/C/j/insolvent/DataBucket/src/page/index/page.rs:400:9] values_len = 15056
[/Users/2pizza/C/j/insolvent/DataBucket/src/page/index/page.rs:400:9] offset = 1278
[/Users/2pizza/C/j/insolvent/DataBucket/src/page/index/page.rs:400:9] size = 629
[/Users/2pizza/C/j/insolvent/DataBucket/src/page/index/page.rs:400:9] utility_length = 1280
[/Users/2pizza/C/j/insolvent/DataBucket/src/page/index/page.rs:400:9] values_len = 15104
[/Users/2pizza/C/j/insolvent/DataBucket/src/page/index/page.rs:400:9] offset = 1282
thread 'main' panicked at /Users/2pizza/C/j/insolvent/DataBucket/src/page/index/page.rs:398:35:
range end index 16386 out of range for slice of length 13910
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment