+12
.sqlx/query-214eb02cdf9fbf46e9344f4d7dbcfdaf6b7bd0ef74f632d007b0f8eb797c97ca.json
+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
+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
+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
+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
+1
-1
Cargo.toml
+19
Dockerfile
+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
+2
sqlx.sh
+31
src/config.rs
+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
+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
+11
-2
src/main.rs