From 82852b98ce32fc6f1266efb012ae95483867ebc4 Mon Sep 17 00:00:00 2001 From: Thijs Cadier Date: Wed, 19 Aug 2015 21:03:00 +0200 Subject: [PATCH] Add Client get_server_status --- src/client.rs | 52 +++++++++++++++++++++++++++++++++++++++++++++++ src/read_prefs.rs | 5 +++++ 2 files changed, 57 insertions(+) diff --git a/src/client.rs b/src/client.rs index 977af88..cfc7d8b 100644 --- a/src/client.rs +++ b/src/client.rs @@ -1,11 +1,18 @@ use std::fmt; use std::ffi::CString; +use std::ptr; use mongo_c_driver_wrapper::bindings; +use bson::Document; + +use super::Result; +use super::BsoncError; +use super::bsonc::Bsonc; use super::collection::{Collection,CreatedBy}; use super::database::Database; use super::uri::Uri; +use super::read_prefs::ReadPrefs; // TODO: We're using a sort of poor man's Arc here // with this root bool, there must be a better way. @@ -116,6 +123,39 @@ impl<'a> Client<'a> { }; Database::new(self, coll) } + + /// Queries the server for the current server status. + /// + /// See: http://api.mongodb.org/c/current/mongoc_client_get_server_status.html + pub fn get_server_status(&self, read_prefs: Option) -> Result { + assert!(!self.inner.is_null()); + + // Bsonc to store the reply + let mut reply = Bsonc::new(); + // Empty error that might be filled + let mut error = BsoncError::empty(); + + let success = unsafe { + bindings::mongoc_client_get_server_status( + self.inner, + match read_prefs { + Some(ref prefs) => prefs.mut_inner(), + None => ptr::null_mut() + }, + reply.mut_inner(), + error.mut_inner() + ) + }; + + if success == 1 { + match reply.as_document() { + Ok(document) => return Ok(document), + Err(error) => return Err(error.into()) + } + } else { + Err(error.into()) + } + } } impl<'a> Drop for Client<'a> { @@ -169,4 +209,16 @@ mod tests { guard1.join().unwrap(); guard2.join().unwrap(); } + + #[test] + fn test_get_server_status() { + let uri = Uri::new("mongodb://localhost:27017/"); + let pool = ClientPool::new(uri); + let client = pool.pop(); + + let status = client.get_server_status(None).unwrap(); + + assert!(status.contains_key("host")); + assert!(status.contains_key("version")); + } } diff --git a/src/read_prefs.rs b/src/read_prefs.rs index c6e09af..ee75a73 100644 --- a/src/read_prefs.rs +++ b/src/read_prefs.rs @@ -38,6 +38,11 @@ impl ReadPrefs { assert!(!self.inner.is_null()); self.inner } + + pub fn mut_inner(&self) -> *mut bindings::mongoc_read_prefs_t { + assert!(!self.inner.is_null()); + self.inner as *mut bindings::mongoc_read_prefs_t + } } impl Drop for ReadPrefs {