@@ -3,6 +3,7 @@ use std::sync::OnceLock;
33use std:: { ptr, slice} ;
44
55use bytes:: Bytes ;
6+ use cargo_metadata:: MetadataCommand ;
67use taos_error:: Code ;
78use taos_query:: common:: { Field , Ty } ;
89use taos_query:: util:: { generate_req_id, hex, InlineBytes , InlineNChar , InlineStr } ;
@@ -460,29 +461,59 @@ pub extern "C" fn taos_result_block(res: *mut TAOS_RES) -> *mut TAOS_ROW {
460461pub unsafe extern "C" fn taos_get_server_info ( taos : * mut TAOS ) -> * const c_char {
461462 trace ! ( taos=?taos, "taos_get_server_info" ) ;
462463
463- static VERSION : OnceLock < CString > = OnceLock :: new ( ) ;
464+ static SERVER_INFO : OnceLock < CString > = OnceLock :: new ( ) ;
464465
465466 if taos. is_null ( ) {
466467 set_err_and_get_code ( TaosError :: new ( Code :: INVALID_PARA , "taos is null" ) ) ;
467468 return ptr:: null ( ) ;
468469 }
469470
470- let version = VERSION . get_or_init ( || {
471+ let server_info = SERVER_INFO . get_or_init ( || {
471472 if let Some ( taos) = ( taos as * mut Taos ) . as_mut ( ) {
472473 CString :: new ( taos. version ( ) ) . unwrap ( )
473474 } else {
474475 CString :: new ( "" ) . unwrap ( )
475476 }
476477 } ) ;
477478
478- trace ! ( version=?version , "taos_get_server_info done" ) ;
479+ trace ! ( server_info=?server_info , "taos_get_server_info done" ) ;
479480
480- version . as_ptr ( )
481+ server_info . as_ptr ( )
481482}
482483
483484#[ no_mangle]
484- pub extern "C" fn taos_get_client_info ( ) -> * const c_char {
485- todo ! ( )
485+ pub unsafe extern "C" fn taos_get_client_info ( ) -> * const c_char {
486+ trace ! ( "taos_get_client_info" ) ;
487+
488+ static CLIENT_INFO : OnceLock < CString > = OnceLock :: new ( ) ;
489+
490+ let metadata = match MetadataCommand :: new ( ) . no_deps ( ) . exec ( ) . ok ( ) {
491+ Some ( md) => md,
492+ None => {
493+ set_err_and_get_code ( TaosError :: new ( Code :: FAILED , "MetadataCommand error" ) ) ;
494+ return ptr:: null ( ) ;
495+ }
496+ } ;
497+
498+ let package = match metadata
499+ . packages
500+ . into_iter ( )
501+ . find ( |pkg| pkg. name == "taos-ws-sys" )
502+ {
503+ Some ( pkg) => pkg,
504+ None => {
505+ set_err_and_get_code ( TaosError :: new ( Code :: FAILED , "find package error" ) ) ;
506+ return ptr:: null ( ) ;
507+ }
508+ } ;
509+
510+ let version = package. version . to_string ( ) ;
511+ let client_info = CString :: new ( version) . unwrap ( ) ;
512+
513+ trace ! ( client_info=?client_info, "taos_get_client_info done" ) ;
514+
515+ CLIENT_INFO . set ( client_info) . unwrap ( ) ;
516+ CLIENT_INFO . get ( ) . unwrap ( ) . as_ptr ( )
486517}
487518
488519#[ no_mangle]
@@ -761,4 +792,14 @@ mod tests {
761792 println ! ( "server_info: {server_info}" ) ;
762793 }
763794 }
795+
796+ #[ test]
797+ fn test_taos_get_client_info ( ) {
798+ unsafe {
799+ let client_info = taos_get_client_info ( ) ;
800+ assert ! ( !client_info. is_null( ) ) ;
801+ let client_info = CStr :: from_ptr ( client_info) . to_str ( ) . unwrap ( ) ;
802+ println ! ( "client_info: {client_info}" ) ;
803+ }
804+ }
764805}
0 commit comments