// Opens a GeoIP database by filename, all formats supported by libgeoip are // supported though there are only functions to access some of the databases in this API. // The database is opened in MEMORY_CACHE mode, if you need to optimize for memory // instead of performance you should change this. // If you don't pass a filename, it will try opening the database from // a list of common paths. func Open(files ...string) (*GeoIP, error) { if len(files) == 0 { files = []string{ "/usr/share/GeoIP/GeoIP.dat", // Linux default "/usr/share/local/GeoIP/GeoIP.dat", // source install? "/usr/local/share/GeoIP/GeoIP.dat", // FreeBSD "/opt/local/share/GeoIP/GeoIP.dat", // MacPorts "/usr/share/GeoIP/GeoIP.dat", // ArchLinux } } g := &GeoIP{} runtime.SetFinalizer(g, (*GeoIP).free) var err error for _, file := range files { // libgeoip prints errors if it can't open the file, so check first if _, err := os.Stat(file); err != nil { if os.IsExist(err) { log.Println(err) } continue } cbase := C.CString(file) defer C.free(unsafe.Pointer(cbase)) g.db, err = C.GeoIP_open(cbase, C.GEOIP_MEMORY_CACHE) if g.db != nil && err != nil { break } } if err != nil { return nil, fmt.Errorf("Error opening GeoIP database (%s): %s", files, err) } if g.db == nil { return nil, fmt.Errorf("Didn't open GeoIP database (%s)", files) } C.GeoIP_set_charset(g.db, C.GEOIP_CHARSET_UTF8) return g, nil }
// OpenType opens a specified GeoIP database type in the default location. Constants // are defined for each database type (for example GEOIP_COUNTRY_EDITION). func OpenType(dbType int) (*GeoIP, error) { g := &GeoIP{} runtime.SetFinalizer(g, (*GeoIP).free) var err error g.db, err = C.GeoIP_open_type(C.int(dbType), C.GEOIP_MEMORY_CACHE) if err != nil { return nil, fmt.Errorf("Error opening GeoIP database (%d): %s", dbType, err) } if g.db == nil { return nil, fmt.Errorf("Didn't open GeoIP database (%d)", dbType) } C.GeoIP_set_charset(g.db, C.GEOIP_CHARSET_UTF8) return g, nil }
// Open opens a GeoIP database, all formats supported by libgeoip are supported though // there are only functions to access the country information in this API. // The database is opened in MEMORY_CACHE mode, if you need to optimize for memory // instead of performance you should change this. // If you don't pass a filename, it will try opening the database from // a list of common paths. func Open(files ...string) *GeoIP { if len(files) == 0 { files = []string{ "/usr/share/GeoIP/GeoIP.dat", // Linux default "/usr/share/local/GeoIP/GeoIP.dat", // source install? "/usr/local/share/GeoIP/GeoIP.dat", // FreeBSD "/opt/local/share/GeoIP/GeoIP.dat", // MacPorts } } g := &GeoIP{} var err error for _, file := range files { // libgeoip prints errors if it can't open the file, so check first if _, err := os.Stat(file); err != nil { if os.IsExist(err) { log.Println(err) } continue } cbase := C.CString(file) g.db, err = C.GeoIP_open(cbase, C.GEOIP_MEMORY_CACHE) C.free(unsafe.Pointer(cbase)) if g.db != nil && err != nil { break } } if err != nil && !Quiet { log.Println("Error opening GeoIP database", files, err) } if g.db != nil { C.GeoIP_set_charset(g.db, C.GEOIP_CHARSET_UTF8) return g } return nil }