Skip to content

Commit aee31ea

Browse files
authored
Merge pull request #142 from supabase/dbdev_ls
`dbdev ls` command
2 parents 338af3e + c7a8198 commit aee31ea

4 files changed

Lines changed: 100 additions & 4 deletions

File tree

cli/src/commands/install.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -115,12 +115,12 @@ async fn extension_versions(
115115
}
116116

117117
#[derive(sqlx::FromRow, PartialEq, Eq, Hash)]
118-
struct UpdatePath {
119-
source: String,
120-
target: String,
118+
pub(crate) struct UpdatePath {
119+
pub(crate) source: String,
120+
pub(crate) target: String,
121121
}
122122

123-
async fn update_paths(
123+
pub(crate) async fn update_paths(
124124
conn: &mut PgConnection,
125125
extension_name: &str,
126126
) -> anyhow::Result<HashSet<UpdatePath>> {

cli/src/commands/list.rs

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
use std::collections::HashMap;
2+
3+
use futures::TryStreamExt;
4+
use sqlx::PgConnection;
5+
6+
use crate::commands::install::update_paths;
7+
8+
pub(crate) async fn list(conn: &mut PgConnection) -> anyhow::Result<()> {
9+
let available_extension_versions = available_extensions_versions(conn).await?;
10+
let available_extensions = available_extensions(conn).await?;
11+
12+
for (extension_name, versions) in available_extension_versions {
13+
let default_version = available_extensions.get(&extension_name);
14+
15+
println!("{extension_name}");
16+
println!(" available versions:");
17+
for version in &versions {
18+
print!(" {version}");
19+
if Some(version) == default_version {
20+
print!(" (default)");
21+
}
22+
println!();
23+
}
24+
25+
println!(" available update paths:");
26+
let update_paths = update_paths(conn, &extension_name).await?;
27+
if update_paths.is_empty() {
28+
println!(" None");
29+
} else {
30+
for update_path in update_paths {
31+
println!(" from {} to {}", update_path.source, update_path.target);
32+
}
33+
}
34+
println!();
35+
}
36+
37+
Ok(())
38+
}
39+
40+
#[derive(sqlx::FromRow)]
41+
struct AvailableExtensionVersion {
42+
name: String,
43+
version: String,
44+
}
45+
46+
async fn available_extensions_versions(
47+
conn: &mut PgConnection,
48+
) -> anyhow::Result<HashMap<String, Vec<String>>> {
49+
let mut rows = sqlx::query_as::<_, AvailableExtensionVersion>(
50+
"select name, version from pgtle.available_extension_versions()",
51+
)
52+
.fetch(conn);
53+
54+
let mut available_extensions = HashMap::new();
55+
while let Some(row) = rows.try_next().await? {
56+
let versions: &mut Vec<String> = available_extensions.entry(row.name).or_default();
57+
versions.push(row.version);
58+
}
59+
60+
Ok(available_extensions)
61+
}
62+
63+
#[derive(sqlx::FromRow)]
64+
struct AvailableExtension {
65+
name: String,
66+
default_version: String,
67+
}
68+
69+
async fn available_extensions(conn: &mut PgConnection) -> anyhow::Result<HashMap<String, String>> {
70+
let mut rows = sqlx::query_as::<_, AvailableExtension>(
71+
"select name, default_version from pgtle.available_extensions()",
72+
)
73+
.fetch(conn);
74+
75+
let mut extensions = HashMap::new();
76+
while let Some(row) = rows.try_next().await? {
77+
extensions.insert(row.name, row.default_version);
78+
}
79+
80+
Ok(extensions)
81+
}

cli/src/commands/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,4 @@ pub mod install;
22
pub mod login;
33
pub mod publish;
44
pub mod uninstall;
5+
pub mod list;

cli/src/main.rs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,14 @@ enum Commands {
6262
#[arg(long)]
6363
registry_name: Option<String>,
6464
},
65+
66+
/// List available packages
67+
#[clap(alias = "ls")]
68+
List {
69+
/// PostgreSQL connection string
70+
#[arg(short, long)]
71+
connection: String,
72+
},
6573
}
6674

6775
#[derive(Debug, clap::Args)]
@@ -139,5 +147,11 @@ async fn main() -> anyhow::Result<()> {
139147
println!("Login successful");
140148
Ok(())
141149
}
150+
151+
Commands::List { connection } => {
152+
let mut conn = util::get_connection(connection).await?;
153+
commands::list::list(&mut conn).await?;
154+
Ok(())
155+
}
142156
}
143157
}

0 commit comments

Comments
 (0)