Skip to content

Commit 5007e9c

Browse files
committed
Properly detect and print DB version according to it's type
1 parent 74dbe20 commit 5007e9c

File tree

5 files changed

+47
-21
lines changed

5 files changed

+47
-21
lines changed

src/config.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -548,7 +548,7 @@ pub struct RunCommand {
548548
pub cluster_name: Option<String>,
549549

550550
#[clap(skip)]
551-
pub cass_version: Option<String>,
551+
pub db_version: Option<String>,
552552

553553
#[clap(skip)]
554554
pub id: Option<String>,

src/main.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -120,14 +120,14 @@ async fn connect(conf: &ConnectionConf) -> Result<(Context, Option<ClusterInfo>)
120120
let session = scripting::connect::connect(conf).await?;
121121
let cluster_info = session.cluster_info().await?;
122122
eprintln!(
123-
"info: Connected to {} running Cassandra version {}",
123+
"info: Connected to '{}' cluster running {}",
124124
cluster_info
125125
.as_ref()
126126
.map(|c| c.name.as_str())
127127
.unwrap_or("unknown"),
128128
cluster_info
129129
.as_ref()
130-
.map(|c| c.cassandra_version.as_str())
130+
.map(|c| c.db_version.as_str())
131131
.unwrap_or("unknown")
132132
);
133133
Ok((session, cluster_info))
@@ -237,7 +237,7 @@ async fn run(conf: RunCommand) -> Result<()> {
237237
let (mut session, cluster_info) = connect(&conf.connection).await?;
238238
if let Some(cluster_info) = cluster_info {
239239
conf.cluster_name = Some(cluster_info.name);
240-
conf.cass_version = Some(cluster_info.cassandra_version);
240+
conf.db_version = Some(cluster_info.db_version);
241241
}
242242

243243
if program.has_prepare() {

src/report/mod.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -487,8 +487,8 @@ impl Display for RunConfigCmp<'_> {
487487
self.line("Datacenter", "", |conf| {
488488
conf.connection.datacenter.clone().unwrap_or_default()
489489
}),
490-
self.line("Cass. version", "", |conf| {
491-
OptionDisplay(conf.cass_version.clone())
490+
self.line("DB version", "", |conf| {
491+
OptionDisplay(conf.db_version.clone())
492492
}),
493493
self.line("Workload", "", |conf| {
494494
conf.workload

src/scripting/connect.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -66,5 +66,5 @@ pub async fn connect(conf: &ConnectionConf) -> Result<Context, CassError> {
6666

6767
pub struct ClusterInfo {
6868
pub name: String,
69-
pub cassandra_version: String,
69+
pub db_version: String,
7070
}

src/scripting/context.rs

+40-14
Original file line numberDiff line numberDiff line change
@@ -262,24 +262,53 @@ impl Context {
262262
})
263263
}
264264

265-
/// Returns cluster metadata such as cluster name and cassandra version.
265+
/// Returns cluster metadata such as cluster name and DB version.
266266
pub async fn cluster_info(&self) -> Result<Option<ClusterInfo>, CassError> {
267-
let cql = "SELECT cluster_name, release_version FROM system.local";
268-
269-
match &self.session {
270-
Some(session) => {
267+
let session = match &self.session {
268+
Some(session) => session,
269+
None => {
270+
return Err(CassError(CassErrorKind::Error(
271+
"'session' is not defined".to_string(),
272+
)))
273+
}
274+
};
275+
let scylla_cql = "SELECT version, build_id FROM system.versions";
276+
let rs = session
277+
.query_unpaged(scylla_cql, ())
278+
.await
279+
.map_err(|e| CassError::query_execution_error(scylla_cql, &[], e));
280+
match rs {
281+
Ok(rs) => {
282+
let rows_result = rs.into_rows_result()?;
283+
while let Ok(mut row) = rows_result.rows::<(&str, &str)>() {
284+
if let Some(Ok((scylla_version, build_id))) = row.next() {
285+
return Ok(Some(ClusterInfo {
286+
name: "".to_string(),
287+
db_version: format!(
288+
"ScyllaDB {} with build-id {}",
289+
scylla_version, build_id
290+
),
291+
}));
292+
}
293+
}
294+
Ok(None)
295+
}
296+
Err(_e) => {
297+
// NOTE: following exists in both cases
298+
// and if we run against ScyllaDB then it has static '3.0.8' version.
299+
let cass_cql = "SELECT cluster_name, release_version FROM system.local";
271300
let rs = session
272-
.query_unpaged(cql, ())
301+
.query_unpaged(cass_cql, ())
273302
.await
274-
.map_err(|e| CassError::query_execution_error(cql, &[], e));
303+
.map_err(|e| CassError::query_execution_error(cass_cql, &[], e));
275304
match rs {
276305
Ok(rs) => {
277306
let rows_result = rs.into_rows_result()?;
278-
while let Ok(mut row) = rows_result.rows() {
279-
if let Some(Ok((name, cassandra_version))) = row.next() {
307+
while let Ok(mut row) = rows_result.rows::<(&str, &str)>() {
308+
if let Some(Ok((name, cass_version))) = row.next() {
280309
return Ok(Some(ClusterInfo {
281-
name,
282-
cassandra_version,
310+
name: name.to_string(),
311+
db_version: format!("Cassandra {}", cass_version),
283312
}));
284313
}
285314
}
@@ -291,9 +320,6 @@ impl Context {
291320
}
292321
}
293322
}
294-
None => Err(CassError(CassErrorKind::Error(
295-
"'session' is not defined".to_string(),
296-
))),
297323
}
298324
}
299325

0 commit comments

Comments
 (0)