bson_ext 1.8.6 → 1.9.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.tar.gz.sig +4 -1
- data/VERSION +1 -1
- data/ext/cbson/bson_buffer.c +16 -0
- data/ext/cbson/bson_buffer.h +16 -0
- data/ext/cbson/cbson.c +33 -15
- data/ext/cbson/encoding_helpers.c +83 -87
- data/ext/cbson/encoding_helpers.h +42 -5
- data/ext/cbson/version.h +17 -1
- metadata +4 -4
- 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: f0154dfba09c2e43e8f5cb9d1889f0b08a41408f
|
4
|
+
data.tar.gz: e1b85f77e8ddb9faa027a218e32d87730ef08b9c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7872d36e308936e291f0b899b15501060731e21cc96ba6d0aeaf0495d3362167fa411ac6ba5635c2bd5b94b50b1ad041951d96cf858a0a10c7afc812bae502b3
|
7
|
+
data.tar.gz: c0558e9f81070a16c0a010a20e133fd18c60fa7feac74e3366f0f57d86303bab8fe887e6bddc532a05a923b59bbcfdfa6c8efc2b1d27e76b5286d9e95ce26d8a
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data.tar.gz.sig
CHANGED
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.
|
1
|
+
1.9.0
|
data/ext/cbson/bson_buffer.c
CHANGED
@@ -1,3 +1,19 @@
|
|
1
|
+
/*
|
2
|
+
* Copyright (C) 2013 10gen 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
|
+
*/
|
16
|
+
|
1
17
|
#include <stdlib.h>
|
2
18
|
#include <string.h>
|
3
19
|
|
data/ext/cbson/bson_buffer.h
CHANGED
@@ -1,3 +1,19 @@
|
|
1
|
+
/*
|
2
|
+
* Copyright (C) 2013 10gen 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
|
+
*/
|
16
|
+
|
1
17
|
#ifndef _BSON_BUFFER_H
|
2
18
|
#define _BSON_BUFFER_H
|
3
19
|
|
data/ext/cbson/cbson.c
CHANGED
@@ -1,3 +1,19 @@
|
|
1
|
+
/*
|
2
|
+
* Copyright (C) 2013 10gen 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
|
+
*/
|
16
|
+
|
1
17
|
/*
|
2
18
|
* This file contains C implementations of some of the functions needed by the
|
3
19
|
* bson module. If possible, these implementations should be used to speed up
|
@@ -98,13 +114,14 @@ static int max_bson_size;
|
|
98
114
|
#define STR_NEW(p,n) rb_str_new((p), (n))
|
99
115
|
#endif
|
100
116
|
|
101
|
-
static void write_utf8(bson_buffer_t buffer, VALUE string,
|
102
|
-
result_t status =
|
103
|
-
|
117
|
+
static void write_utf8(bson_buffer_t buffer, VALUE string, int allow_null) {
|
118
|
+
result_t status = validate_utf8_encoding(
|
119
|
+
(const char*)RSTRING_PTR(string), RSTRING_LEN(string), allow_null);
|
120
|
+
|
104
121
|
if (status == HAS_NULL) {
|
105
122
|
bson_buffer_free(buffer);
|
106
123
|
rb_raise(InvalidDocument, "Key names / regex patterns must not contain the NULL byte");
|
107
|
-
} else if (status ==
|
124
|
+
} else if (status == INVALID_UTF8) {
|
108
125
|
bson_buffer_free(buffer);
|
109
126
|
rb_raise(InvalidStringEncoding, "String not valid UTF-8");
|
110
127
|
}
|
@@ -186,7 +203,7 @@ static VALUE pack_extra(bson_buffer_t buffer, VALUE check_keys) {
|
|
186
203
|
|
187
204
|
static void write_name_and_type(bson_buffer_t buffer, VALUE name, char type) {
|
188
205
|
SAFE_WRITE(buffer, &type, 1);
|
189
|
-
write_utf8(buffer, name,
|
206
|
+
write_utf8(buffer, name, 0);
|
190
207
|
SAFE_WRITE(buffer, &zero, 1);
|
191
208
|
}
|
192
209
|
|
@@ -315,7 +332,7 @@ static int write_element(VALUE key, VALUE value, VALUE extra, int allow_id) {
|
|
315
332
|
write_name_and_type(buffer, key, 0x02);
|
316
333
|
length = RSTRING_LENINT(value) + 1;
|
317
334
|
SAFE_WRITE(buffer, (char*)&length, 4);
|
318
|
-
write_utf8(buffer, value,
|
335
|
+
write_utf8(buffer, value, 1);
|
319
336
|
SAFE_WRITE(buffer, &zero, 1);
|
320
337
|
break;
|
321
338
|
}
|
@@ -447,7 +464,7 @@ static int write_element(VALUE key, VALUE value, VALUE extra, int allow_id) {
|
|
447
464
|
write_name_and_type(buffer, key, 0x02);
|
448
465
|
length = RSTRING_LENINT(str) + 1;
|
449
466
|
SAFE_WRITE(buffer, (char*)&length, 4);
|
450
|
-
write_utf8(buffer, str,
|
467
|
+
write_utf8(buffer, str, 1);
|
451
468
|
SAFE_WRITE(buffer, &zero, 1);
|
452
469
|
break;
|
453
470
|
}
|
@@ -488,7 +505,7 @@ static int write_element(VALUE key, VALUE value, VALUE extra, int allow_id) {
|
|
488
505
|
|
489
506
|
write_name_and_type(buffer, key, 0x0B);
|
490
507
|
|
491
|
-
write_utf8(buffer, pattern,
|
508
|
+
write_utf8(buffer, pattern, 0);
|
492
509
|
SAFE_WRITE(buffer, &zero, 1);
|
493
510
|
|
494
511
|
if (flags & IGNORECASE) {
|
@@ -541,6 +558,7 @@ static void write_doc(bson_buffer_t buffer, VALUE hash, VALUE check_keys, VALUE
|
|
541
558
|
bson_buffer_position length_location = bson_buffer_save_space(buffer, 4);
|
542
559
|
bson_buffer_position length;
|
543
560
|
int allow_id;
|
561
|
+
int max_size;
|
544
562
|
int (*write_function)(VALUE, VALUE, VALUE) = NULL;
|
545
563
|
VALUE id_str = rb_str_new2("_id");
|
546
564
|
VALUE id_sym = ID2SYM(rb_intern("_id"));
|
@@ -601,12 +619,12 @@ static void write_doc(bson_buffer_t buffer, VALUE hash, VALUE check_keys, VALUE
|
|
601
619
|
length = bson_buffer_get_position(buffer) - start_position;
|
602
620
|
|
603
621
|
// make sure that length doesn't exceed the max size (determined by server, defaults to 4mb)
|
604
|
-
|
605
|
-
|
606
|
-
|
607
|
-
|
608
|
-
|
609
|
-
|
622
|
+
max_size = bson_buffer_get_max_size(buffer);
|
623
|
+
if (length > max_size) {
|
624
|
+
bson_buffer_free(buffer);
|
625
|
+
rb_raise(InvalidDocument,
|
626
|
+
"Document too large: This BSON document is limited to %d bytes.",
|
627
|
+
max_size);
|
610
628
|
}
|
611
629
|
SAFE_WRITE_AT_POS(buffer, length_location, (const char*)&length, 4);
|
612
630
|
}
|
@@ -616,10 +634,10 @@ static VALUE method_serialize(VALUE self, VALUE doc, VALUE check_keys,
|
|
616
634
|
|
617
635
|
VALUE result;
|
618
636
|
bson_buffer_t buffer = bson_buffer_new();
|
619
|
-
bson_buffer_set_max_size(buffer, FIX2INT(max_size));
|
620
637
|
if (buffer == NULL) {
|
621
638
|
rb_raise(rb_eNoMemError, "failed to allocate memory in buffer.c");
|
622
639
|
}
|
640
|
+
bson_buffer_set_max_size(buffer, FIX2INT(max_size));
|
623
641
|
|
624
642
|
write_doc(buffer, doc, check_keys, move_id);
|
625
643
|
|
@@ -1,102 +1,98 @@
|
|
1
|
-
#include "encoding_helpers.h"
|
2
|
-
|
3
1
|
/*
|
4
|
-
*
|
2
|
+
* Copyright 2013 10gen Inc.
|
5
3
|
*
|
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
|
-
* made as to fitness for any particular purpose. No warranties of any
|
10
|
-
* kind are expressed or implied. The recipient agrees to determine
|
11
|
-
* applicability of information provided. If this file has been
|
12
|
-
* purchased on magnetic or optical media from Unicode, Inc., the
|
13
|
-
* sole remedy for any claim will be exchange of defective media
|
14
|
-
* within 90 days of receipt.
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
15
9
|
*
|
16
|
-
*
|
17
|
-
*
|
18
|
-
*
|
19
|
-
*
|
20
|
-
*
|
21
|
-
* for internal or external distribution as long as this notice
|
22
|
-
* remains attached.
|
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.
|
23
15
|
*/
|
24
16
|
|
25
|
-
/*
|
26
|
-
* Index into the table below with the first byte of a UTF-8 sequence to
|
27
|
-
* get the number of trailing bytes that are supposed to follow it.
|
28
|
-
*/
|
29
|
-
static const char trailingBytesForUTF8[256] = {
|
30
|
-
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
31
|
-
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
32
|
-
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
33
|
-
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
34
|
-
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
35
|
-
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
36
|
-
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
|
37
|
-
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 3,3,3,3,3,3,3,3,4,4,4,4,5,5,5,5
|
38
|
-
};
|
39
17
|
|
40
|
-
|
18
|
+
#include <string.h>
|
19
|
+
#include "encoding_helpers.h"
|
41
20
|
|
42
|
-
|
43
|
-
|
44
|
-
*
|
45
|
-
*
|
46
|
-
*
|
47
|
-
|
48
|
-
*
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
21
|
+
|
22
|
+
static void
|
23
|
+
get_utf8_sequence (const char *utf8,
|
24
|
+
unsigned char *seq_length,
|
25
|
+
unsigned char *first_mask)
|
26
|
+
{
|
27
|
+
unsigned char c = *(const unsigned char *)utf8;
|
28
|
+
unsigned char m;
|
29
|
+
unsigned char n;
|
30
|
+
|
31
|
+
/*
|
32
|
+
* See the following[1] for a description of what the given multi-byte
|
33
|
+
* sequences will be based on the bits set of the first byte. We also need
|
34
|
+
* to mask the first byte based on that. All subsequent bytes are masked
|
35
|
+
* against 0x3F.
|
36
|
+
*
|
37
|
+
* [1] http://www.joelonsoftware.com/articles/Unicode.html
|
38
|
+
*/
|
39
|
+
|
40
|
+
if ((c & 0x80) == 0) {
|
41
|
+
n = 1;
|
42
|
+
m = 0x7F;
|
43
|
+
} else if ((c & 0xE0) == 0xC0) {
|
44
|
+
n = 2;
|
45
|
+
m = 0x1F;
|
46
|
+
} else if ((c & 0xF0) == 0xE0) {
|
47
|
+
n = 3;
|
48
|
+
m = 0x0F;
|
49
|
+
} else if ((c & 0xF8) == 0xF0) {
|
50
|
+
n = 4;
|
51
|
+
m = 0x07;
|
52
|
+
} else if ((c & 0xFC) == 0xF8) {
|
53
|
+
n = 5;
|
54
|
+
m = 0x03;
|
55
|
+
} else if ((c & 0xFE) == 0xFC) {
|
56
|
+
n = 6;
|
57
|
+
m = 0x01;
|
58
|
+
} else {
|
59
|
+
n = 0;
|
60
|
+
m = 0;
|
61
|
+
}
|
62
|
+
|
63
|
+
*seq_length = n;
|
64
|
+
*first_mask = m;
|
72
65
|
}
|
73
66
|
|
74
|
-
result_t check_string(const unsigned char* string, const long length,
|
75
|
-
const char check_utf8, const char check_null) {
|
76
|
-
int position = 0;
|
77
|
-
/* By default we go character by character. Will be different for checking
|
78
|
-
* UTF-8 */
|
79
|
-
int sequence_length = 1;
|
80
67
|
|
81
|
-
|
82
|
-
|
83
|
-
|
68
|
+
result_t
|
69
|
+
validate_utf8_encoding (const char *utf8,
|
70
|
+
size_t utf8_len,
|
71
|
+
int allow_null)
|
72
|
+
{
|
73
|
+
unsigned char first_mask;
|
74
|
+
unsigned char seq_length;
|
75
|
+
unsigned i;
|
76
|
+
unsigned j;
|
84
77
|
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
78
|
+
for (i = 0; i < utf8_len; i += seq_length) {
|
79
|
+
get_utf8_sequence(&utf8[i], &seq_length, &first_mask);
|
80
|
+
if (!seq_length) {
|
81
|
+
return INVALID_UTF8;
|
82
|
+
}
|
83
|
+
for (j = i + 1; j < (i + seq_length); j++) {
|
84
|
+
if ((utf8[j] & 0xC0) != 0x80) {
|
85
|
+
return INVALID_UTF8;
|
86
|
+
}
|
87
|
+
}
|
88
|
+
if (!allow_null) {
|
89
|
+
for (j = 0; j < seq_length; j++) {
|
90
|
+
if (((i + j) > utf8_len) || !utf8[i + j]) {
|
91
|
+
return HAS_NULL;
|
96
92
|
}
|
97
|
-
|
98
|
-
|
99
|
-
|
93
|
+
}
|
94
|
+
}
|
95
|
+
}
|
100
96
|
|
101
|
-
|
97
|
+
return VALID_UTF8;
|
102
98
|
}
|
@@ -1,13 +1,50 @@
|
|
1
|
+
/*
|
2
|
+
* Copyright 2013 10gen 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
|
+
*/
|
16
|
+
|
17
|
+
|
1
18
|
#ifndef ENCODING_HELPERS_H
|
2
19
|
#define ENCODING_HELPERS_H
|
3
20
|
|
21
|
+
#include <unistd.h>
|
22
|
+
|
4
23
|
typedef enum {
|
5
|
-
|
6
|
-
|
24
|
+
VALID_UTF8,
|
25
|
+
INVALID_UTF8,
|
7
26
|
HAS_NULL
|
8
27
|
} result_t;
|
9
28
|
|
10
|
-
|
11
|
-
|
29
|
+
/**
|
30
|
+
* validate_utf8_encoding:
|
31
|
+
* @utf8: A UTF-8 encoded string.
|
32
|
+
* @utf8_len: The length of @utf8 in bytes.
|
33
|
+
* @allow_null: 1 If '\0' is allowed within @utf8, excluding trailing \0.
|
34
|
+
*
|
35
|
+
* Validates that @utf8 is a valid UTF-8 string.
|
36
|
+
*
|
37
|
+
* If @allow_null is 1, then '\0' is allowed within @utf8_len bytes of @utf8.
|
38
|
+
* Generally, this is bad practice since the main point of UTF-8 strings is
|
39
|
+
* that they can be used with strlen() and friends. However, some languages
|
40
|
+
* such as Python can send UTF-8 encoded strings with NUL's in them.
|
41
|
+
*
|
42
|
+
* Returns: enum indicating validity of @utf8.
|
43
|
+
*/
|
44
|
+
result_t
|
45
|
+
validate_utf8_encoding (const char *utf8,
|
46
|
+
size_t utf8_len,
|
47
|
+
int allow_null);
|
48
|
+
|
12
49
|
|
13
|
-
#endif
|
50
|
+
#endif /* ENCODING_HELPERS_H */
|
data/ext/cbson/version.h
CHANGED
@@ -1 +1,17 @@
|
|
1
|
-
|
1
|
+
/*
|
2
|
+
* Copyright (C) 2013 10gen 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
|
+
*/
|
16
|
+
|
17
|
+
#define VERSION "1.9.0"
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bson_ext
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.9.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tyler Brock
|
@@ -33,7 +33,7 @@ cert_chain:
|
|
33
33
|
8v7zLF2XliYbfurYIwkcXs8yPn8ggApBIy9bX6VJxRs/l2+UvqzaHIFaFy/F8/GP
|
34
34
|
RNTuXsVG5NDACo7Q
|
35
35
|
-----END CERTIFICATE-----
|
36
|
-
date: 2013-
|
36
|
+
date: 2013-06-11 00:00:00.000000000 Z
|
37
37
|
dependencies:
|
38
38
|
- !ruby/object:Gem::Dependency
|
39
39
|
name: bson
|
@@ -41,14 +41,14 @@ dependencies:
|
|
41
41
|
requirements:
|
42
42
|
- - ~>
|
43
43
|
- !ruby/object:Gem::Version
|
44
|
-
version: 1.
|
44
|
+
version: 1.9.0
|
45
45
|
type: :runtime
|
46
46
|
prerelease: false
|
47
47
|
version_requirements: !ruby/object:Gem::Requirement
|
48
48
|
requirements:
|
49
49
|
- - ~>
|
50
50
|
- !ruby/object:Gem::Version
|
51
|
-
version: 1.
|
51
|
+
version: 1.9.0
|
52
52
|
description: C extensions to accelerate the Ruby BSON serialization. For more information
|
53
53
|
about BSON, see http://bsonspec.org. For information about MongoDB, see http://www.mongodb.org.
|
54
54
|
email: mongodb-dev@googlegroups.com
|
metadata.gz.sig
CHANGED
Binary file
|