mongo 0.1.0 → 0.15
Sign up to get free protection for your applications and to get access to all the features.
- 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]
|