2023-05-14 00:15:10 -07:00
|
|
|
use std::{fs, time::Duration};
|
|
|
|
|
|
|
|
use deadpool_postgres::{
|
2023-05-17 09:11:17 -07:00
|
|
|
ManagerConfig, Pool, PoolConfig, RecyclingMethod, Runtime, SslMode, Timeouts,
|
2023-05-14 00:15:10 -07:00
|
|
|
};
|
|
|
|
use native_tls::{Certificate, Identity, TlsConnector};
|
|
|
|
use postgres_native_tls::MakeTlsConnector;
|
|
|
|
|
2023-05-17 09:11:17 -07:00
|
|
|
use crate::utils::PgConfig;
|
2023-05-14 00:15:10 -07:00
|
|
|
|
2023-05-17 09:11:17 -07:00
|
|
|
pub async fn connect_to_database() -> anyhow::Result<Pool> {
|
|
|
|
let mut pg_config = PgConfig::from_env()?;
|
2023-05-14 01:21:34 -07:00
|
|
|
|
2023-05-17 09:11:17 -07:00
|
|
|
pg_config.pg.manager = Some(ManagerConfig {
|
2023-05-14 00:15:10 -07:00
|
|
|
recycling_method: RecyclingMethod::Fast,
|
|
|
|
});
|
2023-05-17 09:11:17 -07:00
|
|
|
pg_config.pg.pool = Some(PoolConfig {
|
|
|
|
max_size: pg_config.pg_max_pool_connections,
|
2023-05-14 00:15:10 -07:00
|
|
|
timeouts: Timeouts::default(),
|
|
|
|
});
|
|
|
|
|
|
|
|
// openssl pkcs12 -export -in client.cer -inkey client-key.cer -out client.pks
|
|
|
|
// base64 -i ca.cer -o ca.cer.b64 && base64 -i client.pks -o client.pks.b64
|
2023-06-14 00:19:27 -07:00
|
|
|
// fly secrets set PG_CA_CERT=- < ./ca.cer.b64 -a APP-NAME
|
|
|
|
// fly secrets set PG_CLIENT_KEY=- < ./client.pks.b64 -a APP-NAME
|
2023-05-17 09:11:17 -07:00
|
|
|
let tls = if pg_config.pg_use_ssl {
|
|
|
|
pg_config.pg.ssl_mode = Some(SslMode::Require);
|
2023-05-19 17:16:37 -07:00
|
|
|
let ca_cert = fs::read(pg_config.pg_ca_cert_path.expect("reading ca cert from env"))
|
2023-05-17 09:11:17 -07:00
|
|
|
.expect("reading ca cert from file");
|
|
|
|
let client_key = fs::read(
|
2023-05-19 17:16:37 -07:00
|
|
|
pg_config
|
2023-05-17 09:11:17 -07:00
|
|
|
.pg_client_key_path
|
|
|
|
.expect("reading client key from env"),
|
|
|
|
)
|
|
|
|
.expect("reading client key from file");
|
2023-05-14 00:15:10 -07:00
|
|
|
MakeTlsConnector::new(
|
|
|
|
TlsConnector::builder()
|
|
|
|
.add_root_certificate(Certificate::from_pem(&ca_cert)?)
|
2023-05-30 10:01:47 -07:00
|
|
|
// TODO: make this configurable
|
2023-05-14 00:15:10 -07:00
|
|
|
.identity(Identity::from_pkcs12(&client_key, "pass")?)
|
|
|
|
.danger_accept_invalid_certs(false)
|
|
|
|
.build()?,
|
|
|
|
)
|
|
|
|
} else {
|
|
|
|
MakeTlsConnector::new(
|
|
|
|
TlsConnector::builder()
|
|
|
|
.danger_accept_invalid_certs(true)
|
|
|
|
.build()
|
|
|
|
.unwrap(),
|
|
|
|
)
|
|
|
|
};
|
|
|
|
|
2023-05-17 09:11:17 -07:00
|
|
|
let pool = pg_config
|
|
|
|
.pg
|
|
|
|
.create_pool(Some(Runtime::Tokio1), tls)
|
|
|
|
.unwrap();
|
2023-05-14 00:15:10 -07:00
|
|
|
match pool.get().await {
|
|
|
|
Ok(_) => println!("Database connected"),
|
|
|
|
Err(e) => {
|
|
|
|
println!("Failed to connect to database: {}, retrying", e.to_string());
|
|
|
|
tokio::time::sleep(Duration::from_millis(500)).await;
|
2023-03-12 00:13:57 -08:00
|
|
|
}
|
|
|
|
}
|
2023-05-14 00:15:10 -07:00
|
|
|
|
|
|
|
Ok(pool)
|
2023-03-12 00:13:57 -08:00
|
|
|
}
|
|
|
|
|
2023-05-14 00:15:10 -07:00
|
|
|
pub async fn setup_database(pool: &Pool) -> anyhow::Result<()> {
|
2023-06-14 00:19:27 -07:00
|
|
|
match create_candles_table(pool).await {
|
2023-03-12 00:13:57 -08:00
|
|
|
Ok(_) => {
|
|
|
|
println!("Successfully configured database");
|
|
|
|
Ok(())
|
|
|
|
}
|
|
|
|
Err(e) => {
|
|
|
|
println!("Failed to configure database: {e}");
|
|
|
|
Err(e)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-05-14 00:15:10 -07:00
|
|
|
pub async fn create_candles_table(pool: &Pool) -> anyhow::Result<()> {
|
|
|
|
let client = pool.get().await?;
|
2023-03-12 00:13:57 -08:00
|
|
|
|
2023-05-14 00:15:10 -07:00
|
|
|
client
|
|
|
|
.execute(
|
2023-06-14 00:19:27 -07:00
|
|
|
"CREATE TABLE IF NOT EXISTS openbook.candles (
|
2023-06-03 10:22:25 -07:00
|
|
|
id bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
|
2023-03-12 18:03:39 -07:00
|
|
|
market_name text,
|
2023-03-12 00:13:57 -08:00
|
|
|
start_time timestamptz,
|
|
|
|
end_time timestamptz,
|
|
|
|
resolution text,
|
2023-05-14 00:15:10 -07:00
|
|
|
open double precision,
|
|
|
|
close double precision,
|
|
|
|
high double precision,
|
|
|
|
low double precision,
|
|
|
|
volume double precision,
|
2023-03-12 00:13:57 -08:00
|
|
|
complete bool
|
|
|
|
)",
|
2023-05-14 00:15:10 -07:00
|
|
|
&[],
|
|
|
|
)
|
|
|
|
.await?;
|
2023-03-12 00:13:57 -08:00
|
|
|
|
2023-05-14 00:15:10 -07:00
|
|
|
client.execute(
|
2023-06-14 23:50:24 -07:00
|
|
|
"CREATE UNIQUE INDEX IF NOT EXISTS idx_market_time_resolution ON openbook.candles USING btree (market_name, start_time, resolution);",
|
2023-05-14 00:15:10 -07:00
|
|
|
&[]
|
|
|
|
).await?;
|
2023-03-12 00:13:57 -08:00
|
|
|
|
2023-06-07 21:03:54 -07:00
|
|
|
Ok(())
|
|
|
|
}
|