mongodb-mongo 0.12 → 0.13

Sign up to get free protection for your applications and to get access to all the features.
Files changed (81) hide show
  1. data/README.rdoc +12 -12
  2. data/Rakefile +1 -1
  3. data/bin/bson_benchmark.rb +1 -1
  4. data/bin/mongo_console +3 -3
  5. data/bin/run_test_script +2 -2
  6. data/bin/standard_benchmark +3 -3
  7. data/examples/admin.rb +3 -3
  8. data/examples/benchmarks.rb +2 -2
  9. data/examples/blog.rb +4 -4
  10. data/examples/capped.rb +3 -3
  11. data/examples/cursor.rb +3 -3
  12. data/examples/gridfs.rb +4 -4
  13. data/examples/index_test.rb +11 -11
  14. data/examples/info.rb +3 -3
  15. data/examples/queries.rb +3 -3
  16. data/examples/simple.rb +3 -3
  17. data/examples/strict.rb +3 -3
  18. data/examples/types.rb +4 -9
  19. data/lib/mongo.rb +35 -3
  20. data/lib/mongo/admin.rb +56 -60
  21. data/lib/mongo/collection.rb +368 -320
  22. data/lib/mongo/connection.rb +166 -0
  23. data/lib/mongo/cursor.rb +206 -209
  24. data/lib/mongo/db.rb +478 -489
  25. data/lib/mongo/errors.rb +8 -9
  26. data/lib/mongo/gridfs/chunk.rb +66 -70
  27. data/lib/mongo/gridfs/grid_store.rb +406 -410
  28. data/lib/mongo/message/get_more_message.rb +8 -13
  29. data/lib/mongo/message/insert_message.rb +7 -11
  30. data/lib/mongo/message/kill_cursors_message.rb +7 -12
  31. data/lib/mongo/message/message.rb +58 -62
  32. data/lib/mongo/message/message_header.rb +19 -24
  33. data/lib/mongo/message/msg_message.rb +5 -9
  34. data/lib/mongo/message/opcodes.rb +10 -15
  35. data/lib/mongo/message/query_message.rb +42 -46
  36. data/lib/mongo/message/remove_message.rb +8 -12
  37. data/lib/mongo/message/update_message.rb +9 -13
  38. data/lib/mongo/query.rb +84 -88
  39. data/lib/mongo/types/binary.rb +13 -17
  40. data/lib/mongo/types/code.rb +9 -13
  41. data/lib/mongo/types/dbref.rb +10 -14
  42. data/lib/mongo/types/objectid.rb +103 -107
  43. data/lib/mongo/types/regexp_of_holding.rb +18 -22
  44. data/lib/mongo/types/undefined.rb +7 -10
  45. data/lib/mongo/util/bson.rb +4 -9
  46. data/lib/mongo/util/xml_to_ruby.rb +1 -3
  47. data/mongo-ruby-driver.gemspec +33 -32
  48. data/{tests → test}/mongo-qa/_common.rb +1 -1
  49. data/{tests → test}/mongo-qa/admin +1 -1
  50. data/{tests → test}/mongo-qa/capped +1 -1
  51. data/{tests → test}/mongo-qa/count1 +4 -4
  52. data/{tests → test}/mongo-qa/dbs +1 -1
  53. data/{tests → test}/mongo-qa/find +1 -1
  54. data/{tests → test}/mongo-qa/find1 +1 -1
  55. data/{tests → test}/mongo-qa/gridfs_in +2 -2
  56. data/{tests → test}/mongo-qa/gridfs_out +2 -2
  57. data/{tests → test}/mongo-qa/indices +2 -2
  58. data/{tests → test}/mongo-qa/remove +1 -1
  59. data/{tests → test}/mongo-qa/stress1 +1 -1
  60. data/{tests → test}/mongo-qa/test1 +1 -1
  61. data/{tests → test}/mongo-qa/update +1 -1
  62. data/{tests → test}/test_admin.rb +3 -3
  63. data/{tests → test}/test_bson.rb +4 -4
  64. data/{tests → test}/test_byte_buffer.rb +0 -0
  65. data/{tests → test}/test_chunk.rb +4 -4
  66. data/{tests → test}/test_collection.rb +42 -4
  67. data/{tests/test_mongo.rb → test/test_connection.rb} +35 -11
  68. data/test/test_cursor.rb +223 -0
  69. data/{tests → test}/test_db.rb +12 -12
  70. data/{tests → test}/test_db_api.rb +28 -33
  71. data/{tests → test}/test_db_connection.rb +3 -3
  72. data/{tests → test}/test_grid_store.rb +4 -4
  73. data/{tests → test}/test_message.rb +1 -1
  74. data/{tests → test}/test_objectid.rb +3 -3
  75. data/{tests → test}/test_ordered_hash.rb +0 -0
  76. data/{tests → test}/test_round_trip.rb +6 -2
  77. data/{tests → test}/test_threading.rb +3 -3
  78. data/test/test_xgen.rb +73 -0
  79. metadata +33 -32
  80. data/lib/mongo/mongo.rb +0 -164
  81. data/tests/test_cursor.rb +0 -121
@@ -4,11 +4,10 @@ require 'test/unit'
4
4
 
5
5
  # NOTE: assumes Mongo is running
6
6
  class DBAPITest < Test::Unit::TestCase
7
- include XGen::Mongo
8
- include XGen::Mongo::Driver
7
+ include Mongo
9
8
 
10
- @@db = Mongo.new(ENV['MONGO_RUBY_DRIVER_HOST'] || 'localhost',
11
- ENV['MONGO_RUBY_DRIVER_PORT'] || Mongo::DEFAULT_PORT).db('ruby-mongo-test')
9
+ @@db = Connection.new(ENV['MONGO_RUBY_DRIVER_HOST'] || 'localhost',
10
+ ENV['MONGO_RUBY_DRIVER_PORT'] || Connection::DEFAULT_PORT).db('ruby-mongo-test')
12
11
  @@coll = @@db.collection('test')
13
12
 
14
13
  def setup
@@ -501,25 +500,18 @@ class DBAPITest < Test::Unit::TestCase
501
500
  cursor = @@coll.find()
502
501
  rows = cursor.to_a
503
502
 
504
- # Make sure we get back exactly the same array the next time we ask
505
- rows2 = cursor.to_a
506
- assert_same rows, rows2
507
-
508
- # Make sure we can still iterate after calling to_a
509
- rows_with_each = cursor.collect{|row| row}
510
- assert_equal rows, rows_with_each
503
+ assert_raise InvalidOperation do
504
+ cursor.to_a
505
+ end
511
506
 
512
- # Make sure we can iterate more than once after calling to_a
507
+ cursor.each { |doc| fail "should be no docs in each now" }
513
508
  end
514
509
 
515
510
  def test_to_a_after_each
516
511
  cursor = @@coll.find
517
512
  cursor.each { |row| row }
518
- begin
513
+ assert_raise InvalidOperation do
519
514
  cursor.to_a
520
- fail "expected \"can't call\" error"
521
- rescue => ex
522
- assert_equal "can't call Cursor#to_a after calling Cursor#each", ex.to_s
523
515
  end
524
516
  end
525
517
 
@@ -536,8 +528,8 @@ class DBAPITest < Test::Unit::TestCase
536
528
  @@coll.insert('a' => 3)
537
529
 
538
530
  assert_equal 3, @@coll.count
539
- assert_equal 1, @@coll.count('$where' => Code.new('this.a > 2'))
540
- assert_equal 2, @@coll.count('$where' => Code.new('this.a > i', {'i' => 1}))
531
+ assert_equal 1, @@coll.find('$where' => Code.new('this.a > 2')).count()
532
+ assert_equal 2, @@coll.find('$where' => Code.new('this.a > i', {'i' => 1})).count()
541
533
  end
542
534
 
543
535
  def test_eval
@@ -554,7 +546,7 @@ class DBAPITest < Test::Unit::TestCase
554
546
  assert_equal 2, @@db.eval(Code.new("return i;", {"i" => 2}))
555
547
  assert_equal 5, @@db.eval(Code.new("i + 3;", {"i" => 2}))
556
548
 
557
- assert_raise RuntimeError do
549
+ assert_raise OperationFailure do
558
550
  @@db.eval("5 ++ 5;")
559
551
  end
560
552
  end
@@ -600,13 +592,30 @@ class DBAPITest < Test::Unit::TestCase
600
592
  test = @@db.collection("test")
601
593
 
602
594
  assert_equal [], test.group([], {}, {"count" => 0}, "function (obj, prev) { prev.count++; }")
595
+ assert_equal [], test.group([], {}, {"count" => 0}, "function (obj, prev) { prev.count++; }", true)
603
596
 
604
597
  test.insert("a" => 2)
605
598
  test.insert("b" => 5)
606
599
  test.insert("a" => 1)
607
600
 
608
601
  assert_equal 3, test.group([], {}, {"count" => 0}, "function (obj, prev) { prev.count++; }")[0]["count"]
602
+ assert_equal 3, test.group([], {}, {"count" => 0}, "function (obj, prev) { prev.count++; }", true)[0]["count"]
609
603
  assert_equal 1, test.group([], {"a" => {"$gt" => 1}}, {"count" => 0}, "function (obj, prev) { prev.count++; }")[0]["count"]
604
+ assert_equal 1, test.group([], {"a" => {"$gt" => 1}}, {"count" => 0}, "function (obj, prev) { prev.count++; }", true)[0]["count"]
605
+
606
+ test.insert("a" => 2, "b" => 3)
607
+ expected = [{"a" => 2, "count" => 2},
608
+ {"a" => nil, "count" => 1},
609
+ {"a" => 1, "count" => 1}]
610
+ assert_equal expected, test.group(["a"], {}, {"count" => 0}, "function (obj, prev) { prev.count++; }")
611
+ assert_equal expected, test.group(["a"], {}, {"count" => 0}, "function (obj, prev) { prev.count++; }", true)
612
+
613
+ assert_raise OperationFailure do
614
+ test.group([], {}, {}, "5 ++ 5")
615
+ end
616
+ assert_raise OperationFailure do
617
+ test.group([], {}, {}, "5 ++ 5", true)
618
+ end
610
619
  end
611
620
 
612
621
  def test_deref
@@ -800,18 +809,4 @@ class DBAPITest < Test::Unit::TestCase
800
809
  @@db.collection("test").find({}, :snapshot => true, :sort => 'a').to_a
801
810
  end
802
811
  end
803
-
804
- # TODO this test fails with error message "Undefed Before end of object"
805
- # That is a database error. The undefined type may go away.
806
-
807
- # def test_insert_undefined
808
- # doc = {'undef' => Undefined.new}
809
- # @@coll.clear
810
- # @@coll.insert(doc)
811
- # p @@db.error # DEBUG
812
- # assert_equal 1, @@coll.count
813
- # row = @@coll.find().next_object
814
- # assert_not_nil row
815
- # end
816
-
817
812
  end
@@ -5,12 +5,12 @@ require 'test/unit'
5
5
  # NOTE: assumes Mongo is running
6
6
  class DBConnectionTest < Test::Unit::TestCase
7
7
 
8
- include XGen::Mongo::Driver
8
+ include Mongo
9
9
 
10
10
  def test_no_exceptions
11
11
  host = ENV['MONGO_RUBY_DRIVER_HOST'] || 'localhost'
12
- port = ENV['MONGO_RUBY_DRIVER_PORT'] || Mongo::DEFAULT_PORT
13
- db = Mongo.new(host, port).db('ruby-mongo-demo')
12
+ port = ENV['MONGO_RUBY_DRIVER_PORT'] || Connection::DEFAULT_PORT
13
+ db = Connection.new(host, port).db('ruby-mongo-demo')
14
14
  coll = db.collection('test')
15
15
  coll.clear
16
16
  db.error
@@ -5,11 +5,11 @@ require 'mongo/gridfs'
5
5
 
6
6
  class GridStoreTest < Test::Unit::TestCase
7
7
 
8
- include XGen::Mongo::Driver
9
- include XGen::Mongo::GridFS
8
+ include Mongo
9
+ include GridFS
10
10
 
11
- @@db = Mongo.new(ENV['MONGO_RUBY_DRIVER_HOST'] || 'localhost',
12
- ENV['MONGO_RUBY_DRIVER_PORT'] || Mongo::DEFAULT_PORT).db('ruby-mongo-test')
11
+ @@db = Connection.new(ENV['MONGO_RUBY_DRIVER_HOST'] || 'localhost',
12
+ ENV['MONGO_RUBY_DRIVER_PORT'] || Connection::DEFAULT_PORT).db('ruby-mongo-test')
13
13
  @@files = @@db.collection('fs.files')
14
14
  @@chunks = @@db.collection('fs.chunks')
15
15
 
@@ -4,7 +4,7 @@ require 'test/unit'
4
4
 
5
5
  class MessageTest < Test::Unit::TestCase
6
6
 
7
- include XGen::Mongo::Driver
7
+ include Mongo
8
8
 
9
9
  def setup
10
10
  @msg = Message.new(42)
@@ -4,7 +4,7 @@ require 'test/unit'
4
4
 
5
5
  class ObjectIDTest < Test::Unit::TestCase
6
6
 
7
- include XGen::Mongo::Driver
7
+ include Mongo
8
8
 
9
9
  def setup
10
10
  @t = 42
@@ -53,8 +53,8 @@ class ObjectIDTest < Test::Unit::TestCase
53
53
 
54
54
  def test_save_and_restore
55
55
  host = ENV['MONGO_RUBY_DRIVER_HOST'] || 'localhost'
56
- port = ENV['MONGO_RUBY_DRIVER_PORT'] || Mongo::DEFAULT_PORT
57
- db = Mongo.new(host, port).db('ruby-mongo-test')
56
+ port = ENV['MONGO_RUBY_DRIVER_PORT'] || Connection::DEFAULT_PORT
57
+ db = Connection.new(host, port).db('ruby-mongo-test')
58
58
  coll = db.collection('test')
59
59
 
60
60
  coll.clear
File without changes
@@ -13,7 +13,7 @@ require 'test/unit'
13
13
  # of this project), then we find the BSON test files there and use those, too.
14
14
  class RoundTripTest < Test::Unit::TestCase
15
15
 
16
- include XGen::Mongo::Driver
16
+ include Mongo
17
17
 
18
18
  @@ruby = nil
19
19
 
@@ -64,7 +64,11 @@ EOS
64
64
  # generated)
65
65
  def one_round_trip(dir, name)
66
66
  obj = File.open(File.join(dir, "#{name}.xson")) { |f|
67
- XMLToRuby.new.xml_to_ruby(f)
67
+ begin
68
+ XMLToRuby.new.xml_to_ruby(f)
69
+ rescue => ex # unsupported type
70
+ return
71
+ end
68
72
  }
69
73
 
70
74
  File.open(File.join(dir, "#{name}.bson"), 'rb') { |f|
@@ -4,11 +4,11 @@ require 'test/unit'
4
4
 
5
5
  class TestThreading < Test::Unit::TestCase
6
6
 
7
- include XGen::Mongo::Driver
7
+ include Mongo
8
8
 
9
9
  @@host = ENV['MONGO_RUBY_DRIVER_HOST'] || 'localhost'
10
- @@port = ENV['MONGO_RUBY_DRIVER_PORT'] || Mongo::DEFAULT_PORT
11
- @@db = Mongo.new(@@host, @@port).db('ruby-mongo-test')
10
+ @@port = ENV['MONGO_RUBY_DRIVER_PORT'] || Connection::DEFAULT_PORT
11
+ @@db = Connection.new(@@host, @@port).db('ruby-mongo-test')
12
12
  @@coll = @@db.collection('thread-test-collection')
13
13
 
14
14
  def test_threading
data/test/test_xgen.rb ADDED
@@ -0,0 +1,73 @@
1
+ # Copyright (C) 2009 10gen Inc.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ $LOAD_PATH[0,0] = File.join(File.dirname(__FILE__), '..', 'lib')
16
+ require 'mongo'
17
+ require 'test/unit'
18
+
19
+ # TODO these tests should be removed - just testing for the deprecated
20
+ # XGen::Mongo::Driver include path
21
+ class TestXGen < Test::Unit::TestCase
22
+ @@db = XGen::Mongo::Driver::Connection.new(ENV['MONGO_RUBY_DRIVER_HOST'] || 'localhost',
23
+ ENV['MONGO_RUBY_DRIVER_PORT'] || XGen::Mongo::Driver::Connection::DEFAULT_PORT).db('ruby-mongo-test')
24
+ @@test = @@db.collection('test')
25
+
26
+ def setup
27
+ @@test.clear
28
+ end
29
+
30
+ def test_sort
31
+ @@test.save('x' => 2)
32
+ @@test.save('x' => 1)
33
+ @@test.save('x' => 3)
34
+
35
+ assert_equal 1, @@test.find({}, :sort => {'x' => XGen::Mongo::ASCENDING}).to_a()[0]['x']
36
+ assert_equal 3, @@test.find({}, :sort => {'x' => XGen::Mongo::DESCENDING}).to_a()[0]['x']
37
+ end
38
+
39
+ def test_gridfs
40
+ XGen::Mongo::GridFS::GridStore.open(@@db, 'foobar', 'w') { |f| f.write('hello world!') }
41
+ assert XGen::Mongo::GridFS::GridStore.exist?(@@db, 'foobar')
42
+ assert !XGen::Mongo::GridFS::GridStore.exist?(@@db, 'mike')
43
+ end
44
+ end
45
+
46
+ class TestXGenInclude < Test::Unit::TestCase
47
+ include XGen::Mongo::GridFS
48
+ include XGen::Mongo::Driver
49
+ include XGen::Mongo
50
+
51
+ @@db = Connection.new(ENV['MONGO_RUBY_DRIVER_HOST'] || 'localhost',
52
+ ENV['MONGO_RUBY_DRIVER_PORT'] || Connection::DEFAULT_PORT).db('ruby-mongo-test')
53
+ @@test = @@db.collection('test')
54
+
55
+ def setup
56
+ @@test.clear
57
+ end
58
+
59
+ def test_sort
60
+ @@test.save('x' => 2)
61
+ @@test.save('x' => 1)
62
+ @@test.save('x' => 3)
63
+
64
+ assert_equal 1, @@test.find({}, :sort => {'x' => ASCENDING}).to_a()[0]['x']
65
+ assert_equal 3, @@test.find({}, :sort => {'x' => DESCENDING}).to_a()[0]['x']
66
+ end
67
+
68
+ def test_gridfs
69
+ GridStore.open(@@db, 'foobar', 'w') { |f| f.write('hello world!') }
70
+ assert GridStore.exist?(@@db, 'foobar')
71
+ assert !GridStore.exist?(@@db, 'mike')
72
+ end
73
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mongodb-mongo
3
3
  version: !ruby/object:Gem::Version
4
- version: "0.12"
4
+ version: "0.13"
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jim Menard
@@ -44,6 +44,7 @@ files:
44
44
  - examples/types.rb
45
45
  - lib/mongo/admin.rb
46
46
  - lib/mongo/collection.rb
47
+ - lib/mongo/connection.rb
47
48
  - lib/mongo/cursor.rb
48
49
  - lib/mongo/db.rb
49
50
  - lib/mongo/gridfs/chunk.rb
@@ -61,7 +62,6 @@ files:
61
62
  - lib/mongo/message/remove_message.rb
62
63
  - lib/mongo/message/update_message.rb
63
64
  - lib/mongo/message.rb
64
- - lib/mongo/mongo.rb
65
65
  - lib/mongo/query.rb
66
66
  - lib/mongo/types/binary.rb
67
67
  - lib/mongo/types/code.rb
@@ -104,33 +104,34 @@ signing_key:
104
104
  specification_version: 2
105
105
  summary: Ruby driver for the 10gen Mongo DB
106
106
  test_files:
107
- - tests/mongo-qa/_common.rb
108
- - tests/mongo-qa/admin
109
- - tests/mongo-qa/capped
110
- - tests/mongo-qa/count1
111
- - tests/mongo-qa/dbs
112
- - tests/mongo-qa/find
113
- - tests/mongo-qa/find1
114
- - tests/mongo-qa/gridfs_in
115
- - tests/mongo-qa/gridfs_out
116
- - tests/mongo-qa/indices
117
- - tests/mongo-qa/remove
118
- - tests/mongo-qa/stress1
119
- - tests/mongo-qa/test1
120
- - tests/mongo-qa/update
121
- - tests/test_admin.rb
122
- - tests/test_bson.rb
123
- - tests/test_byte_buffer.rb
124
- - tests/test_chunk.rb
125
- - tests/test_collection.rb
126
- - tests/test_cursor.rb
127
- - tests/test_db.rb
128
- - tests/test_db_api.rb
129
- - tests/test_db_connection.rb
130
- - tests/test_grid_store.rb
131
- - tests/test_message.rb
132
- - tests/test_mongo.rb
133
- - tests/test_objectid.rb
134
- - tests/test_ordered_hash.rb
135
- - tests/test_threading.rb
136
- - tests/test_round_trip.rb
107
+ - test/mongo-qa/_common.rb
108
+ - test/mongo-qa/admin
109
+ - test/mongo-qa/capped
110
+ - test/mongo-qa/count1
111
+ - test/mongo-qa/dbs
112
+ - test/mongo-qa/find
113
+ - test/mongo-qa/find1
114
+ - test/mongo-qa/gridfs_in
115
+ - test/mongo-qa/gridfs_out
116
+ - test/mongo-qa/indices
117
+ - test/mongo-qa/remove
118
+ - test/mongo-qa/stress1
119
+ - test/mongo-qa/test1
120
+ - test/mongo-qa/update
121
+ - test/test_admin.rb
122
+ - test/test_bson.rb
123
+ - test/test_byte_buffer.rb
124
+ - test/test_chunk.rb
125
+ - test/test_collection.rb
126
+ - test/test_connection.rb
127
+ - test/test_cursor.rb
128
+ - test/test_db.rb
129
+ - test/test_db_api.rb
130
+ - test/test_db_connection.rb
131
+ - test/test_grid_store.rb
132
+ - test/test_message.rb
133
+ - test/test_objectid.rb
134
+ - test/test_ordered_hash.rb
135
+ - test/test_threading.rb
136
+ - test/test_round_trip.rb
137
+ - test/test_xgen.rb
data/lib/mongo/mongo.rb DELETED
@@ -1,164 +0,0 @@
1
- # --
2
- # Copyright (C) 2008-2009 10gen Inc.
3
- #
4
- # Licensed under the Apache License, Version 2.0 (the "License");
5
- # you may not use this file except in compliance with the License.
6
- # You may obtain a copy of the License at
7
- #
8
- # http://www.apache.org/licenses/LICENSE-2.0
9
- #
10
- # Unless required by applicable law or agreed to in writing, software
11
- # distributed under the License is distributed on an "AS IS" BASIS,
12
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
- # See the License for the specific language governing permissions and
14
- # limitations under the License.
15
- # ++
16
-
17
- require 'mongo/db'
18
-
19
- module XGen
20
- module Mongo
21
- module Driver
22
-
23
- # Represents a Mongo database server.
24
- class Mongo
25
-
26
- DEFAULT_PORT = 27017
27
-
28
- # Create a Mongo database server instance. You specify either one or a
29
- # pair of servers. If one, you also say if connecting to a slave is
30
- # OK. In either case, the host default is "localhost" and port default
31
- # is DEFAULT_PORT.
32
- #
33
- # If you specify a pair, pair_or_host is a hash with two keys :left
34
- # and :right. Each key maps to either
35
- # * a server name, in which case port is DEFAULT_PORT
36
- # * a port number, in which case server is "localhost"
37
- # * an array containing a server name and a port number in that order
38
- #
39
- # +options+ are passed on to each DB instance:
40
- #
41
- # :slave_ok :: Only used if one host is specified. If false, when
42
- # connecting to that host/port a DB object will check to
43
- # see if the server is the master. If it is not, an error
44
- # is thrown.
45
- #
46
- # :auto_reconnect :: If a DB connection gets closed (for example, we
47
- # have a server pair and saw the "not master"
48
- # error, which closes the connection), then
49
- # automatically try to reconnect to the master or
50
- # to the single server we have been given. Defaults
51
- # to +false+.
52
- #
53
- # Since that's so confusing, here are a few examples:
54
- #
55
- # Mongo.new # localhost, DEFAULT_PORT, !slave
56
- # Mongo.new("localhost") # localhost, DEFAULT_PORT, !slave
57
- # Mongo.new("localhost", 3000) # localhost, 3000, slave not ok
58
- # # localhost, 3000, slave ok
59
- # Mongo.new("localhost", 3000, :slave_ok => true)
60
- # # localhost, DEFAULT_PORT, auto reconnect
61
- # Mongo.new(nil, nil, :auto_reconnect => true)
62
- #
63
- # # A pair of servers. DB will always talk to the master. On socket
64
- # # error or "not master" error, we will auto-reconnect to the
65
- # # current master.
66
- # Mongo.new({:left => ["db1.example.com", 3000],
67
- # :right => "db2.example.com"}, # DEFAULT_PORT
68
- # nil, :auto_reconnect => true)
69
- #
70
- # # Here, :right is localhost/DEFAULT_PORT. No auto-reconnect.
71
- # Mongo.new({:left => ["db1.example.com", 3000]})
72
- #
73
- # When a DB object first connects to a pair, it will find the master
74
- # instance and connect to that one.
75
- def initialize(pair_or_host=nil, port=nil, options={})
76
- @pair = case pair_or_host
77
- when String
78
- [[pair_or_host, port ? port.to_i : DEFAULT_PORT]]
79
- when Hash
80
- connections = []
81
- connections << pair_val_to_connection(pair_or_host[:left])
82
- connections << pair_val_to_connection(pair_or_host[:right])
83
- connections
84
- when nil
85
- [['localhost', DEFAULT_PORT]]
86
- end
87
- @options = options
88
- end
89
-
90
- # Return the XGen::Mongo::Driver::DB named +db_name+. The slave_ok and
91
- # auto_reconnect options passed in via #new may be overridden here.
92
- # See DB#new for other options you can pass in.
93
- def db(db_name, options={})
94
- XGen::Mongo::Driver::DB.new(db_name, @pair, @options.merge(options))
95
- end
96
-
97
- # Returns a hash containing database names as keys and disk space for
98
- # each as values.
99
- def database_info
100
- doc = single_db_command('admin', :listDatabases => 1)
101
- h = {}
102
- doc['databases'].each { |db|
103
- h[db['name']] = db['sizeOnDisk'].to_i
104
- }
105
- h
106
- end
107
-
108
- # Returns an array of database names.
109
- def database_names
110
- database_info.keys
111
- end
112
-
113
- # Not implemented.
114
- def clone_database(from)
115
- raise "not implemented"
116
- end
117
-
118
- # Not implemented.
119
- def copy_database(from_host, from_db, to_db)
120
- raise "not implemented"
121
- end
122
-
123
- # Drops the database +name+.
124
- def drop_database(name)
125
- single_db_command(name, :dropDatabase => 1)
126
- end
127
-
128
- protected
129
-
130
- # Turns an array containing a host name string and a
131
- # port number integer into a [host, port] pair array.
132
- def pair_val_to_connection(a)
133
- case a
134
- when nil
135
- ['localhost', DEFAULT_PORT]
136
- when String
137
- [a, DEFAULT_PORT]
138
- when Integer
139
- ['localhost', a]
140
- when Array
141
- a
142
- end
143
- end
144
-
145
- # Send cmd (a hash, possibly ordered) to the admin database and return
146
- # the answer. Raises an error unless the return is "ok" (DB#ok?
147
- # returns +true+).
148
- def single_db_command(db_name, cmd)
149
- db = nil
150
- begin
151
- db = db(db_name)
152
- doc = db.db_command(cmd)
153
- raise "error retrieving database info: #{doc.inspect}" unless db.ok?(doc)
154
- doc
155
- ensure
156
- db.close if db
157
- end
158
- end
159
-
160
- end
161
- end
162
- end
163
- end
164
-