bson_buffer * bson_append_string_base( bson_buffer * b , const char * name , const char * value , bson_type type){ int sl = strlen( value ) + 1; if ( ! bson_append_estart( b , type , name , 4 + sl ) ) return 0; bson_append32( b , &sl); bson_append( b , value , sl ); return b; }
bson_buffer * bson_append_binary( bson_buffer * b, const char * name, char type, const char * str, int len ){ if ( ! bson_append_estart( b , bson_bindata , name , 4+1+len ) ) return 0; bson_append32(b, &len); bson_append_byte(b, type); bson_append(b, str, len); return b; }
bson_buffer * bson_append_binary( bson_buffer * b, const char * name, char type, const char * str, int len ){ if ( type == 2 ){ int subtwolen = len + 4; if ( ! bson_append_estart( b , bson_bindata , name , 4+1+4+len ) ) return 0; bson_append32(b, &subtwolen); bson_append_byte(b, type); bson_append32(b, &len); bson_append(b, str, len); }else{ if ( ! bson_append_estart( b , bson_bindata , name , 4+1+len ) ) return 0; bson_append32(b, &len); bson_append_byte(b, type); bson_append(b, str, len); } return b; }
MONGO_EXPORT int bson_append_bool( bson *b, const char *name, const bson_bool_t i ) { check_mongo_object( (void*)b ); if ( bson_append_estart( b, BSON_BOOL, name, 1 ) == BSON_ERROR ) return BSON_ERROR; bson_append_byte( b , i != 0 ); return BSON_OK; }
MONGO_EXPORT int bson_append_oid( bson *b, const char *name, const bson_oid_t *oid ) { check_mongo_object( (void*)b ); if ( bson_append_estart( b, BSON_OID, name, 12 ) == BSON_ERROR ) return BSON_ERROR; bson_append( b , oid , 12 ); return BSON_OK; }
MONGO_EXPORT int bson_append_long( bson *b, const char *name, const int64_t i ) { check_mongo_object( (void*)b ); if ( bson_append_estart( b , BSON_LONG, name, 8 ) == BSON_ERROR ) return BSON_ERROR; bson_append64( b , &i ); return BSON_OK; }
MONGO_EXPORT int bson_append_bson( bson *b, const char *name, const bson *bson ) { if ( !bson ) return BSON_ERROR; if ( bson_append_estart( b, BSON_OBJECT, name, bson_size( bson ) ) == BSON_ERROR ) return BSON_ERROR; bson_append( b , bson->data , bson_size( bson ) ); return BSON_OK; }
MONGO_EXPORT int bson_append_start_array( bson *b, const char *name ) { check_mongo_object( (void*)b ); if ( bson_append_estart( b, BSON_ARRAY, name, 5 ) == BSON_ERROR ) return BSON_ERROR; b->stack[ b->stackPos++ ] = b->cur - b->data; bson_append32( b , &zero ); return BSON_OK; }
MONGO_EXPORT int bson_append_int( bson *b, const char *name, const int i ) { check_mongo_object( (void*)b ); if ( bson_append_estart( b, BSON_INT, name, 4 ) == BSON_ERROR ) return BSON_ERROR; bson_append32( b , &i ); return BSON_OK; }
MONGO_EXPORT int bson_append_start_object( bson *b, const char *name ) { if ( bson_append_estart( b, BSON_OBJECT, name, 5 ) == BSON_ERROR ) return BSON_ERROR; if ( b->stackPos >= b->stackSize && _bson_append_grow_stack( b ) == BSON_ERROR ) return BSON_ERROR; b->stackPtr[ b->stackPos++ ] = _bson_position(b); bson_append32( b , &zero ); return BSON_OK; }
MONGO_EXPORT int bson_append_timestamp2( bson *b, const char *name, int time, int increment ) { if ( bson_append_estart( b, BSON_TIMESTAMP, name, 8 ) == BSON_ERROR ) return BSON_ERROR; bson_append32( b , &increment ); bson_append32( b , &time ); return BSON_OK; }
MONGO_EXPORT int bson_append_double( bson *b, const char *name, const double d ) { check_mongo_object( (void*)b ); if ( bson_append_estart( b, BSON_DOUBLE, name, 8 ) == BSON_ERROR ) return BSON_ERROR; bson_append64( b , &d ); return BSON_OK; }
bson_buffer * bson_append_timestamp( bson_buffer * b, const char * name, bson_timestamp_t * ts ){ if ( ! bson_append_estart( b , bson_timestamp , name , 8 ) ) return 0; bson_append32( b , &(ts->i) ); bson_append32( b , &(ts->t) ); return b; }
bson_buffer * bson_append_regex( bson_buffer * b , const char * name , const char * pattern, const char * opts ){ const int plen = strlen(pattern)+1; const int olen = strlen(opts)+1; if ( ! bson_append_estart( b , bson_regex , name , plen + olen ) ) return 0; bson_append( b , pattern , plen ); bson_append( b , opts , olen ); return b; }
int bson_append_timestamp( bson *b, const char *name, bson_timestamp_t *ts ) { if ( bson_append_estart( b, BSON_TIMESTAMP, name, 8 ) == BSON_ERROR ) return BSON_ERROR; bson_append32( b , &( ts->i ) ); bson_append32( b , &( ts->t ) ); return BSON_OK; }
MONGO_EXPORT int bson_append_timestamp( bson *b, const char *name, bson_timestamp_t *ts ) { check_mongo_object( (void*)b ); if ( bson_append_estart( b, BSON_TIMESTAMP, name, 8 ) == BSON_ERROR ) return BSON_ERROR; bson_append32( b , &( ts->i ) ); bson_append32( b , &( ts->t ) ); return BSON_OK; }
MONGO_EXPORT int bson_append_bson( bson *b, const char *name, const bson *bson ) { if ( !bson ) return BSON_ERROR; check_mongo_object( (void*)b ); check_mongo_object( (void*)bson ); if ( bson_append_estart( b, BSON_OBJECT, name, bson_size( bson ) ) == BSON_ERROR ) return BSON_ERROR; bson_append( b , bson->data , bson_size( bson ) ); return BSON_OK; }
int bson_append_binary( bson *b, const char *name, char type, const char *str, int len ) { if ( type == BSON_BIN_BINARY_OLD ) { int subtwolen = len + 4; if ( bson_append_estart( b, BSON_BINDATA, name, 4+1+4+len ) == BSON_ERROR ) return BSON_ERROR; bson_append32( b, &subtwolen ); bson_append_byte( b, type ); bson_append32( b, &len ); bson_append( b, str, len ); } else { if ( bson_append_estart( b, BSON_BINDATA, name, 4+1+len ) == BSON_ERROR ) return BSON_ERROR; bson_append32( b, &len ); bson_append_byte( b, type ); bson_append( b, str, len ); } return BSON_OK; }
bson_buffer * bson_append_string_base( bson_buffer * b , const char * name , const char * value , int len , bson_type type){ int sl = len + 1; if ( ! bson_append_estart( b , type , name , 4 + sl ) ) return 0; if ( ! bson_check_string( b, value, sl - 1 ) ) return 0; bson_append32( b , &sl); bson_append( b , value , sl - 1 ); bson_append( b , "\0" , 1 ); return b; }
bson_buffer * bson_append_code_w_scope( bson_buffer * b , const char * name , const char * code , const bson * scope){ int sl = strlen(code) + 1; int size = 4 + 4 + sl + bson_size(scope); if (!bson_append_estart(b, bson_codewscope, name, size)) return 0; bson_append32(b, &size); bson_append32(b, &sl); bson_append(b, code, sl); bson_append(b, scope->data, bson_size(scope)); return b; }
MONGO_EXPORT int bson_append_binary( bson *b, const char *name, char type, const char *str, size_t len ) { if ( type == BSON_BIN_BINARY_OLD ) { size_t subtwolen = len + 4; if ( bson_append_estart( b, BSON_BINDATA, name, 4+1+4+len ) == BSON_ERROR ) return BSON_ERROR; bson_append32_as_int( b, ( int )subtwolen ); bson_append_byte( b, type ); bson_append32_as_int( b, ( int )len ); bson_append( b, str, len ); } else { if ( bson_append_estart( b, BSON_BINDATA, name, 4+1+len ) == BSON_ERROR ) return BSON_ERROR; bson_append32_as_int( b, ( int )len ); bson_append_byte( b, type ); bson_append( b, str, len ); } return BSON_OK; }
int bson_append_regex( bson *b, const char *name, const char *pattern, const char *opts ) { const int plen = strlen( pattern )+1; const int olen = strlen( opts )+1; if ( bson_append_estart( b, BSON_REGEX, name, plen + olen ) == BSON_ERROR ) return BSON_ERROR; if ( bson_check_string( b, pattern, plen - 1 ) == BSON_ERROR ) return BSON_ERROR; bson_append( b , pattern , plen ); bson_append( b , opts , olen ); return BSON_OK; }
MONGO_EXPORT int bson_append_regex( bson *b, const char *name, const char *pattern, const char *opts ) { const size_t plen = strlen( pattern )+1; const size_t olen = strlen( opts )+1; check_mongo_object( (void*)b ); if ( bson_append_estart( b, BSON_REGEX, name, plen + olen ) == BSON_ERROR ) return BSON_ERROR; if ( bson_check_string( b, pattern, plen - 1 ) == BSON_ERROR ) return BSON_ERROR; bson_append( b , pattern , plen ); bson_append( b , opts , olen ); return BSON_OK; }
int bson_append_code_w_scope_n( bson *b, const char *name, const char *code, int len, const bson *scope ) { int sl = len + 1; int size = 4 + 4 + sl + bson_size( scope ); if ( bson_append_estart( b, BSON_CODEWSCOPE, name, size ) == BSON_ERROR ) return BSON_ERROR; bson_append32( b, &size ); bson_append32( b, &sl ); bson_append( b, code, sl ); bson_append( b, scope->data, bson_size( scope ) ); return BSON_OK; }
int bson_append_string_base( bson *b, const char *name, const char *value, int len, bson_type type ) { int sl = len + 1; if ( bson_check_string( b, ( const char * )value, sl - 1 ) == BSON_ERROR ) return BSON_ERROR; if ( bson_append_estart( b, type, name, 4 + sl ) == BSON_ERROR ) { return BSON_ERROR; } bson_append32( b , &sl ); bson_append( b , value , sl - 1 ); bson_append( b , "\0" , 1 ); return BSON_OK; }
bson_buffer * bson_append_element( bson_buffer * b, const char * name_or_null, const bson_iterator* elem){ bson_iterator next = *elem; int size; bson_iterator_next(&next); size = next.cur - elem->cur; if (name_or_null == NULL){ bson_ensure_space(b, size); bson_append(b, elem->cur, size); }else{ int data_size = size - 2 - strlen(bson_iterator_key(elem)); bson_append_estart(b, elem->cur[0], name_or_null, data_size); bson_append(b, bson_iterator_value(elem), data_size); } return b; }
static int bson_append_string_base( bson *b, const char *name, const char *value, size_t len, bson_type type ) { size_t sl = len + 1; if ( sl > INT32_MAX ) { b->err = BSON_SIZE_OVERFLOW; /* string too long */ return BSON_ERROR; } if ( bson_check_string( b, ( const char * )value, sl - 1 ) == BSON_ERROR ) return BSON_ERROR; if ( bson_append_estart( b, type, name, 4 + sl ) == BSON_ERROR ) { return BSON_ERROR; } bson_append32_as_int( b , ( int )sl ); bson_append( b , value , sl - 1 ); bson_append( b , "\0" , 1 ); return BSON_OK; }
MONGO_EXPORT int bson_append_code_w_scope_n( bson *b, const char *name, const char *code, size_t len, const bson *scope ) { size_t sl, size; if ( !scope ) return BSON_ERROR; sl = len + 1; size = 4 + 4 + sl + bson_size( scope ); if ( size > (size_t)INT32_MAX ) { b->err = BSON_SIZE_OVERFLOW; return BSON_ERROR; } if ( bson_append_estart( b, BSON_CODEWSCOPE, name, size ) == BSON_ERROR ) return BSON_ERROR; bson_append32_as_int( b, ( int )size ); bson_append32( b, &sl ); bson_append( b, code, sl ); bson_append( b, scope->data, bson_size( scope ) ); return BSON_OK; }
MONGO_EXPORT int bson_append_element( bson *b, const char *name_or_null, const bson_iterator *elem ) { bson_iterator next = *elem; size_t size; bson_iterator_next( &next ); size = next.cur - elem->cur; if ( name_or_null == NULL ) { if( bson_ensure_space( b, size ) == BSON_ERROR ) return BSON_ERROR; bson_append( b, elem->cur, size ); } else { size_t data_size = size - 2 - strlen( bson_iterator_key( elem ) ); bson_append_estart( b, elem->cur[0], name_or_null, data_size ); bson_append( b, bson_iterator_value( elem ), data_size ); } return BSON_OK; }
int bson_append_start_array( bson *b, const char *name ) { if ( bson_append_estart( b, BSON_ARRAY, name, 5 ) == BSON_ERROR ) return BSON_ERROR; b->stack[ b->stackPos++ ] = b->cur - b->data; bson_append32( b , &zero ); return BSON_OK; }