this repo has no description

initialise indexer database

we use `cargo sqlx prepare` with offline mode as the database can be offline when docker starts, which leads to builds failing

vielle.dev 6a56d7b9 3b8d55c0

verified
+12
.sqlx/query-214eb02cdf9fbf46e9344f4d7dbcfdaf6b7bd0ef74f632d007b0f8eb797c97ca.json
··· 1 + { 2 + "db_name": "PostgreSQL", 3 + "query": "CREATE TABLE IF NOT EXISTS foreign_records (\n did TEXT,\n collection TEXT,\n rkey TEXT,\n record JSON NOT NULL,\n PRIMARY KEY (did, collection, rkey)\n );", 4 + "describe": { 5 + "columns": [], 6 + "parameters": { 7 + "Left": [] 8 + }, 9 + "nullable": [] 10 + }, 11 + "hash": "214eb02cdf9fbf46e9344f4d7dbcfdaf6b7bd0ef74f632d007b0f8eb797c97ca" 12 + }
+12
.sqlx/query-2663586971e5e67cd7f5452f64e9d74b28d8ff2619da9a5000b05f6106194d6b.json
··· 1 + { 2 + "db_name": "PostgreSQL", 3 + "query": "CREATE TABLE IF NOT EXISTS blobs (\n did TEXT,\n cid TEXT,\n blob bytea NOT NULL,\n PRIMARY KEY (did, cid)\n )", 4 + "describe": { 5 + "columns": [], 6 + "parameters": { 7 + "Left": [] 8 + }, 9 + "nullable": [] 10 + }, 11 + "hash": "2663586971e5e67cd7f5452f64e9d74b28d8ff2619da9a5000b05f6106194d6b" 12 + }
+12
.sqlx/query-94ea3e0cdd96672b408e4a445c2c38cb2911efff5432ae454210d23b70ee0ae2.json
··· 1 + { 2 + "db_name": "PostgreSQL", 3 + "query": "CREATE TABLE IF NOT EXISTS records (\n collection TEXT,\n rkey TEXT,\n record JSON NOT NULL,\n PRIMARY KEY (collection, rkey)\n );", 4 + "describe": { 5 + "columns": [], 6 + "parameters": { 7 + "Left": [] 8 + }, 9 + "nullable": [] 10 + }, 11 + "hash": "94ea3e0cdd96672b408e4a445c2c38cb2911efff5432ae454210d23b70ee0ae2" 12 + }
+14
Cargo.lock
··· 3335 3335 "sha2", 3336 3336 "smallvec", 3337 3337 "thiserror 2.0.17", 3338 + "tokio", 3339 + "tokio-stream", 3338 3340 "tracing", 3339 3341 "url", 3340 3342 ] ··· 3373 3375 "sqlx-postgres", 3374 3376 "sqlx-sqlite", 3375 3377 "syn 2.0.109", 3378 + "tokio", 3376 3379 "url", 3377 3380 ] 3378 3381 ··· 3804 3807 checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" 3805 3808 dependencies = [ 3806 3809 "rustls", 3810 + "tokio", 3811 + ] 3812 + 3813 + [[package]] 3814 + name = "tokio-stream" 3815 + version = "0.1.17" 3816 + source = "registry+https://github.com/rust-lang/crates.io-index" 3817 + checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" 3818 + dependencies = [ 3819 + "futures-core", 3820 + "pin-project-lite", 3807 3821 "tokio", 3808 3822 ] 3809 3823
+1 -1
Cargo.toml
··· 5 5 6 6 [dependencies] 7 7 jacquard = "0.9.0" 8 - sqlx = "0.8.6" 8 + sqlx = { version = "0.8.6", features = ["runtime-tokio", "postgres"] } 9 9 tokio = "1.48.0"
+19
Dockerfile
··· 1 + FROM rust 2 + WORKDIR /app 3 + 4 + # copying just cargo config and making a stub main 5 + # this means docker can cache building deps 6 + # and just build the main program in watch mode 7 + # much quicker and nicer on my cpu, network, and ram lol 8 + COPY ./Cargo.toml ./Cargo.toml 9 + COPY ./Cargo.lock ./Cargo.lock 10 + RUN mkdir ./src && echo 'fn main() { println!("Using cache build!!"); loop { println!("DOCKERFILE failed..."); } }' > ./src/main.rs 11 + RUN cargo build --locked 12 + RUN rm -f ./target/debug/index 13 + 14 + COPY ./src ./src 15 + COPY ./.sqlx ./.sqlx 16 + RUN cargo build --locked 17 + 18 + RUN cp ./target/debug/index ./index 19 + CMD ["/app/index"]
+2
sqlx.sh
··· 1 + docker compose up db -d 2 + DATABASE_URL=postgres://user:password@localhost:5432/user cargo sqlx prepare
+31
src/config.rs
··· 1 + use jacquard::types::string::Did; 2 + use std::env; 3 + use std::sync::LazyLock; 4 + 5 + // this should be loaded before the program starts any threads 6 + // if this panics threads that access it will be poisoned 7 + pub static USER: LazyLock<Did<'static>> = LazyLock::new(|| { 8 + let Ok(env) = env::var("INDEX_USER") else { 9 + panic!("INDEX_USER not set"); 10 + }; 11 + 12 + let Ok(did) = Did::new_owned(env) else { 13 + panic!("INDEX_USER was not a valid did") 14 + }; 15 + 16 + did 17 + }); 18 + 19 + pub static POSTGRES_URL: LazyLock<String> = LazyLock::new(|| { 20 + let Ok(user) = env::var("POSTGRES_USER") else { 21 + panic!("POSTGRES_USER was not set. Cannot connect to database") 22 + }; 23 + let Ok(password) = env::var("POSTGRES_PASSWORD") else { 24 + panic!("POSTGRES_PASSWORD was not set. Cannot connect to database") 25 + }; 26 + let Ok(host) = env::var("POSTGRES_HOST") else { 27 + panic!("POSTGRES_HOST was not set. Cannot connect to database") 28 + }; 29 + 30 + format!("postgres://{}:{}@{}/{}", user, password, host, user) 31 + });
+63
src/db.rs
··· 1 + use crate::config; 2 + use sqlx::{Pool, Postgres, postgres::PgPool, query}; 3 + 4 + pub async fn init() -> Pool<Postgres> { 5 + let conn = PgPool::connect(&config::POSTGRES_URL).await; 6 + let conn = match conn { 7 + Ok(val) => val, 8 + Err(err) => { 9 + println!("Could not connect to the database. Got error {err}"); 10 + panic!() 11 + } 12 + }; 13 + println!("Connected to db with pool: {:?}", conn); 14 + 15 + // initialise db tables 16 + if let Err(err) = query!( 17 + "CREATE TABLE IF NOT EXISTS records ( 18 + collection TEXT, 19 + rkey TEXT, 20 + record JSON NOT NULL, 21 + PRIMARY KEY (collection, rkey) 22 + );" 23 + ) 24 + .execute(&conn) 25 + .await 26 + { 27 + println!("Creating table `records`: \n{err}"); 28 + panic!("Could not instantiate db"); 29 + }; 30 + 31 + if let Err(err) = query!( 32 + "CREATE TABLE IF NOT EXISTS foreign_records ( 33 + did TEXT, 34 + collection TEXT, 35 + rkey TEXT, 36 + record JSON NOT NULL, 37 + PRIMARY KEY (did, collection, rkey) 38 + );" 39 + ) 40 + .execute(&conn) 41 + .await 42 + { 43 + println!("Creating table `foreign_records`: \n{err}"); 44 + panic!(); 45 + }; 46 + 47 + if let Err(err) = query!( 48 + "CREATE TABLE IF NOT EXISTS blobs ( 49 + did TEXT, 50 + cid TEXT, 51 + blob bytea NOT NULL, 52 + PRIMARY KEY (did, cid) 53 + )" 54 + ) 55 + .execute(&conn) 56 + .await 57 + { 58 + println!("Creating table `blobs`: \n{err}"); 59 + panic!(); 60 + }; 61 + 62 + return conn; 63 + }
+11 -2
src/main.rs
··· 1 - fn main() { 2 - println!("Hello, world!"); 1 + mod config; 2 + mod db; 3 + 4 + #[tokio::main] 5 + async fn main() { 6 + println!("Indexing {}", *config::USER); 7 + let conn = db::init().await; 8 + println!("Database established"); 9 + 10 + // to stop docker whinging 11 + loop {} 3 12 }