Skip to content

Commit 6d76a72

Browse files
committed
refactor(sys): impl taos_get_client_info
1 parent 43bd8ee commit 6d76a72

File tree

1 file changed

+47
-6
lines changed
  • taos-ws-sys/src/native/query

1 file changed

+47
-6
lines changed

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

Lines changed: 47 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ use std::sync::OnceLock;
33
use std::{ptr, slice};
44

55
use bytes::Bytes;
6+
use cargo_metadata::MetadataCommand;
67
use taos_error::Code;
78
use taos_query::common::{Field, Ty};
89
use 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 {
460461
pub 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

Comments
 (0)