district.go 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. package ipdb
  2. import (
  3. "reflect"
  4. "time"
  5. "os"
  6. )
  7. type DistrictInfo struct {
  8. CountryName string `json:"country_name"`
  9. RegionName string `json:"region_name"`
  10. CityName string `json:"city_name"`
  11. DistrictName string `json:"district_name"`
  12. ChinaAdminCode string `json:"china_admin_code"`
  13. CoveringRadius string `json:"covering_radius"`
  14. Latitude string `json:"latitude"`
  15. Longitude string `json:"longitude"`
  16. }
  17. type District struct {
  18. reader *reader
  19. }
  20. func NewDistrict(name string) (*District, error) {
  21. r, e := newReader(name, &DistrictInfo{})
  22. if e != nil {
  23. return nil, e
  24. }
  25. return &District{
  26. reader: r,
  27. }, nil
  28. }
  29. func (db *District) Reload(name string) error {
  30. _, err := os.Stat(name)
  31. if err != nil {
  32. return err
  33. }
  34. reader, err := newReader(name, &DistrictInfo{})
  35. if err != nil {
  36. return err
  37. }
  38. db.reader = reader
  39. return nil
  40. }
  41. func (db *District) Find(addr, language string) ([]string, error) {
  42. return db.reader.find1(addr, language)
  43. }
  44. func (db *District) FindMap(addr, language string) (map[string]string, error) {
  45. data, err := db.reader.find1(addr, language)
  46. if err != nil {
  47. return nil, err
  48. }
  49. info := make(map[string]string, len(db.reader.meta.Fields))
  50. for k, v := range data {
  51. info[db.reader.meta.Fields[k]] = v
  52. }
  53. return info, nil
  54. }
  55. func (db *District) FindInfo(addr, language string) (*DistrictInfo, error) {
  56. data, err := db.reader.FindMap(addr, language)
  57. if err != nil {
  58. return nil, err
  59. }
  60. info := &DistrictInfo{}
  61. for k, v := range data {
  62. sv := reflect.ValueOf(info).Elem()
  63. sfv := sv.FieldByName(db.reader.refType[k])
  64. if !sfv.IsValid() {
  65. continue
  66. }
  67. if !sfv.CanSet() {
  68. continue
  69. }
  70. sft := sfv.Type()
  71. fv := reflect.ValueOf(v)
  72. if sft == fv.Type() {
  73. sfv.Set(fv)
  74. }
  75. }
  76. return info, nil
  77. }
  78. func (db *District) IsIPv4() bool {
  79. return db.reader.IsIPv4Support()
  80. }
  81. func (db *District) IsIPv6() bool {
  82. return db.reader.IsIPv6Support()
  83. }
  84. func (db *District) Languages() []string {
  85. return db.reader.Languages()
  86. }
  87. func (db *District) Fields() []string {
  88. return db.reader.meta.Fields
  89. }
  90. func (db *District) BuildTime() time.Time {
  91. return db.reader.Build()
  92. }