SQLite building for data
This commit is contained in:
@@ -0,0 +1,196 @@
|
||||
-- Hammy reference bundle schema
|
||||
--
|
||||
-- Read-only at runtime. Regenerated as a whole file, never migrated in place.
|
||||
-- Open with SQLITE_OPEN_READONLY.
|
||||
|
||||
PRAGMA foreign_keys = ON;
|
||||
|
||||
-- ---------------------------------------------------------------------------
|
||||
-- Bundle metadata
|
||||
-- ---------------------------------------------------------------------------
|
||||
|
||||
CREATE TABLE ref_meta (
|
||||
key TEXT PRIMARY KEY,
|
||||
value TEXT NOT NULL
|
||||
);
|
||||
|
||||
-- Where each dataset came from and when. Shown by /about and used to decide
|
||||
-- whether a newer bundle is worth downloading.
|
||||
CREATE TABLE ref_sources (
|
||||
dataset TEXT PRIMARY KEY,
|
||||
source_name TEXT NOT NULL,
|
||||
source_url TEXT,
|
||||
license TEXT,
|
||||
retrieved TEXT, -- ISO 8601 date
|
||||
notes TEXT
|
||||
);
|
||||
|
||||
-- ---------------------------------------------------------------------------
|
||||
-- Bands and privileges
|
||||
-- ---------------------------------------------------------------------------
|
||||
|
||||
-- Named bands, region-independent. edge_low/high are the widest extent across
|
||||
-- all regions; per-region reality lives in band_segments.
|
||||
CREATE TABLE bands (
|
||||
id INTEGER PRIMARY KEY,
|
||||
name TEXT NOT NULL UNIQUE, -- '20m', '70cm'
|
||||
edge_low_hz INTEGER NOT NULL,
|
||||
edge_high_hz INTEGER NOT NULL,
|
||||
wavelength_m REAL,
|
||||
sort_order INTEGER NOT NULL
|
||||
);
|
||||
|
||||
CREATE TABLE license_classes (
|
||||
id INTEGER PRIMARY KEY,
|
||||
country TEXT NOT NULL, -- ISO 3166-1 alpha-2
|
||||
code TEXT NOT NULL, -- 'E', 'G', 'T'
|
||||
name TEXT NOT NULL,
|
||||
rank INTEGER NOT NULL, -- higher = more privileges
|
||||
notes TEXT,
|
||||
UNIQUE (country, code)
|
||||
);
|
||||
|
||||
-- One row per (country, class, contiguous frequency range, mode group).
|
||||
-- A class with split phone/CW privileges on a band gets several rows.
|
||||
CREATE TABLE band_segments (
|
||||
id INTEGER PRIMARY KEY,
|
||||
band_id INTEGER NOT NULL REFERENCES bands(id),
|
||||
country TEXT NOT NULL,
|
||||
iaru_region INTEGER, -- 1, 2, 3, or NULL if not region-scoped
|
||||
class_id INTEGER REFERENCES license_classes(id),
|
||||
low_hz INTEGER NOT NULL,
|
||||
high_hz INTEGER NOT NULL,
|
||||
modes TEXT NOT NULL, -- 'CW', 'CW,DATA', 'PHONE,IMAGE'
|
||||
max_power_w INTEGER, -- NULL = national default
|
||||
notes TEXT
|
||||
);
|
||||
|
||||
CREATE INDEX idx_band_segments_freq ON band_segments (country, low_hz, high_hz);
|
||||
CREATE INDEX idx_band_segments_class ON band_segments (class_id);
|
||||
|
||||
-- ---------------------------------------------------------------------------
|
||||
-- DXCC
|
||||
-- ---------------------------------------------------------------------------
|
||||
|
||||
-- id is the ADIF/ARRL DXCC entity code, supplied by cty2sql.py's DXCC_IDS map
|
||||
-- (cty.dat itself carries no entity numbers). WAE and other non-DXCC entities
|
||||
-- are excluded by default since they have no code.
|
||||
--
|
||||
-- latitude is north-positive and longitude is east-positive; utc_offset is the
|
||||
-- usual "UTC + this = local". All three are flipped relative to cty.dat's own
|
||||
-- positive-west conventions by the importer.
|
||||
CREATE TABLE dxcc_entities (
|
||||
id INTEGER PRIMARY KEY, -- ADIF DXCC entity code
|
||||
name TEXT NOT NULL,
|
||||
primary_prefix TEXT NOT NULL UNIQUE,
|
||||
continent TEXT, -- 'EU', 'NA', ...
|
||||
cq_zone INTEGER, -- record default
|
||||
itu_zone INTEGER, -- record default
|
||||
latitude REAL,
|
||||
longitude REAL,
|
||||
utc_offset REAL,
|
||||
deleted INTEGER NOT NULL DEFAULT 0
|
||||
);
|
||||
|
||||
CREATE INDEX idx_dxcc_entities_prefix ON dxcc_entities (primary_prefix);
|
||||
|
||||
-- Prefixes are matched longest-first:
|
||||
-- SELECT ... WHERE ? GLOB prefix || '*' ORDER BY length(prefix) DESC LIMIT 1
|
||||
-- cq_zone/itu_zone here OVERRIDE the entity default when non-NULL. About 75% of
|
||||
-- rows carry one, so COALESCE them in every query:
|
||||
-- COALESCE(p.cq_zone, e.cq_zone)
|
||||
CREATE TABLE dxcc_prefixes (
|
||||
prefix TEXT NOT NULL,
|
||||
entity_id INTEGER NOT NULL REFERENCES dxcc_entities(id),
|
||||
exact INTEGER NOT NULL DEFAULT 0, -- 1 = whole callsign must match
|
||||
cq_zone INTEGER,
|
||||
itu_zone INTEGER,
|
||||
PRIMARY KEY (prefix, entity_id)
|
||||
);
|
||||
|
||||
CREATE INDEX idx_dxcc_prefixes_len ON dxcc_prefixes (length(prefix) DESC);
|
||||
|
||||
-- ---------------------------------------------------------------------------
|
||||
-- Operating reference
|
||||
-- ---------------------------------------------------------------------------
|
||||
|
||||
CREATE TABLE qcodes (
|
||||
code TEXT PRIMARY KEY,
|
||||
question TEXT NOT NULL,
|
||||
answer TEXT NOT NULL,
|
||||
category TEXT -- 'general', 'aeronautical', 'maritime'
|
||||
);
|
||||
|
||||
CREATE TABLE prosigns (
|
||||
symbol TEXT PRIMARY KEY, -- 'AR', 'SK', 'BT'
|
||||
morse TEXT NOT NULL,
|
||||
meaning TEXT NOT NULL,
|
||||
usage TEXT
|
||||
);
|
||||
|
||||
CREATE TABLE phonetics (
|
||||
letter TEXT PRIMARY KEY,
|
||||
word TEXT NOT NULL,
|
||||
pronunciation TEXT
|
||||
);
|
||||
|
||||
CREATE TABLE morse (
|
||||
character TEXT PRIMARY KEY,
|
||||
code TEXT NOT NULL, -- '.-' with . and -
|
||||
category TEXT NOT NULL -- 'letter', 'digit', 'punctuation'
|
||||
);
|
||||
|
||||
CREATE TABLE abbreviations (
|
||||
abbr TEXT PRIMARY KEY,
|
||||
meaning TEXT NOT NULL,
|
||||
context TEXT -- 'CW', 'general', 'contest'
|
||||
);
|
||||
|
||||
-- RST readability/strength/tone scale
|
||||
CREATE TABLE rst_scale (
|
||||
component TEXT NOT NULL, -- 'R', 'S', 'T'
|
||||
value INTEGER NOT NULL,
|
||||
meaning TEXT NOT NULL,
|
||||
PRIMARY KEY (component, value)
|
||||
);
|
||||
|
||||
-- ---------------------------------------------------------------------------
|
||||
-- Engineering reference
|
||||
-- ---------------------------------------------------------------------------
|
||||
|
||||
-- Matched loss follows the usual two-term model:
|
||||
-- loss_dB_per_100ft = k1 * sqrt(f_MHz) + k2 * f_MHz
|
||||
CREATE TABLE coax_types (
|
||||
name TEXT PRIMARY KEY,
|
||||
impedance_ohm REAL NOT NULL,
|
||||
velocity_factor REAL NOT NULL,
|
||||
capacitance_pf_per_ft REAL,
|
||||
outer_diameter_mm REAL,
|
||||
loss_k1 REAL,
|
||||
loss_k2 REAL,
|
||||
max_power_hf_w INTEGER,
|
||||
notes TEXT
|
||||
);
|
||||
|
||||
-- ---------------------------------------------------------------------------
|
||||
-- NCDXF/IARU beacon network
|
||||
-- ---------------------------------------------------------------------------
|
||||
|
||||
-- 18 stations, 10 s per slot, 3 min for a full cycle on each of 5 frequencies.
|
||||
-- Which station is on which band at time t is pure arithmetic from slot_index.
|
||||
CREATE TABLE ncdxf_beacons (
|
||||
slot_index INTEGER PRIMARY KEY, -- 0..17, order within the cycle
|
||||
callsign TEXT NOT NULL,
|
||||
location TEXT NOT NULL,
|
||||
grid TEXT,
|
||||
latitude REAL,
|
||||
longitude REAL,
|
||||
dxcc_id INTEGER REFERENCES dxcc_entities(id),
|
||||
active INTEGER NOT NULL DEFAULT 1
|
||||
);
|
||||
|
||||
CREATE TABLE ncdxf_frequencies (
|
||||
band_id INTEGER PRIMARY KEY REFERENCES bands(id),
|
||||
freq_hz INTEGER NOT NULL,
|
||||
slot_offset INTEGER NOT NULL -- slots to add for this band
|
||||
);
|
||||
Reference in New Issue
Block a user