File Coverage

bson/bson-iter.h
Criterion Covered Total %
statement 28 35 80.0
branch n/a
condition n/a
subroutine n/a
pod n/a
total 28 35 80.0


line stmt bran cond sub pod time code
1             /*
2             * Copyright 2013 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             */
16              
17              
18             #ifndef BSON_ITER_H
19             #define BSON_ITER_H
20              
21              
22             #if !defined (BSON_INSIDE) && !defined (BSON_COMPILATION)
23             # error "Only can be included directly."
24             #endif
25              
26              
27             #include "bson.h"
28             #include "bson-endian.h"
29             #include "bson-macros.h"
30             #include "bson-types.h"
31              
32              
33             BSON_BEGIN_DECLS
34              
35              
36             #define BSON_ITER_HOLDS_DOUBLE(iter) \
37             (bson_iter_type ((iter)) == BSON_TYPE_DOUBLE)
38              
39             #define BSON_ITER_HOLDS_UTF8(iter) \
40             (bson_iter_type ((iter)) == BSON_TYPE_UTF8)
41              
42             #define BSON_ITER_HOLDS_DOCUMENT(iter) \
43             (bson_iter_type ((iter)) == BSON_TYPE_DOCUMENT)
44              
45             #define BSON_ITER_HOLDS_ARRAY(iter) \
46             (bson_iter_type ((iter)) == BSON_TYPE_ARRAY)
47              
48             #define BSON_ITER_HOLDS_BINARY(iter) \
49             (bson_iter_type ((iter)) == BSON_TYPE_BINARY)
50              
51             #define BSON_ITER_HOLDS_UNDEFINED(iter) \
52             (bson_iter_type ((iter)) == BSON_TYPE_UNDEFINED)
53              
54             #define BSON_ITER_HOLDS_OID(iter) \
55             (bson_iter_type ((iter)) == BSON_TYPE_OID)
56              
57             #define BSON_ITER_HOLDS_BOOL(iter) \
58             (bson_iter_type ((iter)) == BSON_TYPE_BOOL)
59              
60             #define BSON_ITER_HOLDS_DATE_TIME(iter) \
61             (bson_iter_type ((iter)) == BSON_TYPE_DATE_TIME)
62              
63             #define BSON_ITER_HOLDS_NULL(iter) \
64             (bson_iter_type ((iter)) == BSON_TYPE_NULL)
65              
66             #define BSON_ITER_HOLDS_REGEX(iter) \
67             (bson_iter_type ((iter)) == BSON_TYPE_REGEX)
68              
69             #define BSON_ITER_HOLDS_DBPOINTER(iter) \
70             (bson_iter_type ((iter)) == BSON_TYPE_DBPOINTER)
71              
72             #define BSON_ITER_HOLDS_CODE(iter) \
73             (bson_iter_type ((iter)) == BSON_TYPE_CODE)
74              
75             #define BSON_ITER_HOLDS_SYMBOL(iter) \
76             (bson_iter_type ((iter)) == BSON_TYPE_SYMBOL)
77              
78             #define BSON_ITER_HOLDS_CODEWSCOPE(iter) \
79             (bson_iter_type ((iter)) == BSON_TYPE_CODEWSCOPE)
80              
81             #define BSON_ITER_HOLDS_INT32(iter) \
82             (bson_iter_type ((iter)) == BSON_TYPE_INT32)
83              
84             #define BSON_ITER_HOLDS_TIMESTAMP(iter) \
85             (bson_iter_type ((iter)) == BSON_TYPE_TIMESTAMP)
86              
87             #define BSON_ITER_HOLDS_INT64(iter) \
88             (bson_iter_type ((iter)) == BSON_TYPE_INT64)
89              
90             #define BSON_ITER_HOLDS_DECIMAL128(iter) \
91             (bson_iter_type (iter)) == BSON_TYPE_DECIMAL128
92              
93             #define BSON_ITER_HOLDS_MAXKEY(iter) \
94             (bson_iter_type ((iter)) == BSON_TYPE_MAXKEY)
95              
96             #define BSON_ITER_HOLDS_MINKEY(iter) \
97             (bson_iter_type ((iter)) == BSON_TYPE_MINKEY)
98              
99             #define BSON_ITER_IS_KEY(iter, key) \
100             (0 == strcmp ((key), bson_iter_key ((iter))))
101              
102              
103             const bson_value_t *
104             bson_iter_value (bson_iter_t *iter);
105              
106              
107             /**
108             * bson_iter_utf8_len_unsafe:
109             * @iter: a bson_iter_t.
110             *
111             * Returns the length of a string currently pointed to by @iter. This performs
112             * no validation so the is responsible for knowing the BSON is valid. Calling
113             * bson_validate() is one way to do this ahead of time.
114             */
115             static BSON_INLINE uint32_t
116 251           bson_iter_utf8_len_unsafe (const bson_iter_t *iter)
117             {
118             int32_t val;
119              
120 251           memcpy (&val, iter->raw + iter->d1, sizeof (val));
121 251           val = BSON_UINT32_FROM_LE (val);
122 251           return BSON_MAX (0, val - 1);
123             }
124              
125              
126             void
127             bson_iter_array (const bson_iter_t *iter,
128             uint32_t *array_len,
129             const uint8_t **array);
130              
131              
132             void
133             bson_iter_binary (const bson_iter_t *iter,
134             bson_subtype_t *subtype,
135             uint32_t *binary_len,
136             const uint8_t **binary);
137              
138              
139             const char *
140             bson_iter_code (const bson_iter_t *iter,
141             uint32_t *length);
142              
143              
144             /**
145             * bson_iter_code_unsafe:
146             * @iter: A bson_iter_t.
147             * @length: A location for the length of the resulting string.
148             *
149             * Like bson_iter_code() but performs no integrity checks.
150             *
151             * Returns: A string that should not be modified or freed.
152             */
153             static BSON_INLINE const char *
154             bson_iter_code_unsafe (const bson_iter_t *iter,
155             uint32_t *length)
156             {
157             *length = bson_iter_utf8_len_unsafe (iter);
158             return (const char *)(iter->raw + iter->d2);
159             }
160              
161              
162             const char *
163             bson_iter_codewscope (const bson_iter_t *iter,
164             uint32_t *length,
165             uint32_t *scope_len,
166             const uint8_t **scope);
167              
168              
169             void
170             bson_iter_dbpointer (const bson_iter_t *iter,
171             uint32_t *collection_len,
172             const char **collection,
173             const bson_oid_t **oid);
174              
175              
176             void
177             bson_iter_document (const bson_iter_t *iter,
178             uint32_t *document_len,
179             const uint8_t **document);
180              
181              
182             double
183             bson_iter_double (const bson_iter_t *iter);
184              
185              
186             /**
187             * bson_iter_double_unsafe:
188             * @iter: A bson_iter_t.
189             *
190             * Similar to bson_iter_double() but does not perform an integrity checking.
191             *
192             * Returns: A double.
193             */
194             static BSON_INLINE double
195 59           bson_iter_double_unsafe (const bson_iter_t *iter)
196             {
197             double val;
198              
199 59           memcpy (&val, iter->raw + iter->d1, sizeof (val));
200 59           return BSON_DOUBLE_FROM_LE (val);
201             }
202              
203              
204             bool
205             bson_iter_init (bson_iter_t *iter,
206             const bson_t *bson);
207              
208              
209             bool
210             bson_iter_init_find (bson_iter_t *iter,
211             const bson_t *bson,
212             const char *key);
213              
214              
215             bool
216             bson_iter_init_find_case (bson_iter_t *iter,
217             const bson_t *bson,
218             const char *key);
219              
220              
221             int32_t
222             bson_iter_int32 (const bson_iter_t *iter);
223              
224              
225             /**
226             * bson_iter_int32_unsafe:
227             * @iter: A bson_iter_t.
228             *
229             * Similar to bson_iter_int32() but with no integrity checking.
230             *
231             * Returns: A 32-bit signed integer.
232             */
233             static BSON_INLINE int32_t
234 70           bson_iter_int32_unsafe (const bson_iter_t *iter)
235             {
236             int32_t val;
237              
238 70           memcpy (&val, iter->raw + iter->d1, sizeof (val));
239 70           return BSON_UINT32_FROM_LE (val);
240             }
241              
242              
243             int64_t
244             bson_iter_int64 (const bson_iter_t *iter);
245              
246              
247             int64_t
248             bson_iter_as_int64 (const bson_iter_t *iter);
249              
250              
251             /**
252             * bson_iter_int64_unsafe:
253             * @iter: a bson_iter_t.
254             *
255             * Similar to bson_iter_int64() but without integrity checking.
256             *
257             * Returns: A 64-bit signed integer.
258             */
259             static BSON_INLINE int64_t
260 48           bson_iter_int64_unsafe (const bson_iter_t *iter)
261             {
262             int64_t val;
263              
264 48           memcpy (&val, iter->raw + iter->d1, sizeof (val));
265 48           return BSON_UINT64_FROM_LE (val);
266             }
267              
268              
269             bool
270             bson_iter_find (bson_iter_t *iter,
271             const char *key);
272              
273              
274             bool
275             bson_iter_find_case (bson_iter_t *iter,
276             const char *key);
277              
278              
279             bool
280             bson_iter_find_descendant (bson_iter_t *iter,
281             const char *dotkey,
282             bson_iter_t *descendant);
283              
284              
285             bool
286             bson_iter_next (bson_iter_t *iter);
287              
288              
289             const bson_oid_t *
290             bson_iter_oid (const bson_iter_t *iter);
291              
292              
293             /**
294             * bson_iter_oid_unsafe:
295             * @iter: A #bson_iter_t.
296             *
297             * Similar to bson_iter_oid() but performs no integrity checks.
298             *
299             * Returns: A #bson_oid_t that should not be modified or freed.
300             */
301             static BSON_INLINE const bson_oid_t *
302 21           bson_iter_oid_unsafe (const bson_iter_t *iter)
303             {
304 21           return (const bson_oid_t *)(iter->raw + iter->d1);
305             }
306              
307              
308             bool
309             bson_iter_decimal128 (const bson_iter_t *iter,
310             bson_decimal128_t *dec);
311              
312              
313             /**
314             * bson_iter_decimal128_unsafe:
315             * @iter: A #bson_iter_t.
316             *
317             * Similar to bson_iter_decimal128() but performs no integrity checks.
318             *
319             * Returns: A #bson_decimal128_t.
320             */
321             static BSON_INLINE void
322 2412           bson_iter_decimal128_unsafe (const bson_iter_t *iter,
323             bson_decimal128_t *dec)
324             {
325             uint64_t low_le;
326             uint64_t high_le;
327              
328 2412           memcpy (&low_le, iter->raw + iter->d1, sizeof (low_le));
329 2412           memcpy (&high_le, iter->raw + iter->d1 + 8, sizeof (high_le));
330              
331 2412           dec->low = BSON_UINT64_FROM_LE (low_le);
332 2412           dec->high = BSON_UINT64_FROM_LE (high_le);
333 2412           }
334              
335              
336             const char *
337             bson_iter_key (const bson_iter_t *iter);
338              
339              
340             /**
341             * bson_iter_key_unsafe:
342             * @iter: A bson_iter_t.
343             *
344             * Similar to bson_iter_key() but performs no integrity checking.
345             *
346             * Returns: A string that should not be modified or freed.
347             */
348             static BSON_INLINE const char *
349 5773           bson_iter_key_unsafe (const bson_iter_t *iter)
350             {
351 5773           return (const char *)(iter->raw + iter->key);
352             }
353              
354              
355             const char *
356             bson_iter_utf8 (const bson_iter_t *iter,
357             uint32_t *length);
358              
359              
360             /**
361             * bson_iter_utf8_unsafe:
362             *
363             * Similar to bson_iter_utf8() but performs no integrity checking.
364             *
365             * Returns: A string that should not be modified or freed.
366             */
367             static BSON_INLINE const char *
368             bson_iter_utf8_unsafe (const bson_iter_t *iter,
369             size_t *length)
370             {
371             *length = bson_iter_utf8_len_unsafe (iter);
372             return (const char *)(iter->raw + iter->d2);
373             }
374              
375              
376             char *
377             bson_iter_dup_utf8 (const bson_iter_t *iter,
378             uint32_t *length);
379              
380              
381             int64_t
382             bson_iter_date_time (const bson_iter_t *iter);
383              
384              
385             time_t
386             bson_iter_time_t (const bson_iter_t *iter);
387              
388              
389             /**
390             * bson_iter_time_t_unsafe:
391             * @iter: A bson_iter_t.
392             *
393             * Similar to bson_iter_time_t() but performs no integrity checking.
394             *
395             * Returns: A time_t containing the number of seconds since UNIX epoch
396             * in UTC.
397             */
398             static BSON_INLINE time_t
399 0           bson_iter_time_t_unsafe (const bson_iter_t *iter)
400             {
401 0           return (time_t)(bson_iter_int64_unsafe (iter) / 1000UL);
402             }
403              
404              
405             void
406             bson_iter_timeval (const bson_iter_t *iter,
407             struct timeval *tv);
408              
409              
410             /**
411             * bson_iter_timeval_unsafe:
412             * @iter: A bson_iter_t.
413             * @tv: A struct timeval.
414             *
415             * Similar to bson_iter_timeval() but performs no integrity checking.
416             */
417             static BSON_INLINE void
418 0           bson_iter_timeval_unsafe (const bson_iter_t *iter,
419             struct timeval *tv)
420             {
421 0           int64_t value = bson_iter_int64_unsafe (iter);
422             #ifdef BSON_OS_WIN32
423             tv->tv_sec = (long) (value / 1000);
424             #else
425 0           tv->tv_sec = (suseconds_t) (value / 1000);
426             #endif
427 0           tv->tv_usec = (value % 1000) * 1000;
428 0           }
429              
430              
431             void
432             bson_iter_timestamp (const bson_iter_t *iter,
433             uint32_t *timestamp,
434             uint32_t *increment);
435              
436              
437             bool
438             bson_iter_bool (const bson_iter_t *iter);
439              
440              
441             /**
442             * bson_iter_bool_unsafe:
443             * @iter: A bson_iter_t.
444             *
445             * Similar to bson_iter_bool() but performs no integrity checking.
446             *
447             * Returns: true or false.
448             */
449             static BSON_INLINE bool
450 18           bson_iter_bool_unsafe (const bson_iter_t *iter)
451             {
452             char val;
453              
454 18           memcpy (&val, iter->raw + iter->d1, 1);
455 18           return !!val;
456             }
457              
458              
459             bool
460             bson_iter_as_bool (const bson_iter_t *iter);
461              
462              
463             const char *
464             bson_iter_regex (const bson_iter_t *iter,
465             const char **options);
466              
467              
468             const char *
469             bson_iter_symbol (const bson_iter_t *iter,
470             uint32_t *length);
471              
472              
473             bson_type_t
474             bson_iter_type (const bson_iter_t *iter);
475              
476              
477             /**
478             * bson_iter_type_unsafe:
479             * @iter: A bson_iter_t.
480             *
481             * Similar to bson_iter_type() but performs no integrity checking.
482             *
483             * Returns: A bson_type_t.
484             */
485             static BSON_INLINE bson_type_t
486 2034           bson_iter_type_unsafe (const bson_iter_t *iter)
487             {
488 2034           return (bson_type_t) (iter->raw + iter->type) [0];
489             }
490              
491              
492             bool
493             bson_iter_recurse (const bson_iter_t *iter,
494             bson_iter_t *child);
495              
496              
497             void
498             bson_iter_overwrite_int32 (bson_iter_t *iter,
499             int32_t value);
500              
501              
502             void
503             bson_iter_overwrite_int64 (bson_iter_t *iter,
504             int64_t value);
505              
506              
507             void
508             bson_iter_overwrite_double (bson_iter_t *iter,
509             double value);
510              
511              
512             void
513             bson_iter_overwrite_decimal128 (bson_iter_t *iter,
514             bson_decimal128_t *value);
515              
516              
517             void
518             bson_iter_overwrite_bool (bson_iter_t *iter,
519             bool value);
520              
521              
522             bool
523             bson_iter_visit_all (bson_iter_t *iter,
524             const bson_visitor_t *visitor,
525             void *data);
526              
527              
528             BSON_END_DECLS
529              
530              
531             #endif /* BSON_ITER_H */