bson 4.9.0 → 4.15.0
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.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/README.md +15 -6
- data/ext/bson/bson-native.h +4 -0
- data/ext/bson/init.c +75 -23
- data/ext/bson/read.c +63 -11
- data/ext/bson/write.c +42 -3
- data/lib/bson/active_support.rb +1 -0
- data/lib/bson/array.rb +5 -1
- data/lib/bson/big_decimal.rb +67 -0
- data/lib/bson/binary.rb +8 -5
- data/lib/bson/boolean.rb +2 -1
- data/lib/bson/code.rb +2 -1
- data/lib/bson/code_with_scope.rb +2 -1
- data/lib/bson/config.rb +1 -0
- data/lib/bson/date.rb +1 -0
- data/lib/bson/date_time.rb +2 -1
- data/lib/bson/db_pointer.rb +2 -1
- data/lib/bson/dbref.rb +152 -0
- data/lib/bson/decimal128/builder.rb +27 -20
- data/lib/bson/decimal128.rb +39 -14
- data/lib/bson/document.rb +61 -18
- data/lib/bson/environment.rb +1 -0
- data/lib/bson/error.rb +13 -0
- data/lib/bson/ext_json.rb +24 -11
- data/lib/bson/false_class.rb +2 -1
- data/lib/bson/float.rb +21 -32
- data/lib/bson/hash.rb +18 -6
- data/lib/bson/int32.rb +3 -2
- data/lib/bson/int64.rb +3 -2
- data/lib/bson/integer.rb +3 -2
- data/lib/bson/json.rb +1 -0
- data/lib/bson/max_key.rb +3 -2
- data/lib/bson/min_key.rb +3 -2
- data/lib/bson/nil_class.rb +2 -1
- data/lib/bson/object.rb +1 -0
- data/lib/bson/object_id.rb +4 -3
- data/lib/bson/open_struct.rb +1 -0
- data/lib/bson/regexp.rb +24 -7
- data/lib/bson/registry.rb +1 -0
- data/lib/bson/specialized.rb +1 -0
- data/lib/bson/string.rb +3 -2
- data/lib/bson/symbol.rb +2 -1
- data/lib/bson/time.rb +4 -3
- data/lib/bson/time_with_zone.rb +1 -0
- data/lib/bson/timestamp.rb +7 -6
- data/lib/bson/true_class.rb +2 -1
- data/lib/bson/undefined.rb +2 -1
- data/lib/bson/version.rb +2 -1
- data/lib/bson.rb +8 -5
- data/spec/README.md +14 -0
- data/spec/bson/array_spec.rb +17 -0
- data/spec/bson/big_decimal_spec.rb +316 -0
- data/spec/bson/binary_spec.rb +1 -1
- data/spec/bson/binary_uuid_spec.rb +12 -0
- data/spec/bson/byte_buffer_read_spec.rb +59 -3
- data/spec/bson/byte_buffer_spec.rb +129 -6
- data/spec/bson/byte_buffer_write_spec.rb +96 -0
- data/spec/bson/date_time_spec.rb +53 -0
- data/spec/bson/dbref_legacy_spec.rb +169 -0
- data/spec/bson/dbref_spec.rb +487 -0
- data/spec/bson/decimal128_spec.rb +231 -0
- data/spec/bson/document_as_spec.rb +46 -0
- data/spec/bson/document_spec.rb +43 -1
- data/spec/bson/ext_json_parse_spec.rb +37 -0
- data/spec/bson/hash_as_spec.rb +57 -0
- data/spec/bson/hash_spec.rb +105 -0
- data/spec/bson/int64_spec.rb +4 -24
- data/spec/bson/raw_spec.rb +18 -1
- data/spec/bson/regexp_spec.rb +52 -0
- data/spec/runners/common_driver.rb +1 -1
- data/spec/shared/LICENSE +20 -0
- data/spec/shared/bin/get-mongodb-download-url +17 -0
- data/spec/shared/bin/s3-copy +45 -0
- data/spec/shared/bin/s3-upload +69 -0
- data/spec/shared/lib/mrss/child_process_helper.rb +80 -0
- data/spec/shared/lib/mrss/cluster_config.rb +231 -0
- data/spec/shared/lib/mrss/constraints.rb +386 -0
- data/spec/shared/lib/mrss/docker_runner.rb +271 -0
- data/spec/shared/lib/mrss/event_subscriber.rb +200 -0
- data/spec/shared/lib/mrss/lite_constraints.rb +191 -0
- data/spec/shared/lib/mrss/server_version_registry.rb +120 -0
- data/spec/shared/lib/mrss/spec_organizer.rb +179 -0
- data/spec/shared/lib/mrss/utils.rb +15 -0
- data/spec/shared/share/Dockerfile.erb +338 -0
- data/spec/shared/share/haproxy-1.conf +16 -0
- data/spec/shared/share/haproxy-2.conf +17 -0
- data/spec/shared/shlib/distro.sh +74 -0
- data/spec/shared/shlib/server.sh +367 -0
- data/spec/shared/shlib/set_env.sh +131 -0
- data/spec/spec_helper.rb +31 -0
- data/spec/spec_tests/common_driver_spec.rb +2 -1
- data/spec/spec_tests/data/corpus/binary.json +33 -0
- data/spec/spec_tests/data/corpus/dbref.json +21 -1
- data/spec/spec_tests/data/corpus/document.json +4 -0
- data/spec/spec_tests/data/corpus/regex.json +2 -2
- data/spec/spec_tests/data/corpus/timestamp.json +10 -0
- data/spec/spec_tests/data/corpus/top.json +23 -12
- data/spec/support/spec_config.rb +8 -1
- data.tar.gz.sig +0 -0
- metadata +168 -93
- metadata.gz.sig +1 -0
data/lib/bson/error.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
module BSON
|
2
3
|
# Base exception class for all BSON-related errors.
|
3
4
|
#
|
@@ -17,5 +18,17 @@ module BSON
|
|
17
18
|
# Exception raised when BSON decoding fails.
|
18
19
|
class BSONDecodeError < Error
|
19
20
|
end
|
21
|
+
|
22
|
+
# Exception raised when serializing an Array or Hash to BSON and an
|
23
|
+
# array or hash element is of a class that does not define how to serialize
|
24
|
+
# itself to BSON.
|
25
|
+
class UnserializableClass < Error
|
26
|
+
end
|
27
|
+
|
28
|
+
# Exception raised when there is an invalid argument passed into the
|
29
|
+
# constructor of regexp object. This includes when the argument contains
|
30
|
+
# a null byte.
|
31
|
+
class InvalidRegexpPattern < Error
|
32
|
+
end
|
20
33
|
end
|
21
34
|
end
|
data/lib/bson/ext_json.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
# Copyright (C) 2019-2020 MongoDB Inc.
|
2
3
|
#
|
3
4
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
@@ -138,7 +139,7 @@ module BSON
|
|
138
139
|
return {}
|
139
140
|
end
|
140
141
|
|
141
|
-
if
|
142
|
+
if dbref?(hash)
|
142
143
|
# Legacy dbref handling.
|
143
144
|
# Note that according to extended json spec, only hash values (but
|
144
145
|
# not the top-level BSON document itself) may be of type "dbref".
|
@@ -147,10 +148,6 @@ module BSON
|
|
147
148
|
# logic to top level hashes doesn't cause harm.
|
148
149
|
hash = hash.dup
|
149
150
|
ref = hash.delete('$ref')
|
150
|
-
# $ref can be a string value or an ObjectId
|
151
|
-
unless ref.is_a?(String)
|
152
|
-
raise Error::ExtJSONParseError, "Invalid $ref value: #{ref}"
|
153
|
-
end
|
154
151
|
# $id, if present, can be anything
|
155
152
|
id = hash.delete('$id')
|
156
153
|
if id.is_a?(Hash)
|
@@ -163,13 +160,9 @@ module BSON
|
|
163
160
|
out = {'$ref' => ref, '$id' => id}
|
164
161
|
if hash.key?('$db')
|
165
162
|
# $db must always be a string, if provided
|
166
|
-
db = hash.delete('$db')
|
167
|
-
unless db.is_a?(String)
|
168
|
-
raise Error::ExtJSONParseError, "Invalid $db value: #{db}"
|
169
|
-
end
|
170
|
-
out['$db'] = db
|
163
|
+
out['$db'] = hash.delete('$db')
|
171
164
|
end
|
172
|
-
return out.update(hash)
|
165
|
+
return out.update(parse_hash(hash))
|
173
166
|
end
|
174
167
|
|
175
168
|
if hash.length == 1
|
@@ -219,6 +212,14 @@ module BSON
|
|
219
212
|
raise Error::ExtJSONParseError, "Invalid subType value in $binary: #{value}"
|
220
213
|
end
|
221
214
|
create_binary(encoded_value, subtype)
|
215
|
+
|
216
|
+
when '$uuid'
|
217
|
+
unless /\A[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}\z/.match(value)
|
218
|
+
raise Error::ExtJSONParseError, "Invalid $uuid value: #{value}"
|
219
|
+
end
|
220
|
+
|
221
|
+
return Binary.from_uuid(value)
|
222
|
+
|
222
223
|
when '$code'
|
223
224
|
unless value.is_a?(String)
|
224
225
|
raise Error::ExtJSONParseError, "Invalid $code value: #{value}"
|
@@ -354,6 +355,9 @@ module BSON
|
|
354
355
|
|
355
356
|
module_function def map_hash(hash, **options)
|
356
357
|
::Hash[hash.map do |key, value|
|
358
|
+
if (key.is_a?(String) || key.is_a?(Symbol)) && key.to_s.include?(NULL_BYTE)
|
359
|
+
raise Error::ExtJSONParseError, "Hash key cannot contain a null byte: #{key}"
|
360
|
+
end
|
357
361
|
[key, parse_obj(value, **options)]
|
358
362
|
end]
|
359
363
|
end
|
@@ -371,5 +375,14 @@ module BSON
|
|
371
375
|
module_function def create_regexp(pattern, options)
|
372
376
|
Regexp::Raw.new(pattern, options)
|
373
377
|
end
|
378
|
+
|
379
|
+
module_function def dbref?(hash)
|
380
|
+
if db = hash.key?('$db')
|
381
|
+
unless db.is_a?(String)
|
382
|
+
return false
|
383
|
+
end
|
384
|
+
end
|
385
|
+
return hash['$ref']&.is_a?(String) && hash.key?('$id')
|
386
|
+
end
|
374
387
|
end
|
375
388
|
end
|
data/lib/bson/false_class.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
# Copyright (C) 2009-2020 MongoDB Inc.
|
2
3
|
#
|
3
4
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
@@ -25,7 +26,7 @@ module BSON
|
|
25
26
|
# A false value in the BSON spec is 0x00.
|
26
27
|
#
|
27
28
|
# @since 2.0.0
|
28
|
-
FALSE_BYTE = 0.chr
|
29
|
+
FALSE_BYTE = String.new(0.chr, encoding: BINARY).freeze
|
29
30
|
|
30
31
|
# The BSON type for false values is the general boolean type of 0x08.
|
31
32
|
#
|
data/lib/bson/float.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
# Copyright (C) 2009-2020 MongoDB Inc.
|
2
3
|
#
|
3
4
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
@@ -15,7 +16,7 @@
|
|
15
16
|
module BSON
|
16
17
|
|
17
18
|
# Injects behaviour for encoding and decoding floating point values
|
18
|
-
# to and from
|
19
|
+
# to and from raw bytes as specified by the BSON spec.
|
19
20
|
#
|
20
21
|
# @see http://bsonspec.org/#/specification
|
21
22
|
#
|
@@ -25,12 +26,12 @@ module BSON
|
|
25
26
|
# A floating point is type 0x01 in the BSON spec.
|
26
27
|
#
|
27
28
|
# @since 2.0.0
|
28
|
-
BSON_TYPE = 1.chr
|
29
|
+
BSON_TYPE = ::String.new(1.chr, encoding: BINARY).freeze
|
29
30
|
|
30
31
|
# The pack directive is for 8 byte floating points.
|
31
32
|
#
|
32
33
|
# @since 2.0.0
|
33
|
-
PACK = "E"
|
34
|
+
PACK = "E"
|
34
35
|
|
35
36
|
# Get the floating point as encoded BSON.
|
36
37
|
#
|
@@ -57,36 +58,24 @@ module BSON
|
|
57
58
|
#
|
58
59
|
# @return [ Hash | Float ] The extended json representation.
|
59
60
|
def as_extended_json(**options)
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
61
|
+
if infinite? == 1
|
62
|
+
{ '$numberDouble' => 'Infinity' }
|
63
|
+
elsif infinite? == -1
|
64
|
+
{ '$numberDouble' => '-Infinity' }
|
65
|
+
elsif nan?
|
66
|
+
{ '$numberDouble' => 'NaN' }
|
67
|
+
elsif options[:mode] == :relaxed || options[:mode] == :legacy
|
68
|
+
self
|
69
|
+
elsif BSON::Environment.jruby? && abs > 1e15
|
70
|
+
# Hack to make bson corpus spec tests pass.
|
71
|
+
# JRuby serializes -1.2345678901234568e+18 as
|
72
|
+
# -1234567890123456770.0, which is valid but differs from MRI
|
73
|
+
# serialization. Extended JSON spec does not define precise
|
74
|
+
# stringification of floats.
|
75
|
+
# https://jira.mongodb.org/browse/SPEC-1536
|
76
|
+
{ '$numberDouble' => ('%.17g' % to_s).upcase }
|
65
77
|
else
|
66
|
-
|
67
|
-
{'$numberDouble' => 'NaN'}
|
68
|
-
else
|
69
|
-
if options[:mode] == :relaxed || options[:mode] == :legacy
|
70
|
-
self
|
71
|
-
else
|
72
|
-
value = if BSON::Environment.jruby?
|
73
|
-
# Hack to make bson corpus spec tests pass.
|
74
|
-
# JRuby serializes -1.2345678901234568e+18 as
|
75
|
-
# -1234567890123456770.0, which is valid but differs from MRI
|
76
|
-
# serialization. Extended JSON spec does not define precise
|
77
|
-
# stringification of floats.
|
78
|
-
# https://jira.mongodb.org/browse/SPEC-1536
|
79
|
-
if abs > 1e15
|
80
|
-
'%.17g' % to_s
|
81
|
-
else
|
82
|
-
to_s
|
83
|
-
end
|
84
|
-
else
|
85
|
-
to_s
|
86
|
-
end
|
87
|
-
{'$numberDouble' => value.upcase}
|
88
|
-
end
|
89
|
-
end
|
78
|
+
{ '$numberDouble' => to_s.upcase }
|
90
79
|
end
|
91
80
|
end
|
92
81
|
|
data/lib/bson/hash.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
# Copyright (C) 2009-2020 MongoDB Inc.
|
2
3
|
#
|
3
4
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
@@ -25,7 +26,7 @@ module BSON
|
|
25
26
|
# A hash, also called an embedded document, is type 0x03 in the BSON spec.
|
26
27
|
#
|
27
28
|
# @since 2.0.0
|
28
|
-
BSON_TYPE = 3.chr
|
29
|
+
BSON_TYPE = ::String.new(3.chr, encoding: BINARY).freeze
|
29
30
|
|
30
31
|
# Get the hash as encoded BSON.
|
31
32
|
#
|
@@ -44,6 +45,9 @@ module BSON
|
|
44
45
|
position = buffer.length
|
45
46
|
buffer.put_int32(0)
|
46
47
|
each do |field, value|
|
48
|
+
unless value.respond_to?(:bson_type)
|
49
|
+
raise Error::UnserializableClass, "Hash value for key '#{field}' does not define its BSON serialized type: #{value}"
|
50
|
+
end
|
47
51
|
buffer.put_byte(value.bson_type)
|
48
52
|
key = field.to_bson_key(validating_keys)
|
49
53
|
begin
|
@@ -67,7 +71,7 @@ module BSON
|
|
67
71
|
# @example Convert the hash to a normalized value.
|
68
72
|
# hash.to_bson_normalized_value
|
69
73
|
#
|
70
|
-
# @return [ BSON::Document ] The
|
74
|
+
# @return [ BSON::Document ] The normalized hash.
|
71
75
|
#
|
72
76
|
# @since 3.0.0
|
73
77
|
def to_bson_normalized_value
|
@@ -85,9 +89,7 @@ module BSON
|
|
85
89
|
#
|
86
90
|
# @return [ Hash ] This hash converted to extended json representation.
|
87
91
|
def as_extended_json(**options)
|
88
|
-
|
89
|
-
[key, value.as_extended_json(**options)]
|
90
|
-
end]
|
92
|
+
transform_values { |value| value.as_extended_json(**options) }
|
91
93
|
end
|
92
94
|
|
93
95
|
module ClassMethods
|
@@ -98,7 +100,7 @@ module BSON
|
|
98
100
|
#
|
99
101
|
# @option options [ nil | :bson ] :mode Decoding mode to use.
|
100
102
|
#
|
101
|
-
# @return [
|
103
|
+
# @return [ Hash ] The decoded hash.
|
102
104
|
#
|
103
105
|
# @see http://bsonspec.org/#/specification
|
104
106
|
#
|
@@ -126,6 +128,16 @@ module BSON
|
|
126
128
|
if actual_byte_size != expected_byte_size
|
127
129
|
raise Error::BSONDecodeError, "Expected hash to take #{expected_byte_size} bytes but it took #{actual_byte_size} bytes"
|
128
130
|
end
|
131
|
+
|
132
|
+
if hash['$ref'] && hash['$id']
|
133
|
+
# We're doing implicit decoding here. If the document is an invalid
|
134
|
+
# dbref, we should decode it as a BSON::Document.
|
135
|
+
begin
|
136
|
+
hash = DBRef.new(hash)
|
137
|
+
rescue ArgumentError
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
129
141
|
hash
|
130
142
|
end
|
131
143
|
end
|
data/lib/bson/int32.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
# Copyright (C) 2009-2020 MongoDB Inc.
|
2
3
|
#
|
3
4
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
@@ -24,7 +25,7 @@ module BSON
|
|
24
25
|
# A boolean is type 0x08 in the BSON spec.
|
25
26
|
#
|
26
27
|
# @since 2.0.0
|
27
|
-
BSON_TYPE = 16.chr
|
28
|
+
BSON_TYPE = ::String.new(16.chr, encoding: BINARY).freeze
|
28
29
|
|
29
30
|
# The number of bytes constant.
|
30
31
|
#
|
@@ -34,7 +35,7 @@ module BSON
|
|
34
35
|
# Constant for the int 32 pack directive.
|
35
36
|
#
|
36
37
|
# @since 2.0.0
|
37
|
-
PACK = "l<"
|
38
|
+
PACK = "l<"
|
38
39
|
|
39
40
|
# Deserialize an Integer from BSON.
|
40
41
|
#
|
data/lib/bson/int64.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
# Copyright (C) 2009-2020 MongoDB Inc.
|
2
3
|
#
|
3
4
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
@@ -24,12 +25,12 @@ module BSON
|
|
24
25
|
# A boolean is type 0x08 in the BSON spec.
|
25
26
|
#
|
26
27
|
# @since 2.0.0
|
27
|
-
BSON_TYPE = 18.chr
|
28
|
+
BSON_TYPE = ::String.new(18.chr, encoding: BINARY).freeze
|
28
29
|
|
29
30
|
# Constant for the int 64 pack directive.
|
30
31
|
#
|
31
32
|
# @since 2.0.0
|
32
|
-
PACK = "q<"
|
33
|
+
PACK = "q<"
|
33
34
|
|
34
35
|
# Deserialize an Integer from BSON.
|
35
36
|
#
|
data/lib/bson/integer.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
# Copyright (C) 2009-2020 MongoDB Inc.
|
2
3
|
#
|
3
4
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
@@ -45,13 +46,13 @@ module BSON
|
|
45
46
|
# The BSON index size.
|
46
47
|
#
|
47
48
|
# @since 2.0.0
|
48
|
-
BSON_INDEX_SIZE = 1024
|
49
|
+
BSON_INDEX_SIZE = 1024
|
49
50
|
|
50
51
|
# A hash of index values for array optimization.
|
51
52
|
#
|
52
53
|
# @since 2.0.0
|
53
54
|
BSON_ARRAY_INDEXES = ::Array.new(BSON_INDEX_SIZE) do |i|
|
54
|
-
(i.to_s.
|
55
|
+
(i.to_s.b << NULL_BYTE).freeze
|
55
56
|
end.freeze
|
56
57
|
|
57
58
|
# Is this integer a valid BSON 32 bit value?
|
data/lib/bson/json.rb
CHANGED
data/lib/bson/max_key.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
# Copyright (C) 2009-2020 MongoDB Inc.
|
2
3
|
#
|
3
4
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
@@ -28,12 +29,12 @@ module BSON
|
|
28
29
|
# A $maxKey is type 0x7F in the BSON spec.
|
29
30
|
#
|
30
31
|
# @since 2.0.0
|
31
|
-
BSON_TYPE = 127.chr
|
32
|
+
BSON_TYPE = ::String.new(127.chr, encoding: BINARY).freeze
|
32
33
|
|
33
34
|
# Constant for always evaluating greater in a comparison.
|
34
35
|
#
|
35
36
|
# @since 2.0.0
|
36
|
-
GREATER = 1
|
37
|
+
GREATER = 1
|
37
38
|
|
38
39
|
# When comparing a max key with any other object, the max key will always
|
39
40
|
# be greater.
|
data/lib/bson/min_key.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
# Copyright (C) 2009-2020 MongoDB Inc.
|
2
3
|
#
|
3
4
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
@@ -28,12 +29,12 @@ module BSON
|
|
28
29
|
# A $minKey is type 0xFF in the BSON spec.
|
29
30
|
#
|
30
31
|
# @since 2.0.0
|
31
|
-
BSON_TYPE = 255.chr
|
32
|
+
BSON_TYPE = ::String.new(255.chr, encoding: BINARY).freeze
|
32
33
|
|
33
34
|
# Constant for always evaluating lesser in a comparison.
|
34
35
|
#
|
35
36
|
# @since 2.0.0
|
36
|
-
LESSER = -1
|
37
|
+
LESSER = -1
|
37
38
|
|
38
39
|
# When comparing a min key with any other object, the min key will always
|
39
40
|
# be lesser.
|
data/lib/bson/nil_class.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
# Copyright (C) 2009-2020 MongoDB Inc.
|
2
3
|
#
|
3
4
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
@@ -26,7 +27,7 @@ module BSON
|
|
26
27
|
# A nil is type 0x0A in the BSON spec.
|
27
28
|
#
|
28
29
|
# @since 2.0.0
|
29
|
-
BSON_TYPE = 10.chr
|
30
|
+
BSON_TYPE = ::String.new(10.chr, encoding: BINARY).freeze
|
30
31
|
|
31
32
|
module ClassMethods
|
32
33
|
|
data/lib/bson/object.rb
CHANGED
data/lib/bson/object_id.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
# Copyright (C) 2009-2020 MongoDB Inc.
|
2
3
|
#
|
3
4
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
@@ -30,7 +31,7 @@ module BSON
|
|
30
31
|
# A object_id is type 0x07 in the BSON spec.
|
31
32
|
#
|
32
33
|
# @since 2.0.0
|
33
|
-
BSON_TYPE = 7.chr
|
34
|
+
BSON_TYPE = ::String.new(7.chr, encoding: BINARY).freeze
|
34
35
|
|
35
36
|
# Check equality of the object id with another object.
|
36
37
|
#
|
@@ -112,7 +113,7 @@ module BSON
|
|
112
113
|
#
|
113
114
|
# @since 2.0.0
|
114
115
|
def generation_time
|
115
|
-
::Time.at(generate_data.
|
116
|
+
::Time.at(generate_data.unpack1("N")).utc
|
116
117
|
end
|
117
118
|
alias :to_time :generation_time
|
118
119
|
|
@@ -352,7 +353,7 @@ module BSON
|
|
352
353
|
# @since 2.0.0
|
353
354
|
def initialize
|
354
355
|
@counter = rand(0x1000000)
|
355
|
-
@machine_id = Digest::MD5.digest(Socket.gethostname).
|
356
|
+
@machine_id = Digest::MD5.digest(Socket.gethostname).unpack1("N")
|
356
357
|
@mutex = Mutex.new
|
357
358
|
end
|
358
359
|
|
data/lib/bson/open_struct.rb
CHANGED
data/lib/bson/regexp.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
# Copyright (C) 2009-2020 MongoDB Inc.
|
2
3
|
#
|
3
4
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
@@ -26,34 +27,34 @@ module BSON
|
|
26
27
|
# A regular expression is type 0x0B in the BSON spec.
|
27
28
|
#
|
28
29
|
# @since 2.0.0
|
29
|
-
BSON_TYPE = 11.chr
|
30
|
+
BSON_TYPE = ::String.new(11.chr, encoding: BINARY).freeze
|
30
31
|
|
31
32
|
# Extended value constant.
|
32
33
|
#
|
33
34
|
# @since 3.2.6
|
34
|
-
EXTENDED_VALUE = 'x'
|
35
|
+
EXTENDED_VALUE = 'x'
|
35
36
|
|
36
37
|
# Ignore case constant.
|
37
38
|
#
|
38
39
|
# @since 3.2.6
|
39
|
-
IGNORECASE_VALUE = 'i'
|
40
|
+
IGNORECASE_VALUE = 'i'
|
40
41
|
|
41
42
|
# Multiline constant.
|
42
43
|
#
|
43
44
|
# @since 3.2.6
|
44
|
-
MULTILINE_VALUE = 'm'
|
45
|
+
MULTILINE_VALUE = 'm'
|
45
46
|
|
46
47
|
# Newline constant.
|
47
48
|
#
|
48
49
|
# @since 3.2.6
|
49
|
-
NEWLINE_VALUE = 's'
|
50
|
+
NEWLINE_VALUE = 's'
|
50
51
|
|
51
52
|
# Ruby multiline constant.
|
52
53
|
#
|
53
54
|
# @since 3.2.6
|
54
55
|
#
|
55
56
|
# @deprecated Will be removed in 5.0
|
56
|
-
RUBY_MULTILINE_VALUE = 'ms'
|
57
|
+
RUBY_MULTILINE_VALUE = 'ms'
|
57
58
|
|
58
59
|
# Get the regexp as JSON hash data.
|
59
60
|
#
|
@@ -154,6 +155,16 @@ module BSON
|
|
154
155
|
#
|
155
156
|
# @since 3.0.0
|
156
157
|
def initialize(pattern, options = '')
|
158
|
+
if pattern.include?(NULL_BYTE)
|
159
|
+
raise Error::InvalidRegexpPattern, "Regexp pattern cannot contain a null byte: #{pattern}"
|
160
|
+
elsif options.is_a?(String) || options.is_a?(Symbol)
|
161
|
+
if options.to_s.include?(NULL_BYTE)
|
162
|
+
raise Error::InvalidRegexpPattern, "Regexp options cannot contain a null byte: #{options}"
|
163
|
+
end
|
164
|
+
elsif !options.is_a?(Integer)
|
165
|
+
raise ArgumentError, "Regexp options must be a String, Symbol, or Integer"
|
166
|
+
end
|
167
|
+
|
157
168
|
@pattern = pattern
|
158
169
|
@options = options
|
159
170
|
end
|
@@ -165,7 +176,13 @@ module BSON
|
|
165
176
|
#
|
166
177
|
# @since 3.1.0
|
167
178
|
def respond_to?(method, include_private = false)
|
168
|
-
|
179
|
+
if defined?(@pattern)
|
180
|
+
compile.respond_to?(method, include_private) || super
|
181
|
+
else
|
182
|
+
# YAML calls #respond_to? during deserialization, before the object
|
183
|
+
# is initialized.
|
184
|
+
super
|
185
|
+
end
|
169
186
|
end
|
170
187
|
|
171
188
|
# Encode the Raw Regexp object to BSON.
|
data/lib/bson/registry.rb
CHANGED
data/lib/bson/specialized.rb
CHANGED
data/lib/bson/string.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
|
+
# frozen_string_literal: true
|
2
3
|
# Copyright (C) 2009-2020 MongoDB Inc.
|
3
4
|
#
|
4
5
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
@@ -26,12 +27,12 @@ module BSON
|
|
26
27
|
# A string is type 0x02 in the BSON spec.
|
27
28
|
#
|
28
29
|
# @since 2.0.0
|
29
|
-
BSON_TYPE = 2.chr
|
30
|
+
BSON_TYPE = ::String.new(2.chr, encoding: BINARY).freeze
|
30
31
|
|
31
32
|
# Regex for matching illegal BSON keys.
|
32
33
|
#
|
33
34
|
# @since 4.1.0
|
34
|
-
ILLEGAL_KEY = /(\A[$])|(\.)
|
35
|
+
ILLEGAL_KEY = /(\A[$])|(\.)/
|
35
36
|
|
36
37
|
# Get the string as encoded BSON.
|
37
38
|
#
|
data/lib/bson/symbol.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
# Copyright (C) 2009-2020 MongoDB Inc.
|
2
3
|
#
|
3
4
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
@@ -28,7 +29,7 @@ module BSON
|
|
28
29
|
# A symbol is type 0x0E in the BSON spec.
|
29
30
|
#
|
30
31
|
# @since 2.0.0
|
31
|
-
BSON_TYPE = 14.chr
|
32
|
+
BSON_TYPE = ::String.new(14.chr, encoding: BINARY).freeze
|
32
33
|
|
33
34
|
# Symbols are serialized as strings as symbols are now removed from the
|
34
35
|
# BSON specification. Therefore the bson_type when serializing must be a
|
data/lib/bson/time.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
# Copyright (C) 2009-2020 MongoDB Inc.
|
2
3
|
#
|
3
4
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
@@ -39,7 +40,7 @@ module BSON
|
|
39
40
|
# A time is type 0x09 in the BSON spec.
|
40
41
|
#
|
41
42
|
# @since 2.0.0
|
42
|
-
BSON_TYPE = 9.chr
|
43
|
+
BSON_TYPE = ::String.new(9.chr, encoding: BINARY).freeze
|
43
44
|
|
44
45
|
# Get the time as encoded BSON.
|
45
46
|
#
|
@@ -63,8 +64,8 @@ module BSON
|
|
63
64
|
#
|
64
65
|
# @note The time is floored to the nearest millisecond.
|
65
66
|
#
|
66
|
-
# @option
|
67
|
-
# extended JSON
|
67
|
+
# @option opts [ nil | :relaxed | :legacy ] :mode Serialization mode
|
68
|
+
# (default is canonical extended JSON)
|
68
69
|
#
|
69
70
|
# @return [ Hash ] The extended json representation.
|
70
71
|
def as_extended_json(**options)
|
data/lib/bson/time_with_zone.rb
CHANGED
data/lib/bson/timestamp.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
# Copyright (C) 2009-2020 MongoDB Inc.
|
2
3
|
#
|
3
4
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
@@ -26,12 +27,12 @@ module BSON
|
|
26
27
|
# A timestamp is type 0x11 in the BSON spec.
|
27
28
|
#
|
28
29
|
# @since 2.0.0
|
29
|
-
BSON_TYPE = 17.chr
|
30
|
+
BSON_TYPE = ::String.new(17.chr, encoding: BINARY).freeze
|
30
31
|
|
31
32
|
# Error message if an object other than a Timestamp is compared with this object.
|
32
33
|
#
|
33
34
|
# @since 4.3.0
|
34
|
-
COMPARISON_ERROR_MESSAGE = 'comparison of %s with Timestamp failed'
|
35
|
+
COMPARISON_ERROR_MESSAGE = 'comparison of %s with Timestamp failed'
|
35
36
|
|
36
37
|
# @!attribute seconds
|
37
38
|
# @return [ Integer ] The number of seconds.
|
@@ -124,8 +125,8 @@ module BSON
|
|
124
125
|
#
|
125
126
|
# @since 2.0.0
|
126
127
|
def to_bson(buffer = ByteBuffer.new, validating_keys = Config.validating_keys?)
|
127
|
-
buffer.
|
128
|
-
buffer.
|
128
|
+
buffer.put_uint32(increment)
|
129
|
+
buffer.put_uint32(seconds)
|
129
130
|
end
|
130
131
|
|
131
132
|
# Deserialize timestamp from BSON.
|
@@ -140,8 +141,8 @@ module BSON
|
|
140
141
|
#
|
141
142
|
# @since 2.0.0
|
142
143
|
def self.from_bson(buffer, **options)
|
143
|
-
increment = buffer.
|
144
|
-
seconds = buffer.
|
144
|
+
increment = buffer.get_uint32
|
145
|
+
seconds = buffer.get_uint32
|
145
146
|
new(seconds, increment)
|
146
147
|
end
|
147
148
|
|
data/lib/bson/true_class.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
# Copyright (C) 2009-2020 MongoDB Inc.
|
2
3
|
#
|
3
4
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
@@ -25,7 +26,7 @@ module BSON
|
|
25
26
|
# A true value in the BSON spec is 0x01.
|
26
27
|
#
|
27
28
|
# @since 2.0.0
|
28
|
-
TRUE_BYTE = 1.chr
|
29
|
+
TRUE_BYTE = ::String.new(1.chr, encoding: BINARY).freeze
|
29
30
|
|
30
31
|
# The BSON type for true values is the general boolean type of 0x08.
|
31
32
|
#
|
data/lib/bson/undefined.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
# Copyright (C) 2009-2020 MongoDB Inc.
|
2
3
|
#
|
3
4
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
@@ -25,7 +26,7 @@ module BSON
|
|
25
26
|
# Undefined is type 0x06 in the BSON spec.
|
26
27
|
#
|
27
28
|
# @since 2.0.0
|
28
|
-
BSON_TYPE = 6.chr
|
29
|
+
BSON_TYPE = ::String.new(6.chr, encoding: BINARY).freeze
|
29
30
|
|
30
31
|
# Determine if undefined is equal to another object.
|
31
32
|
#
|
data/lib/bson/version.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
# Copyright (C) 2009-2020 MongoDB Inc.
|
2
3
|
#
|
3
4
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
@@ -13,5 +14,5 @@
|
|
13
14
|
# limitations under the License.
|
14
15
|
|
15
16
|
module BSON
|
16
|
-
VERSION = "4.
|
17
|
+
VERSION = "4.15.0"
|
17
18
|
end
|