1
0
Fork 0
mirror of https://codeberg.org/icewind/haze.git synced 2026-06-03 17:14:08 +02:00

allow running db queries on sharded db

This commit is contained in:
Robin Appelman 2025-08-22 18:16:06 +02:00
commit 89280d9371
3 changed files with 73 additions and 11 deletions

View file

@ -35,6 +35,7 @@ pub enum HazeArgs {
filter: Option<String>, filter: Option<String>,
root: bool, root: bool,
command: Vec<String>, command: Vec<String>,
index: Option<String>,
}, },
/// Remove all non-pinned instances /// Remove all non-pinned instances
Clean, Clean,
@ -193,11 +194,23 @@ impl HazeArgs {
} else { } else {
false false
}; };
let index = if let Some(next) = args.peek() {
let all = next.as_ref() == "all";
let is_number = next.as_ref().chars().all(char::is_numeric);
if all || is_number {
args.next().map(Into::into)
} else {
None
}
} else {
None
};
let command = args.map(S::into).collect(); let command = args.map(S::into).collect();
Ok(HazeArgs::Db { Ok(HazeArgs::Db {
filter, filter,
root, root,
command, command,
index,
}) })
} }
HazeCommand::Clean => Ok(HazeArgs::Clean), HazeCommand::Clean => Ok(HazeArgs::Clean),
@ -357,7 +370,8 @@ fn test_arg_parse() {
HazeArgs::Db { HazeArgs::Db {
filter: Some("asdasd".to_string()), filter: Some("asdasd".to_string()),
root: false, root: false,
command: Vec::new() command: Vec::new(),
index: None,
} }
); );
assert_eq!( assert_eq!(
@ -365,7 +379,8 @@ fn test_arg_parse() {
HazeArgs::Db { HazeArgs::Db {
filter: Some("asdasd".to_string()), filter: Some("asdasd".to_string()),
root: true, root: true,
command: Vec::new() command: Vec::new(),
index: None,
} }
); );
assert_eq!( assert_eq!(
@ -373,7 +388,8 @@ fn test_arg_parse() {
HazeArgs::Db { HazeArgs::Db {
filter: Some("asdasd".to_string()), filter: Some("asdasd".to_string()),
root: false, root: false,
command: vec!["select".to_string(), "1".to_string()] command: vec!["select".to_string(), "1".to_string()],
index: None,
} }
); );
assert_eq!( assert_eq!(
@ -385,7 +401,34 @@ fn test_arg_parse() {
HazeArgs::Db { HazeArgs::Db {
filter: Some("asdasd".to_string()), filter: Some("asdasd".to_string()),
root: true, root: true,
command: vec!["select 1".to_string()] command: vec!["select 1".to_string()],
index: None,
}
);
assert_eq!(
HazeArgs::parse(
&[],
vec!["haze", "asdasd", "db", "root", "1", "select 1"].into_iter()
)
.unwrap(),
HazeArgs::Db {
filter: Some("asdasd".to_string()),
root: true,
command: vec!["select 1".to_string()],
index: Some("1".into()),
}
);
assert_eq!(
HazeArgs::parse(
&[],
vec!["haze", "asdasd", "db", "all", "select 1"].into_iter()
)
.unwrap(),
HazeArgs::Db {
filter: Some("asdasd".to_string()),
root: false,
command: vec!["select 1".to_string()],
index: Some("all".into()),
} }
); );
assert_eq!( assert_eq!(

View file

@ -271,7 +271,13 @@ impl Database {
cloud_id: &str, cloud_id: &str,
root: bool, root: bool,
command: &[String], command: &[String],
index: Option<&str>,
) -> Result<ExitCode> { ) -> Result<ExitCode> {
let container_id = if let Some(index) = index {
format!("{cloud_id}-db-{index}")
} else {
format!("{cloud_id}-db")
};
let command = command.join(" "); let command = command.join(" ");
if command.is_empty() { if command.is_empty() {
match self.family() { match self.family() {
@ -288,7 +294,7 @@ impl Database {
DatabaseFamily::MariaDB | DatabaseFamily::Mysql => { DatabaseFamily::MariaDB | DatabaseFamily::Mysql => {
exec_tty( exec_tty(
docker, docker,
format!("{}-db", cloud_id), container_id,
"mysql", "mysql",
vec![ vec![
"mysql", "mysql",
@ -304,7 +310,7 @@ impl Database {
DatabaseFamily::Postgres => { DatabaseFamily::Postgres => {
exec_tty( exec_tty(
docker, docker,
format!("{}-db", cloud_id), container_id,
"root", "root",
vec!["psql", "haze", "haze"], vec!["psql", "haze", "haze"],
vec!["PGPASSWORD=haze"], vec!["PGPASSWORD=haze"],
@ -314,7 +320,7 @@ impl Database {
DatabaseFamily::Oracle => { DatabaseFamily::Oracle => {
exec_tty( exec_tty(
docker, docker,
format!("{}-db", cloud_id), container_id,
"root", "root",
vec!["sqlplus", "system/haze"], vec!["sqlplus", "system/haze"],
Vec::<String>::default(), Vec::<String>::default(),
@ -339,7 +345,7 @@ impl Database {
DatabaseFamily::MariaDB | DatabaseFamily::Mysql => { DatabaseFamily::MariaDB | DatabaseFamily::Mysql => {
exec( exec(
docker, docker,
format!("{}-db", cloud_id), container_id,
"mysql", "mysql",
vec![ vec![
"mysql", "mysql",
@ -358,7 +364,7 @@ impl Database {
DatabaseFamily::Postgres => { DatabaseFamily::Postgres => {
exec( exec(
docker, docker,
format!("{}-db", cloud_id), container_id,
"root", "root",
vec!["psql", "haze", "haze", "-c", &command], vec!["psql", "haze", "haze", "-c", &command],
vec!["PGPASSWORD=haze"], vec!["PGPASSWORD=haze"],
@ -369,7 +375,7 @@ impl Database {
DatabaseFamily::Oracle => { DatabaseFamily::Oracle => {
exec( exec(
docker, docker,
format!("{}-db", cloud_id), container_id,
"root", "root",
vec!["sqlplus", "system/haze"], vec!["sqlplus", "system/haze"],
Vec::<String>::default(), Vec::<String>::default(),

View file

@ -166,9 +166,22 @@ async fn main() -> Result<ExitCode> {
filter, filter,
root, root,
command, command,
index,
} => { } => {
let cloud = Cloud::get_by_filter(&docker, filter, &config).await?; let cloud = Cloud::get_by_filter(&docker, filter, &config).await?;
cloud.db().exec(&docker, &cloud.id, root, &command).await?; if Some("all") == index.as_deref() {
for index in ["1", "2", "3", "4"] {
cloud
.db()
.exec(&docker, &cloud.id, root, &command, Some(index))
.await?;
}
} else {
cloud
.db()
.exec(&docker, &cloud.id, root, &command, index.as_deref())
.await?;
}
} }
HazeArgs::Open { filter } => { HazeArgs::Open { filter } => {
let cloud = Cloud::get_by_filter(&docker, filter, &config).await?; let cloud = Cloud::get_by_filter(&docker, filter, &config).await?;