From c95e45f45e3c02e590d898f7bf20466ec4a3874d Mon Sep 17 00:00:00 2001 From: dogenkigen Date: Mon, 4 Dec 2023 13:36:45 +0100 Subject: [PATCH] Making locking parameters more intuitive --- clause/locking.go | 22 ++++++++++++++++++---- clause/locking_test.go | 10 +++++++--- 2 files changed, 25 insertions(+), 7 deletions(-) diff --git a/clause/locking.go b/clause/locking.go index 290aac92..53295b85 100644 --- a/clause/locking.go +++ b/clause/locking.go @@ -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)) } } diff --git a/clause/locking_test.go b/clause/locking_test.go index 0e607312..e45c8e7d 100644 --- a/clause/locking_test.go +++ b/clause/locking_test.go @@ -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 {