You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
63 lines
1.4 KiB
63 lines
1.4 KiB
// +build !appengine |
|
|
|
package maxminddb |
|
|
|
import ( |
|
"os" |
|
"runtime" |
|
) |
|
|
|
// Open takes a string path to a MaxMind DB file and returns a Reader |
|
// structure or an error. The database file is opened using a memory map, |
|
// except on Google App Engine where mmap is not supported; there the database |
|
// is loaded into memory. Use the Close method on the Reader object to return |
|
// the resources to the system. |
|
func Open(file string) (*Reader, error) { |
|
mapFile, err := os.Open(file) |
|
if err != nil { |
|
return nil, err |
|
} |
|
defer func() { |
|
if rerr := mapFile.Close(); rerr != nil { |
|
err = rerr |
|
} |
|
}() |
|
|
|
stats, err := mapFile.Stat() |
|
if err != nil { |
|
return nil, err |
|
} |
|
|
|
fileSize := int(stats.Size()) |
|
mmap, err := mmap(int(mapFile.Fd()), fileSize) |
|
if err != nil { |
|
return nil, err |
|
} |
|
|
|
reader, err := FromBytes(mmap) |
|
if err != nil { |
|
if err2 := munmap(mmap); err2 != nil { |
|
// failing to unmap the file is probably the more severe error |
|
return nil, err2 |
|
} |
|
return nil, err |
|
} |
|
|
|
reader.hasMappedFile = true |
|
runtime.SetFinalizer(reader, (*Reader).Close) |
|
return reader, err |
|
} |
|
|
|
// Close unmaps the database file from virtual memory and returns the |
|
// resources to the system. If called on a Reader opened using FromBytes |
|
// or Open on Google App Engine, this method does nothing. |
|
func (r *Reader) Close() error { |
|
var err error |
|
if r.hasMappedFile { |
|
runtime.SetFinalizer(r, nil) |
|
r.hasMappedFile = false |
|
err = munmap(r.buffer) |
|
} |
|
r.buffer = nil |
|
return err |
|
}
|
|
|