migration function

This commit is contained in:
2026-06-19 22:53:43 +02:00
parent c30399e498
commit 3f05200aeb
2 changed files with 49 additions and 0 deletions
+45
View File
@@ -147,6 +147,51 @@ func lookupASN(ip net.IP) string {
return label
}
// backfillASN setzt das asn-Feld für bereits erfasste Impressions nach, die noch
// keins haben (asn = ''). Nötig, weil recordImpression das asn nur beim ersten
// Insert pro (Tag, Netz, Pfad) schreibt -> Zeilen, die vor aktiver ASN-DB
// entstanden, blieben "(unbekannt)".
//
// TEMPORÄR: einmalig beim Start ausführen, danach den Aufruf (und diese Funktion)
// wieder entfernen/reverten. Arbeitet nur auf dem bereits anonymisierten Netz
// (anon_ip), nie auf einer vollen IP.
func backfillASN() {
if geoASN == nil {
return
}
rows, err := db.Query(`SELECT DISTINCT anon_ip FROM impression WHERE asn = ''`)
if err != nil {
log.Printf("ASN-Backfill: Abfrage fehlgeschlagen: %v", err)
return
}
var nets []string
for rows.Next() {
var anon string
if rows.Scan(&anon) == nil && anon != "" {
nets = append(nets, anon)
}
}
rows.Close()
var updated, resolved int
for _, anon := range nets {
asn := lookupASN(net.ParseIP(anon))
if asn == "" {
continue // kein Treffer -> bleibt "(unbekannt)"
}
res, err := db.Exec(`UPDATE impression SET asn = ? WHERE anon_ip = ? AND asn = ''`, asn, anon)
if err != nil {
log.Printf("ASN-Backfill: Update für %s fehlgeschlagen: %v", anon, err)
continue
}
resolved++
if n, _ := res.RowsAffected(); n > 0 {
updated += int(n)
}
}
log.Printf("ASN-Backfill: %d Netze aufgelöst, %d Zeilen aktualisiert (von %d offenen Netzen)", resolved, updated, len(nets))
}
// trackImpression zählt einen Seitenaufruf pro (Tag, anonymisiertes Netz, Pfad)
// und vermerkt das autonome System. Die IP wird zuerst maskiert; sowohl die
// Speicherung als auch die ASN-Auflösung arbeiten nur auf dem anonymisierten