extern crate griddbnet_sys as ffi;
use chrono::{DateTime, Utc};
use std::ptr;
use std::time::{Duration, UNIX_EPOCH};
pub struct AggregationResult {
_ptr: *mut ffi::GSAggregationResult,
}
impl AggregationResult {
pub fn new(ptr_agg: *mut ffi::GSAggregationResult) -> AggregationResult {
AggregationResult { _ptr: ptr_agg }
}
pub fn get_as_i64(&self) -> (i32, i64) {
let result: *mut i64;
let value_result: i64;
let value_bool = ptr::null_mut();
let ret: i32;
unsafe {
result = ffi::malloc(std::mem::size_of::<i64>() as u64) as *mut i64;
ret = ffi::gsGetAggregationValueAsLong(self._ptr, result, value_bool);
value_result = *result;
ffi::free(result as *mut _);
}
(ret, value_result)
}
pub fn get_as_f64(&self) -> (i32, f64) {
let result: *mut f64;
let value_result: f64;
let value_bool = ptr::null_mut();
let ret: i32;
unsafe {
result = ffi::malloc(std::mem::size_of::<f64>() as u64) as *mut f64;
ret = ffi::gsGetAggregationValueAsDouble(self._ptr, result, value_bool);
value_result = *result;
ffi::free(result as *mut _);
}
(ret, value_result)
}
pub fn get_as_timestamp(&self) -> (i32, DateTime<Utc>) {
let result: *mut i64;
let value_result: i64;
let value_bool = ptr::null_mut();
let ret: i32;
unsafe {
result = ffi::malloc(std::mem::size_of::<i64>() as u64) as *mut i64;
ret = ffi::gsGetAggregationValueAsTimestamp(self._ptr, result, value_bool);
value_result = *result;
ffi::free(result as *mut _);
}
let timestamp = UNIX_EPOCH + Duration::from_millis(value_result as u64);
(ret, DateTime::<Utc>::from(timestamp))
}
}
impl Drop for AggregationResult {
fn drop(&mut self) {
unsafe {
ffi::gsCloseAggregationResult(&mut self._ptr);
}
}
}