From 69097031faedf987feab2f1aa3ca9dec7374d152 Mon Sep 17 00:00:00 2001 From: Steven Fackler Date: Tue, 5 Aug 2014 23:02:36 -0700 Subject: [PATCH] Add PostgresPoolManager --- .gitignore | 2 ++ Cargo.toml | 21 +++++++++++++++++++ src/lib.rs | 26 ++++++++++++++++++++++++ tests/test.rs | 56 +++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 105 insertions(+) create mode 100644 .gitignore create mode 100644 Cargo.toml create mode 100644 src/lib.rs create mode 100644 tests/test.rs diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..2c96eb1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +target/ +Cargo.lock diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..323bb6f --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,21 @@ +[package] +name = "r2d2_postgres" +version = "0.0.0" +authors = ["Steven Fackler "] + +[[lib]] +name = "r2d2_postgres" +path = "src/lib.rs" +test = false + +[[test]] +name = "test" +path = "tests/test.rs" + +[dependencies.rust-postgres] +git = "https://github.com/sfackler/rust-postgres" +rev = "7d8424418c52e148cba4bcfd89eeb9b5abdf7573" + +[dependencies.r2d2] +git = "https://github.com/sfackler/r2d2" +rev = "150f55e4f5cc73a554be72e18c5ed61184673043" \ No newline at end of file diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 0000000..2ecb40d --- /dev/null +++ b/src/lib.rs @@ -0,0 +1,26 @@ +extern crate r2d2; +extern crate postgres; + +use postgres::{PostgresConnection, PostgresConnectParams, IntoConnectParams, SslMode}; +use postgres::error::PostgresConnectError; + +pub struct PostgresPoolManager { + params: PostgresConnectParams, + ssl_mode: SslMode, +} + +impl PostgresPoolManager { + pub fn new(params: T, ssl_mode: SslMode) + -> Result { + Ok(PostgresPoolManager { + params: try!(params.into_connect_params()), + ssl_mode: ssl_mode, + }) + } +} + +impl r2d2::PoolManager for PostgresPoolManager { + fn connect(&self) -> Result { + PostgresConnection::connect(self.params.clone(), &self.ssl_mode) + } +} \ No newline at end of file diff --git a/tests/test.rs b/tests/test.rs new file mode 100644 index 0000000..f456380 --- /dev/null +++ b/tests/test.rs @@ -0,0 +1,56 @@ +extern crate postgres; +extern crate r2d2; +extern crate r2d2_postgres; + +use std::default::Default; +use std::sync::{Arc, Future}; +use std::comm; + +use postgres::NoSsl; +use postgres::error::SocketError; +use r2d2_postgres::PostgresPoolManager; + +#[test] +fn test_bad_url_error() { + let manager = PostgresPoolManager::new("postgres://bogushost", NoSsl).unwrap(); + let config = Default::default(); + match r2d2::Pool::new(config, manager) { + Err(r2d2::ConnectionError(SocketError(_))) => {} + Err(err) => fail!("Unexpected error {}", err), + _ => fail!("Unexpected success") + } +} + +#[test] +fn test_basic() { + let manager = PostgresPoolManager::new("postgres://postgres@localhost", NoSsl).unwrap(); + let config = r2d2::Config { + initial_size: 2, + ..Default::default() + }; + let pool = Arc::new(r2d2::Pool::new(config, manager).unwrap()); + + let (s1, r1) = comm::channel(); + let (s2, r2) = comm::channel(); + + let pool1 = pool.clone(); + let mut fut1 = Future::spawn(proc() { + let conn = pool1.get().unwrap(); + s1.send(()); + r2.recv(); + conn.replace(); + }); + + let pool2 = pool.clone(); + let mut fut2 = Future::spawn(proc() { + let conn = pool2.get().unwrap(); + s2.send(()); + r1.recv(); + conn.replace(); + }); + + fut1.get(); + fut2.get(); + + pool.get().unwrap().replace(); +} \ No newline at end of file