pg_versions 2.0 → 2.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f9b1174e7cd188f4950927c333ada56e38efa995668e613faac794dfe1a12f99
4
- data.tar.gz: 93bef8d80d24f74577c88789291d17c1ad7b585b53aa65ed7b639a6e9bed039d
3
+ metadata.gz: f6eab4d5b85196e9a17fe15efdb09cb6ef83d6821a060c40a5c68e3fae7c9fed
4
+ data.tar.gz: ff1c5c4157163144f7bb1808115c52e50438d8119415b7ea19df18e82e9d5bcd
5
5
  SHA512:
6
- metadata.gz: a883f123cb0ba892d37fd27ad9fa795a399c0903719670f011226b638429dd719990c2334d0bac1e65c167493130350df050e3ee6ce10c51f8bb52a9194336e8
7
- data.tar.gz: 1daf1d513b2de942cfae39b74c2113a75129ccc2b47e9ed87f97fee20e3dc4b20742d808ff56bd6a4edac6d61a545a116bd7cf4621eebd4ea94ee6ab616fa3ba
6
+ metadata.gz: 12c82c86f3138b9b27eaade5a3eb97779b246de26a680de3e23e6d99daa576cc56a1b04ce2c8b82b81f72f8402a73f5eb2e5e7d4babb57651d458317f40eeea5
7
+ data.tar.gz: 70c41180db0eff19a524f1b65165800c08a50a22ddf25f07daaacb58a0c0b901e0bbf22b620f61499f52788ec4d9120de373b2cdbb3a1aaae3d02481dc211bd3
@@ -81,6 +81,7 @@ module PgVersions
81
81
 
82
82
  #TODO: ensure this is called only once per transaction, or that all bumps occur in the same order in all transactions, to avoid deadlocks
83
83
  def self.bump(*channels, connection: nil)
84
+ #TODO: pg_connection.exec returned nil once during testing.
84
85
  PgVersions.with_connection(connection) { |pg_connection|
85
86
  channels = [channels].flatten.sort
86
87
  return {} if channels.size == 0
@@ -107,7 +108,9 @@ module PgVersions
107
108
  FROM
108
109
  to_bump
109
110
  JOIN updated ON to_bump.channel = updated.channel;
110
- ").map { |row| [channels[Integer(row["i"])], string_to_version(row["version"])] }.to_h
111
+ ") { |result|
112
+ result.map { |row| [channels[Integer(row["i"])], string_to_version(row["version"])] }.to_h
113
+ }
111
114
  }
112
115
  end
113
116
 
@@ -130,8 +133,10 @@ module PgVersions
130
133
  JOIN pg_versions ON pg_versions.channel = channels.channel
131
134
  ORDER BY
132
135
  i DESC;
133
- ").each { |row|
134
- versions[channels.delete_at(Integer(row["i"]))] = string_to_version(row["version"])
136
+ ") { |result|
137
+ result.each { |row|
138
+ versions[channels.delete_at(Integer(row["i"]))] = string_to_version(row["version"])
139
+ }
135
140
  }
136
141
  #TODO: bump in the same query instead of calling bump
137
142
  versions.merge!(self.bump(channels, connection: pg_connection)) if channels.size > 0
@@ -186,7 +191,6 @@ module PgVersions
186
191
  listen(pg_connection, channel)
187
192
  }
188
193
  read(pg_connection, @subscribers.keys).each_pair { |channel, version|
189
- #p channel, version
190
194
  @subscribers[channel].each { |subscriber|
191
195
  subscriber.notify({ channel => version })
192
196
  }
@@ -305,8 +309,8 @@ module PgVersions
305
309
  end
306
310
 
307
311
 
308
- def subscribe(*channels, known: {})
309
- subscription = Subscription.new(@connection_thread)
312
+ def subscribe(*channels, known: {}, batch_delay: 0.01)
313
+ subscription = Subscription.new(@connection_thread, batch_delay)
310
314
  subscription.subscribe([channels].flatten, known: known)
311
315
  if block_given?
312
316
  Thread.handle_interrupt(Object => :never) {
@@ -326,8 +330,9 @@ module PgVersions
326
330
 
327
331
  class Subscription
328
332
 
329
- def initialize(connection_thread)
333
+ def initialize(connection_thread, batch_delay)
330
334
  @connection_thread = connection_thread
335
+ @batch_delay = batch_delay
331
336
  @notifications = Queue.new
332
337
  @already_known_versions = Hash.new { |h,k| h[k] = [] }
333
338
  @channels = Hash.new(0)
@@ -375,17 +380,23 @@ module PgVersions
375
380
 
376
381
 
377
382
  #TODO: make this resume-able after forced exception
378
- def wait(new_already_known_versions = {})
383
+ def wait(new_already_known_versions = {}, batch_delay: nil)
384
+ batch_delay = @batch_delay if batch_delay.nil?
379
385
  update_already_known_versions(new_already_known_versions)
380
386
  loop {
381
- versions = @notifications.shift
382
- return nil if not versions #termination
383
- changed_versions = versions.to_a.map { |channel, version|
384
- if (@already_known_versions[channel] <=> version) == -1
385
- @already_known_versions[channel] = version
386
- [channel, version]
387
- end
388
- }.compact.to_h
387
+ events = [@notifications.shift]
388
+ sleep batch_delay if batch_delay
389
+ events << @notifications.shift while not @notifications.empty?
390
+ changed_versions = {}
391
+ events.each { |versions|
392
+ return nil if not versions #termination
393
+ versions.each { |channel, version|
394
+ if (@already_known_versions[channel] <=> version) == -1
395
+ @already_known_versions[channel] = version
396
+ changed_versions[channel] = version
397
+ end
398
+ }
399
+ }
389
400
  if changed_versions.size > 0
390
401
  return Notification.new(changed_versions, @already_known_versions.dup)
391
402
  end
@@ -393,9 +404,9 @@ module PgVersions
393
404
  end
394
405
 
395
406
 
396
- def each(new_already_known_versions = {})
407
+ def each(new_already_known_versions = {}, batch_delay: nil)
397
408
  update_already_known_versions(new_already_known_versions)
398
- while notification = wait()
409
+ while notification = wait(batch_delay: batch_delay)
399
410
  yield notification
400
411
  end
401
412
  end
@@ -1,3 +1,3 @@
1
1
  module PgVersions
2
- VERSION = "2.0"
2
+ VERSION = "2.1"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pg_versions
3
3
  version: !ruby/object:Gem::Version
4
- version: '2.0'
4
+ version: '2.1'
5
5
  platform: ruby
6
6
  authors:
7
7
  - yunta
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-01-08 00:00:00.000000000 Z
11
+ date: 2023-01-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec