-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathregion.go
122 lines (111 loc) · 3.1 KB
/
region.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
package main
import (
"database/sql"
"fmt"
)
type RegionLite struct {
Id int
Code string
Name string
CountryCode string
CountryName string
HasRegionIcon bool
}
type RegionData struct {
Code string
Name string
CountryCode string
}
func LoadRegionById(db *sql.DB, id int) (*RegionLite, error) {
trace(traceName(fmt.Sprintf("LoadRegionById(%d)", id)))
rows, err := db.Query(
"SELECT region_id, region_code, region_name, country_code, country_name, has_region_icon"+
" FROM region_view"+
" WHERE region_id=?", id)
if err != nil {
return nil, err
}
defer rows.Close()
if !rows.Next() {
return nil, fmt.Errorf("Region not found (id: %d)", id)
}
region, err := readRegionFromRows(rows)
if err != nil {
return nil, err
}
return region, nil
}
func LoadRegionsByCountryCode(db *sql.DB, countryCode string) ([]RegionLite, error) {
trace(traceName(fmt.Sprintf("LoadRegionsByCountryCode(%s)", countryCode)))
rows, err := db.Query(
"SELECT region_id, region_code, region_name, country_code, country_name, has_region_icon"+
" FROM region_view"+
" WHERE country_code=?"+
" ORDER BY country_name, region_name", countryCode)
if err != nil {
return nil, err
}
defer rows.Close()
return readRegionListFromRows(rows)
}
func LoadRegionList(db *sql.DB) ([]RegionLite, error) {
trace(traceName("LoadRegionList"))
rows, err := db.Query(
"SELECT region_id, region_code, region_name, country_code, country_name, has_region_icon" +
" FROM region_view" +
" ORDER BY country_name, region_name")
if err != nil {
return nil, err
}
defer rows.Close()
return readRegionListFromRows(rows)
}
func DeleteRegion(db *sql.DB, regionId int) error {
defer trace(traceName(fmt.Sprintf("DeleteRegion(%d)", regionId)))
_, err := db.Exec("DELETE FROM regions WHERE region_id=?", regionId)
return err
}
func InsertRegion(db *sql.DB, data RegionData) (*RegionLite, error) {
defer trace(traceName(fmt.Sprintf("InsertRegion (data: %v)", data)))
res, err := db.Exec(
"INSERT INTO regions"+
" (name, code, country_code)"+
" VALUES(?, ?, ?)",
data.Name, data.Code, data.CountryCode)
if err != nil {
return nil, err
}
regionId, err := res.LastInsertId()
if err != nil {
return nil, err
}
return LoadRegionById(db, int(regionId))
}
func UpdateRegion(db *sql.DB, regionId int, data RegionData) error {
defer trace(traceName(fmt.Sprintf("UpdateRegion(%d, %v)", regionId, data)))
_, err := db.Exec(
"UPDATE regions"+
" SET name=?, code=?, country_code=?"+
" WHERE id=?",
data.Name, data.Code, data.CountryCode, regionId)
return err
}
func readRegionListFromRows(rows *sql.Rows) ([]RegionLite, error) {
var regions []RegionLite
for rows.Next() {
region, err := readRegionFromRows(rows)
if err != nil {
return nil, err
}
regions = append(regions, *region)
}
return regions, nil
}
func readRegionFromRows(rows *sql.Rows) (*RegionLite, error) {
region := RegionLite{}
err := rows.Scan(®ion.Id, ®ion.Code, ®ion.Name, ®ion.CountryCode, ®ion.CountryName, ®ion.HasRegionIcon)
if err != nil {
return nil, err
}
return ®ion, nil
}