locking.go 834 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. package clause
  2. type For struct {
  3. Lockings []Locking
  4. }
  5. type Locking struct {
  6. Strength string
  7. Table Table
  8. Options string
  9. }
  10. // Name where clause name
  11. func (f For) Name() string {
  12. return "FOR"
  13. }
  14. // Build build where clause
  15. func (f For) Build(builder Builder) {
  16. for idx, locking := range f.Lockings {
  17. if idx > 0 {
  18. builder.WriteByte(' ')
  19. }
  20. builder.Write("FOR ")
  21. builder.Write(locking.Strength)
  22. if locking.Table.Name != "" {
  23. builder.Write(" OF ")
  24. builder.WriteQuoted(locking.Table)
  25. }
  26. if locking.Options != "" {
  27. builder.WriteByte(' ')
  28. builder.Write(locking.Options)
  29. }
  30. }
  31. }
  32. // MergeClause merge order by clauses
  33. func (f For) MergeClause(clause *Clause) {
  34. clause.Name = ""
  35. if v, ok := clause.Expression.(For); ok {
  36. f.Lockings = append(v.Lockings, f.Lockings...)
  37. }
  38. clause.Expression = f
  39. }