Added server version checking. Updated tests for compatibility > 1.1.3
This commit is contained in:
parent
bffc59ffb4
commit
5c6f53e408
@ -6,6 +6,7 @@ require 'mongo/types/regexp_of_holding'
|
|||||||
|
|
||||||
require 'mongo/util/conversions'
|
require 'mongo/util/conversions'
|
||||||
require 'mongo/util/support'
|
require 'mongo/util/support'
|
||||||
|
require 'mongo/util/server_version'
|
||||||
|
|
||||||
require 'mongo/errors'
|
require 'mongo/errors'
|
||||||
require 'mongo/constants'
|
require 'mongo/constants'
|
||||||
|
@ -120,6 +120,17 @@ module Mongo
|
|||||||
single_db_command(name, :dropDatabase => 1)
|
single_db_command(name, :dropDatabase => 1)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Return the build information for the current connection.
|
||||||
|
def server_info
|
||||||
|
db("admin").db_command(:buildinfo => 1)
|
||||||
|
end
|
||||||
|
|
||||||
|
# Returns the build version of the current server, using
|
||||||
|
# a ServerVersion object for comparability.
|
||||||
|
def server_version
|
||||||
|
ServerVersion.new(server_info["version"])
|
||||||
|
end
|
||||||
|
|
||||||
protected
|
protected
|
||||||
|
|
||||||
# Turns an array containing a host name string and a
|
# Turns an array containing a host name string and a
|
||||||
|
54
lib/mongo/util/server_version.rb
Normal file
54
lib/mongo/util/server_version.rb
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
module Mongo
|
||||||
|
# Simple class for comparing server versions.
|
||||||
|
class ServerVersion
|
||||||
|
include Comparable
|
||||||
|
|
||||||
|
def initialize(version)
|
||||||
|
@version = version
|
||||||
|
end
|
||||||
|
|
||||||
|
# Implements comparable.
|
||||||
|
def <=>(new)
|
||||||
|
local, new = self.to_a, to_array(new)
|
||||||
|
for n in 0...local.size do
|
||||||
|
break if elements_include_mods?(local[n], new[n])
|
||||||
|
if local[n] < new[n].to_i
|
||||||
|
result = -1
|
||||||
|
break;
|
||||||
|
elsif local[n] > new[n].to_i
|
||||||
|
result = 1
|
||||||
|
break;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
result || 0
|
||||||
|
end
|
||||||
|
|
||||||
|
# Return an array representation of this server version.
|
||||||
|
def to_a
|
||||||
|
to_array(@version)
|
||||||
|
end
|
||||||
|
|
||||||
|
# Return a string representation of this server version.
|
||||||
|
def to_s
|
||||||
|
@version
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
# Returns true if any elements include mod symbols (-, +)
|
||||||
|
def elements_include_mods?(*elements)
|
||||||
|
elements.any? { |n| n =~ /[\-\+]/ }
|
||||||
|
end
|
||||||
|
|
||||||
|
# Converts argument to an array of integers,
|
||||||
|
# appending any mods as the final element.
|
||||||
|
def to_array(version)
|
||||||
|
array = version.split(".").map {|n| (n =~ /^\d+$/) ? n.to_i : n }
|
||||||
|
if array.last =~ /(\d+)([\-\+])/
|
||||||
|
array[array.length-1] = $1.to_i
|
||||||
|
array << $2
|
||||||
|
end
|
||||||
|
array
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
@ -16,9 +16,10 @@
|
|||||||
|
|
||||||
require 'test/test_helper'
|
require 'test/test_helper'
|
||||||
class TestCollection < Test::Unit::TestCase
|
class TestCollection < Test::Unit::TestCase
|
||||||
@@db = Connection.new(ENV['MONGO_RUBY_DRIVER_HOST'] || 'localhost',
|
@@connection = Connection.new(ENV['MONGO_RUBY_DRIVER_HOST'] || 'localhost', ENV['MONGO_RUBY_DRIVER_PORT'] || Connection::DEFAULT_PORT)
|
||||||
ENV['MONGO_RUBY_DRIVER_PORT'] || Connection::DEFAULT_PORT).db('ruby-mongo-test')
|
@@db = @@connection.db('ruby-mongo-test')
|
||||||
@@test = @@db.collection("test")
|
@@test = @@db.collection("test")
|
||||||
|
@@version = @@connection.server_version
|
||||||
|
|
||||||
def setup
|
def setup
|
||||||
@@test.drop()
|
@@test.drop()
|
||||||
@ -89,15 +90,33 @@ class TestCollection < Test::Unit::TestCase
|
|||||||
assert_equal 2, @@test.find_one()["count"]
|
assert_equal 2, @@test.find_one()["count"]
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_safe_update
|
if @@version < "1.1.3"
|
||||||
@@test.create_index("x")
|
def test_safe_update
|
||||||
@@test.insert("x" => 5)
|
@@test.create_index("x")
|
||||||
|
@@test.insert("x" => 5)
|
||||||
|
|
||||||
@@test.update({}, {"$inc" => {"x" => 1}})
|
@@test.update({}, {"$inc" => {"x" => 1}})
|
||||||
assert @@db.error?
|
assert @@db.error?
|
||||||
|
|
||||||
assert_raise OperationFailure do
|
# Can't change an index.
|
||||||
@@test.update({}, {"$inc" => {"x" => 1}}, :safe => true)
|
assert_raise OperationFailure do
|
||||||
|
@@test.update({}, {"$inc" => {"x" => 1}}, :safe => true)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
else
|
||||||
|
def test_safe_update
|
||||||
|
@@test.create_index("x", true)
|
||||||
|
@@test.insert("x" => 5)
|
||||||
|
@@test.insert("x" => 10)
|
||||||
|
|
||||||
|
# Can update an indexed collection.
|
||||||
|
@@test.update({}, {"$inc" => {"x" => 1}})
|
||||||
|
assert !@@db.error?
|
||||||
|
|
||||||
|
# Can't duplicate an index.
|
||||||
|
assert_raise OperationFailure do
|
||||||
|
@@test.update({}, {"x" => 10}, :safe => true, :upsert => true)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -19,6 +19,17 @@ class TestConnection < Test::Unit::TestCase
|
|||||||
@mongo.db('ruby-mongo-test').error
|
@mongo.db('ruby-mongo-test').error
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_server_info
|
||||||
|
server_info = @mongo.server_info
|
||||||
|
assert server_info.keys.include? "version"
|
||||||
|
assert server_info.keys.include? "bits"
|
||||||
|
assert_equal 1.0, server_info["ok"]
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_server_version
|
||||||
|
assert_match /\d\.\d+(\.\d+)?/, @mongo.server_version.to_s
|
||||||
|
end
|
||||||
|
|
||||||
def test_invalid_database_names
|
def test_invalid_database_names
|
||||||
assert_raise TypeError do @mongo.db(4) end
|
assert_raise TypeError do @mongo.db(4) end
|
||||||
|
|
||||||
|
@ -7,9 +7,11 @@ class CursorTest < Test::Unit::TestCase
|
|||||||
|
|
||||||
include Mongo
|
include Mongo
|
||||||
|
|
||||||
@@db = Connection.new(ENV['MONGO_RUBY_DRIVER_HOST'] || 'localhost',
|
@@connection = Connection.new(ENV['MONGO_RUBY_DRIVER_HOST'] || 'localhost',
|
||||||
ENV['MONGO_RUBY_DRIVER_PORT'] || Connection::DEFAULT_PORT).db('ruby-mongo-test')
|
ENV['MONGO_RUBY_DRIVER_PORT'] || Connection::DEFAULT_PORT)
|
||||||
|
@@db = @@connection.db('ruby-mongo-test')
|
||||||
@@coll = @@db.collection('test')
|
@@coll = @@db.collection('test')
|
||||||
|
@@version = @@connection.server_version
|
||||||
|
|
||||||
def setup
|
def setup
|
||||||
@@coll.remove
|
@@coll.remove
|
||||||
@ -321,9 +323,10 @@ class CursorTest < Test::Unit::TestCase
|
|||||||
@@coll.remove
|
@@coll.remove
|
||||||
@@coll.save("x" => 1)
|
@@coll.save("x" => 1)
|
||||||
|
|
||||||
@@coll.find({}, :fields => ["a"]).each do |doc|
|
if @@version < "1.1.3"
|
||||||
fail "shouldn't have any results here"
|
assert_equal(0, @@coll.find({}, :fields => ["a"]).count())
|
||||||
|
else
|
||||||
|
assert_equal(1, @@coll.find({}, :fields => ["a"]).count())
|
||||||
end
|
end
|
||||||
assert_equal(0, @@coll.find({}, :fields => ["a"]).count())
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -6,9 +6,11 @@ require 'test/unit'
|
|||||||
class DBAPITest < Test::Unit::TestCase
|
class DBAPITest < Test::Unit::TestCase
|
||||||
include Mongo
|
include Mongo
|
||||||
|
|
||||||
@@db = Connection.new(ENV['MONGO_RUBY_DRIVER_HOST'] || 'localhost',
|
@@connection = Connection.new(ENV['MONGO_RUBY_DRIVER_HOST'] || 'localhost',
|
||||||
ENV['MONGO_RUBY_DRIVER_PORT'] || Connection::DEFAULT_PORT).db('ruby-mongo-test')
|
ENV['MONGO_RUBY_DRIVER_PORT'] || Connection::DEFAULT_PORT)
|
||||||
|
@@db = @@connection.db("ruby-mongo-test")
|
||||||
@@coll = @@db.collection('test')
|
@@coll = @@db.collection('test')
|
||||||
|
@@version = @@connection.server_version
|
||||||
|
|
||||||
def setup
|
def setup
|
||||||
@@coll.remove
|
@@coll.remove
|
||||||
@ -386,16 +388,26 @@ class DBAPITest < Test::Unit::TestCase
|
|||||||
def test_array
|
def test_array
|
||||||
@@coll << {'b' => [1, 2, 3]}
|
@@coll << {'b' => [1, 2, 3]}
|
||||||
rows = @@coll.find({}, {:fields => ['b']}).to_a
|
rows = @@coll.find({}, {:fields => ['b']}).to_a
|
||||||
assert_equal 1, rows.length
|
if @@version < "1.1.3"
|
||||||
assert_equal [1, 2, 3], rows[0]['b']
|
assert_equal 1, rows.length
|
||||||
|
assert_equal [1, 2, 3], rows[0]['b']
|
||||||
|
else
|
||||||
|
assert_equal 2, rows.length
|
||||||
|
assert_equal [1, 2, 3], rows[1]['b']
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_regex
|
def test_regex
|
||||||
regex = /foobar/i
|
regex = /foobar/i
|
||||||
@@coll << {'b' => regex}
|
@@coll << {'b' => regex}
|
||||||
rows = @@coll.find({}, {:fields => ['b']}).to_a
|
rows = @@coll.find({}, {:fields => ['b']}).to_a
|
||||||
assert_equal 1, rows.length
|
if @@version < "1.1.3"
|
||||||
assert_equal regex, rows[0]['b']
|
assert_equal 1, rows.length
|
||||||
|
assert_equal regex, rows[0]['b']
|
||||||
|
else
|
||||||
|
assert_equal 2, rows.length
|
||||||
|
assert_equal regex, rows[1]['b']
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_non_oid_id
|
def test_non_oid_id
|
||||||
|
Loading…
Reference in New Issue
Block a user