From 8b5de155bd33bd2cea7806366123c06bfa030047 Mon Sep 17 00:00:00 2001 From: Luca Palmieri Date: Sat, 29 Jan 2022 16:25:46 +0000 Subject: [PATCH] Update db/basic, db/sqlx_todo and db/r2d2 to v4 (#506) --- Cargo.lock | 301 ++++++++++-------- database_interactions/basic/Cargo.toml | 10 +- database_interactions/basic/src/db.rs | 17 +- database_interactions/basic/src/main.rs | 2 +- database_interactions/r2d2/Cargo.toml | 12 +- database_interactions/r2d2/src/main.rs | 10 +- database_interactions/sqlx_todo/Cargo.toml | 8 +- database_interactions/sqlx_todo/README.md | 9 +- database_interactions/sqlx_todo/setup_db.sh | 2 + database_interactions/sqlx_todo/src/main.rs | 4 +- .../sqlx_todo/src/todo/model.rs | 15 +- 11 files changed, 225 insertions(+), 165 deletions(-) create mode 100755 database_interactions/sqlx_todo/setup_db.sh diff --git a/Cargo.lock b/Cargo.lock index a1f412e..04865ef 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -22,7 +22,7 @@ dependencies = [ "actix_derive", "bitflags", "bytes 0.5.6", - "crossbeam-channel", + "crossbeam-channel 0.4.4", "derive_more", "futures-channel", "futures-util", @@ -1033,7 +1033,7 @@ dependencies = [ "async-graphql-derive", "async-graphql-parser", "async-graphql-value", - "async-stream 0.3.2", + "async-stream", "async-trait", "bytes 1.1.0", "fnv", @@ -1157,35 +1157,6 @@ dependencies = [ "event-listener", ] -[[package]] -name = "async-native-tls" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e9e7a929bd34c68a82d58a4de7f86fffdaf97fb2af850162a7bb19dd7269b33" -dependencies = [ - "async-std", - "native-tls", - "thiserror", - "url", -] - -[[package]] -name = "async-process" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83137067e3a2a6a06d67168e49e68a0957d215410473a740cea95a2425c0b7c6" -dependencies = [ - "async-io", - "blocking", - "cfg-if 1.0.0", - "event-listener", - "futures-lite", - "libc", - "once_cell", - "signal-hook", - "winapi 0.3.9", -] - [[package]] name = "async-std" version = "1.10.0" @@ -1196,7 +1167,6 @@ dependencies = [ "async-global-executor", "async-io", "async-lock", - "async-process", "crossbeam-utils 0.8.6", "futures-channel", "futures-core", @@ -1214,37 +1184,16 @@ dependencies = [ "wasm-bindgen-futures", ] -[[package]] -name = "async-stream" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22068c0c19514942eefcfd4daf8976ef1aad84e61539f95cd200c35202f80af5" -dependencies = [ - "async-stream-impl 0.2.1", - "futures-core", -] - [[package]] name = "async-stream" version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "171374e7e3b2504e0e5236e3b59260560f9fe94bfe9ac39ba5e4e929c5590625" dependencies = [ - "async-stream-impl 0.3.2", + "async-stream-impl", "futures-core", ] -[[package]] -name = "async-stream-impl" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25f9db3b38af870bf7e5cc649167533b493928e50744e2c30ae350230b414670" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "async-stream-impl" version = "0.3.2" @@ -1287,8 +1236,8 @@ dependencies = [ name = "async_db" version = "2.0.0" dependencies = [ - "actix-web 3.3.3", - "env_logger 0.8.4", + "actix-web 4.0.0-beta.21", + "env_logger 0.9.0", "failure", "futures", "num_cpus", @@ -1329,6 +1278,15 @@ dependencies = [ "tokio-postgres", ] +[[package]] +name = "atoi" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "616896e05fc0e2649463a93a15183c6a16bf03413a7af88ef1285ddedfa9cda5" +dependencies = [ + "num-traits 0.2.14", +] + [[package]] name = "atomic-waker" version = "1.0.0" @@ -1576,7 +1534,7 @@ dependencies = [ "rand 0.7.3", "serde 1.0.136", "serde_json", - "uuid", + "uuid 0.8.2", ] [[package]] @@ -1595,7 +1553,7 @@ dependencies = [ "serde 1.0.136", "serde_bytes", "serde_json", - "uuid", + "uuid 0.8.2", ] [[package]] @@ -1969,6 +1927,21 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dcb25d077389e53838a8158c8e99174c5a9d902dee4904320db714f3c653ffba" +[[package]] +name = "crc" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49fc9a695bca7f35f5f4c15cddc84415f66a74ea78eef08e90c5024f2b540e23" +dependencies = [ + "crc-catalog", +] + +[[package]] +name = "crc-catalog" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccaeedb56da03b09f598226e25e80088cb4cd25f316e6e4df7d695f0feeb1403" + [[package]] name = "crc32fast" version = "1.3.1" @@ -1988,6 +1961,16 @@ dependencies = [ "maybe-uninit", ] +[[package]] +name = "crossbeam-channel" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e54ea8bc3fb1ee042f5aace6e3c6e025d3874866da222930f70ce62aceba0bfa" +dependencies = [ + "cfg-if 1.0.0", + "crossbeam-utils 0.8.6", +] + [[package]] name = "crossbeam-queue" version = "0.2.3" @@ -1999,6 +1982,16 @@ dependencies = [ "maybe-uninit", ] +[[package]] +name = "crossbeam-queue" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b979d76c9fcb84dffc80a73f7290da0f83e4c95773494674cb44b76d13a7a110" +dependencies = [ + "cfg-if 1.0.0", + "crossbeam-utils 0.8.6", +] + [[package]] name = "crossbeam-utils" version = "0.7.2" @@ -2172,7 +2165,7 @@ checksum = "4aaff9a7a1de9893f4004fa08527b31cb2ae4121c44e053cf53f29203c73bd23" dependencies = [ "async-trait", "config", - "crossbeam-queue", + "crossbeam-queue 0.2.3", "num_cpus", "serde 1.0.136", "tokio 0.2.25", @@ -2248,7 +2241,7 @@ dependencies = [ "libsqlite3-sys", "pq-sys", "r2d2", - "uuid", + "uuid 0.8.2", ] [[package]] @@ -2264,7 +2257,7 @@ dependencies = [ "futures", "serde 1.0.136", "serde_json", - "uuid", + "uuid 0.8.2", ] [[package]] @@ -2382,19 +2375,6 @@ dependencies = [ "syn", ] -[[package]] -name = "env_logger" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44533bbbb3bb3c1fa17d9f2e4e38bbbaf8396ba82193c4cb1b6445d711445d36" -dependencies = [ - "atty", - "humantime 1.3.0", - "log", - "regex", - "termcolor", -] - [[package]] name = "env_logger" version = "0.8.4" @@ -2402,7 +2382,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a19187fea3ac7e84da7dacf48de0c45d63c6a76f9490dae389aead16c243fce3" dependencies = [ "atty", - "humantime 2.1.0", + "humantime", "log", "regex", "termcolor", @@ -2415,7 +2395,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b2cf0344971ee6c64c31be0d530793fba457d322dfec2810c453d0ef228f9c3" dependencies = [ "atty", - "humantime 2.1.0", + "humantime", "log", "regex", "termcolor", @@ -2623,6 +2603,17 @@ dependencies = [ "futures-util", ] +[[package]] +name = "futures-intrusive" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62007592ac46aa7c2b6416f7deb9a8a8f63a01e0f1d6e1787d5630170db2b63e" +dependencies = [ + "futures-core", + "lock_api", + "parking_lot", +] + [[package]] name = "futures-io" version = "0.3.19" @@ -2856,6 +2847,18 @@ name = "hashbrown" version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" +dependencies = [ + "ahash 0.7.6", +] + +[[package]] +name = "hashlink" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7249a3129cbc1ffccd74857f81464a323a152173cdb134e0fd81bc803b29facf" +dependencies = [ + "hashbrown", +] [[package]] name = "heck" @@ -3011,15 +3014,6 @@ version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "02296996cb8796d7c6e3bc2d9211b7802812d36999a51bb754123ead7d37d026" -[[package]] -name = "humantime" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df004cfca50ef23c36850aaaa59ad52cc70d0e90243c3c7737a4dd32dc7a3c4f" -dependencies = [ - "quick-error 1.2.3", -] - [[package]] name = "humantime" version = "2.1.0" @@ -3281,7 +3275,7 @@ dependencies = [ "smartstring", "static_assertions 1.1.0", "url", - "uuid", + "uuid 0.8.2", ] [[package]] @@ -3298,7 +3292,7 @@ dependencies = [ "r2d2_mysql", "serde 1.0.136", "serde_json", - "uuid", + "uuid 0.8.2", ] [[package]] @@ -3409,9 +3403,9 @@ checksum = "565dbd88872dbe4cc8a46e527f26483c1d1f7afa6b884a3bd6cd893d4f98da74" [[package]] name = "libsqlite3-sys" -version = "0.17.3" +version = "0.22.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56d90181c2904c287e5390186be820e5ef311a3c62edebb7d6ca3d6a48ce041d" +checksum = "290b64917f8b0cb885d9de0f9959fe1f775d7fa12f1da2db9001c1c8ab60f89d" dependencies = [ "cc", "pkg-config", @@ -3774,7 +3768,7 @@ dependencies = [ "trust-dns-proto 0.20.3", "trust-dns-resolver 0.20.3", "typed-builder", - "uuid", + "uuid 0.8.2", "version_check 0.9.4", "webpki", "webpki-roots 0.21.1", @@ -3806,7 +3800,7 @@ dependencies = [ "actix-web 3.3.3", "futures-util", "sanitize-filename", - "uuid", + "uuid 0.8.2", ] [[package]] @@ -3875,7 +3869,7 @@ dependencies = [ "sha2 0.8.2", "time 0.1.44", "twox-hash", - "uuid", + "uuid 0.8.2", ] [[package]] @@ -4569,12 +4563,12 @@ dependencies = [ name = "r2d2-example" version = "1.0.0" dependencies = [ - "actix-web 3.3.3", - "env_logger 0.8.4", + "actix-web 4.0.0-beta.21", + "env_logger 0.9.0", "r2d2", "r2d2_sqlite", "rusqlite", - "uuid", + "uuid 1.0.0-alpha.1", ] [[package]] @@ -4589,9 +4583,9 @@ dependencies = [ [[package]] name = "r2d2_sqlite" -version = "0.14.0" +version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c4689dcbe44341a3388a696a056cbb96124f7e70a1fbc9cd6a7bb6bab543e3b" +checksum = "9d24607049214c5e42d3df53ac1d8a23c34cc6a5eefe3122acb2c72174719959" dependencies = [ "r2d2", "rusqlite", @@ -4978,17 +4972,17 @@ dependencies = [ [[package]] name = "rusqlite" -version = "0.21.0" +version = "0.25.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64a656821bb6317a84b257737b7934f79c0dbb7eb694710475908280ebad3e64" +checksum = "5c4b1eaf239b47034fb450ee9cdedd7d0226571689d8823030c4b6c2cb407152" dependencies = [ "bitflags", "fallible-iterator", "fallible-streaming-iterator", + "hashlink", "libsqlite3-sys", - "lru-cache", "memchr", - "time 0.1.44", + "smallvec", ] [[package]] @@ -5416,16 +5410,6 @@ dependencies = [ "tokio 1.16.1", ] -[[package]] -name = "signal-hook" -version = "0.3.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "647c97df271007dcea485bb74ffdb57f2e683f1306c854f468a0c244badabf2d" -dependencies = [ - "libc", - "signal-hook-registry", -] - [[package]] name = "signal-hook-registry" version = "1.4.0" @@ -5454,7 +5438,7 @@ dependencies = [ "serde_json", "sparkpost", "time 0.2.27", - "uuid", + "uuid 0.8.2", ] [[package]] @@ -5552,9 +5536,9 @@ dependencies = [ [[package]] name = "sqlx" -version = "0.3.5" +version = "0.5.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8974cacd80085fbe49e778708d660dec6fb351604dc34c3905b26efb2803b038" +checksum = "7911b0031a0247af40095838002999c7a52fba29d9739e93326e71a5a1bc9d43" dependencies = [ "sqlx-core", "sqlx-macros", @@ -5562,55 +5546,88 @@ dependencies = [ [[package]] name = "sqlx-core" -version = "0.3.5" +version = "0.5.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88ac5a436f941c42eac509471a730df5c3c58e1450e68cd39afedbd948206273" +checksum = "aec89bfaca8f7737439bad16d52b07f1ccd0730520d3bf6ae9d069fe4b641fb1" dependencies = [ - "async-native-tls", - "async-std", - "async-stream 0.2.1", + "ahash 0.7.6", + "atoi", "bitflags", "byteorder", - "crossbeam-queue", - "crossbeam-utils 0.7.2", + "bytes 1.1.0", + "crc", + "crossbeam-channel 0.5.2", + "crossbeam-queue 0.3.3", + "crossbeam-utils 0.8.6", + "either", "futures-channel", "futures-core", + "futures-intrusive", "futures-util", + "hashlink", "hex", + "indexmap", + "itoa 0.4.8", "libc", "libsqlite3-sys", "log", "memchr", + "once_cell", + "parking_lot", "percent-encoding", + "rustls 0.19.1", + "sha2 0.9.9", + "smallvec", "sqlformat", + "sqlx-rt", + "stringprep", + "thiserror", + "tokio-stream", "url", + "webpki", + "webpki-roots 0.21.1", + "whoami", ] [[package]] name = "sqlx-macros" -version = "0.3.5" +version = "0.5.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de2ae78b783af5922d811b14665a5a3755e531c3087bb805cf24cf71f15e6780" +checksum = "584866c833511b1a152e87a7ee20dee2739746f60c858b3c5209150bc4b466f5" dependencies = [ - "async-std", "dotenv", - "futures", + "either", "heck", + "once_cell", "proc-macro2", "quote", + "sha2 0.9.9", "sqlx-core", + "sqlx-rt", "syn", "url", ] +[[package]] +name = "sqlx-rt" +version = "0.5.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8061cbaa91ee75041514f67a09398c65a64efed72c90151ecd47593bad53da99" +dependencies = [ + "actix-rt 2.6.0", + "once_cell", + "tokio 1.16.1", + "tokio-rustls 0.22.0", +] + [[package]] name = "sqlx_todo" version = "0.1.0" dependencies = [ - "actix-web 3.3.3", + "actix-web 4.0.0-beta.21", "anyhow", "dotenv", - "env_logger 0.7.1", + "env_logger 0.9.0", "futures", "log", "serde 1.0.136", @@ -6187,6 +6204,17 @@ dependencies = [ "webpki", ] +[[package]] +name = "tokio-stream" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50145484efff8818b5ccd256697f36863f587da82cf8b409c53adf1e840798e3" +dependencies = [ + "futures-core", + "pin-project-lite 0.2.8", + "tokio 1.16.1", +] + [[package]] name = "tokio-tls" version = "0.3.1" @@ -6580,6 +6608,15 @@ dependencies = [ "serde 1.0.136", ] +[[package]] +name = "uuid" +version = "1.0.0-alpha.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb3ab47baa004111b323696c6eaa2752e7356f7f77cf6b6dc7a2087368ce1ca4" +dependencies = [ + "getrandom 0.2.4", +] + [[package]] name = "v_escape" version = "0.13.2" @@ -6973,6 +7010,16 @@ dependencies = [ "cc", ] +[[package]] +name = "whoami" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "524b58fa5a20a2fb3014dd6358b70e6579692a56ef6fce928834e488f42f65e8" +dependencies = [ + "wasm-bindgen", + "web-sys", +] + [[package]] name = "widestring" version = "0.4.3" diff --git a/database_interactions/basic/Cargo.toml b/database_interactions/basic/Cargo.toml index 986aa01..6927e40 100644 --- a/database_interactions/basic/Cargo.toml +++ b/database_interactions/basic/Cargo.toml @@ -2,16 +2,16 @@ name = "async_db" version = "2.0.0" authors = ["Darin Gordon "] -edition = "2018" +edition = "2021" [dependencies] -actix-web = "3" -env_logger = "0.8" +actix-web = "4.0.0-beta.21" +env_logger = "0.9.0" failure = "0.1.7" futures = "0.3.1" num_cpus = "1.13" r2d2 = "0.8.2" -r2d2_sqlite = "0.14" -rusqlite = "0.21" +r2d2_sqlite = "0.18.0" +rusqlite = "0.25.4" serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" diff --git a/database_interactions/basic/src/db.rs b/database_interactions/basic/src/db.rs index d8d4ec1..d8515bc 100644 --- a/database_interactions/basic/src/db.rs +++ b/database_interactions/basic/src/db.rs @@ -1,7 +1,6 @@ -use actix_web::{web, Error as AWError}; +use actix_web::{error::InternalError, http::StatusCode, web}; use failure::Error; -use futures::{Future, TryFutureExt}; -use rusqlite::{Statement, NO_PARAMS}; +use rusqlite::Statement; use serde::{Deserialize, Serialize}; use std::{thread::sleep, time::Duration}; @@ -23,10 +22,10 @@ pub enum Queries { GetTopTenColdestMonths, } -pub fn execute( +pub async fn execute( pool: &Pool, query: Queries, -) -> impl Future, AWError>> { +) -> Result, InternalError> { let pool = pool.clone(); web::block(move || { // simulate an expensive query, see comments at top of main.rs @@ -40,7 +39,9 @@ pub fn execute( }; result.map_err(Error::from) }) - .map_err(AWError::from) + .await + .unwrap() + .map_err(|e| InternalError::new(e, StatusCode::INTERNAL_SERVER_ERROR)) } fn get_hottest_years(conn: Connection) -> WeatherAggResult { @@ -73,7 +74,7 @@ fn get_coldest_years(conn: Connection) -> WeatherAggResult { fn get_rows_as_annual_agg(mut statement: Statement) -> WeatherAggResult { statement - .query_map(NO_PARAMS, |row| { + .query_map([], |row| { Ok(WeatherAgg::AnnualAgg { year: row.get(0)?, total: row.get(1)?, @@ -112,7 +113,7 @@ fn get_coldest_months(conn: Connection) -> WeatherAggResult { fn get_rows_as_month_agg(mut statement: Statement) -> WeatherAggResult { statement - .query_map(NO_PARAMS, |row| { + .query_map([], |row| { Ok(WeatherAgg::MonthAgg { year: row.get(0)?, month: row.get(1)?, diff --git a/database_interactions/basic/src/main.rs b/database_interactions/basic/src/main.rs index a5e95c0..5c29502 100644 --- a/database_interactions/basic/src/main.rs +++ b/database_interactions/basic/src/main.rs @@ -61,7 +61,7 @@ async fn main() -> io::Result<()> { HttpServer::new(move || { App::new() // store db pool as Data object - .data(pool.clone()) + .app_data(web::Data::new(pool.clone())) .wrap(middleware::Logger::default()) .service( web::resource("/asyncio_weather").route(web::get().to(asyncio_weather)), diff --git a/database_interactions/r2d2/Cargo.toml b/database_interactions/r2d2/Cargo.toml index 72c89b6..fb0677a 100644 --- a/database_interactions/r2d2/Cargo.toml +++ b/database_interactions/r2d2/Cargo.toml @@ -2,14 +2,14 @@ name = "r2d2-example" version = "1.0.0" authors = ["Nikolay Kim "] -edition = "2018" +edition = "2021" [dependencies] -actix-web = "3" +actix-web = "4.0.0-beta.21" -env_logger = "0.8" -uuid = { version = "0.8", features = ["v4"] } +env_logger = "0.9.0" +uuid = { version = "1.0.0-alpha.1", features = ["v4"] } r2d2 = "0.8" -r2d2_sqlite = "0.14" -rusqlite = "0.21" +r2d2_sqlite = "0.18.0" +rusqlite = "0.25.4" diff --git a/database_interactions/r2d2/src/main.rs b/database_interactions/r2d2/src/main.rs index 4d34355..4b07576 100644 --- a/database_interactions/r2d2/src/main.rs +++ b/database_interactions/r2d2/src/main.rs @@ -1,7 +1,10 @@ //! Actix web r2d2 example use std::io; -use actix_web::{middleware, web, App, Error, HttpResponse, HttpServer}; +use actix_web::{ + error::InternalError, http::StatusCode, middleware, web, App, Error, HttpResponse, + HttpServer, +}; use r2d2::Pool; use r2d2_sqlite::SqliteConnectionManager; @@ -26,8 +29,9 @@ async fn index( }) }) .await + .unwrap() .map(|user| HttpResponse::Ok().json(user)) - .map_err(|_| HttpResponse::InternalServerError())?; + .map_err(|e| InternalError::new(e, StatusCode::INTERNAL_SERVER_ERROR))?; Ok(res) } @@ -43,7 +47,7 @@ async fn main() -> io::Result<()> { // start http server HttpServer::new(move || { App::new() - .data(pool.clone()) // <- store db pool in app state + .app_data(web::Data::new(pool.clone())) // <- store db pool in app state .wrap(middleware::Logger::default()) .route("/{name}", web::get().to(index)) }) diff --git a/database_interactions/sqlx_todo/Cargo.toml b/database_interactions/sqlx_todo/Cargo.toml index bee058a..71aefda 100644 --- a/database_interactions/sqlx_todo/Cargo.toml +++ b/database_interactions/sqlx_todo/Cargo.toml @@ -2,17 +2,17 @@ name = "sqlx_todo" version = "0.1.0" authors = ["Milan Zivkovic "] -edition = "2018" +edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -actix-web = "3" +actix-web = "4.0.0-beta.21" serde = "1.0.106" serde_json = "1.0.51" -sqlx = { version = "0.3", features = ["sqlite"] } +sqlx = { version = "0.5.9", features = ["sqlite", "runtime-actix-rustls"] } dotenv = "0.15.0" -env_logger = "0.7.1" +env_logger = "0.9.0" log = "0.4.8" anyhow = "1.0.28" futures = "0.3.13" diff --git a/database_interactions/sqlx_todo/README.md b/database_interactions/sqlx_todo/README.md index 3b8d21e..3d0aaec 100644 --- a/database_interactions/sqlx_todo/README.md +++ b/database_interactions/sqlx_todo/README.md @@ -19,7 +19,12 @@ $ cd database_interactions/sqlx_todo ## Set up the database -* Create new database using `schema.sql` +* Create new database: + +```bash +./setup_db.sh +``` + * Copy `.env.example` into `.env` and adjust `DATABASE_URL` to match your SQLite address, if needed ```sh @@ -35,4 +40,4 @@ To run the application execute: cargo run ``` -By default application will be available on `http://localhost:8080`. If you wish to change address or port you can do it inside the `.env` file +By default the application will be available on `http://localhost:8080`. If you wish to change address or port you can do it inside the `.env` file diff --git a/database_interactions/sqlx_todo/setup_db.sh b/database_interactions/sqlx_todo/setup_db.sh new file mode 100755 index 0000000..22b5aa1 --- /dev/null +++ b/database_interactions/sqlx_todo/setup_db.sh @@ -0,0 +1,2 @@ +#!/usr/bin/env bash +sqlite3 test.db < schema.sql diff --git a/database_interactions/sqlx_todo/src/main.rs b/database_interactions/sqlx_todo/src/main.rs index 1c3d6d5..04a62a4 100644 --- a/database_interactions/sqlx_todo/src/main.rs +++ b/database_interactions/sqlx_todo/src/main.rs @@ -40,7 +40,7 @@ async fn main() -> Result<()> { .expect("PORT should be a u16"); info!("using sqlite database at: {}", &database_url); - let db_pool = SqlitePool::new(&database_url).await?; + let db_pool = SqlitePool::connect(&database_url).await?; // startup connection+schema check sqlx::query!("SELECT * FROM todos") @@ -51,7 +51,7 @@ async fn main() -> Result<()> { let server = HttpServer::new(move || { App::new() // pass database pool to application so we can access it inside handlers - .data(db_pool.clone()) + .app_data(web::Data::new(db_pool.clone())) .wrap(middleware::Logger::default()) .route("/", web::get().to(index)) .configure(todo::init) // init todo routes diff --git a/database_interactions/sqlx_todo/src/todo/model.rs b/database_interactions/sqlx_todo/src/todo/model.rs index a0796b2..4e90e79 100644 --- a/database_interactions/sqlx_todo/src/todo/model.rs +++ b/database_interactions/sqlx_todo/src/todo/model.rs @@ -1,4 +1,4 @@ -use actix_web::{Error, HttpRequest, HttpResponse, Responder}; +use actix_web::{body::BoxBody, HttpRequest, HttpResponse, Responder}; use anyhow::Result; use serde::{Deserialize, Serialize}; use sqlx::sqlite::SqliteRow; @@ -14,17 +14,16 @@ pub struct TodoRequest { // this struct will be used to represent database record #[derive(Serialize, FromRow)] pub struct Todo { - pub id: i32, + pub id: i64, pub description: String, pub done: bool, } // implementation of Actix Responder for Todo struct so we can return Todo from action handler impl Responder for Todo { - type Error = Error; - type Future = HttpResponse; + type Body = BoxBody; - fn respond_to(self, _req: &HttpRequest) -> Self::Future { + fn respond_to(self, _req: &HttpRequest) -> HttpResponse { // create response and set content type HttpResponse::Ok().json(&self) } @@ -130,7 +129,8 @@ impl Todo { id, ) .execute(&mut tx) - .await?; + .await? + .rows_affected(); if n == 0 { return Ok(None); @@ -168,7 +168,8 @@ impl Todo { id, ) .execute(&mut tx) - .await?; + .await? + .rows_affected(); tx.commit().await?; Ok(n_deleted)