em-pg-client-helper 0.1.1 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -48,16 +48,17 @@ module PG::EM::Client::Helper
48
48
  #
49
49
  # Calling this method opens up a transaction (by executing `BEGIN`), and
50
50
  # then runs the supplied block, passing in a transaction object which you
51
- # can use to execute SQL commands. When the block completes, a `COMMIT`
52
- # will automatically be executed, unless you have manually called
53
- # `txn.commit` or `txn.rollback`. Since `db_transaction` returns a
54
- # deferrable, you should use `#callback` to specify what to run after the
55
- # transaction completes.
51
+ # can use to execute SQL commands. You *must* call `txn.commit` or
52
+ # `txn.callback` yourself as your inner-most callback, otherwise you will
53
+ # leave the connection in a weird limbo state.
54
+ #
55
+ # Since `db_transaction` returns a deferrable, you should use `#callback`
56
+ # to specify what to run after the transaction completes.
56
57
  #
57
58
  # If an SQL error occurs during the transaction, the block's execution
58
59
  # will be aborted, a `ROLLBACK` will be executed, and the `#errback`
59
- # block (if defined) on the deferrable will be executed (rather than the
60
- # `#callback` block).
60
+ # block (if defined) on the deferrable that `db_transaction` returns will
61
+ # be executed (rather than the `#callback` block).
61
62
  #
62
63
  # Arguments:
63
64
  #
@@ -71,7 +72,10 @@ module PG::EM::Client::Helper
71
72
  # of the transaction. This block will be passed a
72
73
  # `PG::EM::Client::Helper::Transaction` instance, which has methods to
73
74
  # allow you to commit or rollback the transaction, and execute SQL
74
- # statements within the context of the transaction.
75
+ # statements within the context of the transaction. This block *must*
76
+ # return a deferrable. When that returned deferrable completes, a
77
+ # COMMIT will be triggered automatically. If that deferrable fails,
78
+ # a ROLLBACK will be sent, instead.
75
79
  #
76
80
  # Returns a deferrable object, on which you can call `#callback` and
77
81
  # `#errback` to define what to do when the transaction succeeds or fails,
@@ -79,7 +83,7 @@ module PG::EM::Client::Helper
79
83
  #
80
84
  def db_transaction(db, opts = {}, &blk)
81
85
  if db.is_a? PG::EM::ConnectionPool
82
- db.__send__(:hold_deferrable) do |conn|
86
+ db.__send__(:hold_deferred) do |conn|
83
87
  ::PG::EM::Client::Helper::Transaction.new(conn, opts, &blk)
84
88
  end
85
89
  else
@@ -108,7 +112,6 @@ module PG::EM::Client::Helper
108
112
 
109
113
  conn.exec_defer("BEGIN").callback do
110
114
  blk.call(self)
111
- commit if @active
112
115
  end.errback { |ex| rollback(ex) }
113
116
  end
114
117
 
@@ -131,9 +134,11 @@ module PG::EM::Client::Helper
131
134
  # event of a database error or other exception.
132
135
  #
133
136
  def rollback(ex)
134
- @conn.exec_defer("ROLLBACK") do
135
- @active = false
136
- self.fail(ex)
137
+ if @active
138
+ @conn.exec_defer("ROLLBACK") do
139
+ @active = false
140
+ self.fail(ex)
141
+ end
137
142
  end
138
143
  end
139
144
 
@@ -158,9 +163,9 @@ module PG::EM::Client::Helper
158
163
  "Cannot execute a query in a transaction that has been closed"
159
164
  end
160
165
 
161
- df = @conn.exec_defer(sql, values).
162
- errback { |ex| rollback(ex) }
163
- df.callback(&blk) if blk
166
+ @conn.exec_defer(sql, values).
167
+ errback { |ex| rollback(ex) }.
168
+ tap { |df| df.callback(&blk) if blk }
164
169
  end
165
170
  end
166
171
  end
@@ -31,19 +31,19 @@ describe "PG::EM::Client::Helper#db_transaction" do
31
31
 
32
32
  it "runs a BEGIN/COMMIT cycle by default" do
33
33
  mock_query_chain([["BEGIN"], ["COMMIT"]]) do
34
- # Nothing
34
+ EM::DefaultDeferrable.new.tap { |df| df.succeed }
35
35
  end
36
36
  end
37
37
 
38
38
  it "rolls back if BEGIN fails" do
39
39
  mock_query_chain([["BEGIN"], ["ROLLBACK"]], 0) do
40
- # Nothing
40
+ EM::DefaultDeferrable.new.tap { |df| df.succeed }
41
41
  end
42
42
  end
43
43
 
44
44
  it "rolls back if COMMIT fails" do
45
45
  mock_query_chain([["BEGIN"], ["COMMIT"], ["ROLLBACK"]], 1) do
46
- # Nothing
46
+ EM::DefaultDeferrable.new.tap { |df| df.succeed }
47
47
  end
48
48
  end
49
49
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: em-pg-client-helper
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.2.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2014-10-21 00:00:00.000000000 Z
12
+ date: 2014-10-23 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: git-version-bump
@@ -236,7 +236,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
236
236
  version: '0'
237
237
  segments:
238
238
  - 0
239
- hash: -2023776752281468626
239
+ hash: 3974973386782984490
240
240
  required_rubygems_version: !ruby/object:Gem::Requirement
241
241
  none: false
242
242
  requirements:
@@ -245,7 +245,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
245
245
  version: '0'
246
246
  segments:
247
247
  - 0
248
- hash: -2023776752281468626
248
+ hash: 3974973386782984490
249
249
  requirements: []
250
250
  rubyforge_project:
251
251
  rubygems_version: 1.8.23