http urls monitor.

batch.go 1.6KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. package sqlbuilder
  2. // BatchInserter provides a helper that can be used to do massive insertions in
  3. // batches.
  4. type BatchInserter struct {
  5. inserter *inserter
  6. size int
  7. values chan []interface{}
  8. err error
  9. }
  10. func newBatchInserter(inserter *inserter, size int) *BatchInserter {
  11. if size < 1 {
  12. size = 1
  13. }
  14. b := &BatchInserter{
  15. inserter: inserter,
  16. size: size,
  17. values: make(chan []interface{}, size),
  18. }
  19. return b
  20. }
  21. // Values pushes column values to be inserted as part of the batch.
  22. func (b *BatchInserter) Values(values ...interface{}) *BatchInserter {
  23. b.values <- values
  24. return b
  25. }
  26. func (b *BatchInserter) nextQuery() *inserter {
  27. ins := &inserter{}
  28. *ins = *b.inserter
  29. i := 0
  30. for values := range b.values {
  31. i++
  32. ins = ins.Values(values...).(*inserter)
  33. if i == b.size {
  34. break
  35. }
  36. }
  37. if i == 0 {
  38. return nil
  39. }
  40. return ins
  41. }
  42. // NextResult is useful when using PostgreSQL and Returning(), it dumps the
  43. // next slice of results to dst, which can mean having the IDs of all inserted
  44. // elements in the batch.
  45. func (b *BatchInserter) NextResult(dst interface{}) bool {
  46. clone := b.nextQuery()
  47. if clone == nil {
  48. return false
  49. }
  50. b.err = clone.Iterator().All(dst)
  51. return (b.err == nil)
  52. }
  53. // Done means that no more elements are going to be added.
  54. func (b *BatchInserter) Done() {
  55. close(b.values)
  56. }
  57. // Wait blocks until the whole batch is executed.
  58. func (b *BatchInserter) Wait() error {
  59. for {
  60. q := b.nextQuery()
  61. if q == nil {
  62. break
  63. }
  64. if _, err := q.Exec(); err != nil {
  65. b.err = err
  66. break
  67. }
  68. }
  69. return b.Err()
  70. }
  71. // Err returns any error while executing the batch.
  72. func (b *BatchInserter) Err() error {
  73. return b.err
  74. }