package main import ( "database/sql" "flag" "fmt" _ "github.com/mattn/go-sqlite3" "log" "math" "time" ) type EventsRow struct { description sql.NullString timestamp sql.NullInt64 interval sql.NullString period sql.NullString yearknown sql.NullBool monthknown sql.NullBool dayknown sql.NullBool hourknown sql.NullBool minuteknown sql.NullBool secondknown sql.NullBool } type TimelineDB struct { *sql.DB } func formula(p float64) int64 { yearsAgo := math.Exp(20.3444*math.Pow(p, 3)+3) - math.Exp(3) return int64(yearsAgo * 31556926) } func (db *TimelineDB) closestEvent(t int64) (EventsRow, error) { var event EventsRow query := ` select description, timestamp, yearknown, monthknown, dayknown, hourknown, minuteknown, secondknown from events where timestamp is not null order by abs(? - timestamp) asc limit 1 ` stmt, err := db.Prepare(query) if err != nil { return event, err } defer stmt.Close() err = stmt.QueryRow(t).Scan(&event.description, &event.timestamp, &event.yearknown, &event.monthknown, &event.dayknown, &event.hourknown, &event.minuteknown, &event.secondknown) return event, err } func main() { percent := flag.Float64("p", -1, "percentage") flag.Parse() if *percent < 0 || *percent > 1 { log.Fatal("invalid percentage") } t := time.Now().Unix() - formula(*percent) var db TimelineDB var err error db.DB, err = sql.Open("sqlite3", "./timeline.db") if err != nil { log.Fatal(err) } defer db.Close() event, err := db.closestEvent(t) if err != nil { log.Fatal(err) } timestamp, err := event.timestamp.Value() if err != nil { log.Fatal(err) } desc, err := event.description.Value() if err != nil { log.Fatal(err) } date := time.Unix(timestamp.(int64), 0) fmt.Printf("%v\t%v\t%v\n", timestamp, date, desc) }