func (D *RR_MySQL) GetRegionWithIPFromMySQL(ip uint32) (*MySQLRegion, *MyError.MyError) { if e := D.DB.Ping(); e != nil { if ok := InitMySQL(RC_MySQLConf); ok != true { return nil, MyError.NewError(MyError.ERROR_UNKNOWN, "Connect MySQL Error") } } sqlstring := "Select idRegion, StartIP, EndIP, NetAddr, NetMask From " + RegionTable + " Where ? >= StartIP and ? <= EndIP" var idRegion, StartIP, EndIP, NetAddr, NetMask uint32 ee := D.DB.QueryRow(sqlstring, ip, ip).Scan(&idRegion, &StartIP, &EndIP, &NetAddr, &NetMask) switch { case ee == sql.ErrNoRows: utils.QueryLogger.Error(ee.Error()) return nil, MyError.NewError(MyError.ERROR_NOTFOUND, "Not found for Region for IP: "+strconv.Itoa(int(ip))) case ee != nil: utils.QueryLogger.Error(ee.Error()) return nil, MyError.NewError(MyError.ERROR_UNKNOWN, ee.Error()) default: utils.QueryLogger.Debug("GetRegionWithIPFromMySQL: ", " idRegion: ", idRegion, " StartIP: ", StartIP, " EndIP: ", EndIP, " NetAddr: ", NetAddr, " NetMask: ", NetMask, " srcIP: ", utils.Int32ToIP4(ip).String()) return &MySQLRegion{ IdRegion: idRegion, Region: &RegionNew{ StarIP: StartIP, EndIP: EndIP, NetAddr: NetAddr, NetMask: NetMask}, }, nil } return nil, MyError.NewError(MyError.ERROR_UNKNOWN, "Unknown error!") }
func TestMubitRadix(t *testing.T) { cidrNet := []string{ "10.0.0.2/8", "10.20.0.0/14", "10.21.0.0/16", "192.168.0.0/16", "192.168.2.0/24", "8.0.0.0/9", "8.8.8.0/24", "0.0.0.0/0", // "128.0.0.0/1", } ip2Find := []string{ "10.20.1.2", "10.22.1.2", "10.19.0.1", "10.21.0.1", "192.168.2.3", "10.22.0.5", "202.106.0.20", "172.16.3.133", "8.8.8.8", "8.8.7.1", } RadixTree := NewDomainRegionTree() for _, x := range cidrNet { i, n, e := net.ParseCIDR(x) if e != nil { t.Log(e.Error()) t.Fail() continue } a, m := utils.IpNetToInt32(n) RadixTree.AddRegionToCache(&Region{ NetworkAddr: a, NetworkMask: m, RR: []dns.RR{ dns.RR(&dns.A{ A: i, Hdr: dns.RR_Header{ Rrtype: 1, Class: 1, Ttl: 60, }, }), }, }) } // For default route RadixTree.AddRegionToCache(&Region{ NetworkAddr: DefaultRadixNetaddr, NetworkMask: DefaultRadixNetMask, RR: []dns.RR{ dns.RR(&dns.A{ A: utils.Int32ToIP4(DefaultRadixNetaddr), Hdr: dns.RR_Header{ Rrtype: 1, Class: 1, Ttl: 60, }, }), }, }) for _, i := range ip2Find { ii := utils.Ip4ToInt32(utils.StrToIP(i)) r, e := RadixTree.GetRegionFromCacheWithAddr(ii, DefaultRadixSearchMask) if e != nil { t.Log(e) t.Log(i) t.Fail() } else { t.Log(r) } } RadixTree.Radix32.Do(func(r1 *bitradix.Radix32, i int) { t.Log(r1.Key(), r1.Value, r1.Bits()) }) }