purview 1.1.1 → 1.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 1369176b107aba11f52e4a8604fdfd440969f3e1
4
- data.tar.gz: 989bbb48900af7fb712c9745b505727bd4963d53
3
+ metadata.gz: e6b41c5fd1454de8cf72663944dddcb35b3a2ff3
4
+ data.tar.gz: 196b5bf64e43ff4788ea413ef2eb70776a766cf7
5
5
  SHA512:
6
- metadata.gz: 96aed3e255fe0a70bbaec213852a50da2ae7ddcf81ba9633a50d45ee6979cfdcfc1ffc614a5412c9b27964934d4b62bda405bb314f829acaa009133a4228964a
7
- data.tar.gz: 2a8645de4002ef60ba092c796d0099ab0ed2851bc54261cf9e494cc41999f434002fe4a04ec904d3e34a1c4b6b718f305aa9e4a7aa51971272ed5e4d5cbf47f4
6
+ metadata.gz: 5e87b88ea28caeccaa996255a08683fcb4d5fb73d24cf50a9a79fcb0646ad66e8594a4039b3752b53f2e4b2a9d9f0c4ced8755070927f6876814883185feee35
7
+ data.tar.gz: 4beefdf566cba05e3e3153601ae6170e41846b6a5f4c8a816ea49f6b01c82501883fe389e9412e1698cded2b35302f976b3cfd823e85588af2e4cbaae08cfadc
data/CHANGELOG CHANGED
@@ -1,3 +1,10 @@
1
+ Release 1.2.0
2
+ -------------
3
+
4
+ * Use system-time as opposed to assuming/forcing UTC time
5
+ * Add `sync_table` helper to `Database` class
6
+ * Eliminate explicit `return(s)` -- they were causing issues w/ `yield`
7
+
1
8
  Release 1.1.1
2
9
  -------------
3
10
 
@@ -34,9 +34,8 @@ module Purview
34
34
 
35
35
  def parse(value)
36
36
  blank = blank?(value)
37
- return nil if blank && nullable?
38
- raise %{Unexpected blank value for column: "#{name}"} if blank
39
- type.parse(value)
37
+ raise %{Unexpected blank value for column: "#{name}"} if blank && !nullable?
38
+ blank ? nil : type.parse(value)
40
39
  end
41
40
 
42
41
  def primary_key
@@ -9,26 +9,16 @@ module Purview
9
9
  end
10
10
 
11
11
  def baseline_table(table)
12
- with_context_logging('`baseline_table`') do
13
- raise Purview::Exceptions::WrongDatabase.new(table) \
14
- unless tables.include?(table)
15
- starting_timestamp = Time.now.utc
12
+ raise Purview::Exceptions::WrongDatabase.new(table) \
13
+ unless tables.include?(table)
14
+ table_name = table_name(table)
15
+ with_context_logging("`baseline_table` for: #{table_name}") do
16
+ starting_timestamp = timestamp
16
17
  with_table_locked(table, starting_timestamp) do
17
- last_window = nil
18
- begin
19
- with_new_connection do |connection|
20
- with_transaction(connection) do |transaction_timestamp|
21
- with_next_window(
22
- connection,
23
- table,
24
- transaction_timestamp
25
- ) do |window|
26
- table.sync(connection, window)
27
- last_window = window
28
- end
29
- end
30
- end
31
- end while last_window.max < starting_timestamp
18
+ loop do
19
+ last_window = sync_table_without_lock(table, timestamp)
20
+ break if last_window.max > starting_timestamp
21
+ end
32
22
  end
33
23
  end
34
24
  end
@@ -117,7 +107,7 @@ module Purview
117
107
  end
118
108
  end
119
109
 
120
- def enable_table(table, timestamp=Time.now.utc)
110
+ def enable_table(table, timestamp=timestamp)
121
111
  table_name = table_name(table)
122
112
  with_context_logging("`enable_table` for: #{table_name}") do
123
113
  with_new_connection do |connection|
@@ -130,12 +120,12 @@ module Purview
130
120
  end
131
121
  end
132
122
 
133
- def initialize_table(table, starting_timestamp=Time.now.utc)
123
+ def initialize_table(table, timestamp=timestamp)
134
124
  table_name = table_name(table)
135
125
  with_context_logging("`initialize_table` for: #{table_name}") do
136
126
  with_new_connection do |connection|
137
127
  rows_affected = \
138
- connection.execute(initialize_table_sql(table, starting_timestamp)).rows_affected
128
+ connection.execute(initialize_table_sql(table, timestamp)).rows_affected
139
129
  raise Purview::Exceptions::CouldNotInitialize.new(table) \
140
130
  if zero?(rows_affected)
141
131
  end
@@ -143,7 +133,7 @@ module Purview
143
133
  end
144
134
  end
145
135
 
146
- def lock_table(table, timestamp=Time.now.utc)
136
+ def lock_table(table, timestamp=timestamp)
147
137
  table_name = table_name(table)
148
138
  with_context_logging("`lock_table` for: #{table_name}") do
149
139
  with_new_connection do |connection|
@@ -158,24 +148,23 @@ module Purview
158
148
 
159
149
  def sync
160
150
  with_context_logging('`sync`') do
161
- with_new_connection do |connection|
162
- with_transaction(connection) do |transaction_timestamp|
163
- with_next_table(connection, transaction_timestamp) do |table|
164
- with_next_window(
165
- connection,
166
- table,
167
- transaction_timestamp
168
- ) do |window|
169
- with_table_locked(table, transaction_timestamp) do
170
- table.sync(connection, window)
171
- end
172
- end
173
- end
151
+ with_timestamp do |timestamp|
152
+ with_next_table(timestamp) do |table|
153
+ sync_table_with_lock(table, timestamp)
174
154
  end
175
155
  end
176
156
  end
177
157
  end
178
158
 
159
+ def sync_table(table)
160
+ raise Purview::Exceptions::WrongDatabase.new(table) \
161
+ unless tables.include?(table)
162
+ table_name = table_name(table)
163
+ with_context_logging("`sync_table` for: #{table_name}") do
164
+ sync_table_with_lock(table, timestamp)
165
+ end
166
+ end
167
+
179
168
  def unlock_table(table)
180
169
  table_name = table_name(table)
181
170
  with_context_logging("`unlock_table` for: #{table_name}") do
@@ -424,13 +413,12 @@ module Purview
424
413
  ]
425
414
  end
426
415
 
427
- def initialize_table_sql(table, starting_timestamp)
416
+ def initialize_table_sql(table, timestamp)
428
417
  raise %{All "#{Base}(s)" must override the "initialize_table_sql" method}
429
418
  end
430
419
 
431
420
  def limit(column)
432
- return nil if limitless_types.include?(column.type)
433
- column.limit || limit_map[column.type]
421
+ limitless_types.include?(column.type) ? nil : (column.limit || limit_map[column.type])
434
422
  end
435
423
 
436
424
  def limit_map
@@ -448,7 +436,7 @@ module Purview
448
436
  def next_table(connection, timestamp)
449
437
  row = connection.execute(next_table_sql(timestamp)).rows[0]
450
438
  table_name = row && row[table_metadata_table_name_column_name]
451
- table_name ? tables_by_name[table_name] : nil
439
+ table_name && tables_by_name[table_name]
452
440
  end
453
441
 
454
442
  def next_table_sql(timestamp)
@@ -459,9 +447,10 @@ module Purview
459
447
  min = get_max_timestamp_pulled_for_table(connection, table)
460
448
  max = min + table.window_size
461
449
  now = timestamp
462
- return nil if min > now
463
- max = now if max > now
464
- Purview::Structs::Window.new(:min => min, :max => max)
450
+ min > now ? nil : Purview::Structs::Window.new(
451
+ :min => min,
452
+ :max => max > now ? now : max
453
+ )
465
454
  end
466
455
 
467
456
  def null_value
@@ -516,6 +505,35 @@ module Purview
516
505
  raise %{All "#{Base}(s)" must override the "set_max_timestamp_pulled_for_table_sql" method}
517
506
  end
518
507
 
508
+ def sync_table_with_lock(table, timestamp)
509
+ last_window = nil
510
+ with_table_locked(table, timestamp) do
511
+ last_window = sync_table_without_lock(table, timestamp)
512
+ end
513
+ last_window
514
+ end
515
+
516
+ def sync_table_without_lock(table, timestamp)
517
+ last_window = nil
518
+ with_next_window(table, timestamp) do |window|
519
+ with_new_transaction do |connection|
520
+ table.sync(connection, window)
521
+ set_last_pulled_at_for_table(
522
+ connection,
523
+ table,
524
+ timestamp
525
+ )
526
+ set_max_timestamp_pulled_for_table(
527
+ connection,
528
+ table,
529
+ window.max
530
+ )
531
+ last_window = window
532
+ end
533
+ end
534
+ last_window
535
+ end
536
+
519
537
  def table_metadata_enabled_at_column_definition
520
538
  column = Purview::Columns::Timestamp.new(table_metadata_enabled_at_column_name)
521
539
  column_definition(column)
@@ -610,30 +628,24 @@ module Purview
610
628
  raise %{All "#{Base}(s)" must override the "unlock_table_sql" method}
611
629
  end
612
630
 
613
- def with_next_table(connection, timestamp)
614
- table = next_table(connection, timestamp)
615
- raise Purview::Exceptions::NoTable.new unless table
616
- yield table
617
- set_last_pulled_at_for_table(
618
- connection,
619
- table,
620
- timestamp
621
- )
631
+ def with_next_table(timestamp)
632
+ with_new_connection do |connection|
633
+ table = next_table(connection, timestamp)
634
+ raise Purview::Exceptions::NoTable.new unless table
635
+ yield table
636
+ end
622
637
  end
623
638
 
624
- def with_next_window(connection, table, timestamp)
625
- window = next_window(
626
- connection,
627
- table,
628
- timestamp
629
- )
630
- raise Purview::Exceptions::NoWindow.new(table) unless window
631
- yield window
632
- set_max_timestamp_pulled_for_table(
633
- connection,
634
- table,
635
- window.max
636
- )
639
+ def with_next_window(table, timestamp)
640
+ with_new_connection do |connection|
641
+ window = next_window(
642
+ connection,
643
+ table,
644
+ timestamp
645
+ )
646
+ raise Purview::Exceptions::NoWindow.new(table) unless window
647
+ yield window
648
+ end
637
649
  end
638
650
 
639
651
  def with_table_locked(table, timestamp)
@@ -642,10 +654,6 @@ module Purview
642
654
  ensure
643
655
  unlock_table(table)
644
656
  end
645
-
646
- def with_transaction(connection)
647
- connection.with_transaction { yield Time.now.utc }
648
- end
649
657
  end
650
658
  end
651
659
  end
@@ -97,11 +97,11 @@ module Purview
97
97
  ]
98
98
  end
99
99
 
100
- def initialize_table_sql(table, starting_timestamp)
100
+ def initialize_table_sql(table, timestamp)
101
101
  'UPDATE %s SET %s = %s WHERE %s = %s AND %s IS NULL' % [
102
102
  table_metadata_table_name,
103
103
  table_metadata_max_timestamp_pulled_column_name,
104
- quoted(starting_timestamp),
104
+ quoted(timestamp),
105
105
  table_metadata_table_name_column_name,
106
106
  quoted(table.name),
107
107
  table_metadata_max_timestamp_pulled_column_name,
@@ -97,11 +97,11 @@ module Purview
97
97
  ]
98
98
  end
99
99
 
100
- def initialize_table_sql(table, starting_timestamp)
100
+ def initialize_table_sql(table, timestamp)
101
101
  'UPDATE %s SET %s = %s WHERE %s = %s AND %s IS NULL' % [
102
102
  table_metadata_table_name,
103
103
  table_metadata_max_timestamp_pulled_column_name,
104
- quoted(starting_timestamp),
104
+ quoted(timestamp),
105
105
  table_metadata_table_name_column_name,
106
106
  quoted(table.name),
107
107
  table_metadata_max_timestamp_pulled_column_name,
@@ -18,6 +18,12 @@ module Purview
18
18
  def with_new_connection
19
19
  connection_type.with_new_connection(connection_opts) { |connection| yield connection }
20
20
  end
21
+
22
+ def with_new_transaction
23
+ with_new_connection do |connection|
24
+ connection.with_transaction { yield connection }
25
+ end
26
+ end
21
27
  end
22
28
  end
23
29
  end
@@ -21,6 +21,14 @@ module Purview
21
21
  !blank?(value)
22
22
  end
23
23
 
24
+ def timestamp
25
+ Time.now
26
+ end
27
+
28
+ def with_timestamp
29
+ yield timestamp
30
+ end
31
+
24
32
  def zero?(value)
25
33
  Integer(value).zero?
26
34
  end
@@ -29,15 +29,16 @@ module Purview
29
29
  end
30
30
 
31
31
  def extract_rows(result)
32
- return unless result
33
- metadata = result.getMetaData
34
- column_count = metadata.getColumnCount
35
- [].tap do |rows|
36
- while result.next
37
- rows << {}.tap do |row|
38
- (1..column_count).each do |index|
39
- column_name = metadata.getColumnName(index)
40
- row[column_name] = result.getString(column_name)
32
+ if result
33
+ metadata = result.getMetaData
34
+ column_count = metadata.getColumnCount
35
+ [].tap do |rows|
36
+ while result.next
37
+ rows << {}.tap do |row|
38
+ (1..column_count).each do |index|
39
+ column_name = metadata.getColumnName(index)
40
+ row[column_name] = result.getString(column_name)
41
+ end
41
42
  end
42
43
  end
43
44
  end
@@ -68,7 +68,7 @@ module Purview
68
68
  end
69
69
 
70
70
  def temporary_name
71
- "#{name}_#{Time.now.utc.to_i}"
71
+ "#{name}_#{timestamp.to_i}"
72
72
  end
73
73
 
74
74
  def updated_timestamp_column
@@ -81,6 +81,7 @@ module Purview
81
81
 
82
82
  private
83
83
 
84
+ include Purview::Mixins::Helpers
84
85
  include Purview::Mixins::Logger
85
86
 
86
87
  attr_reader :opts
@@ -1,3 +1,3 @@
1
1
  module Purview
2
- VERSION = '1.1.1'
2
+ VERSION = '1.2.0'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: purview
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.1
4
+ version: 1.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jonathan W. Zaleski
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-06-02 00:00:00.000000000 Z
11
+ date: 2015-06-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler