jdbc 0.1.0

Rust bindings to the Java Jdbc.
Documentation
use super::connection::Connection;
use crate::errors::Error;
use jni::{
    objects::{AutoLocal, JMethodID, JObject, JValueGen},
    signature::ReturnType,
    AttachGuard, JNIEnv,
};
pub struct DataSource<'local, 'obj> {
    inner: &'obj JObject<'local>,
    env: JNIEnv<'local>,
    get_conn: JMethodID,
}

impl<'local, 'obj_ref> DataSource<'local, 'obj_ref> {
    pub fn from_ref(
        env: &mut JNIEnv<'local>,
        datasource: &'obj_ref JObject<'local>,
    ) -> Result<Self, Error> {
        let class = AutoLocal::new(env.find_class("javax/sql/DataSource")?, env);
        let get_conn: jni::objects::JMethodID =
            env.get_method_id(&class, "getConnection", "()Ljava/sql/Connection;")?;
        let env = unsafe { env.unsafe_clone() };
        Ok(DataSource {
            inner: datasource,
            env,
            get_conn,
        })
    }

    pub fn get_connection(
        &mut self,
        guard: AttachGuard<'local>,
    ) -> Result<Connection<'local>, Error> {
        let conn = unsafe {
            self.env
                .call_method_unchecked(&self.inner, self.get_conn, ReturnType::Object, &[])
        }?;

        if let JValueGen::Object(obj) = conn {
            return Ok(Connection::from_ref(guard, obj)?);
        }
        return Err(Error::JniError(jni::errors::Error::WrongJValueType(
            "unknown",
            "java.sql.Connection",
        )));
    }
}