123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119 |
- package ipdb
- import (
- "reflect"
- "time"
- "os"
- )
- type DistrictInfo struct {
- CountryName string `json:"country_name"`
- RegionName string `json:"region_name"`
- CityName string `json:"city_name"`
- DistrictName string `json:"district_name"`
- ChinaAdminCode string `json:"china_admin_code"`
- CoveringRadius string `json:"covering_radius"`
- Latitude string `json:"latitude"`
- Longitude string `json:"longitude"`
- }
- type District struct {
- reader *reader
- }
- func NewDistrict(name string) (*District, error) {
- r, e := newReader(name, &DistrictInfo{})
- if e != nil {
- return nil, e
- }
- return &District{
- reader: r,
- }, nil
- }
- func (db *District) Reload(name string) error {
- _, err := os.Stat(name)
- if err != nil {
- return err
- }
- reader, err := newReader(name, &DistrictInfo{})
- if err != nil {
- return err
- }
- db.reader = reader
- return nil
- }
- func (db *District) Find(addr, language string) ([]string, error) {
- return db.reader.find1(addr, language)
- }
- func (db *District) FindMap(addr, language string) (map[string]string, error) {
- data, err := db.reader.find1(addr, language)
- if err != nil {
- return nil, err
- }
- info := make(map[string]string, len(db.reader.meta.Fields))
- for k, v := range data {
- info[db.reader.meta.Fields[k]] = v
- }
- return info, nil
- }
- func (db *District) FindInfo(addr, language string) (*DistrictInfo, error) {
- data, err := db.reader.FindMap(addr, language)
- if err != nil {
- return nil, err
- }
- info := &DistrictInfo{}
- for k, v := range data {
- sv := reflect.ValueOf(info).Elem()
- sfv := sv.FieldByName(db.reader.refType[k])
- if !sfv.IsValid() {
- continue
- }
- if !sfv.CanSet() {
- continue
- }
- sft := sfv.Type()
- fv := reflect.ValueOf(v)
- if sft == fv.Type() {
- sfv.Set(fv)
- }
- }
- return info, nil
- }
- func (db *District) IsIPv4() bool {
- return db.reader.IsIPv4Support()
- }
- func (db *District) IsIPv6() bool {
- return db.reader.IsIPv6Support()
- }
- func (db *District) Languages() []string {
- return db.reader.Languages()
- }
- func (db *District) Fields() []string {
- return db.reader.meta.Fields
- }
- func (db *District) BuildTime() time.Time {
- return db.reader.Build()
- }
|