diff options
-rw-r--r-- | rust/Cargo.lock | 2 | ||||
-rw-r--r-- | rust/Cargo.toml | 2 | ||||
-rw-r--r-- | rust/TODO | 5 | ||||
-rw-r--r-- | rust/src/api_server.rs | 41 | ||||
-rw-r--r-- | rust/src/lib.rs | 17 | ||||
-rw-r--r-- | rust/src/schema.rs | 68 |
6 files changed, 46 insertions, 89 deletions
diff --git a/rust/Cargo.lock b/rust/Cargo.lock index 9508d3ca..8c972677 100644 --- a/rust/Cargo.lock +++ b/rust/Cargo.lock @@ -315,6 +315,8 @@ dependencies = [ "iron-slog 0.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "iron-test 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", "iron_diesel_middleware 0.4.0 (git+https://github.com/darayus/iron-diesel-middleware)", + "r2d2 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", + "r2d2-diesel 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "slog 2.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "slog-async 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "slog-term 2.4.0 (registry+https://github.com/rust-lang/crates.io-index)", diff --git a/rust/Cargo.toml b/rust/Cargo.toml index 868523ff..7612751c 100644 --- a/rust/Cargo.toml +++ b/rust/Cargo.toml @@ -12,6 +12,8 @@ diesel = { version = "1.0.0", features = ["postgres"] } dotenv = "0.9.0" clap = "*" error-chain = "0.11" +r2d2 = "*" +r2d2-diesel = "*" # API server chrono = { version = "0.4", features = ["serde"] } @@ -2,9 +2,10 @@ x re-generate OpenAPI => using whatever sagger-codegen 2.3.1 (stable?) => take iron example from older generator 2.3.1 (iron) => cargo swagger (docker) seems to only use latest -- integrate API server example into a main.rs -- iron-slog +x iron-slog +x integrate API server example into a main.rs - get and post for creators +- cleanup pooled database: https://github.com/diesel-rs/diesel/pull/1466 then: - encode the remaining entities in SQL diff --git a/rust/src/api_server.rs b/rust/src/api_server.rs index 77ac324b..3da38724 100644 --- a/rust/src/api_server.rs +++ b/rust/src/api_server.rs @@ -7,13 +7,18 @@ use futures::{self, Future}; use std::collections::HashMap; +use ConnectionPool; use self::models::*; use diesel; +use r2d2; use diesel::prelude::*; use iron_diesel_middleware::DieselPooledConnection; +use r2d2_diesel::ConnectionManager; use swagger; +use database_schema::creator_rev::table as container_rev; + use fatcat_api::models; use fatcat_api::{Api, ApiError, ContainerIdGetResponse, ContainerLookupGetResponse, ContainerPostResponse, Context, CreatorIdGetResponse, CreatorLookupGetResponse, @@ -23,8 +28,11 @@ use fatcat_api::{Api, ApiError, ContainerIdGetResponse, ContainerLookupGetRespon FilePostResponse, ReleaseIdGetResponse, ReleaseLookupGetResponse, ReleasePostResponse, WorkIdGetResponse, WorkPostResponse}; -#[derive(Copy, Clone)] -pub struct Server; +//#[derive(Copy, Clone)] +#[derive(Clone)] +pub struct Server { + pub db_pool: ConnectionPool, +} impl Api for Server { fn container_id_get( @@ -32,20 +40,21 @@ impl Api for Server { id: String, context: &Context, ) -> Box<Future<Item = ContainerIdGetResponse, Error = ApiError> + Send> { - let context = context.clone(); - //let con: DieselPooledConnection<diesel::pg::PgConnection> = req.db_conn(); - println!( - "container_id_get(\"{}\") - X-Span-ID: {:?}", - id, - context.x_span_id.unwrap_or(String::from("<none>")).clone() - ); - /* - println!( - "container count: {}", - containers.count().load(&con).expect("DB Error"), - ); - */ - Box::new(futures::failed("Generic failure".into())) + let conn = self.db_pool.get().expect("db_pool error"); + let c: i64 = container_rev.count().first(&*conn).expect("DB Error"); + println!("container count: {}", c); + let ce = ContainerEntity{ + issn: None, + publisher: Some("Hello!".into()), + parent: None, + name: None, + state: None, + ident: None, + revision: None, + redirect: None, + editgroup: None, + }; + Box::new(futures::done(Ok(ContainerIdGetResponse::FetchASingleContainerById(ce)))) } fn container_lookup_get( diff --git a/rust/src/lib.rs b/rust/src/lib.rs index ae39224f..c1336561 100644 --- a/rust/src/lib.rs +++ b/rust/src/lib.rs @@ -1,7 +1,7 @@ #[macro_use] extern crate fatcat_api; extern crate chrono; -extern crate diesel; +#[macro_use] extern crate diesel; extern crate iron_diesel_middleware; extern crate dotenv; extern crate futures; @@ -9,7 +9,10 @@ extern crate futures; extern crate swagger; #[macro_use] extern crate error_chain; extern crate iron; +extern crate r2d2; +extern crate r2d2_diesel; +pub mod database_schema; pub mod api_server; mod errors { @@ -21,9 +24,11 @@ use diesel::pg::PgConnection; use diesel::prelude::*; use dotenv::dotenv; use std::env; -use hyper::header::Headers; use iron::{Request, Response}; use iron::middleware::AfterMiddleware; +use r2d2_diesel::ConnectionManager; + +pub type ConnectionPool = r2d2::Pool<r2d2_diesel::ConnectionManager<diesel::pg::PgConnection>>; pub fn establish_connection() -> PgConnection { dotenv().ok(); @@ -34,7 +39,13 @@ pub fn establish_connection() -> PgConnection { /// Instantiate a new server. pub fn server() -> Result<api_server::Server> { - Ok(api_server::Server {}) + dotenv().ok(); + let database_url = env::var("DATABASE_URL").expect("DATABASE_URL must be set"); + let manager = ConnectionManager::<PgConnection>::new(database_url); + let pool = r2d2::Pool::builder().build(manager).expect("Failed to create database pool."); + Ok(api_server::Server { + db_pool: pool, + }) } /// HTTP header middleware diff --git a/rust/src/schema.rs b/rust/src/schema.rs deleted file mode 100644 index 7bef7dcd..00000000 --- a/rust/src/schema.rs +++ /dev/null @@ -1,68 +0,0 @@ -table! { - changelog (id) { - id -> Int8, - editgroup_id -> Int8, - timestamp -> Nullable<Timestamp>, - } -} - -table! { - creator_edit (id) { - id -> Int8, - extra_json -> Nullable<Json>, - ident_id -> Uuid, - rev_id -> Nullable<Int8>, - redirect_id -> Nullable<Uuid>, - editgroup_id -> Int8, - } -} - -table! { - creator_ident (id) { - id -> Uuid, - is_live -> Bool, - rev_id -> Nullable<Int8>, - redirect_id -> Nullable<Uuid>, - } -} - -table! { - creator_rev (id) { - id -> Int8, - extra_json -> Nullable<Json>, - name -> Nullable<Text>, - orcid -> Nullable<Text>, - } -} - -table! { - editgroup (id) { - id -> Int8, - extra_json -> Nullable<Json>, - editor_id -> Int8, - description -> Nullable<Text>, - } -} - -table! { - editor (id) { - id -> Int8, - username -> Text, - is_admin -> Bool, - active_editgroup_id -> Nullable<Int8>, - } -} - -joinable!(changelog -> editgroup (editgroup_id)); -joinable!(creator_edit -> creator_rev (rev_id)); -joinable!(creator_edit -> editgroup (editgroup_id)); -joinable!(creator_ident -> creator_rev (rev_id)); - -allow_tables_to_appear_in_same_query!( - changelog, - creator_edit, - creator_ident, - creator_rev, - editgroup, - editor, -); |