package shortify import ( "database/sql" "fmt" "time" _ "github.com/marcboeker/go-duckdb/v2" ) type VisitLog struct { ShortID string LongURL string IP string UserAgent string Referer string Language string Time time.Time } func (s *Shortener) LogVisit(log VisitLog) { s.logChan <- log } func (s *Shortener) startLogging() { db, err := sql.Open("duckdb", s.DataFolder+"/analytics.db") if err != nil { fmt.Println(err) return } defer db.Close() _, err = db.Exec(` CREATE SEQUENCE IF NOT EXISTS seq_visitid START 1; CREATE TABLE IF NOT EXISTS visits ( id INTEGER PRIMARY KEY, shortid VARCHAR, longurl VARCHAR, ip VARCHAR, useragent VARCHAR, referer VARCHAR, language VARCHAR, time TIMESTAMP ); `) if err != nil { fmt.Println(err) return } stmt, err := db.Prepare(` INSERT INTO visits (id, shortid, longurl, ip, useragent, referer, language, time) VALUES (nextval('seq_visitid'), ?, ?, ?, ?, ?, ?, ?) `) if err != nil { fmt.Println(err) return } defer stmt.Close() for log := range s.logChan { _, err = stmt.Exec(log.ShortID, log.LongURL, log.IP, log.UserAgent, log.Referer, log.Language, log.Time) if err != nil { fmt.Println(err) return } } }