Skip to content

Commit 75d5387

Browse files
committed
admin: use transactions and query wrappers
Wrap the admin commands in transactions and route their queries through the Queries helpers. Add NewQueries and BeginTx helpers to build a handle from the context so each command stops repeating the db.New and db.Begin boilerplate. Signed-off-by: Robin Jarry <robin@jarry.cc>
1 parent ebbc56d commit 75d5387

9 files changed

Lines changed: 260 additions & 187 deletions

File tree

‎cmd/pw/admin/delegate_rules.go‎

Lines changed: 31 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -30,20 +30,14 @@ type DelegateRuleListCmd struct {
3030
}
3131

3232
func (c *DelegateRuleListCmd) Run(ctx context.Context) error {
33-
database := pw.GetDB(ctx)
34-
var project db.Project
35-
err := database.NewSelect().Model(&project).
36-
Where("linkname = ?", c.Project).
37-
Scan(ctx)
33+
q := pw.NewQueries(ctx)
34+
35+
project, err := q.GetProjectByLinkname(c.Project)
3836
if err != nil {
3937
return fmt.Errorf("project %q not found", c.Project)
4038
}
4139

42-
var rules []db.DelegationRule
43-
err = database.NewSelect().Model(&rules).
44-
Where("project_id = ?", project.ID).
45-
OrderExpr("priority ASC").
46-
Scan(ctx)
40+
rules, err := q.ListDelegationRulesByProject(project.ID)
4741
if err != nil {
4842
return err
4943
}
@@ -55,7 +49,7 @@ func (c *DelegateRuleListCmd) Run(ctx context.Context) error {
5549
}
5650
var users []db.User
5751
if len(userIDs) > 0 {
58-
err = database.NewSelect().Model(&users).
52+
err = q.Select(&users).
5953
Where("id IN (?)", bun.List(userIDs)).
6054
Scan(ctx)
6155
if err != nil {
@@ -84,19 +78,18 @@ type DelegateRuleCreateCmd struct {
8478
}
8579

8680
func (c *DelegateRuleCreateCmd) Run(ctx context.Context) error {
87-
database := pw.GetDB(ctx)
88-
var project db.Project
89-
err := database.NewSelect().Model(&project).
90-
Where("linkname = ?", c.Project).
91-
Scan(ctx)
81+
q, err := pw.BeginTx(ctx)
82+
if err != nil {
83+
return err
84+
}
85+
defer q.Rollback()
86+
87+
project, err := q.GetProjectByLinkname(c.Project)
9288
if err != nil {
9389
return fmt.Errorf("project %q not found", c.Project)
9490
}
9591

96-
var user db.User
97-
err = database.NewSelect().Model(&user).
98-
Where("username = ?", c.User).
99-
Scan(ctx)
92+
user, err := q.GetUserByUsername(c.User)
10093
if err != nil {
10194
return fmt.Errorf("user %q not found", c.User)
10295
}
@@ -107,7 +100,12 @@ func (c *DelegateRuleCreateCmd) Run(ctx context.Context) error {
107100
Path: c.Path,
108101
Priority: c.Priority,
109102
}
110-
err = db.New(ctx, database).Insert(&rule)
103+
err = q.Insert(&rule)
104+
if err != nil {
105+
return err
106+
}
107+
108+
err = q.Commit()
111109
if err != nil {
112110
return err
113111
}
@@ -123,12 +121,14 @@ type DelegateRuleDeleteCmd struct {
123121
}
124122

125123
func (c *DelegateRuleDeleteCmd) Run(ctx context.Context) error {
126-
database := pw.GetDB(ctx)
124+
q, err := pw.BeginTx(ctx)
125+
if err != nil {
126+
return err
127+
}
128+
defer q.Rollback()
127129

128130
var rule db.DelegationRule
129-
err := database.NewSelect().Model(&rule).
130-
Where("id = ?", c.ID).
131-
Scan(ctx)
131+
err = q.Select(&rule).Where("id = ?", c.ID).Scan(ctx)
132132
if err != nil {
133133
return fmt.Errorf("delegation rule %d not found", c.ID)
134134
}
@@ -145,9 +145,12 @@ func (c *DelegateRuleDeleteCmd) Run(ctx context.Context) error {
145145
}
146146
}
147147

148-
_, err = database.NewDelete().Model((*db.DelegationRule)(nil)).
149-
Where("id = ?", rule.ID).
150-
Exec(ctx)
148+
_, err = q.Delete(&rule).WherePK().Exec(ctx)
149+
if err != nil {
150+
return err
151+
}
152+
153+
err = q.Commit()
151154
if err != nil {
152155
return err
153156
}

‎cmd/pw/admin/gc.go‎

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,17 @@ import (
1111
"time"
1212

1313
"github.com/getpatchwork/patchwork/cmd/pw/pw"
14-
"github.com/getpatchwork/patchwork/pkg/db"
1514
)
1615

1716
type GcCmd struct{}
1817

1918
func (c *GcCmd) Run(ctx context.Context) error {
2019
cfg := pw.GetConfig(ctx)
21-
q := db.New(ctx, pw.GetDB(ctx))
20+
q, err := pw.BeginTx(ctx)
21+
if err != nil {
22+
return err
23+
}
24+
defer q.Rollback()
2225

2326
n, err := q.CleanExpiredSessions()
2427
if err != nil {
@@ -55,5 +58,5 @@ func (c *GcCmd) Run(ctx context.Context) error {
5558
}
5659
}
5760

58-
return nil
61+
return q.Commit()
5962
}

‎cmd/pw/admin/maintainers.go‎

Lines changed: 35 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -26,18 +26,15 @@ type MaintainerListCmd struct {
2626
}
2727

2828
func (c *MaintainerListCmd) Run(ctx context.Context) error {
29-
database := pw.GetDB(ctx)
29+
q := pw.NewQueries(ctx)
3030

31-
var project db.Project
32-
err := database.NewSelect().Model(&project).
33-
Where("linkname = ?", c.Project).
34-
Scan(ctx)
31+
project, err := q.GetProjectByLinkname(c.Project)
3532
if err != nil {
3633
return fmt.Errorf("project %q not found", c.Project)
3734
}
3835

3936
var maintainers []db.ProjectMaintainer
40-
err = database.NewSelect().Model(&maintainers).
37+
err = q.Select(&maintainers).
4138
Relation("User").
4239
Where("project_id = ?", project.ID).
4340
Scan(ctx)
@@ -63,20 +60,18 @@ type MaintainerAddCmd struct {
6360
}
6461

6562
func (c *MaintainerAddCmd) Run(ctx context.Context) error {
66-
database := pw.GetDB(ctx)
63+
q, err := pw.BeginTx(ctx)
64+
if err != nil {
65+
return err
66+
}
67+
defer q.Rollback()
6768

68-
var project db.Project
69-
err := database.NewSelect().Model(&project).
70-
Where("linkname = ?", c.Project).
71-
Scan(ctx)
69+
project, err := q.GetProjectByLinkname(c.Project)
7270
if err != nil {
7371
return fmt.Errorf("project %q not found", c.Project)
7472
}
7573

76-
var user db.User
77-
err = database.NewSelect().Model(&user).
78-
Where("username = ?", c.Username).
79-
Scan(ctx)
74+
user, err := q.GetUserByUsername(c.Username)
8075
if err != nil {
8176
return fmt.Errorf("user %q not found", c.Username)
8277
}
@@ -85,7 +80,12 @@ func (c *MaintainerAddCmd) Run(ctx context.Context) error {
8580
UserID: user.ID,
8681
ProjectID: project.ID,
8782
}
88-
err = db.New(ctx, database).Insert(&m)
83+
err = q.Insert(&m)
84+
if err != nil {
85+
return err
86+
}
87+
88+
err = q.Commit()
8989
if err != nil {
9090
return err
9191
}
@@ -100,35 +100,39 @@ type MaintainerRemoveCmd struct {
100100
}
101101

102102
func (c *MaintainerRemoveCmd) Run(ctx context.Context) error {
103-
database := pw.GetDB(ctx)
103+
q, err := pw.BeginTx(ctx)
104+
if err != nil {
105+
return err
106+
}
107+
defer q.Rollback()
104108

105-
var project db.Project
106-
err := database.NewSelect().Model(&project).
107-
Where("linkname = ?", c.Project).
108-
Scan(ctx)
109+
project, err := q.GetProjectByLinkname(c.Project)
109110
if err != nil {
110111
return fmt.Errorf("project %q not found", c.Project)
111112
}
112113

113-
var user db.User
114-
err = database.NewSelect().Model(&user).
115-
Where("username = ?", c.Username).
116-
Scan(ctx)
114+
user, err := q.GetUserByUsername(c.Username)
117115
if err != nil {
118116
return fmt.Errorf("user %q not found", c.Username)
119117
}
120118

121-
res, err := database.NewDelete().
122-
Model((*db.ProjectMaintainer)(nil)).
119+
var m db.ProjectMaintainer
120+
err = q.Select(&m).
123121
Where("user_id = ?", user.ID).
124122
Where("project_id = ?", project.ID).
125-
Exec(ctx)
123+
Scan(ctx)
124+
if err != nil {
125+
return fmt.Errorf("%q is not a maintainer of %q", c.Username, c.Project)
126+
}
127+
128+
_, err = q.Delete(&m).WherePK().Exec(ctx)
126129
if err != nil {
127130
return err
128131
}
129-
n, _ := res.RowsAffected()
130-
if n == 0 {
131-
return fmt.Errorf("%q is not a maintainer of %q", c.Username, c.Project)
132+
133+
err = q.Commit()
134+
if err != nil {
135+
return err
132136
}
133137

134138
fmt.Printf("Removed %q from maintainers of %q\n", c.Username, c.Project)

0 commit comments

Comments
 (0)