From 0942faec900b58e59308903e24f1e25a38c5c55d Mon Sep 17 00:00:00 2001 From: Vivianne Langdon Date: Sun, 11 Jun 2023 19:15:52 -0700 Subject: [PATCH] Adding in diesel with basic tutorial for library in db --- .gitignore | 2 + Cargo.lock | 91 +++++++++++++++++++ Cargo.toml | 5 +- diesel.toml | 9 ++ migrations/.keep | 0 .../down.sql | 1 + .../2023-06-12-012955_create_libraries/up.sql | 4 + src/bin/create_library.rs | 18 ++++ src/bin/show_libraries.rs | 19 ++++ src/lib.rs | 28 ++++++ src/models.rs | 16 ++++ src/schema.rs | 8 ++ 12 files changed, 200 insertions(+), 1 deletion(-) create mode 100644 diesel.toml create mode 100644 migrations/.keep create mode 100644 migrations/2023-06-12-012955_create_libraries/down.sql create mode 100644 migrations/2023-06-12-012955_create_libraries/up.sql create mode 100644 src/bin/create_library.rs create mode 100644 src/bin/show_libraries.rs create mode 100644 src/lib.rs create mode 100644 src/models.rs create mode 100644 src/schema.rs diff --git a/.gitignore b/.gitignore index ea8c4bf..0996431 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,3 @@ /target +db.sqlite +.env \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock index f42bd32..3d6dd1d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -74,6 +74,12 @@ dependencies = [ "system-deps", ] +[[package]] +name = "cc" +version = "1.0.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" + [[package]] name = "cfg-expr" version = "0.15.2" @@ -99,6 +105,44 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "diesel" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7a532c1f99a0f596f6960a60d1e119e91582b24b39e2d83a190e61262c3ef0c" +dependencies = [ + "diesel_derives", + "libsqlite3-sys", + "time", +] + +[[package]] +name = "diesel_derives" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74398b79d81e52e130d991afeed9c86034bb1b7735f46d2f5bf7deb261d80303" +dependencies = [ + "diesel_table_macro_syntax", + "proc-macro2", + "quote", + "syn 2.0.18", +] + +[[package]] +name = "diesel_table_macro_syntax" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc5557efc453706fed5e4fa85006fe9817c224c3f480a34c7e5959fd700921c5" +dependencies = [ + "syn 2.0.18", +] + +[[package]] +name = "dotenvy" +version = "0.15.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" + [[package]] name = "field-offset" version = "0.3.6" @@ -612,6 +656,17 @@ version = "0.2.146" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f92be4933c13fd498862a9e02a3055f8a8d9c039ce33db97306fd5a6caa7f29b" +[[package]] +name = "libsqlite3-sys" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "afc22eff61b133b115c6e8c74e818c628d6d5e7a502afea6f64dee076dd94326" +dependencies = [ + "cc", + "pkg-config", + "vcpkg", +] + [[package]] name = "lock_api" version = "0.4.10" @@ -896,7 +951,10 @@ dependencies = [ name = "sample-amp" version = "0.1.0" dependencies = [ + "diesel", + "dotenvy", "gtk4", + "libsqlite3-sys", "relm4", "relm4-components", "relm4-icons", @@ -1045,6 +1103,33 @@ dependencies = [ "syn 2.0.18", ] +[[package]] +name = "time" +version = "0.3.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea9e1b3cf1243ae005d9e74085d4d542f3125458f3a81af210d901dcd7411efd" +dependencies = [ + "itoa", + "serde", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7300fbefb4dadc1af235a9cef3737cea692a9d97e1b9cbcd4ebdae6f8868e6fb" + +[[package]] +name = "time-macros" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "372950940a5f07bf38dbe211d7283c9e6d7327df53794992d293e534c733d09b" +dependencies = [ + "time-core", +] + [[package]] name = "tokio" version = "1.28.2" @@ -1149,6 +1234,12 @@ version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b15811caf2415fb889178633e7724bad2509101cde276048e013b9def5e51fa0" +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + [[package]] name = "version-compare" version = "0.1.1" diff --git a/Cargo.toml b/Cargo.toml index cc1fd8b..a0fd6f2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,4 +9,7 @@ edition = "2021" gtk = { version = "0.6.6", package = "gtk4" } relm4 = { version = "0.6.0", features = ["libadwaita"] } relm4-components = "0.6.0" -relm4-icons = { version = "0.6.0", features = ["plus", "minus"] } \ No newline at end of file +relm4-icons = { version = "0.6.0", features = ["plus", "minus"] } +diesel = { version = "2.1.0", features = ["sqlite", "returning_clauses_for_sqlite_3_35"] } +libsqlite3-sys = { version = "0.26.0", features = ["bundled"] } +dotenvy = "0.15" \ No newline at end of file diff --git a/diesel.toml b/diesel.toml new file mode 100644 index 0000000..c028f4a --- /dev/null +++ b/diesel.toml @@ -0,0 +1,9 @@ +# For documentation on how to configure this file, +# see https://diesel.rs/guides/configuring-diesel-cli + +[print_schema] +file = "src/schema.rs" +custom_type_derives = ["diesel::query_builder::QueryId"] + +[migrations_directory] +dir = "migrations" diff --git a/migrations/.keep b/migrations/.keep new file mode 100644 index 0000000..e69de29 diff --git a/migrations/2023-06-12-012955_create_libraries/down.sql b/migrations/2023-06-12-012955_create_libraries/down.sql new file mode 100644 index 0000000..7824af0 --- /dev/null +++ b/migrations/2023-06-12-012955_create_libraries/down.sql @@ -0,0 +1 @@ +DROP TABLE libraries diff --git a/migrations/2023-06-12-012955_create_libraries/up.sql b/migrations/2023-06-12-012955_create_libraries/up.sql new file mode 100644 index 0000000..b7d0a1c --- /dev/null +++ b/migrations/2023-06-12-012955_create_libraries/up.sql @@ -0,0 +1,4 @@ +CREATE TABLE libraries ( + id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, + name VARCHAR NOT NULL +) diff --git a/src/bin/create_library.rs b/src/bin/create_library.rs new file mode 100644 index 0000000..75acbb1 --- /dev/null +++ b/src/bin/create_library.rs @@ -0,0 +1,18 @@ +use sample_amp::*; +use std::io::{stdin, stdout, Write}; + +fn main() { + let connection = &mut establish_connection(); + + let mut name = String::new(); + + print!("Enter a name for the collection > "); + stdout().flush().unwrap(); + + stdin().read_line(&mut name).unwrap(); + + let name = name.trim_end(); + + let library = create_library(connection, name); + println!("Saved new library: {}, id {}", name, library.id) +} diff --git a/src/bin/show_libraries.rs b/src/bin/show_libraries.rs new file mode 100644 index 0000000..9ccae43 --- /dev/null +++ b/src/bin/show_libraries.rs @@ -0,0 +1,19 @@ +use self::models::*; +use diesel::prelude::*; +use sample_amp::*; + +fn main() { + use self::schema::libraries::dsl::*; + + let connection = &mut establish_connection(); + let results = libraries + .limit(5) + .select(Library::as_select()) + .load(connection) + .expect("Error loading libraries"); + + println!("Displaying {} libraries", results.len()); + for lib in results { + println!("{}", lib.name) + } +} diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 0000000..8684493 --- /dev/null +++ b/src/lib.rs @@ -0,0 +1,28 @@ +use diesel::prelude::*; +use dotenvy::dotenv; +use std::env; + +use crate::models::{NewLibrary, Library}; + +pub mod models; +pub mod schema; + +pub fn establish_connection() -> SqliteConnection { + dotenv().ok(); + + let database_url = env::var("DATABASE_URL").expect("DATABASE_URL must be set"); + SqliteConnection::establish(&database_url) + .unwrap_or_else(|_| panic!("Error connecting to {}", database_url)) +} + +pub fn create_library(conn: &mut SqliteConnection, name: &str) -> Library { + use crate::schema::libraries; + + let new_library = NewLibrary { name }; + + diesel::insert_into(libraries::table) + .values(&new_library) + .returning(Library::as_returning()) + .get_result(conn) + .expect("Error saving new post") +} diff --git a/src/models.rs b/src/models.rs new file mode 100644 index 0000000..ec1d6a5 --- /dev/null +++ b/src/models.rs @@ -0,0 +1,16 @@ +use diesel::prelude::*; +use super::schema::libraries; + +#[derive(Queryable, Selectable)] +#[diesel(table_name = libraries)] +#[diesel(check_for_backend(diesel::sqlite::Sqlite))] +pub struct Library { + pub id: i32, + pub name: String, +} + +#[derive(Insertable)] +#[diesel(table_name = libraries)] +pub struct NewLibrary<'a> { + pub name: &'a str, +} diff --git a/src/schema.rs b/src/schema.rs new file mode 100644 index 0000000..b9c4e5f --- /dev/null +++ b/src/schema.rs @@ -0,0 +1,8 @@ +// @generated automatically by Diesel CLI. + +diesel::table! { + libraries (id) { + id -> Integer, + name -> Text, + } +}