/
exit.go
128 lines (113 loc) · 2.75 KB
/
exit.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
123
124
125
126
127
128
package types
import (
"errors"
"fmt"
"github.com/gbl08ma/sqalx"
sq "github.com/Masterminds/squirrel"
"github.com/lib/pq"
)
// Exit is a Lobby exit
type Exit struct {
ID int
WorldCoord [2]float64
Streets []string
Type string
Lobby *Lobby
}
// GetExits returns a slice with all registered exits
func GetExits(node sqalx.Node) ([]*Exit, error) {
return getExitsWithSelect(node, sdb.Select())
}
func getExitsWithSelect(node sqalx.Node, sbuilder sq.SelectBuilder) ([]*Exit, error) {
exits := []*Exit{}
tx, err := node.Beginx()
if err != nil {
return exits, err
}
defer tx.Commit() // read-only tx
rows, err := sbuilder.Columns("id", "lobby_id", "world_coord", "streets", "type").
From("station_lobby_exit").
RunWith(tx).Query()
if err != nil {
return exits, fmt.Errorf("getExitsWithSelect: %s", err)
}
defer rows.Close()
var lobbyIDs []string
for rows.Next() {
var exit Exit
var lobbyID string
var worldCoord Point
var streets pq.StringArray
err := rows.Scan(
&exit.ID,
&lobbyID,
&worldCoord,
&streets,
&exit.Type)
if err != nil {
return exits, fmt.Errorf("getExitsWithSelect: %s", err)
}
exit.WorldCoord[0] = worldCoord[0]
exit.WorldCoord[1] = worldCoord[1]
exit.Streets = streets
exits = append(exits, &exit)
lobbyIDs = append(lobbyIDs, lobbyID)
}
if err := rows.Err(); err != nil {
return exits, fmt.Errorf("getExitsWithSelect: %s", err)
}
for i := range lobbyIDs {
exits[i].Lobby, err = GetLobby(tx, lobbyIDs[i])
if err != nil {
return exits, fmt.Errorf("getExitsWithSelect: %s", err)
}
}
return exits, nil
}
// GetExit returns the Exit with the given ID
func GetExit(node sqalx.Node, id int) (*Exit, error) {
s := sdb.Select().
Where(sq.Eq{"id": id})
exits, err := getExitsWithSelect(node, s)
if err != nil {
return nil, err
}
if len(exits) == 0 {
return nil, errors.New("Exit not found")
}
return exits[0], nil
}
// Add adds the exit
func (exit *Exit) Add(node sqalx.Node) error {
tx, err := node.Beginx()
if err != nil {
return err
}
defer tx.Rollback()
err = exit.Lobby.Update(tx)
if err != nil {
return errors.New("AddExit: " + err.Error())
}
_, err = sdb.Insert("station_lobby_exit").
Columns("lobby_id", "world_coord", "streets", "type").
Values(exit.Lobby.ID, exit.WorldCoord, exit.Streets, exit.Type).
RunWith(tx).Exec()
if err != nil {
return errors.New("AddExit: " + err.Error())
}
return tx.Commit()
}
// Delete deletes the exit
func (exit *Exit) Delete(node sqalx.Node) error {
tx, err := node.Beginx()
if err != nil {
return err
}
defer tx.Rollback()
_, err = sdb.Delete("station_lobby_exit").
Where(sq.Eq{"id": exit.ID}).RunWith(tx).Exec()
if err != nil {
return fmt.Errorf("RemoveExit: %s", err)
}
return tx.Commit()
}