Making locking parameters more intuitive

This commit is contained in:
dogenkigen 2023-12-04 13:36:45 +01:00 committed by Maciej Laskowski
parent 3207ad6033
commit c95e45f45e
2 changed files with 25 additions and 7 deletions

View File

@ -1,9 +1,23 @@
package clause package clause
type LockingStrength string
const (
LockingStrengthUpdate = LockingStrength("UPDATE")
LockingStrengthShare = LockingStrength("SHARE")
)
type LockingOptions string
const (
LockingOptionsSkipLocked = LockingOptions("SKIP LOCKED")
LockingOptionsNoWait = LockingOptions("NOWAIT")
)
type Locking struct { type Locking struct {
Strength string Strength LockingStrength
Table Table Table Table
Options string Options LockingOptions
} }
// Name where clause name // Name where clause name
@ -13,7 +27,7 @@ func (locking Locking) Name() string {
// Build build where clause // Build build where clause
func (locking Locking) Build(builder Builder) { func (locking Locking) Build(builder Builder) {
builder.WriteString(locking.Strength) builder.WriteString(string(locking.Strength))
if locking.Table.Name != "" { if locking.Table.Name != "" {
builder.WriteString(" OF ") builder.WriteString(" OF ")
builder.WriteQuoted(locking.Table) builder.WriteQuoted(locking.Table)
@ -21,7 +35,7 @@ func (locking Locking) Build(builder Builder) {
if locking.Options != "" { if locking.Options != "" {
builder.WriteByte(' ') builder.WriteByte(' ')
builder.WriteString(locking.Options) builder.WriteString(string(locking.Options))
} }
} }

View File

@ -14,17 +14,21 @@ func TestLocking(t *testing.T) {
Vars []interface{} Vars []interface{}
}{ }{
{ {
[]clause.Interface{clause.Select{}, clause.From{}, clause.Locking{Strength: "UPDATE"}}, []clause.Interface{clause.Select{}, clause.From{}, clause.Locking{Strength: clause.LockingStrengthUpdate}},
"SELECT * FROM `users` FOR UPDATE", nil, "SELECT * FROM `users` FOR UPDATE", nil,
}, },
{ {
[]clause.Interface{clause.Select{}, clause.From{}, clause.Locking{Strength: "SHARE", Table: clause.Table{Name: clause.CurrentTable}}}, []clause.Interface{clause.Select{}, clause.From{}, clause.Locking{Strength: clause.LockingStrengthShare, Table: clause.Table{Name: clause.CurrentTable}}},
"SELECT * FROM `users` FOR SHARE OF `users`", nil, "SELECT * FROM `users` FOR SHARE OF `users`", nil,
}, },
{ {
[]clause.Interface{clause.Select{}, clause.From{}, clause.Locking{Strength: "UPDATE"}, clause.Locking{Strength: "UPDATE", Options: "NOWAIT"}}, []clause.Interface{clause.Select{}, clause.From{}, clause.Locking{Strength: clause.LockingStrengthUpdate, Options: clause.LockingOptionsNoWait}},
"SELECT * FROM `users` FOR UPDATE NOWAIT", nil, "SELECT * FROM `users` FOR UPDATE NOWAIT", nil,
}, },
{
[]clause.Interface{clause.Select{}, clause.From{}, clause.Locking{Strength: clause.LockingStrengthUpdate, Options: clause.LockingOptionsSkipLocked}},
"SELECT * FROM `users` FOR UPDATE SKIP LOCKED", nil,
},
} }
for idx, result := range results { for idx, result := range results {