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

View File

@ -14,17 +14,21 @@ func TestLocking(t *testing.T) {
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,
},
{
[]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,
},
{
[]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,
},
{
[]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 {