Add BSON implementation to third_party
Review URL: https://codereview.appspot.com/6267044 git-svn-id: http://skia.googlecode.com/svn/trunk@4252 2bbb7eff-a529-9590-31e7-b0007b416f81
This commit is contained in:
parent
aba0e3b6bc
commit
b2c16472f6
202
third_party/bson_c/APACHE-2.0.txt
vendored
Normal file
202
third_party/bson_c/APACHE-2.0.txt
vendored
Normal file
@ -0,0 +1,202 @@
|
||||
|
||||
Apache License
|
||||
Version 2.0, January 2004
|
||||
http://www.apache.org/licenses/
|
||||
|
||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||
|
||||
1. Definitions.
|
||||
|
||||
"License" shall mean the terms and conditions for use, reproduction,
|
||||
and distribution as defined by Sections 1 through 9 of this document.
|
||||
|
||||
"Licensor" shall mean the copyright owner or entity authorized by
|
||||
the copyright owner that is granting the License.
|
||||
|
||||
"Legal Entity" shall mean the union of the acting entity and all
|
||||
other entities that control, are controlled by, or are under common
|
||||
control with that entity. For the purposes of this definition,
|
||||
"control" means (i) the power, direct or indirect, to cause the
|
||||
direction or management of such entity, whether by contract or
|
||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||
|
||||
"You" (or "Your") shall mean an individual or Legal Entity
|
||||
exercising permissions granted by this License.
|
||||
|
||||
"Source" form shall mean the preferred form for making modifications,
|
||||
including but not limited to software source code, documentation
|
||||
source, and configuration files.
|
||||
|
||||
"Object" form shall mean any form resulting from mechanical
|
||||
transformation or translation of a Source form, including but
|
||||
not limited to compiled object code, generated documentation,
|
||||
and conversions to other media types.
|
||||
|
||||
"Work" shall mean the work of authorship, whether in Source or
|
||||
Object form, made available under the License, as indicated by a
|
||||
copyright notice that is included in or attached to the work
|
||||
(an example is provided in the Appendix below).
|
||||
|
||||
"Derivative Works" shall mean any work, whether in Source or Object
|
||||
form, that is based on (or derived from) the Work and for which the
|
||||
editorial revisions, annotations, elaborations, or other modifications
|
||||
represent, as a whole, an original work of authorship. For the purposes
|
||||
of this License, Derivative Works shall not include works that remain
|
||||
separable from, or merely link (or bind by name) to the interfaces of,
|
||||
the Work and Derivative Works thereof.
|
||||
|
||||
"Contribution" shall mean any work of authorship, including
|
||||
the original version of the Work and any modifications or additions
|
||||
to that Work or Derivative Works thereof, that is intentionally
|
||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||
or by an individual or Legal Entity authorized to submit on behalf of
|
||||
the copyright owner. For the purposes of this definition, "submitted"
|
||||
means any form of electronic, verbal, or written communication sent
|
||||
to the Licensor or its representatives, including but not limited to
|
||||
communication on electronic mailing lists, source code control systems,
|
||||
and issue tracking systems that are managed by, or on behalf of, the
|
||||
Licensor for the purpose of discussing and improving the Work, but
|
||||
excluding communication that is conspicuously marked or otherwise
|
||||
designated in writing by the copyright owner as "Not a Contribution."
|
||||
|
||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||
on behalf of whom a Contribution has been received by Licensor and
|
||||
subsequently incorporated within the Work.
|
||||
|
||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
copyright license to reproduce, prepare Derivative Works of,
|
||||
publicly display, publicly perform, sublicense, and distribute the
|
||||
Work and such Derivative Works in Source or Object form.
|
||||
|
||||
3. Grant of Patent License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
(except as stated in this section) patent license to make, have made,
|
||||
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||
where such license applies only to those patent claims licensable
|
||||
by such Contributor that are necessarily infringed by their
|
||||
Contribution(s) alone or by combination of their Contribution(s)
|
||||
with the Work to which such Contribution(s) was submitted. If You
|
||||
institute patent litigation against any entity (including a
|
||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||
or a Contribution incorporated within the Work constitutes direct
|
||||
or contributory patent infringement, then any patent licenses
|
||||
granted to You under this License for that Work shall terminate
|
||||
as of the date such litigation is filed.
|
||||
|
||||
4. Redistribution. You may reproduce and distribute copies of the
|
||||
Work or Derivative Works thereof in any medium, with or without
|
||||
modifications, and in Source or Object form, provided that You
|
||||
meet the following conditions:
|
||||
|
||||
(a) You must give any other recipients of the Work or
|
||||
Derivative Works a copy of this License; and
|
||||
|
||||
(b) You must cause any modified files to carry prominent notices
|
||||
stating that You changed the files; and
|
||||
|
||||
(c) You must retain, in the Source form of any Derivative Works
|
||||
that You distribute, all copyright, patent, trademark, and
|
||||
attribution notices from the Source form of the Work,
|
||||
excluding those notices that do not pertain to any part of
|
||||
the Derivative Works; and
|
||||
|
||||
(d) If the Work includes a "NOTICE" text file as part of its
|
||||
distribution, then any Derivative Works that You distribute must
|
||||
include a readable copy of the attribution notices contained
|
||||
within such NOTICE file, excluding those notices that do not
|
||||
pertain to any part of the Derivative Works, in at least one
|
||||
of the following places: within a NOTICE text file distributed
|
||||
as part of the Derivative Works; within the Source form or
|
||||
documentation, if provided along with the Derivative Works; or,
|
||||
within a display generated by the Derivative Works, if and
|
||||
wherever such third-party notices normally appear. The contents
|
||||
of the NOTICE file are for informational purposes only and
|
||||
do not modify the License. You may add Your own attribution
|
||||
notices within Derivative Works that You distribute, alongside
|
||||
or as an addendum to the NOTICE text from the Work, provided
|
||||
that such additional attribution notices cannot be construed
|
||||
as modifying the License.
|
||||
|
||||
You may add Your own copyright statement to Your modifications and
|
||||
may provide additional or different license terms and conditions
|
||||
for use, reproduction, or distribution of Your modifications, or
|
||||
for any such Derivative Works as a whole, provided Your use,
|
||||
reproduction, and distribution of the Work otherwise complies with
|
||||
the conditions stated in this License.
|
||||
|
||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||
any Contribution intentionally submitted for inclusion in the Work
|
||||
by You to the Licensor shall be under the terms and conditions of
|
||||
this License, without any additional terms or conditions.
|
||||
Notwithstanding the above, nothing herein shall supersede or modify
|
||||
the terms of any separate license agreement you may have executed
|
||||
with Licensor regarding such Contributions.
|
||||
|
||||
6. Trademarks. This License does not grant permission to use the trade
|
||||
names, trademarks, service marks, or product names of the Licensor,
|
||||
except as required for reasonable and customary use in describing the
|
||||
origin of the Work and reproducing the content of the NOTICE file.
|
||||
|
||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||
agreed to in writing, Licensor provides the Work (and each
|
||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||
implied, including, without limitation, any warranties or conditions
|
||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||
appropriateness of using or redistributing the Work and assume any
|
||||
risks associated with Your exercise of permissions under this License.
|
||||
|
||||
8. Limitation of Liability. In no event and under no legal theory,
|
||||
whether in tort (including negligence), contract, or otherwise,
|
||||
unless required by applicable law (such as deliberate and grossly
|
||||
negligent acts) or agreed to in writing, shall any Contributor be
|
||||
liable to You for damages, including any direct, indirect, special,
|
||||
incidental, or consequential damages of any character arising as a
|
||||
result of this License or out of the use or inability to use the
|
||||
Work (including but not limited to damages for loss of goodwill,
|
||||
work stoppage, computer failure or malfunction, or any and all
|
||||
other commercial damages or losses), even if such Contributor
|
||||
has been advised of the possibility of such damages.
|
||||
|
||||
9. Accepting Warranty or Additional Liability. While redistributing
|
||||
the Work or Derivative Works thereof, You may choose to offer,
|
||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||
or other liability obligations and/or rights consistent with this
|
||||
License. However, in accepting such obligations, You may act only
|
||||
on Your own behalf and on Your sole responsibility, not on behalf
|
||||
of any other Contributor, and only if You agree to indemnify,
|
||||
defend, and hold each Contributor harmless for any liability
|
||||
incurred by, or claims asserted against, such Contributor by reason
|
||||
of your accepting any such warranty or additional liability.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
APPENDIX: How to apply the Apache License to your work.
|
||||
|
||||
To apply the Apache License to your work, attach the following
|
||||
boilerplate notice, with the fields enclosed by brackets "[]"
|
||||
replaced with your own identifying information. (Don't include
|
||||
the brackets!) The text should be enclosed in the appropriate
|
||||
comment syntax for the file format. We also recommend that a
|
||||
file or class name and description of purpose be included on the
|
||||
same "printed page" as the copyright notice for easier
|
||||
identification within third-party archives.
|
||||
|
||||
Copyright [yyyy] [name of copyright owner]
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
1063
third_party/bson_c/src/bson.c
vendored
Normal file
1063
third_party/bson_c/src/bson.c
vendored
Normal file
File diff suppressed because it is too large
Load Diff
1036
third_party/bson_c/src/bson.h
vendored
Normal file
1036
third_party/bson_c/src/bson.h
vendored
Normal file
File diff suppressed because it is too large
Load Diff
148
third_party/bson_c/src/encoding.c
vendored
Normal file
148
third_party/bson_c/src/encoding.c
vendored
Normal file
@ -0,0 +1,148 @@
|
||||
/*
|
||||
* Copyright 2009-2011 10gen, Inc.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Portions Copyright 2001 Unicode, Inc.
|
||||
*
|
||||
* Disclaimer
|
||||
*
|
||||
* This source code is provided as is by Unicode, Inc. No claims are
|
||||
* made as to fitness for any particular purpose. No warranties of any
|
||||
* kind are expressed or implied. The recipient agrees to determine
|
||||
* applicability of information provided. If this file has been
|
||||
* purchased on magnetic or optical media from Unicode, Inc., the
|
||||
* sole remedy for any claim will be exchange of defective media
|
||||
* within 90 days of receipt.
|
||||
*
|
||||
* Limitations on Rights to Redistribute This Code
|
||||
*
|
||||
* Unicode, Inc. hereby grants the right to freely use the information
|
||||
* supplied in this file in the creation of products supporting the
|
||||
* Unicode Standard, and to make copies of this file in any form
|
||||
* for internal or external distribution as long as this notice
|
||||
* remains attached.
|
||||
*/
|
||||
|
||||
|
||||
#include "bson.h"
|
||||
#include "encoding.h"
|
||||
|
||||
/*
|
||||
* Index into the table below with the first byte of a UTF-8 sequence to
|
||||
* get the number of trailing bytes that are supposed to follow it.
|
||||
*/
|
||||
static const char trailingBytesForUTF8[256] = {
|
||||
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,
|
||||
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,
|
||||
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,
|
||||
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,
|
||||
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,
|
||||
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,
|
||||
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,
|
||||
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
|
||||
};
|
||||
|
||||
/* --------------------------------------------------------------------- */
|
||||
|
||||
/*
|
||||
* Utility routine to tell whether a sequence of bytes is legal UTF-8.
|
||||
* This must be called with the length pre-determined by the first byte.
|
||||
* The length can be set by:
|
||||
* length = trailingBytesForUTF8[*source]+1;
|
||||
* and the sequence is illegal right away if there aren't that many bytes
|
||||
* available.
|
||||
* If presented with a length > 4, this returns 0. The Unicode
|
||||
* definition of UTF-8 goes up to 4-byte sequences.
|
||||
*/
|
||||
static int isLegalUTF8( const unsigned char *source, int length ) {
|
||||
unsigned char a;
|
||||
const unsigned char *srcptr = source + length;
|
||||
switch ( length ) {
|
||||
default:
|
||||
return 0;
|
||||
/* Everything else falls through when "true"... */
|
||||
case 4:
|
||||
if ( ( a = ( *--srcptr ) ) < 0x80 || a > 0xBF ) return 0;
|
||||
case 3:
|
||||
if ( ( a = ( *--srcptr ) ) < 0x80 || a > 0xBF ) return 0;
|
||||
case 2:
|
||||
if ( ( a = ( *--srcptr ) ) > 0xBF ) return 0;
|
||||
switch ( *source ) {
|
||||
/* no fall-through in this inner switch */
|
||||
case 0xE0:
|
||||
if ( a < 0xA0 ) return 0;
|
||||
break;
|
||||
case 0xF0:
|
||||
if ( a < 0x90 ) return 0;
|
||||
break;
|
||||
case 0xF4:
|
||||
if ( a > 0x8F ) return 0;
|
||||
break;
|
||||
default:
|
||||
if ( a < 0x80 ) return 0;
|
||||
}
|
||||
case 1:
|
||||
if ( *source >= 0x80 && *source < 0xC2 ) return 0;
|
||||
if ( *source > 0xF4 ) return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int bson_validate_string( bson *b, const unsigned char *string,
|
||||
const int length, const char check_utf8, const char check_dot,
|
||||
const char check_dollar ) {
|
||||
|
||||
int position = 0;
|
||||
int sequence_length = 1;
|
||||
|
||||
if( check_dollar && string[0] == '$' ) {
|
||||
b->err |= BSON_FIELD_INIT_DOLLAR;
|
||||
}
|
||||
|
||||
while ( position < length ) {
|
||||
if ( check_dot && *( string + position ) == '.' ) {
|
||||
b->err |= BSON_FIELD_HAS_DOT;
|
||||
}
|
||||
|
||||
if ( check_utf8 ) {
|
||||
sequence_length = trailingBytesForUTF8[*( string + position )] + 1;
|
||||
if ( ( position + sequence_length ) > length ) {
|
||||
b->err |= BSON_NOT_UTF8;
|
||||
return BSON_ERROR;
|
||||
}
|
||||
if ( !isLegalUTF8( string + position, sequence_length ) ) {
|
||||
b->err |= BSON_NOT_UTF8;
|
||||
return BSON_ERROR;
|
||||
}
|
||||
}
|
||||
position += sequence_length;
|
||||
}
|
||||
|
||||
return BSON_OK;
|
||||
}
|
||||
|
||||
|
||||
int bson_check_string( bson *b, const char *string,
|
||||
const int length ) {
|
||||
|
||||
return bson_validate_string( b, ( const unsigned char * )string, length, 1, 0, 0 );
|
||||
}
|
||||
|
||||
int bson_check_field_name( bson *b, const char *string,
|
||||
const int length ) {
|
||||
|
||||
return bson_validate_string( b, ( const unsigned char * )string, length, 1, 1, 1 );
|
||||
}
|
54
third_party/bson_c/src/encoding.h
vendored
Normal file
54
third_party/bson_c/src/encoding.h
vendored
Normal file
@ -0,0 +1,54 @@
|
||||
/*
|
||||
* Copyright 2009-2011 10gen, Inc.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#ifndef BSON_ENCODING_H_
|
||||
#define BSON_ENCODING_H_
|
||||
|
||||
MONGO_EXTERN_C_START
|
||||
|
||||
/**
|
||||
* Check that a field name is valid UTF8, does not start with a '$',
|
||||
* and contains no '.' characters. Set bson bit field appropriately.
|
||||
* Note that we don't need to check for '\0' because we're using
|
||||
* strlen(3), which stops at '\0'.
|
||||
*
|
||||
* @param b The bson object to which field name will be appended.
|
||||
* @param string The field name as char*.
|
||||
* @param length The length of the field name.
|
||||
*
|
||||
* @return BSON_OK if valid UTF8 and BSON_ERROR if not. All BSON strings must be
|
||||
* valid UTF8. This function will also check whether the string
|
||||
* contains '.' or starts with '$', since the validity of this depends on context.
|
||||
* Set the value of b->err appropriately.
|
||||
*/
|
||||
int bson_check_field_name( bson *b, const char *string,
|
||||
const int length );
|
||||
|
||||
/**
|
||||
* Check that a string is valid UTF8. Sets the buffer bit field appropriately.
|
||||
*
|
||||
* @param b The bson object to which string will be appended.
|
||||
* @param string The string to check.
|
||||
* @param length The length of the string.
|
||||
*
|
||||
* @return BSON_OK if valid UTF-8; otherwise, BSON_ERROR.
|
||||
* Sets b->err on error.
|
||||
*/
|
||||
bson_bool_t bson_check_string( bson *b, const char *string,
|
||||
const int length );
|
||||
|
||||
MONGO_EXTERN_C_END
|
||||
#endif
|
127
third_party/bson_c/src/numbers.c
vendored
Normal file
127
third_party/bson_c/src/numbers.c
vendored
Normal file
@ -0,0 +1,127 @@
|
||||
/* Copyright 2009-2011 10gen Inc.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
/* all the numbers that fit in a 4 byte string */
|
||||
const char bson_numstrs[1000][4] = {
|
||||
"0", "1", "2", "3", "4", "5", "6", "7", "8", "9",
|
||||
"10", "11", "12", "13", "14", "15", "16", "17", "18", "19",
|
||||
"20", "21", "22", "23", "24", "25", "26", "27", "28", "29",
|
||||
"30", "31", "32", "33", "34", "35", "36", "37", "38", "39",
|
||||
"40", "41", "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", "72", "73", "74", "75", "76", "77", "78", "79",
|
||||
"80", "81", "82", "83", "84", "85", "86", "87", "88", "89",
|
||||
"90", "91", "92", "93", "94", "95", "96", "97", "98", "99",
|
||||
|
||||
"100", "101", "102", "103", "104", "105", "106", "107", "108", "109",
|
||||
"110", "111", "112", "113", "114", "115", "116", "117", "118", "119",
|
||||
"120", "121", "122", "123", "124", "125", "126", "127", "128", "129",
|
||||
"130", "131", "132", "133", "134", "135", "136", "137", "138", "139",
|
||||
"140", "141", "142", "143", "144", "145", "146", "147", "148", "149",
|
||||
"150", "151", "152", "153", "154", "155", "156", "157", "158", "159",
|
||||
"160", "161", "162", "163", "164", "165", "166", "167", "168", "169",
|
||||
"170", "171", "172", "173", "174", "175", "176", "177", "178", "179",
|
||||
"180", "181", "182", "183", "184", "185", "186", "187", "188", "189",
|
||||
"190", "191", "192", "193", "194", "195", "196", "197", "198", "199",
|
||||
|
||||
"200", "201", "202", "203", "204", "205", "206", "207", "208", "209",
|
||||
"210", "211", "212", "213", "214", "215", "216", "217", "218", "219",
|
||||
"220", "221", "222", "223", "224", "225", "226", "227", "228", "229",
|
||||
"230", "231", "232", "233", "234", "235", "236", "237", "238", "239",
|
||||
"240", "241", "242", "243", "244", "245", "246", "247", "248", "249",
|
||||
"250", "251", "252", "253", "254", "255", "256", "257", "258", "259",
|
||||
"260", "261", "262", "263", "264", "265", "266", "267", "268", "269",
|
||||
"270", "271", "272", "273", "274", "275", "276", "277", "278", "279",
|
||||
"280", "281", "282", "283", "284", "285", "286", "287", "288", "289",
|
||||
"290", "291", "292", "293", "294", "295", "296", "297", "298", "299",
|
||||
|
||||
"300", "301", "302", "303", "304", "305", "306", "307", "308", "309",
|
||||
"310", "311", "312", "313", "314", "315", "316", "317", "318", "319",
|
||||
"320", "321", "322", "323", "324", "325", "326", "327", "328", "329",
|
||||
"330", "331", "332", "333", "334", "335", "336", "337", "338", "339",
|
||||
"340", "341", "342", "343", "344", "345", "346", "347", "348", "349",
|
||||
"350", "351", "352", "353", "354", "355", "356", "357", "358", "359",
|
||||
"360", "361", "362", "363", "364", "365", "366", "367", "368", "369",
|
||||
"370", "371", "372", "373", "374", "375", "376", "377", "378", "379",
|
||||
"380", "381", "382", "383", "384", "385", "386", "387", "388", "389",
|
||||
"390", "391", "392", "393", "394", "395", "396", "397", "398", "399",
|
||||
|
||||
"400", "401", "402", "403", "404", "405", "406", "407", "408", "409",
|
||||
"410", "411", "412", "413", "414", "415", "416", "417", "418", "419",
|
||||
"420", "421", "422", "423", "424", "425", "426", "427", "428", "429",
|
||||
"430", "431", "432", "433", "434", "435", "436", "437", "438", "439",
|
||||
"440", "441", "442", "443", "444", "445", "446", "447", "448", "449",
|
||||
"450", "451", "452", "453", "454", "455", "456", "457", "458", "459",
|
||||
"460", "461", "462", "463", "464", "465", "466", "467", "468", "469",
|
||||
"470", "471", "472", "473", "474", "475", "476", "477", "478", "479",
|
||||
"480", "481", "482", "483", "484", "485", "486", "487", "488", "489",
|
||||
"490", "491", "492", "493", "494", "495", "496", "497", "498", "499",
|
||||
|
||||
"500", "501", "502", "503", "504", "505", "506", "507", "508", "509",
|
||||
"510", "511", "512", "513", "514", "515", "516", "517", "518", "519",
|
||||
"520", "521", "522", "523", "524", "525", "526", "527", "528", "529",
|
||||
"530", "531", "532", "533", "534", "535", "536", "537", "538", "539",
|
||||
"540", "541", "542", "543", "544", "545", "546", "547", "548", "549",
|
||||
"550", "551", "552", "553", "554", "555", "556", "557", "558", "559",
|
||||
"560", "561", "562", "563", "564", "565", "566", "567", "568", "569",
|
||||
"570", "571", "572", "573", "574", "575", "576", "577", "578", "579",
|
||||
"580", "581", "582", "583", "584", "585", "586", "587", "588", "589",
|
||||
"590", "591", "592", "593", "594", "595", "596", "597", "598", "599",
|
||||
|
||||
"600", "601", "602", "603", "604", "605", "606", "607", "608", "609",
|
||||
"610", "611", "612", "613", "614", "615", "616", "617", "618", "619",
|
||||
"620", "621", "622", "623", "624", "625", "626", "627", "628", "629",
|
||||
"630", "631", "632", "633", "634", "635", "636", "637", "638", "639",
|
||||
"640", "641", "642", "643", "644", "645", "646", "647", "648", "649",
|
||||
"650", "651", "652", "653", "654", "655", "656", "657", "658", "659",
|
||||
"660", "661", "662", "663", "664", "665", "666", "667", "668", "669",
|
||||
"670", "671", "672", "673", "674", "675", "676", "677", "678", "679",
|
||||
"680", "681", "682", "683", "684", "685", "686", "687", "688", "689",
|
||||
"690", "691", "692", "693", "694", "695", "696", "697", "698", "699",
|
||||
|
||||
"700", "701", "702", "703", "704", "705", "706", "707", "708", "709",
|
||||
"710", "711", "712", "713", "714", "715", "716", "717", "718", "719",
|
||||
"720", "721", "722", "723", "724", "725", "726", "727", "728", "729",
|
||||
"730", "731", "732", "733", "734", "735", "736", "737", "738", "739",
|
||||
"740", "741", "742", "743", "744", "745", "746", "747", "748", "749",
|
||||
"750", "751", "752", "753", "754", "755", "756", "757", "758", "759",
|
||||
"760", "761", "762", "763", "764", "765", "766", "767", "768", "769",
|
||||
"770", "771", "772", "773", "774", "775", "776", "777", "778", "779",
|
||||
"780", "781", "782", "783", "784", "785", "786", "787", "788", "789",
|
||||
"790", "791", "792", "793", "794", "795", "796", "797", "798", "799",
|
||||
|
||||
"800", "801", "802", "803", "804", "805", "806", "807", "808", "809",
|
||||
"810", "811", "812", "813", "814", "815", "816", "817", "818", "819",
|
||||
"820", "821", "822", "823", "824", "825", "826", "827", "828", "829",
|
||||
"830", "831", "832", "833", "834", "835", "836", "837", "838", "839",
|
||||
"840", "841", "842", "843", "844", "845", "846", "847", "848", "849",
|
||||
"850", "851", "852", "853", "854", "855", "856", "857", "858", "859",
|
||||
"860", "861", "862", "863", "864", "865", "866", "867", "868", "869",
|
||||
"870", "871", "872", "873", "874", "875", "876", "877", "878", "879",
|
||||
"880", "881", "882", "883", "884", "885", "886", "887", "888", "889",
|
||||
"890", "891", "892", "893", "894", "895", "896", "897", "898", "899",
|
||||
|
||||
"900", "901", "902", "903", "904", "905", "906", "907", "908", "909",
|
||||
"910", "911", "912", "913", "914", "915", "916", "917", "918", "919",
|
||||
"920", "921", "922", "923", "924", "925", "926", "927", "928", "929",
|
||||
"930", "931", "932", "933", "934", "935", "936", "937", "938", "939",
|
||||
"940", "941", "942", "943", "944", "945", "946", "947", "948", "949",
|
||||
"950", "951", "952", "953", "954", "955", "956", "957", "958", "959",
|
||||
"960", "961", "962", "963", "964", "965", "966", "967", "968", "969",
|
||||
"970", "971", "972", "973", "974", "975", "976", "977", "978", "979",
|
||||
"980", "981", "982", "983", "984", "985", "986", "987", "988", "989",
|
||||
"990", "991", "992", "993", "994", "995", "996", "997", "998", "999",
|
||||
};
|
50
third_party/bson_c/test/bson_subobject_test.c
vendored
Normal file
50
third_party/bson_c/test/bson_subobject_test.c
vendored
Normal file
@ -0,0 +1,50 @@
|
||||
#include "test.h"
|
||||
#include "bson.h"
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
int main() {
|
||||
bson_iterator it[1], it2[1];
|
||||
bson b[1];
|
||||
bson sub[1];
|
||||
bson copy[1];
|
||||
bson_type type;
|
||||
|
||||
bson_init( b );
|
||||
bson_append_string( b, "foo", "hello" );
|
||||
|
||||
{
|
||||
bson_append_start_object( b, "o" );
|
||||
bson_append_string( b, "bar", "goodbye" );
|
||||
bson_append_finish_object( b );
|
||||
}
|
||||
|
||||
bson_iterator_init( it, b );
|
||||
|
||||
bson_iterator_next( it );
|
||||
type = bson_iterator_next( it );
|
||||
|
||||
ASSERT( BSON_OBJECT == type );
|
||||
|
||||
bson_iterator_subobject( it, sub );
|
||||
ASSERT( sub->finished == 1 );
|
||||
|
||||
bson_iterator_init( it2, sub );
|
||||
|
||||
type = bson_iterator_next( it2 );
|
||||
ASSERT( BSON_STRING == type );
|
||||
type = bson_iterator_next( it2 );
|
||||
ASSERT( BSON_EOO == type );
|
||||
|
||||
bson_copy( copy, sub );
|
||||
|
||||
ASSERT( 1 == copy->finished );
|
||||
ASSERT( 0 == copy->stackPos );
|
||||
ASSERT( 0 == copy->err );
|
||||
|
||||
bson_destroy( b );
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
259
third_party/bson_c/test/bson_test.c
vendored
Normal file
259
third_party/bson_c/test/bson_test.c
vendored
Normal file
@ -0,0 +1,259 @@
|
||||
#include "test.h"
|
||||
#include "bson.h"
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
int test_bson_generic() {
|
||||
|
||||
bson_iterator it, it2, it3;
|
||||
bson_oid_t oid;
|
||||
bson_timestamp_t ts;
|
||||
bson_timestamp_t ts_result;
|
||||
bson b[1];
|
||||
bson copy[1];
|
||||
bson scope[1];
|
||||
|
||||
ts.i = 1;
|
||||
ts.t = 2;
|
||||
|
||||
bson_init( b );
|
||||
bson_append_double( b, "d", 3.14 );
|
||||
bson_append_string( b, "s", "hello" );
|
||||
bson_append_string_n( b, "s_n", "goodbye cruel world", 7 );
|
||||
|
||||
{
|
||||
bson_append_start_object( b, "o" );
|
||||
bson_append_start_array( b, "a" );
|
||||
bson_append_binary( b, "0", 8, "w\0rld", 5 );
|
||||
bson_append_finish_object( b );
|
||||
bson_append_finish_object( b );
|
||||
}
|
||||
|
||||
bson_append_undefined( b, "u" );
|
||||
|
||||
bson_oid_from_string( &oid, "010203040506070809101112" );
|
||||
ASSERT( !memcmp( oid.bytes, "\x001\x002\x003\x004\x005\x006\x007\x008\x009\x010\x011\x012", 12 ) );
|
||||
bson_append_oid( b, "oid", &oid );
|
||||
|
||||
bson_append_bool( b, "b", 1 );
|
||||
bson_append_date( b, "date", 0x0102030405060708 );
|
||||
bson_append_null( b, "n" );
|
||||
bson_append_regex( b, "r", "^asdf", "imx" );
|
||||
/* no dbref test (deprecated) */
|
||||
bson_append_code( b, "c", "function(){}" );
|
||||
bson_append_code_n( b, "c_n", "function(){}garbage", 12 );
|
||||
bson_append_symbol( b, "symbol", "symbol" );
|
||||
bson_append_symbol_n( b, "symbol_n", "symbol and garbage", 6 );
|
||||
|
||||
{
|
||||
bson_init( scope );
|
||||
bson_append_int( scope, "i", 123 );
|
||||
bson_finish( scope );
|
||||
|
||||
bson_append_code_w_scope( b, "cws", "function(){return i}", scope );
|
||||
bson_destroy( scope );
|
||||
}
|
||||
|
||||
bson_append_timestamp( b, "timestamp", &ts );
|
||||
bson_append_long( b, "l", 0x1122334455667788 );
|
||||
|
||||
/* Ensure that we can't copy a non-finished object. */
|
||||
ASSERT( bson_copy( copy, b ) == BSON_ERROR );
|
||||
|
||||
bson_finish( b );
|
||||
|
||||
ASSERT( b->err == BSON_VALID );
|
||||
|
||||
/* Test append after finish. */
|
||||
ASSERT( bson_append_string( b, "foo", "bar" ) == BSON_ERROR );
|
||||
ASSERT( b->err & BSON_ALREADY_FINISHED );
|
||||
|
||||
ASSERT( bson_copy( copy, b ) == BSON_OK );
|
||||
|
||||
ASSERT( 1 == copy->finished );
|
||||
ASSERT( 0 == copy->err );
|
||||
|
||||
bson_print( b );
|
||||
|
||||
bson_iterator_init( &it, b );
|
||||
|
||||
ASSERT( bson_iterator_more( &it ) );
|
||||
ASSERT( bson_iterator_next( &it ) == BSON_DOUBLE );
|
||||
ASSERT( bson_iterator_type( &it ) == BSON_DOUBLE );
|
||||
ASSERT( !strcmp( bson_iterator_key( &it ), "d" ) );
|
||||
ASSERT( bson_iterator_double( &it ) == 3.14 );
|
||||
|
||||
ASSERT( bson_iterator_more( &it ) );
|
||||
ASSERT( bson_iterator_next( &it ) == BSON_STRING );
|
||||
ASSERT( bson_iterator_type( &it ) == BSON_STRING );
|
||||
ASSERT( !strcmp( bson_iterator_key( &it ), "s" ) );
|
||||
ASSERT( !strcmp( bson_iterator_string( &it ), "hello" ) );
|
||||
ASSERT( strcmp( bson_iterator_string( &it ), "" ) );
|
||||
|
||||
ASSERT( bson_iterator_more( &it ) );
|
||||
ASSERT( bson_iterator_next( &it ) == BSON_STRING );
|
||||
ASSERT( bson_iterator_type( &it ) == BSON_STRING );
|
||||
ASSERT( !strcmp( bson_iterator_key( &it ), "s_n" ) );
|
||||
ASSERT( !strcmp( bson_iterator_string( &it ), "goodbye" ) );
|
||||
|
||||
ASSERT( bson_iterator_more( &it ) );
|
||||
ASSERT( bson_iterator_next( &it ) == BSON_OBJECT );
|
||||
ASSERT( bson_iterator_type( &it ) == BSON_OBJECT );
|
||||
ASSERT( !strcmp( bson_iterator_key( &it ), "o" ) );
|
||||
bson_iterator_subiterator( &it, &it2 );
|
||||
|
||||
ASSERT( bson_iterator_more( &it2 ) );
|
||||
ASSERT( bson_iterator_next( &it2 ) == BSON_ARRAY );
|
||||
ASSERT( bson_iterator_type( &it2 ) == BSON_ARRAY );
|
||||
ASSERT( !strcmp( bson_iterator_key( &it2 ), "a" ) );
|
||||
bson_iterator_subiterator( &it2, &it3 );
|
||||
|
||||
ASSERT( bson_iterator_more( &it3 ) );
|
||||
ASSERT( bson_iterator_next( &it3 ) == BSON_BINDATA );
|
||||
ASSERT( bson_iterator_type( &it3 ) == BSON_BINDATA );
|
||||
ASSERT( !strcmp( bson_iterator_key( &it3 ), "0" ) );
|
||||
ASSERT( bson_iterator_bin_type( &it3 ) == 8 );
|
||||
ASSERT( bson_iterator_bin_len( &it3 ) == 5 );
|
||||
ASSERT( !memcmp( bson_iterator_bin_data( &it3 ), "w\0rld", 5 ) );
|
||||
|
||||
ASSERT( bson_iterator_more( &it3 ) );
|
||||
ASSERT( bson_iterator_next( &it3 ) == BSON_EOO );
|
||||
ASSERT( bson_iterator_type( &it3 ) == BSON_EOO );
|
||||
ASSERT( !bson_iterator_more( &it3 ) );
|
||||
|
||||
ASSERT( bson_iterator_more( &it2 ) );
|
||||
ASSERT( bson_iterator_next( &it2 ) == BSON_EOO );
|
||||
ASSERT( bson_iterator_type( &it2 ) == BSON_EOO );
|
||||
ASSERT( !bson_iterator_more( &it2 ) );
|
||||
|
||||
ASSERT( bson_iterator_more( &it ) );
|
||||
ASSERT( bson_iterator_next( &it ) == BSON_UNDEFINED );
|
||||
ASSERT( bson_iterator_type( &it ) == BSON_UNDEFINED );
|
||||
ASSERT( !strcmp( bson_iterator_key( &it ), "u" ) );
|
||||
|
||||
ASSERT( bson_iterator_more( &it ) );
|
||||
ASSERT( bson_iterator_next( &it ) == BSON_OID );
|
||||
ASSERT( bson_iterator_type( &it ) == BSON_OID );
|
||||
ASSERT( !strcmp( bson_iterator_key( &it ), "oid" ) );
|
||||
ASSERT( !memcmp( bson_iterator_oid( &it )->bytes, "\x001\x002\x003\x004\x005\x006\x007\x008\x009\x010\x011\x012", 12 ) );
|
||||
ASSERT( bson_iterator_oid( &it )->ints[0] == oid.ints[0] );
|
||||
ASSERT( bson_iterator_oid( &it )->ints[1] == oid.ints[1] );
|
||||
ASSERT( bson_iterator_oid( &it )->ints[2] == oid.ints[2] );
|
||||
|
||||
ASSERT( bson_iterator_more( &it ) );
|
||||
ASSERT( bson_iterator_next( &it ) == BSON_BOOL );
|
||||
ASSERT( bson_iterator_type( &it ) == BSON_BOOL );
|
||||
ASSERT( !strcmp( bson_iterator_key( &it ), "b" ) );
|
||||
ASSERT( bson_iterator_bool( &it ) == 1 );
|
||||
|
||||
ASSERT( bson_iterator_more( &it ) );
|
||||
ASSERT( bson_iterator_next( &it ) == BSON_DATE );
|
||||
ASSERT( bson_iterator_type( &it ) == BSON_DATE );
|
||||
ASSERT( !strcmp( bson_iterator_key( &it ), "date" ) );
|
||||
ASSERT( bson_iterator_date( &it ) == 0x0102030405060708 );
|
||||
|
||||
ASSERT( bson_iterator_more( &it ) );
|
||||
ASSERT( bson_iterator_next( &it ) == BSON_NULL );
|
||||
ASSERT( bson_iterator_type( &it ) == BSON_NULL );
|
||||
ASSERT( !strcmp( bson_iterator_key( &it ), "n" ) );
|
||||
|
||||
ASSERT( bson_iterator_more( &it ) );
|
||||
ASSERT( bson_iterator_next( &it ) == BSON_REGEX );
|
||||
ASSERT( bson_iterator_type( &it ) == BSON_REGEX );
|
||||
ASSERT( !strcmp( bson_iterator_key( &it ), "r" ) );
|
||||
ASSERT( !strcmp( bson_iterator_regex( &it ), "^asdf" ) );
|
||||
ASSERT( !strcmp( bson_iterator_regex_opts( &it ), "imx" ) );
|
||||
|
||||
ASSERT( bson_iterator_more( &it ) );
|
||||
ASSERT( bson_iterator_next( &it ) == BSON_CODE );
|
||||
ASSERT( bson_iterator_type( &it ) == BSON_CODE );
|
||||
ASSERT( !strcmp( bson_iterator_code(&it), "function(){}") );
|
||||
ASSERT( !strcmp( bson_iterator_key( &it ), "c" ) );
|
||||
ASSERT( !strcmp( bson_iterator_string( &it ), "" ) );
|
||||
|
||||
ASSERT( bson_iterator_more( &it ) );
|
||||
ASSERT( bson_iterator_next( &it ) == BSON_CODE );
|
||||
ASSERT( bson_iterator_type( &it ) == BSON_CODE );
|
||||
ASSERT( !strcmp( bson_iterator_key( &it ), "c_n" ) );
|
||||
ASSERT( !strcmp( bson_iterator_string( &it ), "" ) );
|
||||
ASSERT( !strcmp( bson_iterator_code( &it ), "function(){}" ) );
|
||||
|
||||
ASSERT( bson_iterator_more( &it ) );
|
||||
ASSERT( bson_iterator_next( &it ) == BSON_SYMBOL );
|
||||
ASSERT( bson_iterator_type( &it ) == BSON_SYMBOL );
|
||||
ASSERT( !strcmp( bson_iterator_key( &it ), "symbol" ) );
|
||||
ASSERT( !strcmp( bson_iterator_string( &it ), "symbol" ) );
|
||||
|
||||
ASSERT( bson_iterator_more( &it ) );
|
||||
ASSERT( bson_iterator_next( &it ) == BSON_SYMBOL );
|
||||
ASSERT( bson_iterator_type( &it ) == BSON_SYMBOL );
|
||||
ASSERT( !strcmp( bson_iterator_key( &it ), "symbol_n" ) );
|
||||
ASSERT( !strcmp( bson_iterator_string( &it ), "symbol" ) );
|
||||
|
||||
ASSERT( bson_iterator_more( &it ) );
|
||||
ASSERT( bson_iterator_next( &it ) == BSON_CODEWSCOPE );
|
||||
ASSERT( bson_iterator_type( &it ) == BSON_CODEWSCOPE );
|
||||
ASSERT( !strcmp( bson_iterator_key( &it ), "cws" ) );
|
||||
ASSERT( !strcmp( bson_iterator_code( &it ), "function(){return i}" ) );
|
||||
|
||||
{
|
||||
bson scope;
|
||||
bson_iterator_code_scope( &it, &scope );
|
||||
bson_iterator_init( &it2, &scope );
|
||||
|
||||
ASSERT( bson_iterator_more( &it2 ) );
|
||||
ASSERT( bson_iterator_next( &it2 ) == BSON_INT );
|
||||
ASSERT( bson_iterator_type( &it2 ) == BSON_INT );
|
||||
ASSERT( !strcmp( bson_iterator_key( &it2 ), "i" ) );
|
||||
ASSERT( bson_iterator_int( &it2 ) == 123 );
|
||||
|
||||
ASSERT( bson_iterator_more( &it2 ) );
|
||||
ASSERT( bson_iterator_next( &it2 ) == BSON_EOO );
|
||||
ASSERT( bson_iterator_type( &it2 ) == BSON_EOO );
|
||||
ASSERT( !bson_iterator_more( &it2 ) );
|
||||
}
|
||||
|
||||
ASSERT( bson_iterator_more( &it ) );
|
||||
ASSERT( bson_iterator_next( &it ) == BSON_TIMESTAMP );
|
||||
ASSERT( bson_iterator_type( &it ) == BSON_TIMESTAMP );
|
||||
ASSERT( !strcmp( bson_iterator_key( &it ), "timestamp" ) );
|
||||
ts_result = bson_iterator_timestamp( &it );
|
||||
ASSERT( ts_result.i == 1 );
|
||||
ASSERT( ts_result.t == 2 );
|
||||
|
||||
ASSERT( bson_iterator_more( &it ) );
|
||||
ASSERT( bson_iterator_next( &it ) == BSON_LONG );
|
||||
ASSERT( bson_iterator_type( &it ) == BSON_LONG );
|
||||
ASSERT( !strcmp( bson_iterator_key( &it ), "l" ) );
|
||||
ASSERT( bson_iterator_long( &it ) == 0x1122334455667788 );
|
||||
|
||||
ASSERT( bson_iterator_more( &it ) );
|
||||
ASSERT( bson_iterator_next( &it ) == BSON_EOO );
|
||||
ASSERT( bson_iterator_type( &it ) == BSON_EOO );
|
||||
ASSERT( !bson_iterator_more( &it ) );
|
||||
|
||||
bson_destroy( b );
|
||||
}
|
||||
|
||||
int test_bson_iterator() {
|
||||
bson b[1];
|
||||
bson_iterator i[1];
|
||||
|
||||
bson_iterator_init( i, bson_empty( b ) );
|
||||
bson_iterator_next( i );
|
||||
bson_iterator_type( i );
|
||||
|
||||
bson_find( i, bson_empty( b ), "foo" );
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int main() {
|
||||
|
||||
test_bson_generic();
|
||||
test_bson_iterator();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user