use remdb::config::{DbConfig, DefaultMemoryAllocator, WALConfig};
use remdb::rbac::Permission;
use remdb::{RemDb, Result};
static mut DB_MEMORY: [u8; 4 * 1024 * 1024] = [0; 4 * 1024 * 1024];
static ALLOCATOR: DefaultMemoryAllocator = DefaultMemoryAllocator;
fn main() -> Result<()> {
unsafe {
remdb::memory::allocator::init_global_allocator(DB_MEMORY.as_mut_ptr(), DB_MEMORY.len())?;
}
let config = Box::leak(Box::new(DbConfig {
tables: vec![],
total_memory: 4 * 1024 * 1024,
low_power_mode_supported: false,
low_power_max_records: None,
default_max_records: 1000,
memory_allocator: &ALLOCATOR,
wal_config: WALConfig {
log_path: "./wal",
log_mode: remdb::config::LogMode::Sync,
checkpoint_interval_ms: 60000,
log_file_size_limit: 16 * 1024 * 1024,
log_prealloc_size: 1 * 1024 * 1024,
log_segment_size: 16 * 1024 * 1024,
retained_checkpoints: 3,
max_consecutive_invalid: 100,
skip_threshold: 1000,
skip_block_size: 1024 * 1024,
max_skip_attempts: 3,
compression_type: remdb::config::WALCompressionType::None,
compression_level: 3,
},
time_series_defaults: remdb::time_series::TimeSeriesConfig::DEFAULT,
#[cfg(feature = "ha")]
ha_config: None,
#[cfg(feature = "pubsub")]
pubsub_config: None,
model_worker_config: Default::default(),
}));
let mut db = RemDb::new(config);
db.init()?;
println!("=== RBAC (基于角色的访问控制) 示例 ===\n");
println!("1. 创建角色");
println!(" 使用默认角色: admin");
db.create_role("developer")?;
println!(" 创建角色: developer");
db.create_role("readonly")?;
println!(" 创建角色: readonly");
println!("\n2. 创建用户");
db.create_user("alice")?;
println!(" 创建用户: alice");
db.create_user("bob")?;
println!(" 创建用户: bob");
db.create_user("charlie")?;
println!(" 创建用户: charlie");
println!("\n3. 授予权限给角色");
db.grant_permission("admin", Permission::Admin, None, None)?;
println!(" 授予 admin 角色管理员权限");
db.grant_permission("developer", Permission::Insert, None, None)?;
db.grant_permission("developer", Permission::Select, None, None)?;
db.grant_permission("developer", Permission::Update, None, None)?;
db.grant_permission("developer", Permission::Delete, None, None)?;
println!(" 授予 developer 角色读写权限");
db.grant_permission("readonly", Permission::Select, None, None)?;
println!(" 授予 readonly 角色读取权限");
println!("\n4. 分配角色给用户");
db.grant_role("alice", "admin")?;
println!(" 分配 admin 角色给用户 alice");
db.grant_role("bob", "developer")?;
println!(" 分配 developer 角色给用户 bob");
db.grant_role("charlie", "readonly")?;
println!(" 分配 readonly 角色给用户 charlie");
println!("\n5. 检查权限");
let has_insert = db.check_permission("alice", &Permission::Insert, &None, &None)?;
let has_select = db.check_permission("alice", &Permission::Select, &None, &None)?;
let has_update = db.check_permission("alice", &Permission::Update, &None, &None)?;
println!(
" alice (admin): Insert={}, Select={}, Update={}",
has_insert, has_select, has_update
);
let has_insert = db.check_permission("bob", &Permission::Insert, &None, &None)?;
let has_select = db.check_permission("bob", &Permission::Select, &None, &None)?;
let has_admin = db.check_permission("bob", &Permission::Admin, &None, &None)?;
println!(
" bob (developer): Insert={}, Select={}, Admin={}",
has_insert, has_select, has_admin
);
let has_select = db.check_permission("charlie", &Permission::Select, &None, &None)?;
let has_delete = db.check_permission("charlie", &Permission::Delete, &None, &None)?;
println!(
" charlie (readonly): Select={}, Delete={}",
has_select, has_delete
);
println!("\n6. 撤销权限");
db.revoke_permission("developer", &Permission::Delete, &None, &None)?;
println!(" 撤销 developer 角色的删除权限");
let has_delete = db.check_permission("bob", &Permission::Delete, &None, &None)?;
println!(" bob 现在是否有删除权限: {}", has_delete);
println!("\n7. 撤销用户角色");
db.revoke_role("bob", "developer")?;
println!(" 撤销 bob 的 developer 角色");
let has_select = db.check_permission("bob", &Permission::Select, &None, &None)?;
println!(" bob 现在是否有读取权限: {}", has_select);
println!("\n8. 删除角色和用户");
db.drop_user("charlie")?;
println!(" 删除用户: charlie");
db.drop_role("readonly")?;
println!(" 删除角色: readonly");
println!("\n9. 表级别权限");
db.sql_query("CREATE TABLE sensitive_data (id INT32 PRIMARY KEY, value TEXT)")?;
println!(" 创建表: sensitive_data");
db.grant_permission(
"developer",
Permission::Select,
Some("sensitive_data".to_string()),
None,
)?;
println!(" 授予 developer 角色对 sensitive_data 表的读取权限");
db.grant_role("bob", "developer")?;
let has_select = db.check_permission(
"bob",
&Permission::Select,
&Some("sensitive_data".to_string()),
&None,
)?;
println!(" bob 是否有读取 sensitive_data 表的权限: {}", has_select);
println!("\n=== RBAC 示例完成 ===");
Ok(())
}