package database import ( "database/sql" "fmt" "log" _ "github.com/mattn/go-sqlite3" ) func InitDB(db *sql.DB) { schema := ` CREATE TABLE IF NOT EXISTS currencies ( id INTEGER PRIMARY KEY AUTOINCREMENT, code TEXT NOT NULL UNIQUE, name TEXT NOT NULL ); CREATE TABLE IF NOT EXISTS companies ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL UNIQUE, shares_outstanding INTEGER NOT NULL, price REAL NOT NULL, currency_id INTEGER NOT NULL, FOREIGN KEY (currency_id) REFERENCES currencies(id) ); CREATE TABLE IF NOT EXISTS periods ( id INTEGER PRIMARY KEY AUTOINCREMENT, type TEXT NOT NULL CHECK(type IN ('Q', 'H', 'Y')), year INTEGER NOT NULL, idx INTEGER NOT NULL, start_date TEXT NOT NULL, end_date TEXT NOT NULL, UNIQUE(type, year, idx) ); CREATE TABLE IF NOT EXISTS revenue_reports ( id INTEGER PRIMARY KEY AUTOINCREMENT, company_id INTEGER NOT NULL, period_id INTEGER NOT NULL, FOREIGN KEY (company_id) REFERENCES companies(id), FOREIGN KEY (period_id) REFERENCES periods(id), UNIQUE(company_id, period_id) ); CREATE TABLE IF NOT EXISTS revenue_entries ( id INTEGER PRIMARY KEY AUTOINCREMENT, report_id INTEGER NOT NULL, currency_id INTEGER NOT NULL, category TEXT NOT NULL CHECK(category IN ('product', 'location', 'total')), label TEXT NOT NULL, value REAL NOT NULL, FOREIGN KEY (report_id) REFERENCES revenue_reports(id), FOREIGN KEY (currency_id) REFERENCES currencies(id) ); -- one row per category type per company -- e.g. Apple has "product" and "location" CREATE TABLE IF NOT EXISTS category_defs ( id INTEGER PRIMARY KEY AUTOINCREMENT, company_id INTEGER NOT NULL, name TEXT NOT NULL, FOREIGN KEY (company_id) REFERENCES companies(id), UNIQUE(company_id, name) ); -- the actual labels belonging to each category -- e.g. category_def "product" → "iPhone", "Mac", "Services" CREATE TABLE IF NOT EXISTS category_labels ( id INTEGER PRIMARY KEY AUTOINCREMENT, category_def_id INTEGER NOT NULL, label TEXT NOT NULL, FOREIGN KEY (category_def_id) REFERENCES category_defs(id), UNIQUE(category_def_id, label) ); ` if _, err := db.Exec(schema); err != nil { log.Fatal("Failed to create tables:", err) } fmt.Println("Tables ready") }