use remdb::config::WALConfig;
use remdb::*;
static mut DB_MEMORY: [u8; 2 * 1024 * 1024] = [0; 2 * 1024 * 1024];
fn main() {
unsafe {
memory::allocator::init_global_allocator(DB_MEMORY.as_mut_ptr(), DB_MEMORY.len())
.expect("Failed to initialize allocator");
static ALLOCATOR: config::DefaultMemoryAllocator = config::DefaultMemoryAllocator;
static CONFIG: config::DbConfig = config::DbConfig {
tables: vec![],
total_memory: 2 * 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: 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: config::WALCompressionType::None,
compression_level: 3,
},
#[cfg(feature = "pubsub")]
pubsub_config: None,
#[cfg(feature = "ha")]
ha_config: Some(config::HAConfig {
node_id: 1, ha_role: remdb::ha::HARole::Auto,
replication_mode: remdb::ha::ReplicationMode::Async,
heartbeat_interval_ms: 1000,
failure_detection_ms: 3000,
sync_timeout_ms: 2000,
master_address: None,
master_port: None,
replication_port: 5556,
}),
time_series_defaults: config::TimeSeriesConfig::DEFAULT,
model_worker_config: remdb::config::ModelWorkerConfig::DEFAULT,
};
let mut db = init_global_db(&CONFIG).expect("Failed to initialize database");
println!("=== 测试1:AUTOINCREMENT(无下划线)===");
let create_table_sql1 = "CREATE TABLE test1 (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n name VARCHAR(50)\n)";
match sql::parse_sql_query(create_table_sql1) {
Ok(query) => {
println!("✅ SQL解析成功: AUTOINCREMENT");
println!(" 表名: {}", query.table_name);
println!(" 字段数: {}", query.table_def.len());
println!(" 主键: {:?}", query.primary_key);
if let Err(e) = sql::execute_query(&mut db, &query) {
println!("❌ 执行失败: {}", e);
} else {
println!("✅ 执行成功: AUTOINCREMENT");
}
}
Err(e) => {
println!("❌ 解析失败: {}", e);
}
}
println!("\n=== 测试:尝试直接使用API创建表===");
use remdb::DataType;
use remdb::FieldConstraint;
let fields = &[
("id", DataType::Int64, 0, None, None),
("name", DataType::VarChar, 50, None, None),
];
let constraints = &[
FieldConstraint {
primary_key: true,
not_null: true,
unique: true,
auto_increment: true,
},
FieldConstraint {
primary_key: false,
not_null: false,
unique: false,
auto_increment: false,
},
];
match db.create_table_with_constraints(
"api_test",
fields,
Some(constraints),
Some(vec![0]),
None,
) {
Ok(_) => {
println!("✅ API创建表成功: api_test");
}
Err(e) => {
println!("❌ API创建表失败: {}", e);
}
}
println!("\n=== 测试:尝试向API创建的表插入数据===");
let insert_sql = "INSERT INTO api_test (name) VALUES ('API Test')";
match sql::parse_sql_query(insert_sql) {
Ok(query) => {
println!("✅ SQL解析成功");
if let Err(e) = sql::execute_query(&mut db, &query) {
println!("❌ 执行失败: {}", e);
} else {
println!("✅ 执行成功");
}
}
Err(e) => {
println!("❌ 解析失败: {}", e);
}
}
println!("\n=== 表信息 ===");
let show_tables_sql = "SHOW TABLES";
match db.sql_query(show_tables_sql) {
Ok(result) => {
println!("当前表列表:");
println!("{}", result.to_string());
}
Err(e) => {
println!("获取表列表失败: {}", e);
}
}
println!("\n=== 测试2:AUTO_INCREMENT(带下划线)===");
let create_table_sql2 = "CREATE TABLE test2 (\n id INTEGER PRIMARY KEY AUTO_INCREMENT,\n name VARCHAR(50)\n)";
match sql::parse_sql_query(create_table_sql2) {
Ok(query) => {
println!("✅ SQL解析成功: AUTO_INCREMENT");
if let Err(e) = sql::execute_query(&mut db, &query) {
println!("❌ 执行失败: {}", e);
} else {
println!("✅ 执行成功: AUTO_INCREMENT");
}
}
Err(e) => {
println!("❌ 解析失败: {}", e);
}
}
println!("\n=== 测试3:数据插入(显式指定主键)===");
let insert_explicit_sql =
"INSERT INTO test1 (id, name) VALUES (1, 'Test with explicit ID')";
match sql::parse_sql_query(insert_explicit_sql) {
Ok(query) => {
println!("✅ SQL解析成功: 显式插入");
if let Err(e) = sql::execute_query(&mut db, &query) {
println!("❌ 执行失败: {}", e);
} else {
println!("✅ 执行成功: 显式插入");
}
}
Err(e) => {
println!("❌ 解析失败: {}", e);
}
}
println!("\n=== 测试4:数据插入(不指定主键,使用自增)===");
let insert_auto_sql = "INSERT INTO test1 (name) VALUES ('Test with auto ID')";
match sql::parse_sql_query(insert_auto_sql) {
Ok(query) => {
println!("✅ SQL解析成功: 自增插入");
if let Err(e) = sql::execute_query(&mut db, &query) {
println!("❌ 执行失败: {}", e);
} else {
println!("✅ 执行成功: 自增插入");
}
}
Err(e) => {
println!("❌ 解析失败: {}", e);
}
}
println!("\n=== 测试5:test2表数据插入(显式指定主键)===");
let insert_explicit_sql2 =
"INSERT INTO test2 (id, name) VALUES (1, 'Test2 with explicit ID')";
match sql::parse_sql_query(insert_explicit_sql2) {
Ok(query) => {
println!("✅ SQL解析成功: test2显式插入");
if let Err(e) = sql::execute_query(&mut db, &query) {
println!("❌ 执行失败: {}", e);
} else {
println!("✅ 执行成功: test2显式插入");
}
}
Err(e) => {
println!("❌ 解析失败: {}", e);
}
}
println!("\n=== 测试6:test2表数据插入(不指定主键,使用自增)===");
let insert_auto_sql2 = "INSERT INTO test2 (name) VALUES ('Test2 with auto ID')";
match sql::parse_sql_query(insert_auto_sql2) {
Ok(query) => {
println!("✅ SQL解析成功: test2自增插入");
if let Err(e) = sql::execute_query(&mut db, &query) {
println!("❌ 执行失败: {}", e);
} else {
println!("✅ 执行成功: test2自增插入");
}
}
Err(e) => {
println!("❌ 解析失败: {}", e);
}
}
println!("\n=== 测试7:查询test1表,验证插入结果===");
let select_sql1 = "SELECT * FROM test1";
match db.sql_query(select_sql1) {
Ok(result) => {
println!("✅ 查询成功,test1结果如下:");
println!("{}", result.to_string());
}
Err(e) => {
println!("❌ 查询失败: {}", e);
}
}
println!("\n=== 测试8:查询test2表,验证插入结果===");
let select_sql2 = "SELECT * FROM test2";
match db.sql_query(select_sql2) {
Ok(result) => {
println!("✅ 查询成功,test2结果如下:");
println!("{}", result.to_string());
}
Err(e) => {
println!("❌ 查询失败: {}", e);
}
}
println!("\n=== 测试9:使用新的专用方法查询数据===");
match db.execute_query("test1", &["id", "name"], None, None) {
Ok(result) => {
println!("✅ 使用execute_query查询test1成功:");
println!("{}", result.to_string());
}
Err(e) => {
println!("❌ 使用execute_query查询失败: {}", e);
}
}
println!("\n=== 测试10:使用新的专用方法插入数据===");
let columns = &["name"];
let values = &["New User"];
match db.insert_record("test1", columns, values) {
Ok(affected_rows) => {
println!("✅ 使用insert_record插入成功,影响行数: {}", affected_rows);
if let Ok(result) = db.execute_query("test1", &["id", "name"], None, None) {
println!("✅ 插入后查询结果:");
println!("{}", result.to_string());
}
}
Err(e) => {
println!("❌ 使用insert_record插入失败: {}", e);
}
}
}
}