95 lines
2.4 KiB
Rust
95 lines
2.4 KiB
Rust
use clap::{Parser, Subcommand};
|
|
use flaredb_client::RdbClient;
|
|
|
|
#[derive(Parser)]
|
|
#[command(author, version, about, long_about = None)]
|
|
struct Args {
|
|
#[arg(long, default_value = "127.0.0.1:50052")]
|
|
addr: String,
|
|
|
|
#[arg(long, default_value = "127.0.0.1:2479")]
|
|
pd_addr: String,
|
|
|
|
#[arg(long, default_value = "")]
|
|
namespace: String,
|
|
|
|
#[command(subcommand)]
|
|
command: Commands,
|
|
}
|
|
|
|
#[derive(Subcommand)]
|
|
enum Commands {
|
|
RawPut {
|
|
#[arg(long)]
|
|
key: String,
|
|
#[arg(long)]
|
|
value: String,
|
|
},
|
|
RawGet {
|
|
#[arg(long)]
|
|
key: String,
|
|
},
|
|
CasGet {
|
|
#[arg(long)]
|
|
key: String,
|
|
},
|
|
Cas {
|
|
#[arg(long)]
|
|
key: String,
|
|
#[arg(long)]
|
|
value: String,
|
|
#[arg(long)]
|
|
expected: u64,
|
|
},
|
|
Tso,
|
|
}
|
|
|
|
#[tokio::main]
|
|
async fn main() -> Result<(), Box<dyn std::error::Error>> {
|
|
let args = Args::parse();
|
|
let mut client =
|
|
RdbClient::connect_with_pd_namespace(args.addr, args.pd_addr, args.namespace).await?;
|
|
|
|
match args.command {
|
|
Commands::RawPut { key, value } => {
|
|
client.raw_put(key.into_bytes(), value.into_bytes()).await?;
|
|
println!("Success");
|
|
}
|
|
Commands::RawGet { key } => match client.raw_get(key.into_bytes()).await? {
|
|
Some(val) => println!("{}", String::from_utf8_lossy(&val)),
|
|
None => {
|
|
eprintln!("Not found");
|
|
std::process::exit(1);
|
|
}
|
|
},
|
|
Commands::Cas {
|
|
key,
|
|
value,
|
|
expected,
|
|
} => {
|
|
let (success, current, new) = client
|
|
.cas(key.into_bytes(), value.into_bytes(), expected)
|
|
.await?;
|
|
if success {
|
|
println!("Success, Version: {}", new);
|
|
} else {
|
|
println!("Conflict! Current Version: {}", current);
|
|
}
|
|
}
|
|
Commands::Tso => {
|
|
let ts = client.get_tso().await?;
|
|
println!("Timestamp: {}", ts);
|
|
}
|
|
Commands::CasGet { key } => match client.cas_get(key.into_bytes()).await? {
|
|
Some((ver, val)) => {
|
|
println!("Version: {}, Value: {}", ver, String::from_utf8_lossy(&val));
|
|
}
|
|
None => {
|
|
eprintln!("Not found");
|
|
std::process::exit(1);
|
|
}
|
|
},
|
|
}
|
|
|
|
Ok(())
|
|
}
|