update functions

* introduce async handling
* use r2d2 as connection handler

Signed-off-by: Ralf Zerres <ralf.zerres@networkx.de>
This commit is contained in:
2021-05-21 12:02:51 +02:00
parent 51e747ef6d
commit dffac8ead2
4 changed files with 52 additions and 22 deletions

View File

@@ -1,18 +1,21 @@
/* /*
* advotracker - Hotline tackingtool for Advocats * advotracker - Hotline tackingtool for Advocats
* *
* Copyright 2019 Ralf Zerres <ralf.zerres@networkx.de> * Copyright 2021 Ralf Zerres <ralf.zerres@networkx.de>
* SPDX-License-Identifier: (0BSD or MIT) * SPDX-License-Identifier: (0BSD or MIT)
*/ */
//use diesel::debug_query; //use diesel::debug_query;
use diesel::prelude::*; use diesel::{
prelude::*,
r2d2::{Builder, ConnectionManager, Pool},
};
use diesel::sqlite::SqliteConnection; use diesel::sqlite::SqliteConnection;
use diesel::sqlite::Sqlite; use diesel::sqlite::Sqlite;
use dotenv::dotenv; use dotenv::dotenv;
use std::env; use std::env;
/// establish a sqlite connection /// establish a connection
pub fn establish_connection() -> SqliteConnection { pub fn establish_connection() -> SqliteConnection {
// load our .env file // load our .env file
dotenv().ok(); dotenv().ok();
@@ -22,7 +25,8 @@ pub fn establish_connection() -> SqliteConnection {
// establish a new SQLite connection (taking the reference from database_url) // establish a new SQLite connection (taking the reference from database_url)
SqliteConnection::establish(&database_url) SqliteConnection::establish(&database_url)
.unwrap_or_else(|_| panic!("Error connecting to {}", &database_url)) .unwrap_or_else(|_| panic!("Error connecting to {}", &database_url));
/* /*
* WIP: integrate tracing! * WIP: integrate tracing!
trace!( trace!(
@@ -33,6 +37,31 @@ pub fn establish_connection() -> SqliteConnection {
*/ */
} }
/// establish a connection to a db pool
pub fn build() -> Result<Pool<M>, Error> {
// TODO: consume database_url
// precedence in decreasing order:
// 1: commandline
// 2: env
// 3: user_config
// 4: system_config
// load .env file
dotenv().ok();
let database_url = env::var("DATABASE_URL").expect("DATABASE_URL must be set");
// establish a new SQLite connection (taking the reference from database_url)
// SqliteConnection::establish(&database_url)
// .unwrap_or_else(|_| panic!("Error connecting to {}", &database_url))
// establish a new connection
let manager = ConnectionManager::<SqliteConnection>::new(&database_url);
let pool = Pool::builder.build(manager)?;
Ok(pool)
}
/// show the sql query /// show the sql query
pub fn show_query<T>(query: &T) pub fn show_query<T>(query: &T)
where where

View File

@@ -5,9 +5,8 @@
* SPDX-License-Identifier: (0BSD or MIT) * SPDX-License-Identifier: (0BSD or MIT)
*/ */
// table specific functions /// module handling configuratio of database
/// module handling database connections pub mod config;
pub mod db_connection;
/// module handling harms /// module handling harms
pub mod harms; pub mod harms;

View File

@@ -7,9 +7,14 @@
//#[cfg(test)] //#[cfg(test)]
use async_std::*;
use async_diesel::*;
use chrono::Local; use chrono::Local;
use diesel::debug_query; use diesel::debug_query;
use diesel::prelude::*; use diesel::{
prelude::*,
r2d2::Pool,
};
use diesel::sqlite::{Sqlite, SqliteConnection}; use diesel::sqlite::{Sqlite, SqliteConnection};
use diesel::{QueryDsl, RunQueryDsl}; use diesel::{QueryDsl, RunQueryDsl};
use std::error::Error; use std::error::Error;
@@ -22,17 +27,17 @@ use crate::schema::roles::dsl::*;
use crate::schema::roles::*; use crate::schema::roles::*;
impl Role { impl Role {
// implement CRUD-Functions for our trait // implement CRUD-Functions
// new- -> Create // new- -> Create
// show- -> Read // show- -> Read
// update- -> Update // update- -> Update
// delete- -> Delete // delete- -> Delete
/// create a new role record /// create a new role record
pub fn new( pub async fn new(
param_role_name: &str, param_role_name: &str,
param_id_user_changed: i32, param_id_user_changed: i32,
connection: &SqliteConnection, pool: &Pool,
) -> Result<(), Box<dyn Error>> { ) -> Result<(), Box<dyn Error>> {
//let row = Self::get(param_role_name, param_user_id_changed, &connection); //let row = Self::get(param_role_name, param_user_id_changed, &connection);
//if row.len() == 0 { //if row.len() == 0 {
@@ -45,12 +50,8 @@ impl Role {
}; };
diesel::insert_into(roles::table) diesel::insert_into(roles::table)
.values(struct_role) .values(struct_role)
.execute(connection)?; .execute_async(&pool)
.await?;
Ok(())
//else {
// Err(("row already exists!"))
//}
} }
/* /*

View File

@@ -6,11 +6,12 @@
*/ */
#[cfg(test)] #[cfg(test)]
use diesel::debug_query; use async_std::*;
//use diesel::debug_query;
use diesel::dsl::*; use diesel::dsl::*;
use diesel::prelude::*; use diesel::prelude::*;
#[cfg(test)] //#[cfg(test)]
use diesel::sqlite::Sqlite; //use diesel::sqlite::Sqlite;
#[cfg(test)] #[cfg(test)]
use diesel::sqlite::SqliteConnection; use diesel::sqlite::SqliteConnection;
@@ -34,10 +35,10 @@ fn examine_set_users_default_values() {
} }
/// set user defaults /// set user defaults
pub fn set_roles_default_values(connection: &SqliteConnection) -> QueryResult<usize> { pub async fn set_roles_default_values(pool: &pool) -> QueryResult<usize> {
use schema::roles::dsl::*; use schema::roles::dsl::*;
insert_into(roles).default_values().execute(connection) insert_into(roles).default_values().execute_async(&pool).await?;
} }
#[test] #[test]