Skip to content

Commit 5190ef5

Browse files
committed
refactor(sys): impl taos_get_current_db
1 parent 6d76a72 commit 5190ef5

File tree

1 file changed

+79
-3
lines changed
  • taos-ws-sys/src/native/query

1 file changed

+79
-3
lines changed

taos-ws-sys/src/native/query/mod.rs

Lines changed: 79 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -517,13 +517,57 @@ pub unsafe extern "C" fn taos_get_client_info() -> *const c_char {
517517
}
518518

519519
#[no_mangle]
520-
pub extern "C" fn taos_get_current_db(
520+
pub unsafe extern "C" fn taos_get_current_db(
521521
taos: *mut TAOS,
522522
database: *mut c_char,
523523
len: c_int,
524524
required: *mut c_int,
525525
) -> c_int {
526-
todo!()
526+
trace!(taos=?taos, database=?database, len, required=?required, "taos_get_current_db");
527+
528+
if taos.is_null() {
529+
return set_err_and_get_code(TaosError::new(Code::INVALID_PARA, "taos is null"));
530+
}
531+
532+
let res = taos_query(taos, c"SELECT DATABASE()".as_ptr());
533+
if res.is_null() {
534+
return set_err_and_get_code(TaosError::new(Code::FAILED, "query failed"));
535+
}
536+
537+
let mut rows = 0;
538+
let mut data = ptr::null_mut();
539+
let mut code = taos_fetch_raw_block(res, &mut rows, &mut data);
540+
if code != 0 {
541+
return code;
542+
}
543+
544+
let mut len_actual = 0;
545+
let mut db = ptr::null();
546+
if let Some(rs) = (res as *mut TaosMaybeError<ResultSet>)
547+
.as_mut()
548+
.and_then(|rs| rs.deref_mut())
549+
{
550+
(_, len_actual, db) = rs.get_raw_value(0, 0);
551+
}
552+
553+
if db.is_null() {
554+
return set_err_and_get_code(TaosError::new(Code::FAILED, "get value failed"));
555+
}
556+
557+
if len_actual < len as u32 {
558+
ptr::copy_nonoverlapping(db as _, database, len_actual as _);
559+
} else {
560+
ptr::copy_nonoverlapping(db as _, database, len as _);
561+
*required = len_actual as _;
562+
code = -1;
563+
}
564+
565+
trace!(
566+
"taos_get_current_db done database={:?}",
567+
CStr::from_ptr(database)
568+
);
569+
570+
code
527571
}
528572

529573
#[no_mangle]
@@ -573,7 +617,7 @@ mod tests {
573617
use taos_query::common::Precision;
574618

575619
use super::*;
576-
use crate::native::error::taos_errno;
620+
use crate::native::error::{taos_errno, taos_errstr};
577621
use crate::native::taos_connect;
578622

579623
fn connect() -> *mut TAOS {
@@ -802,4 +846,36 @@ mod tests {
802846
println!("client_info: {client_info}");
803847
}
804848
}
849+
850+
#[test]
851+
fn test_taos_get_current_db() {
852+
unsafe {
853+
let taos = taos_connect(
854+
c"localhost".as_ptr(),
855+
c"root".as_ptr(),
856+
c"taosdata".as_ptr(),
857+
c"test".as_ptr(),
858+
6041,
859+
);
860+
assert!(!taos.is_null());
861+
let mut db = vec![0 as c_char; 1024];
862+
let mut required = 0;
863+
let code = taos_get_current_db(taos, db.as_mut_ptr(), db.len() as _, &mut required);
864+
assert_eq!(code, 0);
865+
println!("db: {:?}", CStr::from_ptr(db.as_ptr()));
866+
}
867+
}
868+
869+
#[test]
870+
fn test_taos_get_current_db_without_db() {
871+
unsafe {
872+
let taos = connect();
873+
let mut db = vec![0 as c_char; 1024];
874+
let mut required = 0;
875+
let code = taos_get_current_db(taos, db.as_mut_ptr(), db.len() as _, &mut required);
876+
assert!(code != 0);
877+
let errstr = taos_errstr(ptr::null_mut());
878+
println!("errstr: {:?}", CStr::from_ptr(errstr));
879+
}
880+
}
805881
}

0 commit comments

Comments
 (0)