73 lines
1.2 KiB
Go
73 lines
1.2 KiB
Go
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 *Server) LogVisit(log VisitLog) {
|
|
s.logChan <- log
|
|
}
|
|
|
|
func (s *Server) 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
|
|
}
|
|
}
|
|
}
|