mosql 0.4.0 → 0.4.1
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 +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: 
         |