mongo 0.1.0 → 0.15
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.
- data/README.rdoc +268 -71
- data/Rakefile +27 -62
- data/bin/bson_benchmark.rb +59 -0
- data/bin/mongo_console +3 -3
- data/bin/run_test_script +19 -0
- data/bin/standard_benchmark +109 -0
- data/examples/admin.rb +41 -0
- data/examples/benchmarks.rb +42 -0
- data/examples/blog.rb +76 -0
- data/examples/capped.rb +23 -0
- data/examples/cursor.rb +47 -0
- data/examples/gridfs.rb +87 -0
- data/examples/index_test.rb +125 -0
- data/examples/info.rb +30 -0
- data/examples/queries.rb +69 -0
- data/examples/simple.rb +23 -0
- data/examples/strict.rb +34 -0
- data/examples/types.rb +35 -0
- data/lib/mongo.rb +9 -2
- data/lib/mongo/admin.rb +65 -68
- data/lib/mongo/collection.rb +379 -117
- data/lib/mongo/connection.rb +151 -0
- data/lib/mongo/cursor.rb +271 -216
- data/lib/mongo/db.rb +500 -315
- data/lib/mongo/errors.rb +26 -0
- data/lib/mongo/gridfs.rb +16 -0
- data/lib/mongo/gridfs/chunk.rb +92 -0
- data/lib/mongo/gridfs/grid_store.rb +464 -0
- data/lib/mongo/message.rb +16 -0
- data/lib/mongo/message/get_more_message.rb +24 -13
- data/lib/mongo/message/insert_message.rb +29 -11
- data/lib/mongo/message/kill_cursors_message.rb +23 -12
- data/lib/mongo/message/message.rb +74 -62
- data/lib/mongo/message/message_header.rb +35 -24
- data/lib/mongo/message/msg_message.rb +21 -9
- data/lib/mongo/message/opcodes.rb +26 -15
- data/lib/mongo/message/query_message.rb +63 -43
- data/lib/mongo/message/remove_message.rb +29 -12
- data/lib/mongo/message/update_message.rb +30 -13
- data/lib/mongo/query.rb +97 -89
- data/lib/mongo/types/binary.rb +25 -21
- data/lib/mongo/types/code.rb +30 -0
- data/lib/mongo/types/dbref.rb +19 -23
- data/lib/mongo/types/objectid.rb +130 -116
- data/lib/mongo/types/regexp_of_holding.rb +27 -31
- data/lib/mongo/util/bson.rb +273 -160
- data/lib/mongo/util/byte_buffer.rb +32 -28
- data/lib/mongo/util/ordered_hash.rb +88 -42
- data/lib/mongo/util/xml_to_ruby.rb +18 -15
- data/mongo-ruby-driver.gemspec +103 -0
- data/test/mongo-qa/_common.rb +8 -0
- data/test/mongo-qa/admin +26 -0
- data/test/mongo-qa/capped +22 -0
- data/test/mongo-qa/count1 +18 -0
- data/test/mongo-qa/dbs +22 -0
- data/test/mongo-qa/find +10 -0
- data/test/mongo-qa/find1 +15 -0
- data/test/mongo-qa/gridfs_in +16 -0
- data/test/mongo-qa/gridfs_out +17 -0
- data/test/mongo-qa/indices +49 -0
- data/test/mongo-qa/remove +25 -0
- data/test/mongo-qa/stress1 +35 -0
- data/test/mongo-qa/test1 +11 -0
- data/test/mongo-qa/update +18 -0
- data/{tests → test}/test_admin.rb +25 -16
- data/test/test_bson.rb +268 -0
- data/{tests → test}/test_byte_buffer.rb +0 -0
- data/test/test_chunk.rb +84 -0
- data/test/test_collection.rb +282 -0
- data/test/test_connection.rb +101 -0
- data/test/test_cursor.rb +321 -0
- data/test/test_db.rb +196 -0
- data/test/test_db_api.rb +798 -0
- data/{tests → test}/test_db_connection.rb +4 -3
- data/test/test_grid_store.rb +284 -0
- data/{tests → test}/test_message.rb +1 -1
- data/test/test_objectid.rb +105 -0
- data/{tests → test}/test_ordered_hash.rb +55 -0
- data/{tests → test}/test_round_trip.rb +13 -9
- data/test/test_threading.rb +37 -0
- metadata +74 -32
- data/bin/validate +0 -51
- data/lib/mongo/mongo.rb +0 -74
- data/lib/mongo/types/undefined.rb +0 -31
- data/tests/test_bson.rb +0 -135
- data/tests/test_cursor.rb +0 -66
- data/tests/test_db.rb +0 -51
- data/tests/test_db_api.rb +0 -349
- data/tests/test_objectid.rb +0 -88
@@ -1,17 +1,17 @@
|
|
1
1
|
# --
|
2
2
|
# Copyright (C) 2008-2009 10gen Inc.
|
3
3
|
#
|
4
|
-
#
|
5
|
-
#
|
6
|
-
#
|
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
7
|
#
|
8
|
-
#
|
9
|
-
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
10
|
-
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
|
11
|
-
# for more details.
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
12
9
|
#
|
13
|
-
#
|
14
|
-
#
|
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
15
|
# ++
|
16
16
|
|
17
17
|
# A byte buffer.
|
@@ -66,14 +66,10 @@ class ByteBuffer
|
|
66
66
|
@cursor += array.length
|
67
67
|
end
|
68
68
|
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
else
|
74
|
-
def put_int(i, offset=nil)
|
75
|
-
put_array([i].pack(@int_pack_order).split(//).collect{|c| c[0]}, offset)
|
76
|
-
end
|
69
|
+
def put_int(i, offset=nil)
|
70
|
+
a = []
|
71
|
+
[i].pack(@int_pack_order).each_byte { |b| a << b }
|
72
|
+
put_array(a, offset)
|
77
73
|
end
|
78
74
|
|
79
75
|
def put_long(i, offset=nil)
|
@@ -87,14 +83,10 @@ class ByteBuffer
|
|
87
83
|
end
|
88
84
|
end
|
89
85
|
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
else
|
95
|
-
def put_double(d, offset=nil)
|
96
|
-
put_array([d].pack(@double_pack_order).split(//).collect{|c| c[0]}, offset)
|
97
|
-
end
|
86
|
+
def put_double(d, offset=nil)
|
87
|
+
a = []
|
88
|
+
[d].pack(@double_pack_order).each_byte { |b| a << b }
|
89
|
+
put_array(a, offset)
|
98
90
|
end
|
99
91
|
|
100
92
|
# If +size+ == nil, returns one byte. Else returns array of bytes of length
|
@@ -108,7 +100,11 @@ class ByteBuffer
|
|
108
100
|
if one_byte
|
109
101
|
@buf[start]
|
110
102
|
else
|
111
|
-
@buf
|
103
|
+
if @buf.respond_to? "unpack"
|
104
|
+
@buf[start, len].unpack("C*")
|
105
|
+
else
|
106
|
+
@buf[start, len]
|
107
|
+
end
|
112
108
|
end
|
113
109
|
end
|
114
110
|
|
@@ -143,11 +139,19 @@ class ByteBuffer
|
|
143
139
|
end
|
144
140
|
|
145
141
|
def to_a
|
146
|
-
@buf
|
142
|
+
if @buf.respond_to? "unpack"
|
143
|
+
@buf.unpack("C*")
|
144
|
+
else
|
145
|
+
@buf
|
146
|
+
end
|
147
147
|
end
|
148
148
|
|
149
149
|
def to_s
|
150
|
-
@buf.pack
|
150
|
+
if @buf.respond_to? "pack"
|
151
|
+
@buf.pack("C*")
|
152
|
+
else
|
153
|
+
@buf
|
154
|
+
end
|
151
155
|
end
|
152
156
|
|
153
157
|
def dump
|
@@ -1,17 +1,17 @@
|
|
1
1
|
# --
|
2
2
|
# Copyright (C) 2008-2009 10gen Inc.
|
3
3
|
#
|
4
|
-
#
|
5
|
-
#
|
6
|
-
#
|
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
7
|
#
|
8
|
-
#
|
9
|
-
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
10
|
-
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
|
11
|
-
# for more details.
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
12
9
|
#
|
13
|
-
#
|
14
|
-
#
|
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
15
|
# ++
|
16
16
|
|
17
17
|
# A hash in which the order of keys are preserved.
|
@@ -20,49 +20,95 @@
|
|
20
20
|
# Hash already keeps its keys ordered by order of insertion.
|
21
21
|
class OrderedHash < Hash
|
22
22
|
|
23
|
+
def ==(other)
|
24
|
+
begin
|
25
|
+
!other.nil? &&
|
26
|
+
keys == other.keys &&
|
27
|
+
values == other.values
|
28
|
+
rescue
|
29
|
+
false
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
23
33
|
# We only need the body of this class if the RUBY_VERSION is before 1.9
|
24
34
|
if RUBY_VERSION < '1.9'
|
35
|
+
attr_accessor :ordered_keys
|
25
36
|
|
26
|
-
|
37
|
+
def self.[] *args
|
38
|
+
oh = OrderedHash.new
|
39
|
+
if Hash === args[0]
|
40
|
+
oh.merge! args[0]
|
41
|
+
elsif (args.size % 2) != 0
|
42
|
+
raise ArgumentError, "odd number of elements for Hash"
|
43
|
+
else
|
44
|
+
0.step(args.size - 1, 2) do |key|
|
45
|
+
value = key + 1
|
46
|
+
oh[args[key]] = args[value]
|
47
|
+
end
|
48
|
+
end
|
49
|
+
oh
|
50
|
+
end
|
27
51
|
|
28
|
-
|
29
|
-
|
30
|
-
|
52
|
+
def initialize(*a, &b)
|
53
|
+
super
|
54
|
+
@ordered_keys = []
|
55
|
+
end
|
31
56
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
super(key, value)
|
36
|
-
end
|
57
|
+
def keys
|
58
|
+
@ordered_keys || []
|
59
|
+
end
|
37
60
|
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
61
|
+
def []=(key, value)
|
62
|
+
@ordered_keys ||= []
|
63
|
+
@ordered_keys << key unless @ordered_keys.include?(key)
|
64
|
+
super(key, value)
|
65
|
+
end
|
42
66
|
|
43
|
-
|
44
|
-
|
45
|
-
|
67
|
+
def each
|
68
|
+
@ordered_keys ||= []
|
69
|
+
@ordered_keys.each { |k| yield k, self[k] }
|
70
|
+
self
|
71
|
+
end
|
46
72
|
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
oh
|
51
|
-
end
|
73
|
+
def values
|
74
|
+
collect { |k, v| v }
|
75
|
+
end
|
52
76
|
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
end
|
77
|
+
def merge(other)
|
78
|
+
oh = self.dup
|
79
|
+
oh.merge!(other)
|
80
|
+
oh
|
81
|
+
end
|
59
82
|
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
83
|
+
def merge!(other)
|
84
|
+
@ordered_keys ||= []
|
85
|
+
@ordered_keys += other.keys # unordered if not an OrderedHash
|
86
|
+
@ordered_keys.uniq!
|
87
|
+
super(other)
|
88
|
+
end
|
65
89
|
|
66
|
-
|
90
|
+
def inspect
|
91
|
+
str = '{'
|
92
|
+
str << (@ordered_keys || []).collect { |k| "\"#{k}\"=>#{self.[](k).inspect}" }.join(", ")
|
93
|
+
str << '}'
|
94
|
+
end
|
67
95
|
|
96
|
+
def delete(key, &block)
|
97
|
+
@ordered_keys.delete(key) if @ordered_keys
|
98
|
+
super
|
99
|
+
end
|
100
|
+
|
101
|
+
def delete_if(&block)
|
102
|
+
self.each { |k,v|
|
103
|
+
if yield k, v
|
104
|
+
delete(k)
|
105
|
+
end
|
106
|
+
}
|
107
|
+
end
|
108
|
+
|
109
|
+
def clear
|
110
|
+
super
|
111
|
+
@ordered_keys = []
|
112
|
+
end
|
113
|
+
end
|
68
114
|
end
|
@@ -1,17 +1,17 @@
|
|
1
1
|
# --
|
2
2
|
# Copyright (C) 2008-2009 10gen Inc.
|
3
3
|
#
|
4
|
-
#
|
5
|
-
#
|
6
|
-
#
|
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
7
|
#
|
8
|
-
#
|
9
|
-
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
10
|
-
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
|
11
|
-
# for more details.
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
12
9
|
#
|
13
|
-
#
|
14
|
-
#
|
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
15
|
# ++
|
16
16
|
|
17
17
|
require 'rexml/document'
|
@@ -21,7 +21,7 @@ require 'mongo'
|
|
21
21
|
# an OrderedHash.
|
22
22
|
class XMLToRuby
|
23
23
|
|
24
|
-
include
|
24
|
+
include Mongo
|
25
25
|
|
26
26
|
def xml_to_ruby(io)
|
27
27
|
doc = REXML::Document.new(io)
|
@@ -42,10 +42,15 @@ class XMLToRuby
|
|
42
42
|
e.text.to_i
|
43
43
|
when 'number'
|
44
44
|
e.text.to_f
|
45
|
-
when 'string'
|
45
|
+
when 'string'
|
46
46
|
e.text.to_s
|
47
|
+
when 'code'
|
48
|
+
Code.new(e.text.to_s)
|
47
49
|
when 'binary'
|
48
|
-
|
50
|
+
bin = Binary.new
|
51
|
+
decoded = Base64.decode64(e.text.to_s)
|
52
|
+
decoded.each_byte { |b| bin.put(b) }
|
53
|
+
bin
|
49
54
|
when 'symbol'
|
50
55
|
e.text.to_s.intern
|
51
56
|
when 'boolean'
|
@@ -58,8 +63,6 @@ class XMLToRuby
|
|
58
63
|
regex_to_ruby(e.elements)
|
59
64
|
when 'null'
|
60
65
|
nil
|
61
|
-
when 'undefined'
|
62
|
-
Undefined.new
|
63
66
|
when 'doc'
|
64
67
|
doc_to_ruby(e)
|
65
68
|
else
|
@@ -96,7 +99,7 @@ class XMLToRuby
|
|
96
99
|
def dbref_to_ruby(elements)
|
97
100
|
ns = elements['ns'].text
|
98
101
|
oid_str = elements['oid'].text
|
99
|
-
DBRef.new(
|
102
|
+
DBRef.new(ns, ObjectID.from_string(oid_str))
|
100
103
|
end
|
101
104
|
|
102
105
|
end
|
@@ -0,0 +1,103 @@
|
|
1
|
+
# We need to list all of the included files because we aren't allowed to use
|
2
|
+
# Dir[...] in the github sandbox.
|
3
|
+
PACKAGE_FILES = ['README.rdoc', 'Rakefile', 'mongo-ruby-driver.gemspec',
|
4
|
+
'bin/bson_benchmark.rb',
|
5
|
+
'bin/mongo_console',
|
6
|
+
'bin/run_test_script',
|
7
|
+
'bin/standard_benchmark',
|
8
|
+
'examples/admin.rb',
|
9
|
+
'examples/benchmarks.rb',
|
10
|
+
'examples/blog.rb',
|
11
|
+
'examples/capped.rb',
|
12
|
+
'examples/cursor.rb',
|
13
|
+
'examples/gridfs.rb',
|
14
|
+
'examples/index_test.rb',
|
15
|
+
'examples/info.rb',
|
16
|
+
'examples/queries.rb',
|
17
|
+
'examples/simple.rb',
|
18
|
+
'examples/strict.rb',
|
19
|
+
'examples/types.rb',
|
20
|
+
'lib/mongo/admin.rb',
|
21
|
+
'lib/mongo/collection.rb',
|
22
|
+
'lib/mongo/connection.rb',
|
23
|
+
'lib/mongo/cursor.rb',
|
24
|
+
'lib/mongo/db.rb',
|
25
|
+
'lib/mongo/gridfs/chunk.rb',
|
26
|
+
'lib/mongo/gridfs/grid_store.rb',
|
27
|
+
'lib/mongo/gridfs.rb',
|
28
|
+
'lib/mongo/errors.rb',
|
29
|
+
'lib/mongo/message/get_more_message.rb',
|
30
|
+
'lib/mongo/message/insert_message.rb',
|
31
|
+
'lib/mongo/message/kill_cursors_message.rb',
|
32
|
+
'lib/mongo/message/message.rb',
|
33
|
+
'lib/mongo/message/message_header.rb',
|
34
|
+
'lib/mongo/message/msg_message.rb',
|
35
|
+
'lib/mongo/message/opcodes.rb',
|
36
|
+
'lib/mongo/message/query_message.rb',
|
37
|
+
'lib/mongo/message/remove_message.rb',
|
38
|
+
'lib/mongo/message/update_message.rb',
|
39
|
+
'lib/mongo/message.rb',
|
40
|
+
'lib/mongo/query.rb',
|
41
|
+
'lib/mongo/types/binary.rb',
|
42
|
+
'lib/mongo/types/code.rb',
|
43
|
+
'lib/mongo/types/dbref.rb',
|
44
|
+
'lib/mongo/types/objectid.rb',
|
45
|
+
'lib/mongo/types/regexp_of_holding.rb',
|
46
|
+
'lib/mongo/util/bson.rb',
|
47
|
+
'lib/mongo/util/byte_buffer.rb',
|
48
|
+
'lib/mongo/util/ordered_hash.rb',
|
49
|
+
'lib/mongo/util/xml_to_ruby.rb',
|
50
|
+
'lib/mongo.rb']
|
51
|
+
TEST_FILES = ['test/mongo-qa/_common.rb',
|
52
|
+
'test/mongo-qa/admin',
|
53
|
+
'test/mongo-qa/capped',
|
54
|
+
'test/mongo-qa/count1',
|
55
|
+
'test/mongo-qa/dbs',
|
56
|
+
'test/mongo-qa/find',
|
57
|
+
'test/mongo-qa/find1',
|
58
|
+
'test/mongo-qa/gridfs_in',
|
59
|
+
'test/mongo-qa/gridfs_out',
|
60
|
+
'test/mongo-qa/indices',
|
61
|
+
'test/mongo-qa/remove',
|
62
|
+
'test/mongo-qa/stress1',
|
63
|
+
'test/mongo-qa/test1',
|
64
|
+
'test/mongo-qa/update',
|
65
|
+
'test/test_admin.rb',
|
66
|
+
'test/test_bson.rb',
|
67
|
+
'test/test_byte_buffer.rb',
|
68
|
+
'test/test_chunk.rb',
|
69
|
+
'test/test_collection.rb',
|
70
|
+
'test/test_connection.rb',
|
71
|
+
'test/test_cursor.rb',
|
72
|
+
'test/test_db.rb',
|
73
|
+
'test/test_db_api.rb',
|
74
|
+
'test/test_db_connection.rb',
|
75
|
+
'test/test_grid_store.rb',
|
76
|
+
'test/test_message.rb',
|
77
|
+
'test/test_objectid.rb',
|
78
|
+
'test/test_ordered_hash.rb',
|
79
|
+
'test/test_threading.rb',
|
80
|
+
'test/test_round_trip.rb']
|
81
|
+
|
82
|
+
Gem::Specification.new do |s|
|
83
|
+
s.name = 'mongo'
|
84
|
+
|
85
|
+
# be sure to change this constant in lib/mongo.rb as well
|
86
|
+
s.version = '0.15'
|
87
|
+
|
88
|
+
s.platform = Gem::Platform::RUBY
|
89
|
+
s.summary = 'Ruby driver for the MongoDB'
|
90
|
+
s.description = 'A Ruby driver for MongoDB. For more information about Mongo, see http://www.mongodb.org.'
|
91
|
+
|
92
|
+
s.require_paths = ['lib']
|
93
|
+
s.files = PACKAGE_FILES
|
94
|
+
s.test_files = TEST_FILES
|
95
|
+
|
96
|
+
s.has_rdoc = true
|
97
|
+
s.rdoc_options = ['--main', 'README.rdoc', '--inline-source']
|
98
|
+
s.extra_rdoc_files = ['README.rdoc']
|
99
|
+
|
100
|
+
s.authors = ['Jim Menard', 'Mike Dirolf']
|
101
|
+
s.email = 'mongodb-dev@googlegroups.com'
|
102
|
+
s.homepage = 'http://www.mongodb.org'
|
103
|
+
end
|
data/test/mongo-qa/admin
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require File.join(File.dirname(__FILE__), '_common.rb')
|
4
|
+
db = Connection.new(DEFAULT_HOST, DEFAULT_PORT).db(DEFAULT_DB)
|
5
|
+
|
6
|
+
db.collection('test').insert({'test' => 1})
|
7
|
+
admin = db.admin
|
8
|
+
|
9
|
+
if $DEBUG
|
10
|
+
db.drop_collection('tester')
|
11
|
+
admin.profiling_level = :slow_only
|
12
|
+
end
|
13
|
+
|
14
|
+
['test', 'pdlskwmf', '$'].each { |name|
|
15
|
+
begin
|
16
|
+
admin.validate_collection(name)
|
17
|
+
puts 'true'
|
18
|
+
rescue => ex
|
19
|
+
puts 'false'
|
20
|
+
end
|
21
|
+
}
|
22
|
+
|
23
|
+
level_xlation = {:off => 'off', :all => 'all', :slow_only => 'slowOnly'}
|
24
|
+
puts level_xlation[admin.profiling_level]
|
25
|
+
admin.profiling_level = :off
|
26
|
+
puts level_xlation[admin.profiling_level]
|