Initial Commit
This commit is contained in:
@@ -0,0 +1,55 @@
|
||||
use anyhow::Context;
|
||||
use sqlx::sqlite::{SqliteConnectOptions, SqlitePoolOptions};
|
||||
use sqlx::SqlitePool;
|
||||
use std::str::FromStr;
|
||||
|
||||
pub async fn init_db(database_url: &str) -> anyhow::Result<SqlitePool> {
|
||||
let options = SqliteConnectOptions::from_str(database_url)
|
||||
.context("invalid DATABASE_URL")?
|
||||
.create_if_missing(true)
|
||||
.journal_mode(sqlx::sqlite::SqliteJournalMode::Wal)
|
||||
.foreign_keys(true);
|
||||
|
||||
let pool = SqlitePoolOptions::new()
|
||||
.max_connections(5)
|
||||
.connect_with(options)
|
||||
.await
|
||||
.context("failed to connect to SQLite")?;
|
||||
|
||||
run_schema(&pool).await?;
|
||||
seed_horizon(&pool).await?;
|
||||
|
||||
Ok(pool)
|
||||
}
|
||||
|
||||
async fn run_schema(pool: &SqlitePool) -> anyhow::Result<()> {
|
||||
let schema = include_str!("schema.sql");
|
||||
// Execute each statement separately
|
||||
for statement in schema.split(';') {
|
||||
let s = statement.trim();
|
||||
if !s.is_empty() {
|
||||
sqlx::query(s).execute(pool).await?;
|
||||
}
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
|
||||
async fn seed_horizon(pool: &SqlitePool) -> anyhow::Result<()> {
|
||||
let count: i64 = sqlx::query_scalar("SELECT COUNT(*) FROM horizon")
|
||||
.fetch_one(pool)
|
||||
.await?;
|
||||
|
||||
if count == 0 {
|
||||
let mut tx = pool.begin().await?;
|
||||
for az in 0..360i32 {
|
||||
sqlx::query("INSERT OR IGNORE INTO horizon (az_deg, alt_deg) VALUES (?, 15.0)")
|
||||
.bind(az)
|
||||
.execute(&mut *tx)
|
||||
.await?;
|
||||
}
|
||||
tx.commit().await?;
|
||||
tracing::info!("Seeded horizon table with 360 flat points at 15°");
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
@@ -0,0 +1,149 @@
|
||||
-- OpenNGC catalog cache (refreshed weekly)
|
||||
CREATE TABLE IF NOT EXISTS catalog (
|
||||
id TEXT PRIMARY KEY,
|
||||
name TEXT NOT NULL,
|
||||
common_name TEXT,
|
||||
obj_type TEXT NOT NULL,
|
||||
ra_deg REAL NOT NULL,
|
||||
dec_deg REAL NOT NULL,
|
||||
ra_h TEXT NOT NULL,
|
||||
dec_dms TEXT NOT NULL,
|
||||
constellation TEXT,
|
||||
size_arcmin_maj REAL,
|
||||
size_arcmin_min REAL,
|
||||
pos_angle_deg REAL,
|
||||
mag_v REAL,
|
||||
surface_brightness REAL,
|
||||
hubble_type TEXT,
|
||||
messier_num INTEGER,
|
||||
is_highlight BOOLEAN DEFAULT FALSE,
|
||||
fov_fill_pct REAL,
|
||||
mosaic_flag BOOLEAN DEFAULT FALSE,
|
||||
mosaic_panels_w INTEGER DEFAULT 1,
|
||||
mosaic_panels_h INTEGER DEFAULT 1,
|
||||
difficulty INTEGER,
|
||||
guide_star_density TEXT,
|
||||
fetched_at INTEGER NOT NULL
|
||||
);
|
||||
|
||||
-- Nightly precomputed visibility (refreshed each evening at sunset)
|
||||
CREATE TABLE IF NOT EXISTS nightly_cache (
|
||||
catalog_id TEXT NOT NULL,
|
||||
night_date TEXT NOT NULL,
|
||||
max_alt_deg REAL,
|
||||
transit_utc TEXT,
|
||||
rise_utc TEXT,
|
||||
set_utc TEXT,
|
||||
best_start_utc TEXT,
|
||||
best_end_utc TEXT,
|
||||
usable_min INTEGER,
|
||||
meridian_flip_utc TEXT,
|
||||
airmass_at_transit REAL,
|
||||
extinction_mag REAL,
|
||||
moon_sep_deg REAL,
|
||||
recommended_filter TEXT,
|
||||
visibility_json TEXT,
|
||||
PRIMARY KEY (catalog_id, night_date)
|
||||
);
|
||||
|
||||
-- Tonight summary (single row, refreshed at sunset)
|
||||
CREATE TABLE IF NOT EXISTS tonight (
|
||||
id INTEGER PRIMARY KEY CHECK (id = 1),
|
||||
date TEXT NOT NULL,
|
||||
astro_dusk_utc TEXT NOT NULL,
|
||||
astro_dawn_utc TEXT NOT NULL,
|
||||
moon_rise_utc TEXT,
|
||||
moon_set_utc TEXT,
|
||||
moon_illumination REAL,
|
||||
moon_phase_name TEXT,
|
||||
moon_ra_deg REAL,
|
||||
moon_dec_deg REAL,
|
||||
true_dark_start_utc TEXT,
|
||||
true_dark_end_utc TEXT,
|
||||
true_dark_minutes INTEGER,
|
||||
computed_at INTEGER
|
||||
);
|
||||
|
||||
-- Custom horizon profile
|
||||
CREATE TABLE IF NOT EXISTS horizon (
|
||||
az_deg INTEGER PRIMARY KEY,
|
||||
alt_deg REAL NOT NULL DEFAULT 15.0
|
||||
);
|
||||
|
||||
-- Imaging log
|
||||
CREATE TABLE IF NOT EXISTS imaging_log (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
catalog_id TEXT NOT NULL,
|
||||
session_date TEXT NOT NULL,
|
||||
filter_id TEXT NOT NULL,
|
||||
integration_min INTEGER NOT NULL,
|
||||
quality TEXT NOT NULL DEFAULT 'pending',
|
||||
notes TEXT,
|
||||
guiding_rms REAL,
|
||||
mean_temp_c REAL,
|
||||
phd2_log_id INTEGER,
|
||||
created_at INTEGER NOT NULL DEFAULT (unixepoch())
|
||||
);
|
||||
|
||||
-- Target gallery images
|
||||
CREATE TABLE IF NOT EXISTS gallery (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
catalog_id TEXT NOT NULL,
|
||||
log_id INTEGER,
|
||||
filename TEXT NOT NULL,
|
||||
caption TEXT,
|
||||
created_at INTEGER NOT NULL DEFAULT (unixepoch())
|
||||
);
|
||||
|
||||
-- PHD2 guiding log analysis results
|
||||
CREATE TABLE IF NOT EXISTS phd2_logs (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
session_date TEXT NOT NULL,
|
||||
filename TEXT NOT NULL,
|
||||
rms_total REAL,
|
||||
rms_ra REAL,
|
||||
rms_dec REAL,
|
||||
peak_error REAL,
|
||||
star_lost_count INTEGER,
|
||||
duration_min INTEGER,
|
||||
guide_star_snr REAL,
|
||||
created_at INTEGER NOT NULL DEFAULT (unixepoch())
|
||||
);
|
||||
|
||||
-- Weather cache
|
||||
CREATE TABLE IF NOT EXISTS weather_cache (
|
||||
id INTEGER PRIMARY KEY CHECK (id = 1),
|
||||
seventimer_json TEXT,
|
||||
openmeteo_json TEXT,
|
||||
dew_point_c REAL,
|
||||
temp_c REAL,
|
||||
humidity_pct REAL,
|
||||
go_nogo TEXT,
|
||||
fetched_at INTEGER
|
||||
);
|
||||
|
||||
-- App settings
|
||||
CREATE TABLE IF NOT EXISTS settings (
|
||||
key TEXT PRIMARY KEY,
|
||||
value TEXT NOT NULL
|
||||
);
|
||||
|
||||
-- Per-target planning notes (separate from session log notes)
|
||||
CREATE TABLE IF NOT EXISTS target_notes (
|
||||
catalog_id TEXT PRIMARY KEY,
|
||||
notes TEXT NOT NULL DEFAULT '',
|
||||
updated_at INTEGER NOT NULL DEFAULT (unixepoch())
|
||||
);
|
||||
|
||||
-- Custom user-defined targets (manual coordinates, TLE satellites, custom objects)
|
||||
CREATE TABLE IF NOT EXISTS custom_targets (
|
||||
id TEXT PRIMARY KEY, -- user-chosen, e.g. "MyNebula", "ISS"
|
||||
name TEXT NOT NULL,
|
||||
obj_type TEXT NOT NULL DEFAULT 'custom', -- custom, satellite, comet
|
||||
ra_deg REAL, -- NULL for TLE objects (computed live)
|
||||
dec_deg REAL,
|
||||
tle_line1 TEXT, -- for satellites
|
||||
tle_line2 TEXT,
|
||||
notes TEXT,
|
||||
created_at INTEGER NOT NULL DEFAULT (unixepoch())
|
||||
);
|
||||
Reference in New Issue
Block a user