From f2c50b6a89e81b06ee1f8065b89f576bc0715562 Mon Sep 17 00:00:00 2001 From: Mia Date: Sun, 26 Jan 2025 17:14:03 +0000 Subject: [PATCH] diesel init --- .gitignore | 2 + Cargo.lock | 402 ++++++++++++++++++ Cargo.toml | 1 + consumer/Cargo.toml | 4 + consumer/src/config.rs | 5 +- consumer/src/indexer/mod.rs | 18 +- consumer/src/main.rs | 8 +- diesel.toml | 9 + migrations/.keep | 0 .../down.sql | 6 + .../up.sql | 36 ++ parakeet-db/Cargo.toml | 9 + parakeet-db/src/lib.rs | 2 + parakeet-db/src/models.rs | 0 parakeet-db/src/schema.rs | 2 + parakeet/Cargo.toml | 3 + parakeet/src/config.rs | 3 +- parakeet/src/main.rs | 9 +- 18 files changed, 507 insertions(+), 12 deletions(-) create mode 100644 diesel.toml create mode 100644 migrations/.keep create mode 100644 migrations/00000000000000_diesel_initial_setup/down.sql create mode 100644 migrations/00000000000000_diesel_initial_setup/up.sql create mode 100644 parakeet-db/Cargo.toml create mode 100644 parakeet-db/src/lib.rs create mode 100644 parakeet-db/src/models.rs create mode 100644 parakeet-db/src/schema.rs diff --git a/.gitignore b/.gitignore index 282a1e10..dbf67885 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ target/ .DS_Store .idea/ +.env +Config.toml diff --git a/Cargo.lock b/Cargo.lock index 1e957851..d18e0a1f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -82,6 +82,17 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "async-trait" +version = "0.1.85" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f934833b4b7233644e5848f235df3f57ed8c80f1528a26c3dfa13d2147fa056" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "atomic" version = "0.6.0" @@ -118,6 +129,12 @@ version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4cbbc9d0964165b47557570cce6c952866c2678457aca742aafc9fb771d30270" +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + [[package]] name = "bitflags" version = "2.8.0" @@ -289,13 +306,17 @@ version = "0.1.0" dependencies = [ "chrono", "ciborium", + "diesel", + "diesel-async", "eyre", "figment", "futures", "ipld-core", + "parakeet-db", "serde", "serde_bytes", "serde_ipld_dagcbor", + "serde_json", "tokio", "tokio-tungstenite", "tracing", @@ -352,6 +373,41 @@ dependencies = [ "typenum", ] +[[package]] +name = "darling" +version = "0.20.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.20.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn", +] + +[[package]] +name = "darling_macro" +version = "0.20.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" +dependencies = [ + "darling_core", + "quote", + "syn", +] + [[package]] name = "data-encoding" version = "2.7.0" @@ -378,6 +434,74 @@ dependencies = [ "syn", ] +[[package]] +name = "deadpool" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6541a3916932fe57768d4be0b1ffb5ec7cbf74ca8c903fdfd5c0fe8aa958f0ed" +dependencies = [ + "deadpool-runtime", + "num_cpus", + "tokio", +] + +[[package]] +name = "deadpool-runtime" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "092966b41edc516079bdf31ec78a2e0588d1d0c08f78b91d8307215928642b2b" + +[[package]] +name = "diesel" +version = "2.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf1bedf64cdb9643204a36dd15b19a6ce8e7aa7f7b105868e9f1fad5ffa7d12" +dependencies = [ + "bitflags", + "byteorder", + "chrono", + "diesel_derives", + "itoa", + "serde_json", +] + +[[package]] +name = "diesel-async" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51a307ac00f7c23f526a04a77761a0519b9f0eb2838ebf5b905a58580095bdcb" +dependencies = [ + "async-trait", + "deadpool", + "diesel", + "futures-util", + "scoped-futures", + "tokio", + "tokio-postgres", +] + +[[package]] +name = "diesel_derives" +version = "2.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7f2c3de51e2ba6bf2a648285696137aaf0f5f487bcbea93972fe8a364e131a4" +dependencies = [ + "diesel_table_macro_syntax", + "dsl_auto_type", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "diesel_table_macro_syntax" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "209c735641a413bc68c4923a9d6ad4bcb3ca306b794edaa7eb0b3228a99ffb25" +dependencies = [ + "syn", +] + [[package]] name = "digest" version = "0.10.7" @@ -386,8 +510,29 @@ checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer", "crypto-common", + "subtle", ] +[[package]] +name = "dsl_auto_type" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5d9abe6314103864cc2d8901b7ae224e0ab1a103a0a416661b4097b0779b607" +dependencies = [ + "darling", + "either", + "heck", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "either" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" + [[package]] name = "equivalent" version = "1.0.1" @@ -414,6 +559,12 @@ dependencies = [ "once_cell", ] +[[package]] +name = "fallible-iterator" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" + [[package]] name = "fastrand" version = "2.3.0" @@ -593,6 +744,21 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" +[[package]] +name = "hermit-abi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest", +] + [[package]] name = "http" version = "1.2.0" @@ -633,6 +799,12 @@ dependencies = [ "cc", ] +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + [[package]] name = "indenter" version = "0.3.3" @@ -722,6 +894,16 @@ version = "0.4.25" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "04cbf5b083de1c7e0222a7a51dbfdba1cbe1c6ab0b15e29fff3f6c077fd9cd9f" +[[package]] +name = "md-5" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" +dependencies = [ + "cfg-if", + "digest", +] + [[package]] name = "memchr" version = "2.7.4" @@ -806,6 +988,16 @@ dependencies = [ "autocfg", ] +[[package]] +name = "num_cpus" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" +dependencies = [ + "hermit-abi", + "libc", +] + [[package]] name = "object" version = "0.36.7" @@ -875,14 +1067,26 @@ checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" name = "parakeet" version = "0.1.0" dependencies = [ + "diesel", + "diesel-async", "eyre", "figment", + "parakeet-db", "serde", "tokio", "tracing", "tracing-subscriber", ] +[[package]] +name = "parakeet-db" +version = "0.1.0" +dependencies = [ + "chrono", + "diesel", + "serde_json", +] + [[package]] name = "parakeet-lexgen" version = "0.1.0" @@ -941,6 +1145,30 @@ dependencies = [ "syn", ] +[[package]] +name = "percent-encoding" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" + +[[package]] +name = "phf" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" +dependencies = [ + "phf_shared", +] + +[[package]] +name = "phf_shared" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" +dependencies = [ + "siphasher", +] + [[package]] name = "pin-project-lite" version = "0.2.16" @@ -959,6 +1187,35 @@ version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" +[[package]] +name = "postgres-protocol" +version = "0.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "acda0ebdebc28befa84bee35e651e4c5f09073d668c7aed4cf7e23c3cda84b23" +dependencies = [ + "base64", + "byteorder", + "bytes", + "fallible-iterator", + "hmac", + "md-5", + "memchr", + "rand", + "sha2", + "stringprep", +] + +[[package]] +name = "postgres-types" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f66ea23a2d0e5734297357705193335e0a957696f34bed2f2faefacb2fec336f" +dependencies = [ + "bytes", + "fallible-iterator", + "postgres-protocol", +] + [[package]] name = "ppv-lite86" version = "0.2.20" @@ -1087,6 +1344,15 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "scoped-futures" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b24aae2d0636530f359e9d5ef0c04669d11c5e756699b27a6a6d845d8329091" +dependencies = [ + "pin-project-lite", +] + [[package]] name = "scopeguard" version = "1.2.0" @@ -1189,6 +1455,17 @@ dependencies = [ "digest", ] +[[package]] +name = "sha2" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + [[package]] name = "sharded-slab" version = "0.1.7" @@ -1213,6 +1490,12 @@ dependencies = [ "libc", ] +[[package]] +name = "siphasher" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" + [[package]] name = "slab" version = "0.4.9" @@ -1238,12 +1521,29 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "stringprep" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b4df3d392d81bd458a8a621b8bffbd2302a12ffe288a9d931670948749463b1" +dependencies = [ + "unicode-bidi", + "unicode-normalization", + "unicode-properties", +] + [[package]] name = "strsim" version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + [[package]] name = "syn" version = "2.0.96" @@ -1299,6 +1599,21 @@ dependencies = [ "once_cell", ] +[[package]] +name = "tinyvec" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "022db8904dfa342efe721985167e9fcd16c29b226db4397ed752a761cfce81e8" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + [[package]] name = "tokio" version = "1.43.0" @@ -1338,6 +1653,32 @@ dependencies = [ "tokio", ] +[[package]] +name = "tokio-postgres" +version = "0.7.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b5d3742945bc7d7f210693b0c58ae542c6fd47b17adbbda0885f3dcb34a6bdb" +dependencies = [ + "async-trait", + "byteorder", + "bytes", + "fallible-iterator", + "futures-channel", + "futures-util", + "log", + "parking_lot", + "percent-encoding", + "phf", + "pin-project-lite", + "postgres-protocol", + "postgres-types", + "rand", + "socket2", + "tokio", + "tokio-util", + "whoami", +] + [[package]] name = "tokio-tungstenite" version = "0.26.1" @@ -1352,6 +1693,19 @@ dependencies = [ "tungstenite", ] +[[package]] +name = "tokio-util" +version = "0.7.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7fcaa8d55a2bdd6b83ace262b016eca0d79ee02818c5c1bcdf0305114081078" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", +] + [[package]] name = "toml" version = "0.8.19" @@ -1477,12 +1831,33 @@ dependencies = [ "version_check", ] +[[package]] +name = "unicode-bidi" +version = "0.3.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" + [[package]] name = "unicode-ident" version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" +[[package]] +name = "unicode-normalization" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "unicode-properties" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e70f2a8b45122e719eb623c01822704c4e0907e7e426a05927e1a1cfff5b75d0" + [[package]] name = "unsigned-varint" version = "0.8.0" @@ -1535,6 +1910,12 @@ version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +[[package]] +name = "wasite" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" + [[package]] name = "wasm-bindgen" version = "0.2.100" @@ -1593,6 +1974,27 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "web-sys" +version = "0.3.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "whoami" +version = "1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "372d5b87f58ec45c384ba03563b03544dc5fadc3983e434b286913f5b4a9bb6d" +dependencies = [ + "redox_syscall", + "wasite", + "web-sys", +] + [[package]] name = "winapi" version = "0.3.9" diff --git a/Cargo.toml b/Cargo.toml index cb682376..82c1e94c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,5 +4,6 @@ resolver = "2" members = [ "consumer", "parakeet", + "parakeet-db", "parakeet-lexgen" ] diff --git a/consumer/Cargo.toml b/consumer/Cargo.toml index 55480ec0..2a83b2a3 100644 --- a/consumer/Cargo.toml +++ b/consumer/Cargo.toml @@ -6,13 +6,17 @@ edition = "2021" [dependencies] chrono = { version = "0.4.39", features = ["serde"] } ciborium = "0.2.2" +diesel = { version = "2.2.6", features = ["chrono", "serde_json"] } +diesel-async = { version = "0.5.2", features = ["deadpool", "postgres"] } eyre = "0.6.12" figment = { version = "0.10.19", features = ["env", "toml"] } futures = "0.3.31" ipld-core = "0.4.1" +parakeet-db = { path = "../parakeet-db" } serde = { version = "1.0.217", features = ["derive"] } serde_bytes = "0.11" serde_ipld_dagcbor = "0.6.1" +serde_json = "1.0.134" tokio = { version = "1.42.0", features = ["full"] } tokio-tungstenite = { version = "0.26.1", features = ["native-tls"] } tracing = "0.1.40" diff --git a/consumer/src/config.rs b/consumer/src/config.rs index 90da7955..d4ffcf31 100644 --- a/consumer/src/config.rs +++ b/consumer/src/config.rs @@ -1,5 +1,5 @@ -use figment::Figment; use figment::providers::{Env, Format, Toml}; +use figment::Figment; use serde::Deserialize; pub(crate) fn load_config() -> eyre::Result { @@ -14,4 +14,5 @@ pub(crate) fn load_config() -> eyre::Result { #[derive(Debug, Deserialize)] pub struct Config { pub relay_source: String, -} \ No newline at end of file + pub database_url: String, +} diff --git a/consumer/src/indexer/mod.rs b/consumer/src/indexer/mod.rs index 182e3610..764ae824 100644 --- a/consumer/src/indexer/mod.rs +++ b/consumer/src/indexer/mod.rs @@ -1,12 +1,16 @@ +use diesel_async::AsyncPgConnection; +use diesel_async::pooled_connection::deadpool::Pool; use crate::firehose::{AtpAccountEvent, AtpCommitEvent, AtpIdentityEvent, FirehoseEvent}; use tokio::sync::mpsc::Receiver; -pub async fn relay_indexer(mut rx: Receiver) -> eyre::Result<()> { +pub async fn relay_indexer(pool: Pool, mut rx: Receiver) -> eyre::Result<()> { + let mut conn = pool.get().await?; + while let Some(event) = rx.recv().await { let res = match event { - FirehoseEvent::Identity(identity) => index_identity(identity).await, - FirehoseEvent::Account(account) => index_account(account).await, - FirehoseEvent::Commit(commit) => index_commit(commit).await, + FirehoseEvent::Identity(identity) => index_identity(&mut conn, identity).await, + FirehoseEvent::Account(account) => index_account(&mut conn, account).await, + FirehoseEvent::Commit(commit) => index_commit(&mut conn, commit).await, FirehoseEvent::Label(_) => { // We handle all labels through direct connections to labelers tracing::warn!("got #labels from the relay"); @@ -22,14 +26,14 @@ pub async fn relay_indexer(mut rx: Receiver) -> eyre::Result<()> Ok(()) } -async fn index_identity(identity: AtpIdentityEvent) -> eyre::Result<()> { +async fn index_identity(conn: &mut AsyncPgConnection, identity: AtpIdentityEvent) -> eyre::Result<()> { Ok(()) } -async fn index_account(account: AtpAccountEvent) -> eyre::Result<()> { +async fn index_account(conn: &mut AsyncPgConnection, account: AtpAccountEvent) -> eyre::Result<()> { Ok(()) } -async fn index_commit(commit: AtpCommitEvent) -> eyre::Result<()> { +async fn index_commit(conn: &mut AsyncPgConnection, commit: AtpCommitEvent) -> eyre::Result<()> { Ok(()) } diff --git a/consumer/src/main.rs b/consumer/src/main.rs index 8cfc7845..6192551a 100644 --- a/consumer/src/main.rs +++ b/consumer/src/main.rs @@ -1,3 +1,6 @@ +use diesel_async::AsyncPgConnection; +use diesel_async::pooled_connection::AsyncDieselConnectionManager; +use diesel_async::pooled_connection::deadpool::Pool; use tokio::sync::mpsc::Sender; mod config; @@ -10,12 +13,15 @@ async fn main() -> eyre::Result<()> { let conf = config::load_config()?; + let db_mgr = AsyncDieselConnectionManager::::new(&conf.database_url); + let pool = Pool::builder(db_mgr).build()?; + let (tx, rx) = tokio::sync::mpsc::channel::(64); let relay_firehose = firehose::FirehoseConsumer::new_relay(&conf.relay_source, None).await?; let firehose_handle = tokio::spawn(relay_consumer(relay_firehose, tx)); - let indexer_handle = tokio::spawn(indexer::relay_indexer(rx)); + let indexer_handle = tokio::spawn(indexer::relay_indexer(pool.clone(), rx)); let (firehose_res, indexer_res) = tokio::try_join!{ firehose_handle, diff --git a/diesel.toml b/diesel.toml new file mode 100644 index 00000000..8e54f04e --- /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 = "parakeet-db/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 00000000..e69de29b diff --git a/migrations/00000000000000_diesel_initial_setup/down.sql b/migrations/00000000000000_diesel_initial_setup/down.sql new file mode 100644 index 00000000..a9f52609 --- /dev/null +++ b/migrations/00000000000000_diesel_initial_setup/down.sql @@ -0,0 +1,6 @@ +-- This file was automatically created by Diesel to setup helper functions +-- and other internal bookkeeping. This file is safe to edit, any future +-- changes will be added to existing projects as new migrations. + +DROP FUNCTION IF EXISTS diesel_manage_updated_at(_tbl regclass); +DROP FUNCTION IF EXISTS diesel_set_updated_at(); diff --git a/migrations/00000000000000_diesel_initial_setup/up.sql b/migrations/00000000000000_diesel_initial_setup/up.sql new file mode 100644 index 00000000..d68895b1 --- /dev/null +++ b/migrations/00000000000000_diesel_initial_setup/up.sql @@ -0,0 +1,36 @@ +-- This file was automatically created by Diesel to setup helper functions +-- and other internal bookkeeping. This file is safe to edit, any future +-- changes will be added to existing projects as new migrations. + + + + +-- Sets up a trigger for the given table to automatically set a column called +-- `updated_at` whenever the row is modified (unless `updated_at` was included +-- in the modified columns) +-- +-- # Example +-- +-- ```sql +-- CREATE TABLE users (id SERIAL PRIMARY KEY, updated_at TIMESTAMP NOT NULL DEFAULT NOW()); +-- +-- SELECT diesel_manage_updated_at('users'); +-- ``` +CREATE OR REPLACE FUNCTION diesel_manage_updated_at(_tbl regclass) RETURNS VOID AS $$ +BEGIN + EXECUTE format('CREATE TRIGGER set_updated_at BEFORE UPDATE ON %s + FOR EACH ROW EXECUTE PROCEDURE diesel_set_updated_at()', _tbl); +END; +$$ LANGUAGE plpgsql; + +CREATE OR REPLACE FUNCTION diesel_set_updated_at() RETURNS trigger AS $$ +BEGIN + IF ( + NEW IS DISTINCT FROM OLD AND + NEW.updated_at IS NOT DISTINCT FROM OLD.updated_at + ) THEN + NEW.updated_at := current_timestamp; + END IF; + RETURN NEW; +END; +$$ LANGUAGE plpgsql; diff --git a/parakeet-db/Cargo.toml b/parakeet-db/Cargo.toml new file mode 100644 index 00000000..6251ec3c --- /dev/null +++ b/parakeet-db/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "parakeet-db" +version = "0.1.0" +edition = "2021" + +[dependencies] +chrono = { version = "0.4.39", features = ["serde"] } +diesel = { version = "2.2.6", features = ["chrono", "serde_json"] } +serde_json = "1.0.134" \ No newline at end of file diff --git a/parakeet-db/src/lib.rs b/parakeet-db/src/lib.rs new file mode 100644 index 00000000..d5cbad7e --- /dev/null +++ b/parakeet-db/src/lib.rs @@ -0,0 +1,2 @@ +pub mod models; +pub mod schema; diff --git a/parakeet-db/src/models.rs b/parakeet-db/src/models.rs new file mode 100644 index 00000000..e69de29b diff --git a/parakeet-db/src/schema.rs b/parakeet-db/src/schema.rs new file mode 100644 index 00000000..4dc25e28 --- /dev/null +++ b/parakeet-db/src/schema.rs @@ -0,0 +1,2 @@ +// @generated automatically by Diesel CLI. + diff --git a/parakeet/Cargo.toml b/parakeet/Cargo.toml index 78359894..ceefefc9 100644 --- a/parakeet/Cargo.toml +++ b/parakeet/Cargo.toml @@ -4,8 +4,11 @@ version = "0.1.0" edition = "2021" [dependencies] +diesel = { version = "2.2.6", features = ["chrono", "serde_json"] } +diesel-async = { version = "0.5.2", features = ["deadpool", "postgres"] } eyre = "0.6.12" figment = { version = "0.10.19", features = ["env", "toml"] } +parakeet-db = { path = "../parakeet-db" } serde = { version = "1.0.217", features = ["derive"] } tokio = { version = "1.42.0", features = ["full"] } tracing = "0.1.40" diff --git a/parakeet/src/config.rs b/parakeet/src/config.rs index 25a65ce4..7867bda1 100644 --- a/parakeet/src/config.rs +++ b/parakeet/src/config.rs @@ -1,5 +1,5 @@ -use figment::Figment; use figment::providers::{Env, Format, Toml}; +use figment::Figment; use serde::Deserialize; pub(crate) fn load_config() -> eyre::Result { @@ -13,6 +13,7 @@ pub(crate) fn load_config() -> eyre::Result { #[derive(Debug, Deserialize)] pub struct Config { + pub database_url: String, #[serde(default)] pub server: ConfigServer, } diff --git a/parakeet/src/main.rs b/parakeet/src/main.rs index f833c26b..8d6b4afb 100644 --- a/parakeet/src/main.rs +++ b/parakeet/src/main.rs @@ -1,10 +1,17 @@ +use diesel_async::AsyncPgConnection; +use diesel_async::pooled_connection::AsyncDieselConnectionManager; +use diesel_async::pooled_connection::deadpool::Pool; + mod config; #[tokio::main] -async fn main() -> eyre::Result<()> { +async fn main() -> eyre::Result<()> { tracing_subscriber::fmt::init(); let conf = config::load_config()?; + let db_mgr = AsyncDieselConnectionManager::::new(&conf.database_url); + let pool = Pool::builder(db_mgr).build()?; + Ok(()) } -- 2.51.2