sq-dbsync 1.0.1 → 1.0.2
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.
@@ -12,7 +12,9 @@ module Sq::Dbsync::Database
|
|
12
12
|
def self.create(opts)
|
13
13
|
case opts[:brand]
|
14
14
|
when 'mysql'
|
15
|
-
Sq::Dbsync::Database::Mysql.new(Sequel.connect(opts))
|
15
|
+
db = Sq::Dbsync::Database::Mysql.new(Sequel.connect(opts))
|
16
|
+
db.charset = opts[:charset] if opts[:charset]
|
17
|
+
db
|
16
18
|
when 'postgresql'
|
17
19
|
Sq::Dbsync::Database::Postgres.new(Sequel.connect(opts))
|
18
20
|
else
|
@@ -16,6 +16,8 @@ module Sq::Dbsync::Database
|
|
16
16
|
|
17
17
|
include Common
|
18
18
|
|
19
|
+
attr_accessor :charset
|
20
|
+
|
19
21
|
def initialize(db)
|
20
22
|
super
|
21
23
|
@db = db
|
@@ -25,9 +27,11 @@ module Sq::Dbsync::Database
|
|
25
27
|
|
26
28
|
def load_from_file(table_name, columns, file_name)
|
27
29
|
ensure_connection
|
28
|
-
|
30
|
+
character_set = self.charset ? " character set #{self.charset}" : ""
|
31
|
+
sql = "LOAD DATA INFILE '%s' IGNORE INTO TABLE %s %s (%s)" % [
|
29
32
|
file_name,
|
30
33
|
table_name,
|
34
|
+
character_set,
|
31
35
|
escape_columns(columns)
|
32
36
|
]
|
33
37
|
db.run sql
|
@@ -42,9 +46,11 @@ module Sq::Dbsync::Database
|
|
42
46
|
# Very low lock wait timeout, since we don't want loads to be blocked
|
43
47
|
# waiting for long queries.
|
44
48
|
set_lock_timeout(10)
|
45
|
-
|
49
|
+
character_set = self.charset ? " character set #{self.charset}" : ""
|
50
|
+
db.run "LOAD DATA INFILE '%s' REPLACE INTO TABLE %s %s (%s)" % [
|
46
51
|
file_name,
|
47
52
|
table_name,
|
53
|
+
character_set,
|
48
54
|
escape_columns(columns)
|
49
55
|
]
|
50
56
|
rescue Sequel::DatabaseError => e
|
@@ -134,6 +140,9 @@ module Sq::Dbsync::Database
|
|
134
140
|
cmd += " -p%s" % opts[:password] if opts[:password]
|
135
141
|
cmd += " -h %s" % opts[:host] if opts[:host]
|
136
142
|
cmd += " -P %i" % opts[:port] if opts[:port]
|
143
|
+
|
144
|
+
cmd += " --default-character-set %s" % opts[:charset] if opts[:charset]
|
145
|
+
|
137
146
|
cmd += " %s" % opts.fetch(:database)
|
138
147
|
|
139
148
|
# This option prevents mysql from buffering results in memory before
|
data/lib/sq/dbsync/version.rb
CHANGED
@@ -14,13 +14,14 @@ describe 'Syncing source databases to a target' do
|
|
14
14
|
SQD::Manager.new(config, [[SQD::StaticTablePlan.new(plan), :source]])
|
15
15
|
}
|
16
16
|
let(:source) { manager.sources.fetch(:source) }
|
17
|
+
let(:mb4_source) { manager.sources.fetch(:mb4_source) }
|
17
18
|
let(:alt_source) { manager.sources.fetch(:alt_source) }
|
18
19
|
let(:target) { manager.target }
|
19
20
|
let(:plan) {[{
|
20
21
|
table_name: :test_table,
|
21
22
|
source_table_name: :test_table,
|
22
23
|
refresh_recent: true,
|
23
|
-
columns: [:id, :updated_at]
|
24
|
+
columns: [:id, :updated_at, :value]
|
24
25
|
}] }
|
25
26
|
|
26
27
|
MINUTE = 60
|
@@ -74,6 +75,34 @@ describe 'Syncing source databases to a target' do
|
|
74
75
|
target[:test_table ].map {|x| x[:id] }.should include(row)
|
75
76
|
target[:alt_test_table ].map {|x| x[:id] }.should include(alt_row)
|
76
77
|
end
|
78
|
+
|
79
|
+
it 'handles utf8mb4 inputs' do
|
80
|
+
plan = [{
|
81
|
+
table_name: :mb4_test_table,
|
82
|
+
source_table_name: :mb4_test_table,
|
83
|
+
refresh_recent: true,
|
84
|
+
columns: [:id, :updated_at, :value],
|
85
|
+
charset: "utf8mb4"
|
86
|
+
}]
|
87
|
+
|
88
|
+
config = {
|
89
|
+
sources: TEST_SOURCES,
|
90
|
+
target: MB4_TEST_TARGET,
|
91
|
+
logger: SQD::Loggers::Composite.new([logger]),
|
92
|
+
clock: ->{ @now }
|
93
|
+
}
|
94
|
+
|
95
|
+
manager = SQD::Manager.new(config, [[SQD::StaticTablePlan.new(plan), :mb4_source]])
|
96
|
+
|
97
|
+
row = mb4_source[:mb4_test_table].insert(updated_at: @now, value: "\u{1f4a9}")
|
98
|
+
|
99
|
+
manager.batch_nonactive
|
100
|
+
|
101
|
+
manager.target[:mb4_test_table].map {|x| x[:id] }.should include(row)
|
102
|
+
manager.target[:mb4_test_table].map {|x| x[:value] }.should include("\u{1f4a9}")
|
103
|
+
manager.target[:meta_last_sync_times].count.should == 1
|
104
|
+
end
|
105
|
+
|
77
106
|
end
|
78
107
|
|
79
108
|
context 'refresh recent load' do
|
@@ -211,6 +240,13 @@ describe 'Syncing source databases to a target' do
|
|
211
240
|
primary_key :id
|
212
241
|
DateTime :reporting_date
|
213
242
|
DateTime :updated_at
|
243
|
+
String :value
|
244
|
+
end
|
245
|
+
mb4_source.create_table! :mb4_test_table, charset:"utf8mb4" do
|
246
|
+
primary_key :id
|
247
|
+
DateTime :reporting_date
|
248
|
+
DateTime :updated_at
|
249
|
+
String :value
|
214
250
|
end
|
215
251
|
source.create_table! :test_table_2 do
|
216
252
|
primary_key :id
|
data/spec/database_helper.rb
CHANGED
@@ -34,6 +34,7 @@ end
|
|
34
34
|
|
35
35
|
TEST_SOURCES = {
|
36
36
|
source: db_options(database: 'sq_dbsync_test_source'),
|
37
|
+
mb4_source: db_options(database: 'sq_dbsync_mb4_test_source', charset: "utf8mb4"),
|
37
38
|
alt_source: db_options(database: 'sq_dbsync_test_source_alt'),
|
38
39
|
postgres: db_options(
|
39
40
|
user: `whoami`.chomp,
|
@@ -43,6 +44,7 @@ TEST_SOURCES = {
|
|
43
44
|
)
|
44
45
|
}
|
45
46
|
TEST_TARGET = db_options(database: 'sq_dbsync_test_target')
|
47
|
+
MB4_TEST_TARGET = db_options(database: 'sq_dbsync_test_target', charset:"utf8mb4")
|
46
48
|
|
47
49
|
$target = nil
|
48
50
|
def test_target
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sq-dbsync
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2013-
|
13
|
+
date: 2013-04-15 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: rspec
|
@@ -163,7 +163,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
163
163
|
version: '0'
|
164
164
|
requirements: []
|
165
165
|
rubyforge_project:
|
166
|
-
rubygems_version: 1.8.
|
166
|
+
rubygems_version: 1.8.25
|
167
167
|
signing_key:
|
168
168
|
specification_version: 3
|
169
169
|
summary: Column based, timestamp replication of MySQL and Postgres databases. Uses
|