#![allow(non_camel_case_types)]
#![allow(dead_code)]
#![allow(missing_copy_implementations)]
use crate::cassandra::batch::Batch;
use crate::cassandra::cluster::Cluster;
use crate::cassandra::custom_payload::CustomPayloadResponse;
use crate::cassandra::error::*;
use crate::cassandra::future::CassFuture;
use crate::cassandra::metrics::SessionMetrics;
use crate::cassandra::prepared::PreparedStatement;
use crate::cassandra::result::CassResult;
use crate::cassandra::schema::schema_meta::SchemaMeta;
use crate::cassandra::statement::Statement;
use crate::cassandra::util::Protected;
use crate::CustomPayload;
use crate::cassandra_sys::cass_session_close;
use crate::cassandra_sys::cass_session_connect;
use crate::cassandra_sys::cass_session_connect_keyspace_n;
use crate::cassandra_sys::cass_session_execute;
use crate::cassandra_sys::cass_session_execute_batch;
use crate::cassandra_sys::cass_session_free;
use crate::cassandra_sys::cass_session_get_metrics;
use crate::cassandra_sys::cass_session_get_schema_meta;
use crate::cassandra_sys::cass_session_new;
use crate::cassandra_sys::cass_session_prepare_n;
use crate::cassandra_sys::CassSession as _Session;
use std::ffi::NulError;
use std::mem;
use std::os::raw::c_char;
#[derive(Debug)]
pub struct Session(pub *mut _Session);
unsafe impl Send for Session {}
unsafe impl Sync for Session {}
impl Protected<*mut _Session> for Session {
fn inner(&self) -> *mut _Session {
self.0
}
fn build(inner: *mut _Session) -> Self {
if inner.is_null() {
panic!("Unexpected null pointer")
};
Session(inner)
}
}
impl Drop for Session {
fn drop(&mut self) {
unsafe { cass_session_free(self.0) }
}
}
impl Default for Session {
fn default() -> Session {
Session::new()
}
}
impl Session {
pub fn new() -> Session {
unsafe { Session(cass_session_new()) }
}
pub fn connect(self, cluster: &Cluster) -> CassFuture<()> {
unsafe { <CassFuture<()>>::build(cass_session_connect(self.0, cluster.inner())) }
}
pub fn connect_keyspace(&self, cluster: &Cluster, keyspace: &str) -> Result<CassFuture<()>> {
unsafe {
let keyspace_ptr = keyspace.as_ptr() as *const c_char;
Ok(<CassFuture<()>>::build(cass_session_connect_keyspace_n(
self.0,
cluster.inner(),
keyspace_ptr,
keyspace.len(),
)))
}
}
pub fn close(self) -> CassFuture<()> {
unsafe { <CassFuture<()>>::build(cass_session_close(self.0)) }
}
pub fn prepare(&self, query: &str) -> Result<CassFuture<PreparedStatement>> {
unsafe {
let query_ptr = query.as_ptr() as *const c_char;
Ok(<CassFuture<PreparedStatement>>::build(
cass_session_prepare_n(self.0, query_ptr, query.len()),
))
}
}
pub fn execute_batch(&self, batch: &Batch) -> CassFuture<CassResult> {
<CassFuture<CassResult>>::build(unsafe {
cass_session_execute_batch(self.0, batch.inner())
})
}
pub fn execute_batch_with_payloads(
&self,
batch: &Batch,
) -> CassFuture<(CassResult, CustomPayloadResponse)> {
<CassFuture<(CassResult, CustomPayloadResponse)>>::build(unsafe {
cass_session_execute_batch(self.0, batch.inner())
})
}
pub fn execute(&self, statement: &Statement) -> CassFuture<CassResult> {
unsafe { <CassFuture<CassResult>>::build(cass_session_execute(self.0, statement.inner())) }
}
pub fn execute_with_payloads(
&self,
statement: &Statement,
) -> CassFuture<(CassResult, CustomPayloadResponse)> {
unsafe {
<CassFuture<(CassResult, CustomPayloadResponse)>>::build(cass_session_execute(
self.0,
statement.inner(),
))
}
}
pub fn get_schema_meta(&self) -> SchemaMeta {
unsafe { SchemaMeta::build(cass_session_get_schema_meta(self.0)) }
}
pub fn get_metrics(&self) -> SessionMetrics {
unsafe {
let mut metrics = mem::zeroed();
cass_session_get_metrics(self.0, &mut metrics);
SessionMetrics::build(&metrics)
}
}
}