···1+use deadpool_postgres::{Manager, Pool};
2use dropshot::{ApiDescription, ConfigLogging, ConfigLoggingLevel};
3+use eyre::Context;
4use slog::Logger;
5+use std::env::var;
6+use std::str::FromStr;
7+use tokio_postgres::{Config, NoTls};
89pub mod import;
10mod types;
11mod utils;
1213#[derive(Clone)]
14+pub struct ApiContext {
15+ pub pool: Pool,
16+}
1718pub fn create_logger() -> eyre::Result<Logger> {
19 let log = ConfigLogging::StderrTerminal { level: ConfigLoggingLevel::Info }
···28 // TODO: api endpoints
2930 Ok(api)
31+}
32+33+pub async fn connect_db() -> eyre::Result<Pool> {
34+ let db_uri = var("PLC_DB_URI").wrap_err("PLC_DB_URI missing")?;
35+36+ let cfg = Config::from_str(&db_uri)?;
37+ let mgr = Manager::from_config(cfg, NoTls, Default::default());
38+ let pool = Pool::builder(mgr).build()?;
39+40+ // run the init script
41+ let init_conn = pool.get().await?;
42+ init_conn.simple_query(include_str!("sql/init.sql")).await?;
43+44+ Ok(pool)
45+}
+4-2
src/main.rs
···12 let _scope = slog_scope::set_global_logger(log.clone());
13 slog_stdlog::init()?;
1415- tokio::spawn(plc_mirror::import::importer(log.clone()));
001617 let bind_address = var("PLC_BIND_ADDR")
18 .unwrap_or(DEFAULT_BIND.to_string())
19 .parse()?;
2021- let context = plc_mirror::ApiContext {};
2223 let server = ServerBuilder::new(api, context, log)
24 .config(ConfigDropshot {
···12 let _scope = slog_scope::set_global_logger(log.clone());
13 slog_stdlog::init()?;
1415+ let pool = plc_mirror::connect_db().await?;
16+17+ tokio::spawn(plc_mirror::import::importer(log.clone(), pool.clone()));
1819 let bind_address = var("PLC_BIND_ADDR")
20 .unwrap_or(DEFAULT_BIND.to_string())
21 .parse()?;
2223+ let context = plc_mirror::ApiContext { pool };
2425 let server = ServerBuilder::new(api, context, log)
26 .config(ConfigDropshot {
+19
src/sql/init.sql
···0000000000000000000
···1+create table if not exists dids
2+(
3+ did text primary key
4+);
5+6+create table if not exists operations
7+(
8+ did text not null references dids (did),
9+ hash text not null,
10+ prev text,
11+ sig text not null,
12+ nullified bool not null default false,
13+14+ operation jsonb not null,
15+16+ created_at timestamptz not null default now(),
17+18+ primary key (did, hash)
19+);