optimized inserts and updates on ip table
This commit is contained in:
parent
5a61660567
commit
e47ed6adfe
@ -6,12 +6,15 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"log"
|
"log"
|
||||||
"net"
|
"net"
|
||||||
|
"reflect"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"git.paulbsd.com/paulbsd/ipbl/src/api"
|
"git.paulbsd.com/paulbsd/ipbl/src/api"
|
||||||
"git.paulbsd.com/paulbsd/ipbl/src/config"
|
"git.paulbsd.com/paulbsd/ipbl/src/config"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var lastday = time.Now().Add(-(time.Hour * 24))
|
||||||
|
|
||||||
// GetIPs ...
|
// GetIPs ...
|
||||||
func GetIPs(ctx *context.Context, config *config.Config, limit int) (apimailboxes []*api.IP, err error) {
|
func GetIPs(ctx *context.Context, config *config.Config, limit int) (apimailboxes []*api.IP, err error) {
|
||||||
var ips []IP
|
var ips []IP
|
||||||
@ -66,28 +69,24 @@ func (i *IP) InsertIP(cfg *config.Config) (num int64, err error) {
|
|||||||
|
|
||||||
// InsertIPBulk ...
|
// InsertIPBulk ...
|
||||||
func InsertIPBulk(cfg *config.Config, ips *[]IP) (numinserts int64, numupdates int64, numfail int64, err error) {
|
func InsertIPBulk(cfg *config.Config, ips *[]IP) (numinserts int64, numupdates int64, numfail int64, err error) {
|
||||||
lastday := time.Now().Add(-(time.Hour * 24))
|
|
||||||
|
var iplist []string
|
||||||
for _, ip := range *ips {
|
for _, ip := range *ips {
|
||||||
s_ip := IP{IP: ip.IP}
|
iplist = append(iplist, ip.IP)
|
||||||
res, _ := cfg.Db.Get(&s_ip)
|
|
||||||
if res {
|
|
||||||
if !s_ip.Updated.After(lastday) {
|
|
||||||
num, err := cfg.Db.ID(s_ip.ID).Update(&s_ip)
|
|
||||||
if err != nil {
|
|
||||||
numfail++
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
numupdates += num
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
num, err := cfg.Db.Insert(ip)
|
|
||||||
if err != nil {
|
|
||||||
numfail++
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
numinserts += num
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var searchips []IP
|
||||||
|
cfg.Db.In("ip", iplist).Find(&searchips)
|
||||||
|
|
||||||
|
var toupdateips []string
|
||||||
|
for _, ip := range searchips {
|
||||||
|
toupdateips = append(toupdateips, ip.IP)
|
||||||
|
}
|
||||||
|
cfg.Db.In("ip", toupdateips).Cols("updated").Update(&IP{})
|
||||||
|
|
||||||
|
var toinsertip, _ = differ(*ips, searchips)
|
||||||
|
numinserts, err = cfg.Db.Insert(toinsertip)
|
||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -131,6 +130,29 @@ func (ip *IP) APIFormat() *api.IP {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func differ(sl1 []IP, sl2 []IP) (toinsert []IP, err error) {
|
||||||
|
var m = make(map[string]IPDiffer)
|
||||||
|
longslice := append(sl1, sl2...)
|
||||||
|
|
||||||
|
for _, v2 := range longslice {
|
||||||
|
if _, v := m[v2.IP]; !v {
|
||||||
|
m[v2.IP] = IPDiffer{IP: v2, Num: 1}
|
||||||
|
} else {
|
||||||
|
if this, ok := m[v2.IP]; ok {
|
||||||
|
this.Num += 1
|
||||||
|
m[v2.IP] = this
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, j := range reflect.ValueOf(m).MapKeys() {
|
||||||
|
if m[j.String()].Num == 1 {
|
||||||
|
toinsert = append(toinsert, m[j.String()].IP)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
// IP describe IP objects
|
// IP describe IP objects
|
||||||
type IP struct {
|
type IP struct {
|
||||||
ID int `xorm:"pk autoincr" json:"-"`
|
ID int `xorm:"pk autoincr" json:"-"`
|
||||||
@ -140,3 +162,8 @@ type IP struct {
|
|||||||
Created time.Time `xorm:"created notnull" json:"-"`
|
Created time.Time `xorm:"created notnull" json:"-"`
|
||||||
Updated time.Time `xorm:"updated notnull" json:"-"`
|
Updated time.Time `xorm:"updated notnull" json:"-"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type IPDiffer struct {
|
||||||
|
IP IP
|
||||||
|
Num int
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user