mongodb-mongo 0.5.3 → 0.6.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.
- data/README.rdoc +6 -6
- data/bin/run_test_script +4 -0
- data/bin/standard_benchmark +49 -0
- data/examples/admin.rb +41 -0
- data/examples/benchmarks.rb +6 -2
- data/examples/capped.rb +23 -0
- data/examples/cursor.rb +47 -0
- data/examples/gridfs.rb +87 -0
- data/examples/info.rb +30 -0
- data/examples/queries.rb +69 -0
- data/examples/strict.rb +34 -0
- data/examples/types.rb +40 -0
- data/lib/mongo/collection.rb +10 -2
- data/lib/mongo/cursor.rb +5 -0
- data/lib/mongo/db.rb +2 -0
- data/lib/mongo/gridfs/chunk.rb +0 -2
- data/lib/mongo/gridfs/grid_store.rb +10 -10
- data/lib/mongo/message/query_message.rb +1 -1
- data/lib/mongo/query.rb +1 -0
- data/lib/mongo/types/objectid.rb +2 -2
- data/lib/mongo/util/bson.rb +4 -4
- data/mongo-ruby-driver.gemspec +77 -58
- data/tests/mongo-qa/admin +26 -0
- data/tests/mongo-qa/capped +5 -0
- data/tests/mongo-qa/count1 +8 -0
- data/tests/mongo-qa/dbs +22 -0
- data/tests/mongo-qa/find +4 -0
- data/tests/mongo-qa/find1 +15 -0
- data/tests/mongo-qa/indices +46 -0
- data/tests/mongo-qa/remove +18 -0
- data/tests/mongo-qa/stress1 +35 -0
- data/tests/mongo-qa/test1 +5 -1
- data/tests/mongo-qa/update +18 -0
- data/tests/test_db.rb +2 -2
- data/tests/test_db_api.rb +12 -0
- data/tests/test_objectid.rb +8 -8
- metadata +21 -7
- data/tests/mongo-qa/circular +0 -16
data/examples/types.rb
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
$LOAD_PATH[0,0] = File.join(File.dirname(__FILE__), '..', 'lib')
|
2
|
+
require 'mongo'
|
3
|
+
require 'pp'
|
4
|
+
|
5
|
+
include XGen::Mongo::Driver
|
6
|
+
|
7
|
+
host = ENV['MONGO_RUBY_DRIVER_HOST'] || 'localhost'
|
8
|
+
port = ENV['MONGO_RUBY_DRIVER_PORT'] || XGen::Mongo::Driver::Mongo::DEFAULT_PORT
|
9
|
+
|
10
|
+
puts "Connecting to #{host}:#{port}"
|
11
|
+
db = Mongo.new(host, port).db('ruby-mongo-examples')
|
12
|
+
coll = db.collection('test')
|
13
|
+
|
14
|
+
# Remove all records, if any
|
15
|
+
coll.clear
|
16
|
+
|
17
|
+
# Insert record with all sorts of values
|
18
|
+
coll.insert('array' => [1, 2, 3],
|
19
|
+
'string' => 'hello',
|
20
|
+
'hash' => {'a' => 1, 'b' => 2},
|
21
|
+
'date' => Time.now, # milliseconds only; microseconds are not stored
|
22
|
+
'oid' => ObjectID.new,
|
23
|
+
'binary' => Binary.new([1, 2, 3]),
|
24
|
+
'int' => 42,
|
25
|
+
'float' => 33.33333,
|
26
|
+
'regex' => /foobar/i,
|
27
|
+
'boolean' => true,
|
28
|
+
'$where' => 'this.x == 3', # special case of string
|
29
|
+
'dbref' => DBRef.new(nil, 'dbref', db, coll.name, ObjectID.new),
|
30
|
+
|
31
|
+
# NOTE: the undefined type is not saved to the database properly. This is a
|
32
|
+
# Mongo bug. However, the undefined type may go away completely.
|
33
|
+
# 'undef' => Undefined.new,
|
34
|
+
|
35
|
+
'null' => nil,
|
36
|
+
'symbol' => :zildjian)
|
37
|
+
|
38
|
+
pp coll.find().next_object
|
39
|
+
|
40
|
+
coll.clear
|
data/lib/mongo/collection.rb
CHANGED
@@ -26,8 +26,8 @@ module XGen
|
|
26
26
|
attr_reader :db, :name, :hint
|
27
27
|
|
28
28
|
def initialize(db, name)
|
29
|
-
@db = db
|
30
|
-
@
|
29
|
+
@db, @name = db, name
|
30
|
+
@hint = nil
|
31
31
|
end
|
32
32
|
|
33
33
|
# Set hint fields to use and return +self+. hint may be a single field
|
@@ -65,6 +65,14 @@ module XGen
|
|
65
65
|
@db.query(self, Query.new(selector, fields, offset, limit, sort, hint))
|
66
66
|
end
|
67
67
|
|
68
|
+
# Find the first record that matches +selector+. See #find.
|
69
|
+
def find_first(selector={}, options={})
|
70
|
+
h = options.dup
|
71
|
+
h[:limit] = 1
|
72
|
+
cursor = find(selector, h)
|
73
|
+
cursor.next_object # don't need to explicitly close b/c of limit
|
74
|
+
end
|
75
|
+
|
68
76
|
# Insert +objects+, which are hashes. "<<" is aliased to this method.
|
69
77
|
# Returns either the single inserted object or a new array containing
|
70
78
|
# +objects+. The object(s) may have been modified by the database's PK
|
data/lib/mongo/cursor.rb
CHANGED
@@ -38,6 +38,7 @@ module XGen
|
|
38
38
|
@closed = false
|
39
39
|
@can_call_to_a = true
|
40
40
|
@query_run = false
|
41
|
+
@rows = nil
|
41
42
|
end
|
42
43
|
|
43
44
|
def closed?; @closed; end
|
@@ -133,6 +134,10 @@ module XGen
|
|
133
134
|
end
|
134
135
|
|
135
136
|
# Close the cursor.
|
137
|
+
#
|
138
|
+
# Note: if a cursor is read until exhausted (read until OP_QUERY or
|
139
|
+
# OP_GETMORE returns zero for the cursor id), there is no need to
|
140
|
+
# close it by calling this method.
|
136
141
|
def close
|
137
142
|
@db.send_to_db(KillCursorsMessage.new(@cursor_id)) if @cursor_id
|
138
143
|
@cache = []
|
data/lib/mongo/db.rb
CHANGED
@@ -122,6 +122,7 @@ module XGen
|
|
122
122
|
@auto_reconnect = options[:auto_reconnect]
|
123
123
|
@semaphore = Object.new
|
124
124
|
@semaphore.extend Mutex_m
|
125
|
+
@socket = nil
|
125
126
|
connect_to_master
|
126
127
|
end
|
127
128
|
|
@@ -132,6 +133,7 @@ module XGen
|
|
132
133
|
@host, @port = *hp
|
133
134
|
begin
|
134
135
|
@socket = TCPSocket.new(@host, @port)
|
136
|
+
@socket.setsockopt(Socket::IPPROTO_TCP, Socket::TCP_NODELAY, 1)
|
135
137
|
|
136
138
|
# Check for master. Can't call master? because it uses mutex,
|
137
139
|
# which may already be in use during this call.
|
data/lib/mongo/gridfs/chunk.rb
CHANGED
@@ -201,13 +201,13 @@ module XGen
|
|
201
201
|
|
202
202
|
def gets(separator=$/)
|
203
203
|
str = ''
|
204
|
-
byte = getc
|
204
|
+
byte = self.getc
|
205
205
|
return nil if byte == nil # EOF
|
206
206
|
while byte != nil
|
207
207
|
s = byte.chr
|
208
208
|
str << s
|
209
209
|
break if s == separator
|
210
|
-
byte = getc
|
210
|
+
byte = self.getc
|
211
211
|
end
|
212
212
|
@lineno += 1
|
213
213
|
str
|
@@ -215,17 +215,17 @@ module XGen
|
|
215
215
|
|
216
216
|
def read(len=nil, buf=nil)
|
217
217
|
buf ||= ''
|
218
|
-
byte = getc
|
218
|
+
byte = self.getc
|
219
219
|
while byte != nil && (len == nil || len > 0)
|
220
220
|
buf << byte.chr
|
221
221
|
len -= 1 if len
|
222
|
-
byte = getc if (len == nil || len > 0)
|
222
|
+
byte = self.getc if (len == nil || len > 0)
|
223
223
|
end
|
224
224
|
buf
|
225
225
|
end
|
226
226
|
|
227
227
|
def readchar
|
228
|
-
byte = getc
|
228
|
+
byte = self.getc
|
229
229
|
raise EOFError.new if byte == nil
|
230
230
|
byte
|
231
231
|
end
|
@@ -250,10 +250,10 @@ module XGen
|
|
250
250
|
alias_method :each_line, :each
|
251
251
|
|
252
252
|
def each_byte
|
253
|
-
byte = getc
|
253
|
+
byte = self.getc
|
254
254
|
while byte
|
255
255
|
yield byte
|
256
|
-
byte = getc
|
256
|
+
byte = self.getc
|
257
257
|
end
|
258
258
|
end
|
259
259
|
|
@@ -280,14 +280,14 @@ module XGen
|
|
280
280
|
objs = [$_] if objs == nil || objs.empty?
|
281
281
|
objs.each { |obj|
|
282
282
|
str = obj.to_s
|
283
|
-
str.each_byte { |byte| putc(byte) }
|
283
|
+
str.each_byte { |byte| self.putc(byte) }
|
284
284
|
}
|
285
285
|
nil
|
286
286
|
end
|
287
287
|
|
288
288
|
def puts(*objs)
|
289
289
|
if objs == nil || objs.empty?
|
290
|
-
putc(10)
|
290
|
+
self.putc(10)
|
291
291
|
else
|
292
292
|
print(*objs.collect{ |obj|
|
293
293
|
str = obj.to_s
|
@@ -307,7 +307,7 @@ module XGen
|
|
307
307
|
raise "#@filename not opened for write" unless @mode[0] == ?w
|
308
308
|
count = 0
|
309
309
|
string.each_byte { |byte|
|
310
|
-
putc byte
|
310
|
+
self.putc byte
|
311
311
|
count += 1
|
312
312
|
}
|
313
313
|
count
|
@@ -16,7 +16,7 @@ module XGen
|
|
16
16
|
write_int(0)
|
17
17
|
write_string("#{db_name}.#{collection_name}")
|
18
18
|
write_int(query.number_to_skip)
|
19
|
-
write_int(query.number_to_return)
|
19
|
+
write_int(-query.number_to_return) # Negative means hard limit
|
20
20
|
sel = query.selector
|
21
21
|
if query.contains_special_fields
|
22
22
|
sel = OrderedHash.new
|
data/lib/mongo/query.rb
CHANGED
@@ -65,6 +65,7 @@ module XGen
|
|
65
65
|
def initialize(sel={}, return_fields=nil, number_to_skip=0, number_to_return=0, order_by=nil, hint=nil)
|
66
66
|
@number_to_skip, @number_to_return, @order_by, @hint =
|
67
67
|
number_to_skip, number_to_return, order_by, hint
|
68
|
+
@explain = nil
|
68
69
|
self.selector = sel
|
69
70
|
self.fields = return_fields
|
70
71
|
end
|
data/lib/mongo/types/objectid.rb
CHANGED
@@ -64,7 +64,7 @@ module XGen
|
|
64
64
|
# Given a string representation of an ObjectID, return a new ObjectID
|
65
65
|
# with that value.
|
66
66
|
def self.from_string(str)
|
67
|
-
raise "illegal ObjectID format" unless
|
67
|
+
raise "illegal ObjectID format" unless legal?(str)
|
68
68
|
data = []
|
69
69
|
BYTE_ORDER.each_with_index { |string_position, data_index|
|
70
70
|
data[data_index] = str[string_position * 2, 2].to_i(16)
|
@@ -72,7 +72,7 @@ module XGen
|
|
72
72
|
self.new(data)
|
73
73
|
end
|
74
74
|
|
75
|
-
def self.
|
75
|
+
def self.legal?(str)
|
76
76
|
len = BYTE_ORDER.length * 2
|
77
77
|
str =~ /([0-9a-f]+)/i
|
78
78
|
match = $1
|
data/lib/mongo/util/bson.rb
CHANGED
@@ -54,7 +54,7 @@ class BSON
|
|
54
54
|
end
|
55
55
|
else
|
56
56
|
def self.to_utf8(str)
|
57
|
-
str # TODO punt for now
|
57
|
+
str # TODO Ruby 1.8 punt for now
|
58
58
|
end
|
59
59
|
end
|
60
60
|
|
@@ -117,7 +117,7 @@ class BSON
|
|
117
117
|
when UNDEFINED
|
118
118
|
serialize_undefined_element(@buf, k)
|
119
119
|
when CODE_W_SCOPE
|
120
|
-
# TODO
|
120
|
+
# TODO CODE_W_SCOPE unimplemented; may be removed
|
121
121
|
raise "unimplemented type #{type}"
|
122
122
|
else
|
123
123
|
raise "unhandled type #{type}"
|
@@ -177,7 +177,7 @@ class BSON
|
|
177
177
|
key = deserialize_cstr(@buf)
|
178
178
|
doc[key] = deserialize_binary_data(@buf)
|
179
179
|
when CODE_W_SCOPE
|
180
|
-
# TODO
|
180
|
+
# TODO CODE_W_SCOPE unimplemented; may be removed
|
181
181
|
raise "unimplemented type #{type}"
|
182
182
|
when EOO
|
183
183
|
break
|
@@ -393,7 +393,7 @@ class BSON
|
|
393
393
|
|
394
394
|
def deserialize_cstr(buf)
|
395
395
|
chars = ""
|
396
|
-
while
|
396
|
+
while true
|
397
397
|
b = buf.get
|
398
398
|
break if b == 0
|
399
399
|
chars << b.chr
|
data/mongo-ruby-driver.gemspec
CHANGED
@@ -1,69 +1,88 @@
|
|
1
|
+
PACKAGE_FILES = ['README.rdoc', 'Rakefile', 'mongo-ruby-driver.gemspec',
|
2
|
+
'bin/mongo_console',
|
3
|
+
'bin/run_test_script',
|
4
|
+
'bin/standard_benchmark',
|
5
|
+
'examples/admin.rb',
|
6
|
+
'examples/benchmarks.rb',
|
7
|
+
'examples/blog.rb',
|
8
|
+
'examples/capped.rb',
|
9
|
+
'examples/cursor.rb',
|
10
|
+
'examples/gridfs.rb',
|
11
|
+
'examples/index_test.rb',
|
12
|
+
'examples/info.rb',
|
13
|
+
'examples/queries.rb',
|
14
|
+
'examples/simple.rb',
|
15
|
+
'examples/strict.rb',
|
16
|
+
'examples/types.rb',
|
17
|
+
'lib/mongo/admin.rb',
|
18
|
+
'lib/mongo/collection.rb',
|
19
|
+
'lib/mongo/cursor.rb',
|
20
|
+
'lib/mongo/db.rb',
|
21
|
+
'lib/mongo/gridfs/chunk.rb',
|
22
|
+
'lib/mongo/gridfs/grid_store.rb',
|
23
|
+
'lib/mongo/gridfs.rb',
|
24
|
+
'lib/mongo/message/get_more_message.rb',
|
25
|
+
'lib/mongo/message/insert_message.rb',
|
26
|
+
'lib/mongo/message/kill_cursors_message.rb',
|
27
|
+
'lib/mongo/message/message.rb',
|
28
|
+
'lib/mongo/message/message_header.rb',
|
29
|
+
'lib/mongo/message/msg_message.rb',
|
30
|
+
'lib/mongo/message/opcodes.rb',
|
31
|
+
'lib/mongo/message/query_message.rb',
|
32
|
+
'lib/mongo/message/remove_message.rb',
|
33
|
+
'lib/mongo/message/update_message.rb',
|
34
|
+
'lib/mongo/message.rb',
|
35
|
+
'lib/mongo/mongo.rb',
|
36
|
+
'lib/mongo/query.rb',
|
37
|
+
'lib/mongo/types/binary.rb',
|
38
|
+
'lib/mongo/types/dbref.rb',
|
39
|
+
'lib/mongo/types/objectid.rb',
|
40
|
+
'lib/mongo/types/regexp_of_holding.rb',
|
41
|
+
'lib/mongo/types/undefined.rb',
|
42
|
+
'lib/mongo/util/bson.rb',
|
43
|
+
'lib/mongo/util/byte_buffer.rb',
|
44
|
+
'lib/mongo/util/ordered_hash.rb',
|
45
|
+
'lib/mongo/util/xml_to_ruby.rb',
|
46
|
+
'lib/mongo.rb']
|
47
|
+
|
48
|
+
TEST_FILES = ['tests/mongo-qa/_common.rb',
|
49
|
+
'tests/mongo-qa/admin',
|
50
|
+
'tests/mongo-qa/capped',
|
51
|
+
'tests/mongo-qa/count1',
|
52
|
+
'tests/mongo-qa/dbs',
|
53
|
+
'tests/mongo-qa/find',
|
54
|
+
'tests/mongo-qa/find1',
|
55
|
+
'tests/mongo-qa/indices',
|
56
|
+
'tests/mongo-qa/remove',
|
57
|
+
'tests/mongo-qa/stress1',
|
58
|
+
'tests/mongo-qa/test1',
|
59
|
+
'tests/mongo-qa/update',
|
60
|
+
'tests/test_admin.rb',
|
61
|
+
'tests/test_bson.rb',
|
62
|
+
'tests/test_byte_buffer.rb',
|
63
|
+
'tests/test_chunk.rb',
|
64
|
+
'tests/test_cursor.rb',
|
65
|
+
'tests/test_db.rb',
|
66
|
+
'tests/test_db_api.rb',
|
67
|
+
'tests/test_db_connection.rb',
|
68
|
+
'tests/test_grid_store.rb',
|
69
|
+
'tests/test_message.rb',
|
70
|
+
'tests/test_mongo.rb',
|
71
|
+
'tests/test_objectid.rb',
|
72
|
+
'tests/test_ordered_hash.rb',
|
73
|
+
'tests/test_round_trip.rb']
|
74
|
+
|
1
75
|
Gem::Specification.new do |s|
|
2
76
|
s.name = 'mongo'
|
3
|
-
s.version = '0.
|
77
|
+
s.version = '0.6.2'
|
4
78
|
s.platform = Gem::Platform::RUBY
|
5
79
|
s.summary = 'Simple pure-Ruby driver for the 10gen Mongo DB'
|
6
80
|
s.description = 'A pure-Ruby driver for the 10gen Mongo DB. For more information about Mongo, see http://www.mongodb.org.'
|
7
81
|
|
8
82
|
s.require_paths = ['lib']
|
9
83
|
|
10
|
-
s.files =
|
11
|
-
|
12
|
-
'examples/blog.rb',
|
13
|
-
'examples/index_test.rb',
|
14
|
-
'examples/simple.rb',
|
15
|
-
'lib/mongo.rb',
|
16
|
-
'lib/mongo/admin.rb',
|
17
|
-
'lib/mongo/collection.rb',
|
18
|
-
'lib/mongo/cursor.rb',
|
19
|
-
'lib/mongo/db.rb',
|
20
|
-
'lib/mongo/gridfs/chunk.rb',
|
21
|
-
'lib/mongo/gridfs/grid_store.rb',
|
22
|
-
'lib/mongo/gridfs.rb',
|
23
|
-
'lib/mongo/message/get_more_message.rb',
|
24
|
-
'lib/mongo/message/insert_message.rb',
|
25
|
-
'lib/mongo/message/kill_cursors_message.rb',
|
26
|
-
'lib/mongo/message/message.rb',
|
27
|
-
'lib/mongo/message/message_header.rb',
|
28
|
-
'lib/mongo/message/msg_message.rb',
|
29
|
-
'lib/mongo/message/opcodes.rb',
|
30
|
-
'lib/mongo/message/query_message.rb',
|
31
|
-
'lib/mongo/message/remove_message.rb',
|
32
|
-
'lib/mongo/message/update_message.rb',
|
33
|
-
'lib/mongo/message.rb',
|
34
|
-
'lib/mongo/mongo.rb',
|
35
|
-
'lib/mongo/query.rb',
|
36
|
-
'lib/mongo/types/binary.rb',
|
37
|
-
'lib/mongo/types/dbref.rb',
|
38
|
-
'lib/mongo/types/objectid.rb',
|
39
|
-
'lib/mongo/types/regexp_of_holding.rb',
|
40
|
-
'lib/mongo/types/undefined.rb',
|
41
|
-
'lib/mongo/util/bson.rb',
|
42
|
-
'lib/mongo/util/byte_buffer.rb',
|
43
|
-
'lib/mongo/util/ordered_hash.rb',
|
44
|
-
'lib/mongo/util/xml_to_ruby.rb',
|
45
|
-
'README.rdoc', 'Rakefile', 'mongo-ruby-driver.gemspec']
|
46
|
-
s.test_files = ['tests/mongo-qa/_common.rb',
|
47
|
-
'tests/mongo-qa/capped',
|
48
|
-
'tests/mongo-qa/circular',
|
49
|
-
'tests/mongo-qa/count1',
|
50
|
-
'tests/mongo-qa/find',
|
51
|
-
'tests/mongo-qa/remove',
|
52
|
-
'tests/mongo-qa/test1',
|
53
|
-
'tests/test_admin.rb',
|
54
|
-
'tests/test_bson.rb',
|
55
|
-
'tests/test_byte_buffer.rb',
|
56
|
-
'tests/test_chunk.rb',
|
57
|
-
'tests/test_cursor.rb',
|
58
|
-
'tests/test_db.rb',
|
59
|
-
'tests/test_db_api.rb',
|
60
|
-
'tests/test_db_connection.rb',
|
61
|
-
'tests/test_grid_store.rb',
|
62
|
-
'tests/test_message.rb',
|
63
|
-
'tests/test_mongo.rb',
|
64
|
-
'tests/test_objectid.rb',
|
65
|
-
'tests/test_ordered_hash.rb',
|
66
|
-
'tests/test_round_trip.rb']
|
84
|
+
s.files = PACKAGE_FILES
|
85
|
+
s.test_files = TEST_FILES
|
67
86
|
|
68
87
|
s.has_rdoc = true
|
69
88
|
s.rdoc_options = ['--main', 'README.rdoc', '--inline-source']
|
@@ -0,0 +1,26 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require File.join(File.dirname(__FILE__), '_common.rb')
|
4
|
+
db = Mongo.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]
|
data/tests/mongo-qa/capped
CHANGED
@@ -3,6 +3,11 @@
|
|
3
3
|
require File.join(File.dirname(__FILE__), '_common.rb')
|
4
4
|
db = Mongo.new(DEFAULT_HOST, DEFAULT_PORT).db(DEFAULT_DB)
|
5
5
|
|
6
|
+
if $DEBUG
|
7
|
+
db.drop_collection('capped1')
|
8
|
+
db.drop_collection('capped2')
|
9
|
+
end
|
10
|
+
|
6
11
|
db.create_collection('capped1', :capped => true, :size => 500)
|
7
12
|
coll = db.collection('capped1')
|
8
13
|
coll.insert('x' => 1)
|