mosql 0.4.0 → 0.4.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +10 -9
- data/README.md +18 -1
- data/lib/mosql/cli.rb +5 -0
- data/lib/mosql/schema.rb +22 -3
- data/lib/mosql/streamer.rb +1 -1
- data/lib/mosql/version.rb +1 -1
- data/mosql.gemspec +1 -0
- data/test/functional/streamer.rb +2 -2
- data/test/unit/lib/mosql/schema.rb +42 -0
- metadata +16 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7ab1024ecdb478cb92b0c2041f7d5f52a67ec0d3
|
4
|
+
data.tar.gz: 2b88ed3d4bb0723f67170d645d61e34b62d29dc6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5e8cc02a48b261391e0a161e0c35fb92113cc85f9e7436ed14bb9a4e0b54f4389f13093a02f9af6b516bd6d1d1db93202d5e8fd52c76d927564ead0733eb2d1d
|
7
|
+
data.tar.gz: d6a2c35555a5e8d4c99596f8c0cd212dca2546932a023cc1d7686ea6581ef0387813179817ce368cf06dff50753b927cc1ecba8be3bc82b44ff52519c141e31c
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
mosql (0.4.
|
4
|
+
mosql (0.4.1)
|
5
|
+
bson (~> 1.10)
|
5
6
|
bson_ext
|
6
7
|
json
|
7
8
|
log4r
|
@@ -14,24 +15,24 @@ PATH
|
|
14
15
|
GEM
|
15
16
|
remote: https://rubygems.org/
|
16
17
|
specs:
|
17
|
-
bson (1.
|
18
|
-
bson_ext (1.
|
19
|
-
bson (~> 1.
|
18
|
+
bson (1.11.1)
|
19
|
+
bson_ext (1.11.1)
|
20
|
+
bson (~> 1.11.1)
|
20
21
|
json (1.8.1)
|
21
22
|
log4r (1.1.10)
|
22
23
|
metaclass (0.0.4)
|
23
|
-
minitest (
|
24
|
-
mocha (1.
|
24
|
+
minitest (5.4.2)
|
25
|
+
mocha (1.1.0)
|
25
26
|
metaclass (~> 0.0.1)
|
26
|
-
mongo (1.
|
27
|
-
bson (= 1.
|
27
|
+
mongo (1.11.1)
|
28
|
+
bson (= 1.11.1)
|
28
29
|
mongoriver (0.4.0)
|
29
30
|
bson_ext
|
30
31
|
log4r
|
31
32
|
mongo (>= 1.7)
|
32
33
|
pg (0.17.1)
|
33
34
|
rake (10.3.2)
|
34
|
-
sequel (4.
|
35
|
+
sequel (4.16.0)
|
35
36
|
|
36
37
|
PLATFORMS
|
37
38
|
ruby
|
data/README.md
CHANGED
@@ -212,7 +212,24 @@ e.g.
|
|
212
212
|
mosql --mongo mongdb://$USER@$PASSWORD:$HOST/admin
|
213
213
|
```
|
214
214
|
|
215
|
-
|
215
|
+
In order to use MongoDB 2.4's "roles" support (which is different from that in
|
216
|
+
2.6), you need to create the user in the admin database, give it explicit read
|
217
|
+
access to the databases you want to copy *and* to the `local` database, and
|
218
|
+
specify authSource in the URL. eg, connect to `mydb/admin` with the mongo shell
|
219
|
+
and run:
|
220
|
+
|
221
|
+
```
|
222
|
+
> db.addUser({user: "replicator", pwd: "PASSWORD", roles: [], otherDBRoles: {local: ["read"], sourceDb: ["read"]}})
|
223
|
+
```
|
224
|
+
|
225
|
+
(Note that `roles: []` ensures that this user has no special access to the
|
226
|
+
`admin` database.) Now specify:
|
227
|
+
|
228
|
+
```
|
229
|
+
mosql --mongo mongdb://$USER@$PASSWORD:$HOST/sourceDb?authSource=admin
|
230
|
+
```
|
231
|
+
|
232
|
+
I have not yet tested using MoSQL with 2.6's rewritten "roles" support. Drop me
|
216
233
|
a note if you figure out anything I should know.
|
217
234
|
|
218
235
|
## Sharded clusters
|
data/lib/mosql/cli.rb
CHANGED
@@ -98,6 +98,11 @@ module MoSQL
|
|
98
98
|
opts.on("--unsafe", "Ignore rows that cause errors on insert") do
|
99
99
|
@options[:unsafe] = true
|
100
100
|
end
|
101
|
+
|
102
|
+
# eg, --oplog-filter '{"ns": {"$regex": "^somedb[0-9]*\\.collection$"}}'
|
103
|
+
opts.on("--oplog-filter [filter]", "An additional JSON filter for the oplog query") do |filter|
|
104
|
+
@options[:oplog_filter] = JSON.parse(filter)
|
105
|
+
end
|
101
106
|
end
|
102
107
|
|
103
108
|
optparse.parse!(@args)
|
data/lib/mosql/schema.rb
CHANGED
@@ -159,10 +159,24 @@ module MoSQL
|
|
159
159
|
val
|
160
160
|
end
|
161
161
|
|
162
|
-
def
|
162
|
+
def fetch_exists(obj, dotted)
|
163
|
+
pieces = dotted.split(".")
|
164
|
+
while pieces.length > 1
|
165
|
+
key = pieces.shift
|
166
|
+
obj = obj[key]
|
167
|
+
return false unless obj.is_a?(Hash)
|
168
|
+
end
|
169
|
+
obj.has_key?(pieces.first)
|
170
|
+
end
|
171
|
+
|
172
|
+
def fetch_special_source(obj, source, original)
|
163
173
|
case source
|
164
174
|
when "$timestamp"
|
165
175
|
Sequel.function(:now)
|
176
|
+
when /^\$exists (.+)/
|
177
|
+
# We need to look in the cloned original object, not in the version that
|
178
|
+
# has had some fields deleted.
|
179
|
+
fetch_exists(original, $1)
|
166
180
|
else
|
167
181
|
raise SchemaError.new("Unknown source: #{source}")
|
168
182
|
end
|
@@ -188,7 +202,12 @@ module MoSQL
|
|
188
202
|
def transform(ns, obj, schema=nil)
|
189
203
|
schema ||= find_ns!(ns)
|
190
204
|
|
191
|
-
|
205
|
+
original = obj
|
206
|
+
|
207
|
+
# Do a deep clone, because we're potentially going to be
|
208
|
+
# mutating embedded objects.
|
209
|
+
obj = BSON.deserialize(BSON.serialize(obj))
|
210
|
+
|
192
211
|
row = []
|
193
212
|
schema[:columns].each do |col|
|
194
213
|
|
@@ -196,7 +215,7 @@ module MoSQL
|
|
196
215
|
type = col[:type]
|
197
216
|
|
198
217
|
if source.start_with?("$")
|
199
|
-
v = fetch_special_source(obj, source)
|
218
|
+
v = fetch_special_source(obj, source, original)
|
200
219
|
else
|
201
220
|
v = fetch_and_delete_dotted(obj, source)
|
202
221
|
case v
|
data/lib/mosql/streamer.rb
CHANGED
@@ -170,7 +170,7 @@ module MoSQL
|
|
170
170
|
if tail_from.is_a? Time
|
171
171
|
tail_from = tailer.most_recent_position(tail_from)
|
172
172
|
end
|
173
|
-
tailer.tail(:from => tail_from)
|
173
|
+
tailer.tail(:from => tail_from, :filter => options[:oplog_filter])
|
174
174
|
until @done
|
175
175
|
tailer.stream(1000) do |op|
|
176
176
|
handle_op(op)
|
data/lib/mosql/version.rb
CHANGED
data/mosql.gemspec
CHANGED
@@ -19,6 +19,7 @@ Gem::Specification.new do |gem|
|
|
19
19
|
%w[sequel pg mongo bson_ext rake log4r json
|
20
20
|
].each { |dep| gem.add_runtime_dependency(dep) }
|
21
21
|
gem.add_runtime_dependency "mongoriver", "0.4"
|
22
|
+
gem.add_runtime_dependency "bson", "~> 1.10"
|
22
23
|
|
23
24
|
gem.add_development_dependency "minitest"
|
24
25
|
gem.add_development_dependency "mocha"
|
data/test/functional/streamer.rb
CHANGED
@@ -262,7 +262,7 @@ EOF
|
|
262
262
|
@streamer.handle_op({ 'ns' => 'mosql_test.collection',
|
263
263
|
'op' => 'u',
|
264
264
|
'o2' => { '_id' => 'a' },
|
265
|
-
'o' => { 'var' => 1 <<
|
265
|
+
'o' => { 'var' => 1 << 62 },
|
266
266
|
})
|
267
267
|
end
|
268
268
|
end
|
@@ -272,7 +272,7 @@ EOF
|
|
272
272
|
@streamer.handle_op({ 'ns' => 'mosql_test.collection',
|
273
273
|
'op' => 'u',
|
274
274
|
'o2' => { '_id' => 'a' },
|
275
|
-
'o' => { 'var' => 1 <<
|
275
|
+
'o' => { 'var' => 1 << 62 },
|
276
276
|
})
|
277
277
|
assert_equal(0, sequel[:sqltable].where(:_id => 'a').count)
|
278
278
|
end
|
@@ -343,6 +343,26 @@ db:
|
|
343
343
|
- mosql_created:
|
344
344
|
:source: $timestamp
|
345
345
|
:type: timestamp
|
346
|
+
existence:
|
347
|
+
:meta:
|
348
|
+
:table: b_table
|
349
|
+
:columns:
|
350
|
+
- _id: TEXT
|
351
|
+
- has_foo:
|
352
|
+
:source: $exists foo
|
353
|
+
:type: BOOLEAN
|
354
|
+
- has_foo_bar:
|
355
|
+
:source: $exists foo.bar
|
356
|
+
:type: BOOLEAN
|
357
|
+
exists_and_value:
|
358
|
+
:meta:
|
359
|
+
:table: c_table
|
360
|
+
:columns:
|
361
|
+
- _id: TEXT
|
362
|
+
- foo: TEXT
|
363
|
+
- has_foo:
|
364
|
+
:source: $exists foo
|
365
|
+
:type: BOOLEAN
|
346
366
|
invalid:
|
347
367
|
:meta:
|
348
368
|
:table: invalid
|
@@ -362,6 +382,28 @@ EOF
|
|
362
382
|
assert_equal(['a', Sequel.function(:now)], r)
|
363
383
|
end
|
364
384
|
|
385
|
+
it 'translates $exists' do
|
386
|
+
r = @othermap.transform('db.existence', { '_id' => 'a' })
|
387
|
+
assert_equal(['a', false, false], r)
|
388
|
+
r = @othermap.transform('db.existence', { '_id' => 'a', 'foo' => nil })
|
389
|
+
assert_equal(['a', true, false], r)
|
390
|
+
r = @othermap.transform('db.existence', { '_id' => 'a', 'foo' => {} })
|
391
|
+
assert_equal(['a', true, false], r)
|
392
|
+
r = @othermap.transform('db.existence', { '_id' => 'a', 'foo' => {'bar' => nil} })
|
393
|
+
assert_equal(['a', true, true], r)
|
394
|
+
r = @othermap.transform('db.existence', { '_id' => 'a', 'foo' => {'bar' => 42} })
|
395
|
+
assert_equal(['a', true, true], r)
|
396
|
+
end
|
397
|
+
|
398
|
+
it 'can get $exists and value' do
|
399
|
+
r = @othermap.transform('db.exists_and_value', { '_id' => 'a' })
|
400
|
+
assert_equal(['a', nil, false], r)
|
401
|
+
r = @othermap.transform('db.exists_and_value', { '_id' => 'a', 'foo' => nil })
|
402
|
+
assert_equal(['a', nil, true], r)
|
403
|
+
r = @othermap.transform('db.exists_and_value', { '_id' => 'a', 'foo' => 'xxx' })
|
404
|
+
assert_equal(['a', 'xxx', true], r)
|
405
|
+
end
|
406
|
+
|
365
407
|
it 'rejects unknown specials' do
|
366
408
|
assert_raises(MoSQL::SchemaError) do
|
367
409
|
r = @othermap.transform('db.invalid', { '_id' => 'a' })
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mosql
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nelson Elhage
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-11-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: sequel
|
@@ -122,6 +122,20 @@ dependencies:
|
|
122
122
|
- - '='
|
123
123
|
- !ruby/object:Gem::Version
|
124
124
|
version: '0.4'
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: bson
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - "~>"
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '1.10'
|
132
|
+
type: :runtime
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - "~>"
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: '1.10'
|
125
139
|
- !ruby/object:Gem::Dependency
|
126
140
|
name: minitest
|
127
141
|
requirement: !ruby/object:Gem::Requirement
|
@@ -213,4 +227,3 @@ test_files:
|
|
213
227
|
- test/functional/streamer.rb
|
214
228
|
- test/functional/transform.rb
|
215
229
|
- test/unit/lib/mosql/schema.rb
|
216
|
-
has_rdoc:
|