Advertisement
Guest User

Untitled

a guest
Feb 23rd, 2020
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.32 KB | None | 0 0
  1.  
  2. (defn rollback
  3. [conn &opt v]
  4. (signal 0 [conn @[:rollback v]]))
  5.  
  6. (defn commit
  7. [conn &opt v]
  8. (signal 0 [conn @[:commit v]]))
  9.  
  10. (defn txn*
  11. "function form of txn"
  12. [conn options ftx]
  13. (def retry (get options :retry false))
  14. (def mode (get options :mode ""))
  15. (try
  16. (do
  17. (exec conn (string "begin " mode ";"))
  18. (def fb (fiber/new ftx :i0123))
  19. (def v (resume fb))
  20. (if (= (fiber/status fb) :dead)
  21. (do
  22. (exec conn "commit;")
  23. v)
  24. (if (and (= (fiber/status fb) :user0)
  25. (= (get v 0) conn))
  26. (let [action (get-in v [0 0])
  27. value (get-in v [0 1])]
  28. (case action
  29. :commit
  30. (do
  31. (exec conn "commit;")
  32. value)
  33. :rollback
  34. (do
  35. (exec conn "rollback;")
  36. value)
  37. (error "misuse of txn* error")))
  38. (do
  39. (exec conn "rollback;")
  40. (propagate v fb)))))
  41. ([err f]
  42. (if (and
  43. retry
  44. (error? err)
  45. (= (result-error-field err PG_DIAG_SQLSTATE) "40001"))
  46. (txn* conn options ftx)
  47. (do
  48. (unless (= (status conn) CONNECTION_BAD)
  49. (exec conn "rollback;"))
  50. (propagate err f))))))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement