bson 4.0.0.beta → 4.0.0.rc0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/ext/bson/native-endian.h +153 -99
- data/ext/bson/native.c +31 -30
- data/lib/bson/document.rb +24 -3
- data/lib/bson/version.rb +1 -1
- data/spec/bson/document_spec.rb +45 -17
- metadata +3 -3
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 50450bf61d6b631052b5a15fe98bcd5f572679d8
|
4
|
+
data.tar.gz: 079657ee59b117dcabc37e762642a90d5890f235
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5981ca13936db57eda138264169994bfa188cf0d79cb8808d1e7e1182dcf7de604017fa1b37e9c3179ed9154383b3ff2d0d449a72899e754b4e9b788235e0df9
|
7
|
+
data.tar.gz: 7142366162a5ac4648887be40a77285cff05f9e6c7198d47e36c37c298e26dba9c6b0ba11d429dea917460df304eeb88e5bbcc9f17443ae85ca31217c7f65f67
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data.tar.gz.sig
CHANGED
Binary file
|
data/ext/bson/native-endian.h
CHANGED
@@ -1,11 +1,18 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
1
|
+
/*
|
2
|
+
* Copyright 2015 MongoDB, 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
|
+
*/
|
9
16
|
|
10
17
|
#if (defined(_WIN16) || defined(_WIN32) || defined(_WIN64)) && !defined(__WINDOWS__)
|
11
18
|
|
@@ -16,105 +23,152 @@
|
|
16
23
|
# include <sys/types.h>
|
17
24
|
#endif
|
18
25
|
|
19
|
-
#
|
20
|
-
|
21
|
-
# include <endian.h>
|
22
|
-
|
23
|
-
#elif defined(__APPLE__)
|
24
|
-
|
25
|
-
# include <libkern/OSByteOrder.h>
|
26
|
-
|
27
|
-
# define htobe16(x) OSSwapHostToBigInt16(x)
|
28
|
-
# define htole16(x) OSSwapHostToLittleInt16(x)
|
29
|
-
# define be16toh(x) OSSwapBigToHostInt16(x)
|
30
|
-
# define le16toh(x) OSSwapLittleToHostInt16(x)
|
31
|
-
|
32
|
-
# define htobe32(x) OSSwapHostToBigInt32(x)
|
33
|
-
# define htole32(x) OSSwapHostToLittleInt32(x)
|
34
|
-
# define be32toh(x) OSSwapBigToHostInt32(x)
|
35
|
-
# define le32toh(x) OSSwapLittleToHostInt32(x)
|
36
|
-
|
37
|
-
# define htobe64(x) OSSwapHostToBigInt64(x)
|
38
|
-
# define htole64(x) OSSwapHostToLittleInt64(x)
|
39
|
-
# define be64toh(x) OSSwapBigToHostInt64(x)
|
40
|
-
# define le64toh(x) OSSwapLittleToHostInt64(x)
|
41
|
-
|
42
|
-
# define __BYTE_ORDER BYTE_ORDER
|
43
|
-
# define __BIG_ENDIAN BIG_ENDIAN
|
44
|
-
# define __LITTLE_ENDIAN LITTLE_ENDIAN
|
45
|
-
# define __PDP_ENDIAN PDP_ENDIAN
|
46
|
-
|
47
|
-
#elif defined(__OpenBSD__)
|
48
|
-
|
49
|
-
# include <sys/endian.h>
|
50
|
-
|
51
|
-
#elif defined(__NetBSD__) || defined(__FreeBSD__) || defined(__DragonFly__)
|
26
|
+
#define BSON_BIG_ENDIAN 4321
|
27
|
+
#define BSON_LITTLE_ENDIAN 1234
|
52
28
|
|
53
|
-
#
|
54
|
-
|
55
|
-
#
|
56
|
-
#
|
57
|
-
|
58
|
-
#
|
59
|
-
#
|
60
|
-
|
61
|
-
# define be64toh(x) betoh64(x)
|
62
|
-
# define le64toh(x) letoh64(x)
|
63
|
-
|
64
|
-
#elif defined(__WINDOWS__)
|
65
|
-
|
66
|
-
# include <sys/param.h>
|
29
|
+
#if defined(__sun)
|
30
|
+
# include <sys/byteorder.h>
|
31
|
+
# if defined(_LITTLE_ENDIAN)
|
32
|
+
# define BSON_BYTE_ORDER 1234
|
33
|
+
# else
|
34
|
+
# define BSON_BYTE_ORDER 4321
|
35
|
+
# endif
|
36
|
+
#endif
|
67
37
|
|
38
|
+
#ifndef BSON_BYTE_ORDER
|
68
39
|
# if BYTE_ORDER == LITTLE_ENDIAN
|
69
|
-
|
70
|
-
# define htobe16(x) htons(x)
|
71
|
-
# define htole16(x) (x)
|
72
|
-
# define be16toh(x) ntohs(x)
|
73
|
-
# define le16toh(x) (x)
|
74
|
-
|
75
|
-
# define htobe32(x) htonl(x)
|
76
|
-
# define htole32(x) (x)
|
77
|
-
# define be32toh(x) ntohl(x)
|
78
|
-
# define le32toh(x) (x)
|
79
|
-
|
80
|
-
# define htobe64(x) htonll(x)
|
81
|
-
# define htole64(x) (x)
|
82
|
-
# define be64toh(x) ntohll(x)
|
83
|
-
# define le64toh(x) (x)
|
84
|
-
|
40
|
+
# define BSON_BYTE_ORDER 1234
|
85
41
|
# elif BYTE_ORDER == BIG_ENDIAN
|
86
|
-
|
87
|
-
/* that would be xbox 360 */
|
88
|
-
# define htobe16(x) (x)
|
89
|
-
# define htole16(x) __builtin_bswap16(x)
|
90
|
-
# define be16toh(x) (x)
|
91
|
-
# define le16toh(x) __builtin_bswap16(x)
|
92
|
-
|
93
|
-
# define htobe32(x) (x)
|
94
|
-
# define htole32(x) __builtin_bswap32(x)
|
95
|
-
# define be32toh(x) (x)
|
96
|
-
# define le32toh(x) __builtin_bswap32(x)
|
97
|
-
|
98
|
-
# define htobe64(x) (x)
|
99
|
-
# define htole64(x) __builtin_bswap64(x)
|
100
|
-
# define be64toh(x) (x)
|
101
|
-
# define le64toh(x) __builtin_bswap64(x)
|
102
|
-
|
103
|
-
# else
|
104
|
-
|
105
|
-
# error byte order not supported
|
106
|
-
|
42
|
+
# define BSON_BYTE_ORDER 4321
|
107
43
|
# endif
|
44
|
+
#endif
|
108
45
|
|
109
|
-
#
|
110
|
-
# define
|
111
|
-
# define
|
112
|
-
#
|
113
|
-
|
114
|
-
#
|
46
|
+
#if defined(__sun)
|
47
|
+
# define BSON_UINT32_SWAP_LE_BE(v) __bson_uint32_swap_slow((uint32_t)v)
|
48
|
+
# define BSON_UINT64_SWAP_LE_BE(v) __bson_uint64_swap_slow((uint64_t)v)
|
49
|
+
#elif defined(__clang__) && defined(__clang_major__) && defined(__clang_minor__) && \
|
50
|
+
(__clang_major__ >= 3) && (__clang_minor__ >= 1)
|
51
|
+
# if __has_builtin(__builtin_bswap32)
|
52
|
+
# define BSON_UINT32_SWAP_LE_BE(v) __builtin_bswap32(v)
|
53
|
+
# endif
|
54
|
+
# if __has_builtin(__builtin_bswap64)
|
55
|
+
# define BSON_UINT64_SWAP_LE_BE(v) __builtin_bswap64(v)
|
56
|
+
# endif
|
57
|
+
#elif defined(__GNUC__) && (__GNUC__ >= 4)
|
58
|
+
# if __GNUC__ >= 4 && defined (__GNUC_MINOR__) && __GNUC_MINOR__ >= 3
|
59
|
+
# define BSON_UINT32_SWAP_LE_BE(v) __builtin_bswap32 ((uint32_t)v)
|
60
|
+
# define BSON_UINT64_SWAP_LE_BE(v) __builtin_bswap64 ((uint64_t)v)
|
61
|
+
# endif
|
62
|
+
#endif
|
115
63
|
|
116
|
-
#
|
64
|
+
#ifndef BSON_UINT32_SWAP_LE_BE
|
65
|
+
# define BSON_UINT32_SWAP_LE_BE(v) __bson_uint32_swap_slow((uint32_t)v)
|
66
|
+
#endif
|
117
67
|
|
68
|
+
#ifndef BSON_UINT64_SWAP_LE_BE
|
69
|
+
# define BSON_UINT64_SWAP_LE_BE(v) __bson_uint64_swap_slow((uint64_t)v)
|
118
70
|
#endif
|
119
71
|
|
72
|
+
#if BSON_BYTE_ORDER == BSON_LITTLE_ENDIAN
|
73
|
+
# define BSON_UINT32_FROM_LE(v) ((uint32_t)v)
|
74
|
+
# define BSON_UINT32_TO_LE(v) ((uint32_t)v)
|
75
|
+
# define BSON_UINT32_FROM_BE(v) BSON_UINT32_SWAP_LE_BE(v)
|
76
|
+
# define BSON_UINT32_TO_BE(v) BSON_UINT32_SWAP_LE_BE(v)
|
77
|
+
# define BSON_UINT64_FROM_LE(v) ((uint64_t)v)
|
78
|
+
# define BSON_UINT64_TO_LE(v) ((uint64_t)v)
|
79
|
+
# define BSON_UINT64_FROM_BE(v) BSON_UINT64_SWAP_LE_BE(v)
|
80
|
+
# define BSON_UINT64_TO_BE(v) BSON_UINT64_SWAP_LE_BE(v)
|
81
|
+
# define BSON_DOUBLE_FROM_LE(v) ((double)v)
|
82
|
+
# define BSON_DOUBLE_TO_LE(v) ((double)v)
|
83
|
+
#elif BSON_BYTE_ORDER == BSON_BIG_ENDIAN
|
84
|
+
# define BSON_UINT32_FROM_LE(v) BSON_UINT32_SWAP_LE_BE(v)
|
85
|
+
# define BSON_UINT32_TO_LE(v) BSON_UINT32_SWAP_LE_BE(v)
|
86
|
+
# define BSON_UINT32_FROM_BE(v) ((uint32_t)v)
|
87
|
+
# define BSON_UINT32_TO_BE(v) ((uint32_t)v)
|
88
|
+
# define BSON_UINT64_FROM_LE(v) BSON_UINT64_SWAP_LE_BE(v)
|
89
|
+
# define BSON_UINT64_TO_LE(v) BSON_UINT64_SWAP_LE_BE(v)
|
90
|
+
# define BSON_UINT64_FROM_BE(v) ((uint64_t)v)
|
91
|
+
# define BSON_UINT64_TO_BE(v) ((uint64_t)v)
|
92
|
+
# define BSON_DOUBLE_FROM_LE(v) (__bson_double_swap_slow(v))
|
93
|
+
# define BSON_DOUBLE_TO_LE(v) (__bson_double_swap_slow(v))
|
94
|
+
#else
|
95
|
+
# error "The endianness of target architecture is unknown."
|
120
96
|
#endif
|
97
|
+
|
98
|
+
/*
|
99
|
+
*--------------------------------------------------------------------------
|
100
|
+
*
|
101
|
+
* __bson_uint32_swap_slow --
|
102
|
+
*
|
103
|
+
* Fallback endianness conversion for 32-bit integers.
|
104
|
+
*
|
105
|
+
* Returns:
|
106
|
+
* The endian swapped version.
|
107
|
+
*
|
108
|
+
* Side effects:
|
109
|
+
* None.
|
110
|
+
*
|
111
|
+
*--------------------------------------------------------------------------
|
112
|
+
*/
|
113
|
+
static uint32_t __bson_uint32_swap_slow(uint32_t v)
|
114
|
+
{
|
115
|
+
return ((v & 0x000000FFU) << 24) |
|
116
|
+
((v & 0x0000FF00U) << 8) |
|
117
|
+
((v & 0x00FF0000U) >> 8) |
|
118
|
+
((v & 0xFF000000U) >> 24);
|
119
|
+
}
|
120
|
+
|
121
|
+
|
122
|
+
/*
|
123
|
+
*--------------------------------------------------------------------------
|
124
|
+
*
|
125
|
+
* __bson_uint64_swap_slow --
|
126
|
+
*
|
127
|
+
* Fallback endianness conversion for 64-bit integers.
|
128
|
+
*
|
129
|
+
* Returns:
|
130
|
+
* The endian swapped version.
|
131
|
+
*
|
132
|
+
* Side effects:
|
133
|
+
* None.
|
134
|
+
*
|
135
|
+
*--------------------------------------------------------------------------
|
136
|
+
*/
|
137
|
+
static uint64_t __bson_uint64_swap_slow(uint64_t v)
|
138
|
+
{
|
139
|
+
return ((v & 0x00000000000000FFULL) << 56) |
|
140
|
+
((v & 0x000000000000FF00ULL) << 40) |
|
141
|
+
((v & 0x0000000000FF0000ULL) << 24) |
|
142
|
+
((v & 0x00000000FF000000ULL) << 8) |
|
143
|
+
((v & 0x000000FF00000000ULL) >> 8) |
|
144
|
+
((v & 0x0000FF0000000000ULL) >> 24) |
|
145
|
+
((v & 0x00FF000000000000ULL) >> 40) |
|
146
|
+
((v & 0xFF00000000000000ULL) >> 56);
|
147
|
+
}
|
148
|
+
|
149
|
+
/*
|
150
|
+
*--------------------------------------------------------------------------
|
151
|
+
*
|
152
|
+
* __bson_double_swap_slow --
|
153
|
+
*
|
154
|
+
* Fallback endianness conversion for double floating point.
|
155
|
+
*
|
156
|
+
* Returns:
|
157
|
+
* The endian swapped version.
|
158
|
+
*
|
159
|
+
* Side effects:
|
160
|
+
* None.
|
161
|
+
*
|
162
|
+
*--------------------------------------------------------------------------
|
163
|
+
*/
|
164
|
+
static double __bson_double_swap_slow(double v)
|
165
|
+
{
|
166
|
+
uint64_t uv;
|
167
|
+
|
168
|
+
memcpy(&uv, &v, sizeof(v));
|
169
|
+
uv = BSON_UINT64_SWAP_LE_BE(uv);
|
170
|
+
memcpy(&v, &uv, sizeof(v));
|
171
|
+
|
172
|
+
return v;
|
173
|
+
}
|
174
|
+
|
data/ext/bson/native.c
CHANGED
@@ -203,7 +203,7 @@ VALUE rb_bson_byte_buffer_get_bytes(VALUE self, VALUE i)
|
|
203
203
|
{
|
204
204
|
byte_buffer_t *b;
|
205
205
|
VALUE bytes;
|
206
|
-
const
|
206
|
+
const uint32_t length = FIX2LONG(i);
|
207
207
|
|
208
208
|
TypedData_Get_Struct(self, byte_buffer_t, &rb_byte_buffer_data_type, b);
|
209
209
|
ENSURE_BSON_READ(b, length);
|
@@ -235,13 +235,13 @@ VALUE rb_bson_byte_buffer_get_cstring(VALUE self)
|
|
235
235
|
VALUE rb_bson_byte_buffer_get_double(VALUE self)
|
236
236
|
{
|
237
237
|
byte_buffer_t *b;
|
238
|
-
|
238
|
+
double d;
|
239
239
|
|
240
240
|
TypedData_Get_Struct(self, byte_buffer_t, &rb_byte_buffer_data_type, b);
|
241
241
|
ENSURE_BSON_READ(b, 8);
|
242
|
-
|
242
|
+
memcpy(&d, READ_PTR(b), 8);
|
243
243
|
b->read_position += 8;
|
244
|
-
return DBL2NUM(
|
244
|
+
return DBL2NUM(BSON_DOUBLE_FROM_LE(d));
|
245
245
|
}
|
246
246
|
|
247
247
|
/**
|
@@ -254,9 +254,9 @@ VALUE rb_bson_byte_buffer_get_int32(VALUE self)
|
|
254
254
|
|
255
255
|
TypedData_Get_Struct(self, byte_buffer_t, &rb_byte_buffer_data_type, b);
|
256
256
|
ENSURE_BSON_READ(b, 4);
|
257
|
-
i32
|
257
|
+
memcpy(&i32, READ_PTR(b), 4);
|
258
258
|
b->read_position += 4;
|
259
|
-
return INT2NUM(i32);
|
259
|
+
return INT2NUM(BSON_UINT32_FROM_LE(i32));
|
260
260
|
}
|
261
261
|
|
262
262
|
/**
|
@@ -269,9 +269,9 @@ VALUE rb_bson_byte_buffer_get_int64(VALUE self)
|
|
269
269
|
|
270
270
|
TypedData_Get_Struct(self, byte_buffer_t, &rb_byte_buffer_data_type, b);
|
271
271
|
ENSURE_BSON_READ(b, 8);
|
272
|
-
i64
|
272
|
+
memcpy(&i64, READ_PTR(b), 8);
|
273
273
|
b->read_position += 8;
|
274
|
-
return
|
274
|
+
return LL2NUM(BSON_UINT64_FROM_LE(i64));
|
275
275
|
}
|
276
276
|
|
277
277
|
/**
|
@@ -281,15 +281,17 @@ VALUE rb_bson_byte_buffer_get_string(VALUE self)
|
|
281
281
|
{
|
282
282
|
byte_buffer_t *b;
|
283
283
|
int32_t length;
|
284
|
+
int32_t length_le;
|
284
285
|
VALUE string;
|
285
286
|
|
286
287
|
TypedData_Get_Struct(self, byte_buffer_t, &rb_byte_buffer_data_type, b);
|
287
288
|
ENSURE_BSON_READ(b, 4);
|
288
|
-
length
|
289
|
+
memcpy(&length, READ_PTR(b), 4);
|
290
|
+
length_le = BSON_UINT32_FROM_LE(length);
|
289
291
|
b->read_position += 4;
|
290
|
-
ENSURE_BSON_READ(b,
|
291
|
-
string = rb_enc_str_new(READ_PTR(b),
|
292
|
-
b->read_position +=
|
292
|
+
ENSURE_BSON_READ(b, length_le);
|
293
|
+
string = rb_enc_str_new(READ_PTR(b), length_le - 1, rb_utf8_encoding());
|
294
|
+
b->read_position += length_le;
|
293
295
|
return string;
|
294
296
|
}
|
295
297
|
|
@@ -351,13 +353,10 @@ VALUE rb_bson_byte_buffer_put_cstring(VALUE self, VALUE string)
|
|
351
353
|
VALUE rb_bson_byte_buffer_put_double(VALUE self, VALUE f)
|
352
354
|
{
|
353
355
|
byte_buffer_t *b;
|
354
|
-
|
355
|
-
|
356
|
-
ucast.d = NUM2DBL(f);
|
356
|
+
const double d = BSON_DOUBLE_TO_LE(NUM2DBL(f));
|
357
357
|
TypedData_Get_Struct(self, byte_buffer_t, &rb_byte_buffer_data_type, b);
|
358
358
|
ENSURE_BSON_WRITE(b, 8);
|
359
|
-
|
360
|
-
*(int64_t*)WRITE_PTR(b) = ucast.i64;
|
359
|
+
memcpy(WRITE_PTR(b), (char*)&d, 8);
|
361
360
|
b->write_position += 8;
|
362
361
|
|
363
362
|
return self;
|
@@ -369,11 +368,11 @@ VALUE rb_bson_byte_buffer_put_double(VALUE self, VALUE f)
|
|
369
368
|
VALUE rb_bson_byte_buffer_put_int32(VALUE self, VALUE i)
|
370
369
|
{
|
371
370
|
byte_buffer_t *b;
|
372
|
-
const int32_t i32 = NUM2INT(i);
|
371
|
+
const int32_t i32 = BSON_UINT32_TO_LE(NUM2INT(i));
|
373
372
|
|
374
373
|
TypedData_Get_Struct(self, byte_buffer_t, &rb_byte_buffer_data_type, b);
|
375
374
|
ENSURE_BSON_WRITE(b, 4);
|
376
|
-
|
375
|
+
memcpy(WRITE_PTR(b), (char*)&i32, 4);
|
377
376
|
b->write_position += 4;
|
378
377
|
|
379
378
|
return self;
|
@@ -385,11 +384,11 @@ VALUE rb_bson_byte_buffer_put_int32(VALUE self, VALUE i)
|
|
385
384
|
VALUE rb_bson_byte_buffer_put_int64(VALUE self, VALUE i)
|
386
385
|
{
|
387
386
|
byte_buffer_t *b;
|
388
|
-
const int64_t i64 =
|
387
|
+
const int64_t i64 = BSON_UINT64_TO_LE(NUM2LL(i));
|
389
388
|
|
390
389
|
TypedData_Get_Struct(self, byte_buffer_t, &rb_byte_buffer_data_type, b);
|
391
390
|
ENSURE_BSON_WRITE(b, 8);
|
392
|
-
|
391
|
+
memcpy(WRITE_PTR(b), (char*)&i64, 8);
|
393
392
|
b->write_position += 8;
|
394
393
|
|
395
394
|
return self;
|
@@ -401,9 +400,11 @@ VALUE rb_bson_byte_buffer_put_int64(VALUE self, VALUE i)
|
|
401
400
|
VALUE rb_bson_byte_buffer_put_string(VALUE self, VALUE string)
|
402
401
|
{
|
403
402
|
byte_buffer_t *b;
|
403
|
+
int32_t length_le;
|
404
404
|
|
405
405
|
char *str = RSTRING_PTR(string);
|
406
|
-
const
|
406
|
+
const int32_t length = RSTRING_LEN(string) + 1;
|
407
|
+
length_le = BSON_UINT32_TO_LE(length);
|
407
408
|
|
408
409
|
if (!rb_bson_utf8_validate(str, length - 1, true)) {
|
409
410
|
rb_raise(rb_eArgError, "String %s is not valid UTF-8.", str);
|
@@ -411,7 +412,7 @@ VALUE rb_bson_byte_buffer_put_string(VALUE self, VALUE string)
|
|
411
412
|
|
412
413
|
TypedData_Get_Struct(self, byte_buffer_t, &rb_byte_buffer_data_type, b);
|
413
414
|
ENSURE_BSON_WRITE(b, length + 4);
|
414
|
-
|
415
|
+
memcpy(WRITE_PTR(b), (char*)&length_le, 4);
|
415
416
|
b->write_position += 4;
|
416
417
|
memcpy(WRITE_PTR(b), str, length);
|
417
418
|
b->write_position += length;
|
@@ -435,8 +436,8 @@ VALUE rb_bson_byte_buffer_read_position(VALUE self)
|
|
435
436
|
VALUE rb_bson_byte_buffer_replace_int32(VALUE self, VALUE index, VALUE i)
|
436
437
|
{
|
437
438
|
byte_buffer_t *b;
|
438
|
-
const int32_t position =
|
439
|
-
const int32_t i32 =
|
439
|
+
const int32_t position = NUM2LONG(index);
|
440
|
+
const int32_t i32 = BSON_UINT32_TO_LE(NUM2LONG(i));
|
440
441
|
|
441
442
|
TypedData_Get_Struct(self, byte_buffer_t, &rb_byte_buffer_data_type, b);
|
442
443
|
|
@@ -516,25 +517,25 @@ void rb_bson_expand_buffer(byte_buffer_t* buffer_ptr, size_t length)
|
|
516
517
|
VALUE rb_bson_object_id_generator_next(int argc, VALUE* args, VALUE self)
|
517
518
|
{
|
518
519
|
char bytes[12];
|
519
|
-
|
520
|
-
|
520
|
+
uint32_t t;
|
521
|
+
uint32_t c;
|
521
522
|
unsigned short pid = htons(getpid());
|
522
523
|
|
523
524
|
if (argc == 0 || (argc == 1 && *args == Qnil)) {
|
524
525
|
t = htonl((int) time(NULL));
|
525
526
|
}
|
526
527
|
else {
|
527
|
-
t = htonl(
|
528
|
+
t = htonl(NUM2ULONG(rb_funcall(*args, rb_intern("to_i"), 0)));
|
528
529
|
}
|
529
530
|
|
530
531
|
c = htonl(rb_bson_object_id_counter << 8);
|
531
532
|
|
532
|
-
# if
|
533
|
+
# if BSON_BYTE_ORDER == BSON_LITTLE_ENDIAN
|
533
534
|
memcpy(&bytes, &t, 4);
|
534
535
|
memcpy(&bytes[4], rb_bson_machine_id_hash, 3);
|
535
536
|
memcpy(&bytes[7], &pid, 2);
|
536
537
|
memcpy(&bytes[9], (unsigned char*) &c, 3);
|
537
|
-
#elif
|
538
|
+
#elif BSON_BYTE_ORDER == BSON_BIG_ENDIAN
|
538
539
|
memcpy(&bytes, ((unsigned char*) &t) + 4, 4);
|
539
540
|
memcpy(&bytes[4], rb_bson_machine_id_hash, 3);
|
540
541
|
memcpy(&bytes[7], &pid, 2);
|
data/lib/bson/document.rb
CHANGED
@@ -74,9 +74,11 @@ module BSON
|
|
74
74
|
# @example Test if a key exists using a symbol
|
75
75
|
# document.has_key?(:test)
|
76
76
|
#
|
77
|
+
# @param [ Object ] key The key to check for.
|
78
|
+
#
|
77
79
|
# @return [ true, false]
|
78
80
|
#
|
79
|
-
# @since
|
81
|
+
# @since 4.0.0
|
80
82
|
def has_key?(key)
|
81
83
|
super(convert_key(key))
|
82
84
|
end
|
@@ -85,22 +87,41 @@ module BSON
|
|
85
87
|
alias :key? :has_key?
|
86
88
|
alias :member? :has_key?
|
87
89
|
|
88
|
-
|
89
90
|
# Returns true if the given value is present in the document. Will normalize
|
90
91
|
# symbols into strings.
|
91
92
|
#
|
92
93
|
# @example Test if a key exists using a symbol
|
93
94
|
# document.has_value?(:test)
|
94
95
|
#
|
96
|
+
# @param [ Object ] value THe value to check for.
|
97
|
+
#
|
95
98
|
# @return [ true, false]
|
96
99
|
#
|
97
|
-
# @since
|
100
|
+
# @since 4.0.0
|
98
101
|
def has_value?(value)
|
99
102
|
super(convert_value(value))
|
100
103
|
end
|
101
104
|
|
102
105
|
alias :value :has_value?
|
103
106
|
|
107
|
+
# Deletes the key-value pair and returns the value from the document
|
108
|
+
# whose key is equal to key.
|
109
|
+
# If the key is not found, returns the default value. If the optional code
|
110
|
+
# block is given and the key is not found, pass in the key and return the
|
111
|
+
# result of block.
|
112
|
+
#
|
113
|
+
# @example Delete a key-value pair
|
114
|
+
# document.delete(:test)
|
115
|
+
#
|
116
|
+
# @param [ Object ] key The key of the key-value pair to delete.
|
117
|
+
#
|
118
|
+
# @return [ Object ]
|
119
|
+
#
|
120
|
+
# @since 4.0.0
|
121
|
+
def delete(key, &block)
|
122
|
+
super(convert_key(key), &block)
|
123
|
+
end
|
124
|
+
|
104
125
|
# Instantiate a new Document. Valid parameters for instantiation is a hash
|
105
126
|
# only or nothing.
|
106
127
|
#
|
data/lib/bson/version.rb
CHANGED
data/spec/bson/document_spec.rb
CHANGED
@@ -98,33 +98,61 @@ describe BSON::Document do
|
|
98
98
|
|
99
99
|
describe "#delete" do
|
100
100
|
|
101
|
-
|
102
|
-
let(:val) { "ffffff" }
|
103
|
-
let(:bad_key) { "black" }
|
101
|
+
shared_examples_for "a document with deletable pairs" do
|
104
102
|
|
105
|
-
|
106
|
-
doc[key] = val
|
107
|
-
end
|
103
|
+
let!(:deleted) { doc.delete(key) }
|
108
104
|
|
109
|
-
|
105
|
+
it "returns the deleted value" do
|
106
|
+
expect(deleted).to eq(val)
|
107
|
+
end
|
110
108
|
|
111
|
-
|
112
|
-
|
113
|
-
|
109
|
+
it "removes the key from the list" do
|
110
|
+
expect(doc.keys.length).to eq(keys.length)
|
111
|
+
end
|
114
112
|
|
115
|
-
|
116
|
-
|
113
|
+
it "matches the keys length to the document length" do
|
114
|
+
expect(doc.length).to eq(doc.keys.length)
|
115
|
+
end
|
116
|
+
|
117
|
+
context "when removing a bad key" do
|
118
|
+
|
119
|
+
it "returns nil" do
|
120
|
+
expect(doc.delete(bad_key)).to be_nil
|
121
|
+
end
|
122
|
+
|
123
|
+
context "when a block is provided" do
|
124
|
+
|
125
|
+
it "returns the result of the block" do
|
126
|
+
expect(doc.delete(bad_key) { |k| "golden key" }).to eq("golden key")
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|
117
130
|
end
|
118
131
|
|
119
|
-
|
120
|
-
|
132
|
+
context "when keys are strings" do
|
133
|
+
|
134
|
+
let(:key) { "white" }
|
135
|
+
let(:val) { "ffffff" }
|
136
|
+
let(:bad_key) { "black" }
|
137
|
+
|
138
|
+
before do
|
139
|
+
doc[key] = val
|
140
|
+
end
|
141
|
+
|
142
|
+
it_behaves_like "a document with deletable pairs"
|
121
143
|
end
|
122
144
|
|
123
|
-
context "when
|
145
|
+
context "when keys are symbols" do
|
146
|
+
|
147
|
+
let(:key) { :white }
|
148
|
+
let(:val) { "ffffff" }
|
149
|
+
let(:bad_key) { :black }
|
124
150
|
|
125
|
-
|
126
|
-
|
151
|
+
before do
|
152
|
+
doc[key] = val
|
127
153
|
end
|
154
|
+
|
155
|
+
it_behaves_like "a document with deletable pairs"
|
128
156
|
end
|
129
157
|
end
|
130
158
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bson
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 4.0.0.
|
4
|
+
version: 4.0.0.rc0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tyler Brock
|
@@ -34,7 +34,7 @@ cert_chain:
|
|
34
34
|
XZOS48LlWh15EG4yZo/gRzqNAW2LUIkYA5eMS2Kp6r+KV8IBUO/LaHdrXbdilpa8
|
35
35
|
BRsuCo7UZDbFVRns04HLyjVvkj+K/ywIcdKdS0csz5M=
|
36
36
|
-----END CERTIFICATE-----
|
37
|
-
date: 2015-10
|
37
|
+
date: 2015-11-10 00:00:00.000000000 Z
|
38
38
|
dependencies: []
|
39
39
|
description: A full featured BSON specification implementation, in Ruby
|
40
40
|
email:
|
@@ -137,7 +137,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
137
137
|
version: 1.3.6
|
138
138
|
requirements: []
|
139
139
|
rubyforge_project: bson
|
140
|
-
rubygems_version: 2.4.
|
140
|
+
rubygems_version: 2.4.5.1
|
141
141
|
signing_key:
|
142
142
|
specification_version: 4
|
143
143
|
summary: Ruby Implementation of the BSON specification
|
metadata.gz.sig
CHANGED
Binary file
|