sq-dbsync 1.0.2 → 1.0.3
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.
|
@@ -51,6 +51,10 @@ module Sq::Dbsync::Database
|
|
|
51
51
|
|
|
52
52
|
"time without time zone" => "time",
|
|
53
53
|
"timestamp without time zone" => "datetime",
|
|
54
|
+
|
|
55
|
+
# mysql has no single-column representation for timestamp with time zone
|
|
56
|
+
"timestamp with time zone" => "datetime",
|
|
57
|
+
|
|
54
58
|
"boolean" => "char(1)"
|
|
55
59
|
}.fetch(db_type, db_type)
|
|
56
60
|
end
|
|
@@ -60,7 +64,7 @@ module Sq::Dbsync::Database
|
|
|
60
64
|
file = sql_to_file(sql)
|
|
61
65
|
|
|
62
66
|
cmd = "set -o pipefail; "
|
|
63
|
-
cmd += "psql --no-align --tuples-only -F '\t'"
|
|
67
|
+
cmd += "env PGTZ=utc psql --no-align --tuples-only -F '\t'"
|
|
64
68
|
cmd += " -U %s" % opts[:user] if opts[:user]
|
|
65
69
|
cmd += " -h %s" % opts[:host] if opts[:host]
|
|
66
70
|
cmd += " -p %i" % opts[:port] if opts[:port]
|
data/lib/sq/dbsync/version.rb
CHANGED
|
@@ -224,6 +224,37 @@ describe SQD::BatchLoadAction do
|
|
|
224
224
|
let(:source) { test_source(:postgres) }
|
|
225
225
|
|
|
226
226
|
it_should_behave_like 'a batch load'
|
|
227
|
-
end
|
|
228
227
|
|
|
228
|
+
it 'loads records with time zones' do
|
|
229
|
+
table_plan = {
|
|
230
|
+
table_name: :test_table,
|
|
231
|
+
source_table_name: :test_table,
|
|
232
|
+
columns: [:id, :col1, :updated_at, :ts_with_tz],
|
|
233
|
+
source_db: source,
|
|
234
|
+
indexes: index
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
action = SQD::BatchLoadAction.new(target,
|
|
238
|
+
table_plan,
|
|
239
|
+
registry,
|
|
240
|
+
SQD::Loggers::Null.new,
|
|
241
|
+
->{ @now })
|
|
242
|
+
|
|
243
|
+
create_pg_source_table_with(
|
|
244
|
+
id: 1,
|
|
245
|
+
col1: 'hello',
|
|
246
|
+
pii: 'don alias',
|
|
247
|
+
created_at: '2012-01-01 01:01:01',
|
|
248
|
+
updated_at: '2012-01-01 01:01:01',
|
|
249
|
+
ts_with_tz: '2012-01-01 01:01:01+02',
|
|
250
|
+
)
|
|
251
|
+
|
|
252
|
+
registry.ensure_storage_exists
|
|
253
|
+
|
|
254
|
+
action.call
|
|
255
|
+
|
|
256
|
+
target[:test_table].count.should == 1
|
|
257
|
+
target[:test_table].to_a.last[:ts_with_tz].should == Time.utc(2011, 12, 31, 23, 1, 1)
|
|
258
|
+
end
|
|
259
|
+
end
|
|
229
260
|
end
|
data/spec/integration_helper.rb
CHANGED
|
@@ -24,6 +24,30 @@ def create_source_table_with(*rows)
|
|
|
24
24
|
end
|
|
25
25
|
end
|
|
26
26
|
|
|
27
|
+
def create_pg_source_table_with(*rows)
|
|
28
|
+
# Total hack to allow source db to be passed as optional first argument.
|
|
29
|
+
if rows[0].is_a?(Hash)
|
|
30
|
+
source_db = source
|
|
31
|
+
else
|
|
32
|
+
source_db = rows.shift
|
|
33
|
+
end
|
|
34
|
+
table_name = :test_table
|
|
35
|
+
|
|
36
|
+
source_db.create_table! table_name do
|
|
37
|
+
primary_key :id
|
|
38
|
+
String :col1
|
|
39
|
+
String :pii
|
|
40
|
+
DateTime :updated_at
|
|
41
|
+
DateTime :created_at
|
|
42
|
+
DateTime :imported_at
|
|
43
|
+
column :ts_with_tz, 'timestamp with time zone'
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
rows.each do |row|
|
|
47
|
+
source_db[table_name].insert(row)
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
|
|
27
51
|
def setup_target_table(last_synced_at)
|
|
28
52
|
target.create_table! :test_table do
|
|
29
53
|
Integer :id
|
metadata
CHANGED
|
@@ -1,105 +1,105 @@
|
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: sq-dbsync
|
|
3
|
-
version: !ruby/object:Gem::Version
|
|
4
|
-
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
hash: 17
|
|
5
5
|
prerelease:
|
|
6
|
+
segments:
|
|
7
|
+
- 1
|
|
8
|
+
- 0
|
|
9
|
+
- 3
|
|
10
|
+
version: 1.0.3
|
|
6
11
|
platform: ruby
|
|
7
|
-
authors:
|
|
12
|
+
authors:
|
|
8
13
|
- Xavier Shay
|
|
9
14
|
- Damon McCormick
|
|
10
15
|
autorequire:
|
|
11
16
|
bindir: bin
|
|
12
17
|
cert_chain: []
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
18
|
+
|
|
19
|
+
date: 2013-04-16 00:00:00 Z
|
|
20
|
+
dependencies:
|
|
21
|
+
- !ruby/object:Gem::Dependency
|
|
16
22
|
name: rspec
|
|
17
|
-
requirement: !ruby/object:Gem::Requirement
|
|
18
|
-
none: false
|
|
19
|
-
requirements:
|
|
20
|
-
- - ~>
|
|
21
|
-
- !ruby/object:Gem::Version
|
|
22
|
-
version: '2.0'
|
|
23
|
-
type: :development
|
|
24
23
|
prerelease: false
|
|
25
|
-
|
|
24
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
|
26
25
|
none: false
|
|
27
|
-
requirements:
|
|
26
|
+
requirements:
|
|
28
27
|
- - ~>
|
|
29
|
-
- !ruby/object:Gem::Version
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
requirements:
|
|
36
|
-
- - ! '>='
|
|
37
|
-
- !ruby/object:Gem::Version
|
|
38
|
-
version: '0'
|
|
28
|
+
- !ruby/object:Gem::Version
|
|
29
|
+
hash: 3
|
|
30
|
+
segments:
|
|
31
|
+
- 2
|
|
32
|
+
- 0
|
|
33
|
+
version: "2.0"
|
|
39
34
|
type: :development
|
|
35
|
+
version_requirements: *id001
|
|
36
|
+
- !ruby/object:Gem::Dependency
|
|
37
|
+
name: rake
|
|
40
38
|
prerelease: false
|
|
41
|
-
|
|
42
|
-
none: false
|
|
43
|
-
requirements:
|
|
44
|
-
- - ! '>='
|
|
45
|
-
- !ruby/object:Gem::Version
|
|
46
|
-
version: '0'
|
|
47
|
-
- !ruby/object:Gem::Dependency
|
|
48
|
-
name: simplecov
|
|
49
|
-
requirement: !ruby/object:Gem::Requirement
|
|
39
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
|
50
40
|
none: false
|
|
51
|
-
requirements:
|
|
52
|
-
- -
|
|
53
|
-
- !ruby/object:Gem::Version
|
|
54
|
-
|
|
41
|
+
requirements:
|
|
42
|
+
- - ">="
|
|
43
|
+
- !ruby/object:Gem::Version
|
|
44
|
+
hash: 3
|
|
45
|
+
segments:
|
|
46
|
+
- 0
|
|
47
|
+
version: "0"
|
|
55
48
|
type: :development
|
|
49
|
+
version_requirements: *id002
|
|
50
|
+
- !ruby/object:Gem::Dependency
|
|
51
|
+
name: simplecov
|
|
56
52
|
prerelease: false
|
|
57
|
-
|
|
58
|
-
none: false
|
|
59
|
-
requirements:
|
|
60
|
-
- - ! '>='
|
|
61
|
-
- !ruby/object:Gem::Version
|
|
62
|
-
version: '0'
|
|
63
|
-
- !ruby/object:Gem::Dependency
|
|
64
|
-
name: cane
|
|
65
|
-
requirement: !ruby/object:Gem::Requirement
|
|
53
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
|
66
54
|
none: false
|
|
67
|
-
requirements:
|
|
68
|
-
- -
|
|
69
|
-
- !ruby/object:Gem::Version
|
|
70
|
-
|
|
55
|
+
requirements:
|
|
56
|
+
- - ">="
|
|
57
|
+
- !ruby/object:Gem::Version
|
|
58
|
+
hash: 3
|
|
59
|
+
segments:
|
|
60
|
+
- 0
|
|
61
|
+
version: "0"
|
|
71
62
|
type: :development
|
|
63
|
+
version_requirements: *id003
|
|
64
|
+
- !ruby/object:Gem::Dependency
|
|
65
|
+
name: cane
|
|
72
66
|
prerelease: false
|
|
73
|
-
|
|
67
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
|
74
68
|
none: false
|
|
75
|
-
requirements:
|
|
76
|
-
- -
|
|
77
|
-
- !ruby/object:Gem::Version
|
|
78
|
-
|
|
79
|
-
|
|
69
|
+
requirements:
|
|
70
|
+
- - ">="
|
|
71
|
+
- !ruby/object:Gem::Version
|
|
72
|
+
hash: 3
|
|
73
|
+
segments:
|
|
74
|
+
- 0
|
|
75
|
+
version: "0"
|
|
76
|
+
type: :development
|
|
77
|
+
version_requirements: *id004
|
|
78
|
+
- !ruby/object:Gem::Dependency
|
|
80
79
|
name: sequel
|
|
81
|
-
requirement: !ruby/object:Gem::Requirement
|
|
82
|
-
none: false
|
|
83
|
-
requirements:
|
|
84
|
-
- - ! '>='
|
|
85
|
-
- !ruby/object:Gem::Version
|
|
86
|
-
version: '0'
|
|
87
|
-
type: :runtime
|
|
88
80
|
prerelease: false
|
|
89
|
-
|
|
81
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
|
90
82
|
none: false
|
|
91
|
-
requirements:
|
|
92
|
-
- -
|
|
93
|
-
- !ruby/object:Gem::Version
|
|
94
|
-
|
|
83
|
+
requirements:
|
|
84
|
+
- - ">="
|
|
85
|
+
- !ruby/object:Gem::Version
|
|
86
|
+
hash: 3
|
|
87
|
+
segments:
|
|
88
|
+
- 0
|
|
89
|
+
version: "0"
|
|
90
|
+
type: :runtime
|
|
91
|
+
version_requirements: *id005
|
|
95
92
|
description: Column based, timestamp replication of MySQL and Postgres databases.
|
|
96
|
-
email:
|
|
93
|
+
email:
|
|
97
94
|
- xavier@squareup.com
|
|
98
95
|
- damon@squaerup.com
|
|
99
96
|
executables: []
|
|
97
|
+
|
|
100
98
|
extensions: []
|
|
99
|
+
|
|
101
100
|
extra_rdoc_files: []
|
|
102
|
-
|
|
101
|
+
|
|
102
|
+
files:
|
|
103
103
|
- spec/acceptance/loading_spec.rb
|
|
104
104
|
- spec/acceptance_helper.rb
|
|
105
105
|
- spec/database_helper.rb
|
|
@@ -145,30 +145,38 @@ files:
|
|
|
145
145
|
- sq-dbsync.gemspec
|
|
146
146
|
homepage: http://github.com/square/sq-dbsync
|
|
147
147
|
licenses: []
|
|
148
|
+
|
|
148
149
|
post_install_message:
|
|
149
150
|
rdoc_options: []
|
|
150
|
-
|
|
151
|
+
|
|
152
|
+
require_paths:
|
|
151
153
|
- lib
|
|
152
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
|
154
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
153
155
|
none: false
|
|
154
|
-
requirements:
|
|
155
|
-
- -
|
|
156
|
-
- !ruby/object:Gem::Version
|
|
157
|
-
|
|
158
|
-
|
|
156
|
+
requirements:
|
|
157
|
+
- - ">="
|
|
158
|
+
- !ruby/object:Gem::Version
|
|
159
|
+
hash: 3
|
|
160
|
+
segments:
|
|
161
|
+
- 0
|
|
162
|
+
version: "0"
|
|
163
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
159
164
|
none: false
|
|
160
|
-
requirements:
|
|
161
|
-
- -
|
|
162
|
-
- !ruby/object:Gem::Version
|
|
163
|
-
|
|
165
|
+
requirements:
|
|
166
|
+
- - ">="
|
|
167
|
+
- !ruby/object:Gem::Version
|
|
168
|
+
hash: 3
|
|
169
|
+
segments:
|
|
170
|
+
- 0
|
|
171
|
+
version: "0"
|
|
164
172
|
requirements: []
|
|
173
|
+
|
|
165
174
|
rubyforge_project:
|
|
166
175
|
rubygems_version: 1.8.25
|
|
167
176
|
signing_key:
|
|
168
177
|
specification_version: 3
|
|
169
|
-
summary: Column based, timestamp replication of MySQL and Postgres databases. Uses
|
|
170
|
-
|
|
171
|
-
test_files:
|
|
178
|
+
summary: Column based, timestamp replication of MySQL and Postgres databases. Uses Ruby for the glue code but pushes the heavy lifting on to the database.
|
|
179
|
+
test_files:
|
|
172
180
|
- spec/acceptance/loading_spec.rb
|
|
173
181
|
- spec/acceptance_helper.rb
|
|
174
182
|
- spec/database_helper.rb
|
|
@@ -185,3 +193,4 @@ test_files:
|
|
|
185
193
|
- spec/unit/pipeline_spec.rb
|
|
186
194
|
- spec/unit/stream_logger_spec.rb
|
|
187
195
|
- spec/unit_helper.rb
|
|
196
|
+
has_rdoc: false
|