// Returns the "City Record" for an IP address. Requires the GeoCity(Lite) // database - http://www.maxmind.com/en/city func (gi *GeoIP) GetRecord(ip string) *GeoIPRecord { if gi.db == nil { return nil } cip := C.CString(ip) defer C.free(unsafe.Pointer(cip)) gi.mu.Lock() record := C.GeoIP_record_by_addr(gi.db, cip) gi.mu.Unlock() if record == nil { return nil } // defer C.free(unsafe.Pointer(record)) defer C.GeoIPRecord_delete(record) rec := new(GeoIPRecord) rec.CountryCode = C.GoString(record.country_code) rec.CountryCode3 = C.GoString(record.country_code3) rec.CountryName = C.GoString(record.country_name) rec.Region = C.GoString(record.region) rec.City = C.GoString(record.city) rec.PostalCode = C.GoString(record.postal_code) rec.Latitude = float32(record.latitude) rec.Longitude = float32(record.longitude) rec.AreaCode = int(record.area_code) rec.CharSet = int(record.charset) rec.ContinentCode = C.GoString(record.continent_code) return rec }
// Returns the "City Record" for an IPv4 address. Requires the GeoCity(Lite) // database - http://www.maxmind.com/en/city func (gi *GeoIP) GetRecord(ip string) *GeoIPRecord { if gi.db == nil { return nil } cip := C.CString(ip) defer C.free(unsafe.Pointer(cip)) gi.mu.Lock() record := C.GeoIP_record_by_addr(gi.db, cip) gi.mu.Unlock() if record == nil { return nil } defer C.GeoIPRecord_delete(record) return populateGeoIPRecords(gi.db.databaseType, record) }
// Returns the "City Record" for an IP address. Requires the GeoCity(Lite) // database - http://www.maxmind.com/en/city func (gi *GeoIP) GetRecord(ip string) *GeoIPRecord { if gi.db == nil { return nil } cip := C.CString(ip) defer C.free(unsafe.Pointer(cip)) gi.mu.Lock() record := C.GeoIP_record_by_addr(gi.db, cip) gi.mu.Unlock() if record == nil { return nil } // defer C.free(unsafe.Pointer(record)) defer C.GeoIPRecord_delete(record) rec := new(GeoIPRecord) rec.CountryCode = C.GoString(record.country_code) rec.CountryCode3 = C.GoString(record.country_code3) rec.CountryName = C.GoString(record.country_name) rec.Region = C.GoString(record.region) rec.City = C.GoString(record.city) rec.PostalCode = C.GoString(record.postal_code) rec.Latitude = float32(record.latitude) rec.Longitude = float32(record.longitude) rec.CharSet = int(record.charset) rec.ContinentCode = C.GoString(record.continent_code) if gi.db.databaseType != C.GEOIP_CITY_EDITION_REV0 { /* DIRTY HACK BELOW: The GeoIPRecord struct in GeoIPCity.h contains an int32 union of metro_code and dma_code. The union is unnamed, so cgo names it anon0 and assumes it's a 4-byte array. */ union_int := (*int32)(unsafe.Pointer(&record.anon0)) rec.MetroCode = int(*union_int) rec.AreaCode = int(record.area_code) } return rec }