#![allow(dead_code, unused)]
mod btree; mod catalog; mod fts; mod interface; mod pager; mod parser; mod planner; mod table; mod vector;
use interface::{Repl, Server, WsServer};
use std::env::{self, Args};
use std::io::{self, Write};
fn main() {
let args: Vec<String> = env::args().collect();
if let Some(idx) = args.iter().position(|s| s == "--websocket") {
let port: u16 = args.get(idx + 1)
.and_then(|s| s.parse().ok())
.unwrap_or(8080);
let db_path = args.get(idx + 2).map(|s| s.as_str());
let mut server = if let Some(path) = db_path {
eprintln!("啟動 WebSocket 伺服器,連接埠 {},資料庫:{}", port, path);
match WsServer::open(path) {
Ok(s) => s,
Err(e) => {
eprintln!("無法開啟資料庫:{}", e);
std::process::exit(1);
}
}
} else {
eprintln!("啟動 WebSocket 伺服器,連接埠 {}(記憶體模式)", port);
WsServer::new()
};
let runtime = tokio::runtime::Runtime::new().expect("無法建立 tokio 執行環境");
runtime.block_on(async {
server.run(port).await.expect("WebSocket 伺服器錯誤");
});
server.shutdown();
return;
}
if args.contains(&"--server".to_string()) {
let db_path = args.iter().skip_while(|s| *s != "--server").nth(1);
let mut server = if let Some(path) = db_path {
if path == ":memory:" {
eprintln!("啟動 stdio 伺服器(記憶體模式)");
Server::new()
} else {
eprintln!("啟動 stdio 伺服器,資料庫:{}", path);
match Server::open(&path) {
Ok(s) => s,
Err(e) => {
eprintln!("無法開啟資料庫:{}", e);
std::process::exit(1);
}
}
}
} else {
eprintln!("啟動 stdio 伺服器(記憶體模式)");
Server::new()
};
server.run();
server.close();
return;
}
let mut repl = if args.len() > 1 {
let db_path = &args[1];
println!("開啟資料庫:{}", db_path);
match Repl::open(db_path) {
Ok(r) => r,
Err(e) => {
eprintln!("無法開啟資料庫:{}", e);
std::process::exit(1);
}
}
} else {
Repl::new()
};
repl.run();
repl.close();
}