http urls monitor.

delete.go 3.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. package sqlbuilder
  2. import (
  3. "context"
  4. "database/sql"
  5. "upper.io/db.v3/internal/immutable"
  6. "upper.io/db.v3/internal/sqladapter/exql"
  7. )
  8. type deleterQuery struct {
  9. table string
  10. limit int
  11. where *exql.Where
  12. whereArgs []interface{}
  13. amendFn func(string) string
  14. }
  15. func (dq *deleterQuery) and(b *sqlBuilder, terms ...interface{}) error {
  16. where, whereArgs := b.t.toWhereWithArguments(terms)
  17. if dq.where == nil {
  18. dq.where, dq.whereArgs = &exql.Where{}, []interface{}{}
  19. }
  20. dq.where.Append(&where)
  21. dq.whereArgs = append(dq.whereArgs, whereArgs...)
  22. return nil
  23. }
  24. func (dq *deleterQuery) statement() *exql.Statement {
  25. stmt := &exql.Statement{
  26. Type: exql.Delete,
  27. Table: exql.TableWithName(dq.table),
  28. }
  29. if dq.where != nil {
  30. stmt.Where = dq.where
  31. }
  32. if dq.limit != 0 {
  33. stmt.Limit = exql.Limit(dq.limit)
  34. }
  35. stmt.SetAmendment(dq.amendFn)
  36. return stmt
  37. }
  38. type deleter struct {
  39. builder *sqlBuilder
  40. fn func(*deleterQuery) error
  41. prev *deleter
  42. }
  43. var _ = immutable.Immutable(&deleter{})
  44. func (del *deleter) SQLBuilder() *sqlBuilder {
  45. if del.prev == nil {
  46. return del.builder
  47. }
  48. return del.prev.SQLBuilder()
  49. }
  50. func (del *deleter) template() *exql.Template {
  51. return del.SQLBuilder().t.Template
  52. }
  53. func (del *deleter) String() string {
  54. s, err := del.Compile()
  55. if err != nil {
  56. panic(err.Error())
  57. }
  58. return prepareQueryForDisplay(s)
  59. }
  60. func (del *deleter) setTable(table string) *deleter {
  61. return del.frame(func(uq *deleterQuery) error {
  62. uq.table = table
  63. return nil
  64. })
  65. }
  66. func (del *deleter) frame(fn func(*deleterQuery) error) *deleter {
  67. return &deleter{prev: del, fn: fn}
  68. }
  69. func (del *deleter) Where(terms ...interface{}) Deleter {
  70. return del.frame(func(dq *deleterQuery) error {
  71. dq.where, dq.whereArgs = &exql.Where{}, []interface{}{}
  72. return dq.and(del.SQLBuilder(), terms...)
  73. })
  74. }
  75. func (del *deleter) And(terms ...interface{}) Deleter {
  76. return del.frame(func(dq *deleterQuery) error {
  77. return dq.and(del.SQLBuilder(), terms...)
  78. })
  79. }
  80. func (del *deleter) Limit(limit int) Deleter {
  81. return del.frame(func(dq *deleterQuery) error {
  82. dq.limit = limit
  83. return nil
  84. })
  85. }
  86. func (del *deleter) Amend(fn func(string) string) Deleter {
  87. return del.frame(func(dq *deleterQuery) error {
  88. dq.amendFn = fn
  89. return nil
  90. })
  91. }
  92. func (dq *deleterQuery) arguments() []interface{} {
  93. return joinArguments(dq.whereArgs)
  94. }
  95. func (del *deleter) Arguments() []interface{} {
  96. dq, err := del.build()
  97. if err != nil {
  98. return nil
  99. }
  100. return dq.arguments()
  101. }
  102. func (del *deleter) Prepare() (*sql.Stmt, error) {
  103. return del.PrepareContext(del.SQLBuilder().sess.Context())
  104. }
  105. func (del *deleter) PrepareContext(ctx context.Context) (*sql.Stmt, error) {
  106. dq, err := del.build()
  107. if err != nil {
  108. return nil, err
  109. }
  110. return del.SQLBuilder().sess.StatementPrepare(ctx, dq.statement())
  111. }
  112. func (del *deleter) Exec() (sql.Result, error) {
  113. return del.ExecContext(del.SQLBuilder().sess.Context())
  114. }
  115. func (del *deleter) ExecContext(ctx context.Context) (sql.Result, error) {
  116. dq, err := del.build()
  117. if err != nil {
  118. return nil, err
  119. }
  120. return del.SQLBuilder().sess.StatementExec(ctx, dq.statement(), dq.arguments()...)
  121. }
  122. func (del *deleter) statement() (*exql.Statement, error) {
  123. iq, err := del.build()
  124. if err != nil {
  125. return nil, err
  126. }
  127. return iq.statement(), nil
  128. }
  129. func (del *deleter) build() (*deleterQuery, error) {
  130. dq, err := immutable.FastForward(del)
  131. if err != nil {
  132. return nil, err
  133. }
  134. return dq.(*deleterQuery), nil
  135. }
  136. func (del *deleter) Compile() (string, error) {
  137. s, err := del.statement()
  138. if err != nil {
  139. return "", err
  140. }
  141. return s.Compile(del.template())
  142. }
  143. func (del *deleter) Prev() immutable.Immutable {
  144. if del == nil {
  145. return nil
  146. }
  147. return del.prev
  148. }
  149. func (del *deleter) Fn(in interface{}) error {
  150. if del.fn == nil {
  151. return nil
  152. }
  153. return del.fn(in.(*deleterQuery))
  154. }
  155. func (del *deleter) Base() interface{} {
  156. return &deleterQuery{}
  157. }