diff --git a/CHANGELOG.md b/CHANGELOG.md index c7f20667..abcac1cb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,16 @@ All changes in this project will be noted in this file. +## Unreleased + +### Additions + +- `INSPECT KEYSPACE` without arguments to inspect the current keyspace + +### Fixes + +- Added error code output for new error codes which otherwise printed "Unknown error" + ## Version 0.7.4 ### Additions diff --git a/server/src/corestore/mod.rs b/server/src/corestore/mod.rs index 4109c14a..0229de82 100644 --- a/server/src/corestore/mod.rs +++ b/server/src/corestore/mod.rs @@ -165,6 +165,13 @@ impl Corestore { } Ok(()) } + /// Returns the current keyspace, if set + pub fn get_cks(&self) -> KeyspaceResult<&Keyspace> { + match self.estate.ks { + Some((_, ref cks)) => Ok(cks), + _ => Err(DdlError::DefaultNotFound), + } + } pub fn get_keyspace(&self, ksid: &Q) -> Option> where ObjectID: Borrow, diff --git a/server/src/queryengine/inspect.rs b/server/src/queryengine/inspect.rs index b9ff3d90..226224b7 100644 --- a/server/src/queryengine/inspect.rs +++ b/server/src/queryengine/inspect.rs @@ -69,9 +69,11 @@ action! { /// INSPECT a keyspace. This should only have the keyspace ID fn inspect_keyspace(handle: &Corestore, con: &'a mut T, mut act: ActionIter<'a>) { - ensure_length(act.len(), |len| len == 1)?; + ensure_length(act.len(), |len| len < 2)?; + let tbl_list: Vec; match act.next() { Some(keyspace_name) => { + // inspect the provided keyspace let ksid = if keyspace_name.len() > 64 { return conwrite!(con, responses::groups::BAD_CONTAINER_NAME); } else { @@ -81,15 +83,19 @@ action! { Some(kspace) => kspace, None => return conwrite!(con, responses::groups::CONTAINER_NOT_FOUND), }; - let tbl_list: Vec = ks.tables.iter().map(|kv| kv.key().clone()).collect(); - let mut writer = unsafe { - TypedArrayWriter::new(con, b'+', tbl_list.len()) - }.await?; - for tbl in tbl_list { - writer.write_element(tbl).await?; - } + tbl_list = ks.tables.iter().map(|kv| kv.key().clone()).collect(); }, - None => aerr!(con), + None => { + // inspect the current keyspace + let cks = handle.get_cks()?; + tbl_list = cks.tables.iter().map(|kv| kv.key().clone()).collect(); + }, + } + let mut writer = unsafe { + TypedArrayWriter::new(con, b'+', tbl_list.len()) + }.await?; + for tbl in tbl_list { + writer.write_element(tbl).await?; } Ok(()) } diff --git a/server/src/tests/ddl_tests.rs b/server/src/tests/ddl_tests.rs index 80cb2f37..58c3ceb1 100644 --- a/server/src/tests/ddl_tests.rs +++ b/server/src/tests/ddl_tests.rs @@ -85,12 +85,11 @@ mod __private { ); } async fn test_create_table_fully_qualified_entity() { - let mykeyspace: &str = __MYENTITY__.split(':').collect::>()[0]; let mut rng = rand::thread_rng(); let tblname = utils::rand_alphastring(10, &mut rng); query.push("create"); query.push("table"); - query.push(mykeyspace.to_owned() + ":" + &tblname); + query.push(__MYKS__.to_owned() + ":" + &tblname); query.push("keymap(str,str)"); assert_eq!( con.run_query_raw(&query).await.unwrap(), @@ -98,12 +97,11 @@ mod __private { ); } async fn test_create_table_volatile_fully_qualified_entity() { - let mykeyspace: &str = __MYENTITY__.split(':').collect::>()[0]; let mut rng = rand::thread_rng(); let tblname = utils::rand_alphastring(10, &mut rng); query.push("create"); query.push("table"); - query.push(mykeyspace.to_owned() + ":" + &tblname); + query.push(__MYKS__.to_owned() + ":" + &tblname); query.push("keymap(str,str)"); query.push("volatile"); assert_eq!( @@ -132,10 +130,9 @@ mod __private { ); } async fn test_drop_table_fully_qualified_entity() { - let mykeyspace: &str = __MYENTITY__.split(':').collect::>()[0]; let mut rng = rand::thread_rng(); let tblname = utils::rand_alphastring(10, &mut rng); - let my_fqe = mykeyspace.to_owned() + ":" + &tblname; + let my_fqe = __MYKS__.to_owned() + ":" + &tblname; query.push("create"); query.push("table"); query.push(&my_fqe); @@ -171,14 +168,10 @@ mod __private { ) } async fn test_whereami() { - let mykeyspace: Vec<&str> = __MYENTITY__.split(':').collect::>(); query.push("whereami"); assert_eq!( con.run_query_raw(&query).await.unwrap(), - Element::Array(Array::NonNullStr(vec![ - mykeyspace[0].to_owned(), - mykeyspace[1].to_owned() - ])) + Element::Array(Array::NonNullStr(vec![__MYKS__, __MYTABLE__])) ); runeq!( con, diff --git a/server/src/tests/inspect_tests.rs b/server/src/tests/inspect_tests.rs index 013bbd5c..fce72348 100644 --- a/server/src/tests/inspect_tests.rs +++ b/server/src/tests/inspect_tests.rs @@ -36,20 +36,24 @@ mod __private { )) } async fn test_inspect_keyspace() { - let my_keyspace: &str = __MYENTITY__.split(':').collect::>()[0]; query.push("INSPECT"); query.push("KEYSPACE"); - query.push(my_keyspace); + query.push(&__MYKS__); assert!(matches!( con.run_query_raw(&query).await.unwrap(), Element::Array(Array::Str(_)) )) } + async fn test_inspect_current_keyspace() { + query.push("INSPECT"); + query.push("KEYSPACE"); + let ret: Vec = con.run_query(&query).await.unwrap(); + assert!(ret.contains(&__MYTABLE__)); + } async fn test_inspect_table() { - let my_table: &str = __MYENTITY__.split(':').collect::>()[1]; query.push("INSPECT"); query.push("TABLE"); - query.push(my_table); + query.push(__MYTABLE__); match con.run_query_raw(&query).await.unwrap() { Element::String(st) => { assert_eq!(st, "Keymap { data:(str,str), volatile:true }".to_owned()) diff --git a/sky-macros/src/dbtest_fn.rs b/sky-macros/src/dbtest_fn.rs index f0827371..aea792bf 100644 --- a/sky-macros/src/dbtest_fn.rs +++ b/sky-macros/src/dbtest_fn.rs @@ -282,6 +282,8 @@ fn generate_dbtest( let mut __concat_entity = std::string::String::new(); __concat_entity.push_str("testsuite:"); __concat_entity.push_str(&#rand_string); + let __MYTABLE__ : String = #rand_string.to_string(); + let __MYKS__: String = "testsuite".to_owned(); let __MYENTITY__: String = __concat_entity.clone(); }; // now switch to the temporary table we created