@@ -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