bson_bool_t mongo_cursor_get_more(mongo_cursor* cursor){ if (cursor->mm && cursor->mm->fields.cursorID){ mongo_connection* conn = cursor->conn; char* data; int sl = strlen(cursor->ns)+1; mongo_message * mm = mongo_message_create(16 /*header*/ +4 /*ZERO*/ +sl +4 /*numToReturn*/ +8 /*cursorID*/ , 0, 0, mongo_op_get_more); data = &mm->data; data = mongo_data_append32(data, &zero); data = mongo_data_append(data, cursor->ns, sl); data = mongo_data_append32(data, &zero); data = mongo_data_append64(data, &cursor->mm->fields.cursorID); mongo_message_send(conn, mm); free(cursor->mm); MONGO_TRY{ cursor->mm = mongo_read_response(cursor->conn); }MONGO_CATCH{ cursor->mm = NULL; mongo_cursor_destroy(cursor); MONGO_RETHROW(); } return cursor->mm && cursor->mm->fields.num; } else{
MONGO_EXPORT int mongo_cursor_destroy( mongo_cursor *cursor ) { int result = MONGO_OK; if ( !cursor ) return result; /* Kill cursor if live. */ if ( cursor->reply && cursor->reply->fields.cursorID ) { mongo *conn = cursor->conn; mongo_message *mm = mongo_message_create( 16 /*header*/ +4 /*ZERO*/ +4 /*numCursors*/ +8 /*cursorID*/ , 0, 0, MONGO_OP_KILL_CURSORS ); char *data = &mm->data; data = mongo_data_append32( data, &ZERO ); data = mongo_data_append32( data, &ONE ); data = mongo_data_append64( data, &cursor->reply->fields.cursorID ); result = mongo_message_send( conn, mm ); } bson_free( cursor->reply ); bson_free( ( void * )cursor->ns ); if( cursor->flags & MONGO_CURSOR_MUST_FREE ) bson_free( cursor ); return result; }
MONGO_EXPORT int mongo_remove( mongo *conn, const char *ns, const bson *cond ) { char *data; mongo_message *mm; /* Make sure that the BSON is valid UTF-8. * TODO: decide whether to check cond as well. * */ if( mongo_bson_valid( conn, ( bson * )cond, 0 ) != MONGO_OK ) { return MONGO_ERROR; } mm = mongo_message_create( 16 /* header */ + 4 /* ZERO */ + strlen( ns ) + 1 + 4 /* ZERO */ + bson_size( cond ) , 0 , 0 , MONGO_OP_DELETE ); data = &mm->data; data = mongo_data_append32( data, &ZERO ); data = mongo_data_append( data, ns, strlen( ns ) + 1 ); data = mongo_data_append32( data, &ZERO ); data = mongo_data_append( data, cond->data, bson_size( cond ) ); return mongo_message_send( conn, mm ); }
MONGO_EXPORT int mongo_insert_batch( mongo *conn, const char *ns, const bson **bsons, int count ) { mongo_message *mm; int i; char *data; int size = 16 + 4 + strlen( ns ) + 1; for( i=0; i<count; i++ ) { size += bson_size( bsons[i] ); if( mongo_bson_valid( conn, bsons[i], 1 ) != MONGO_OK ) return MONGO_ERROR; } mm = mongo_message_create( size , 0 , 0 , MONGO_OP_INSERT ); data = &mm->data; data = mongo_data_append32( data, &ZERO ); data = mongo_data_append( data, ns, strlen( ns ) + 1 ); for( i=0; i<count; i++ ) { data = mongo_data_append( data, bsons[i]->data, bson_size( bsons[i] ) ); } return mongo_message_send( conn, mm ); }
int mongo_update( mongo *conn, const char *ns, const bson *cond, const bson *op, int flags ) { char *data; mongo_message *mm; /* Make sure that the op BSON is valid UTF-8. * TODO: decide whether to check cond as well. * */ if( mongo_bson_valid( conn, ( bson * )op, 0 ) != MONGO_OK ) { return MONGO_ERROR; } mm = mongo_message_create( 16 /* header */ + 4 /* ZERO */ + strlen( ns ) + 1 + 4 /* flags */ + bson_size( cond ) + bson_size( op ) , 0 , 0 , MONGO_OP_UPDATE ); data = &mm->data; data = mongo_data_append32( data, &ZERO ); data = mongo_data_append( data, ns, strlen( ns ) + 1 ); data = mongo_data_append32( data, &flags ); data = mongo_data_append( data, cond->data, bson_size( cond ) ); data = mongo_data_append( data, op->data, bson_size( op ) ); return mongo_message_send( conn, mm ); }
int mongo_cursor_destroy(mongo_cursor* cursor){ int result = MONGO_OK; if (!cursor) return result; if (cursor->reply && cursor->reply->fields.cursorID){ mongo_connection* conn = cursor->conn; mongo_message * mm = mongo_message_create(16 /*header*/ +4 /*ZERO*/ +4 /*numCursors*/ +8 /*cursorID*/ , 0, 0, MONGO_OP_KILL_CURSORS); char* data = &mm->data; data = mongo_data_append32(data, &ZERO); data = mongo_data_append32(data, &ONE); data = mongo_data_append64(data, &cursor->reply->fields.cursorID); result = mongo_message_send(conn, mm); } free(cursor->reply); free((void*)cursor->ns); free(cursor); return result; }
mongo_cursor* mongo_find(mongo_connection* conn, const char* ns, bson* query, bson* fields, int nToReturn, int nToSkip, int options) { int sl; int res; mongo_cursor * cursor; char * data; mongo_message * mm = mongo_message_create( 16 + /* header */ 4 + /* options */ strlen( ns ) + 1 + /* ns */ 4 + 4 + /* skip,return */ bson_size( query ) + bson_size( fields ) , 0 , 0 , MONGO_OP_QUERY ); data = &mm->data; data = mongo_data_append32( data , &options ); data = mongo_data_append( data , ns , strlen( ns ) + 1 ); data = mongo_data_append32( data , &nToSkip ); data = mongo_data_append32( data , &nToReturn ); data = mongo_data_append( data , query->data , bson_size( query ) ); if ( fields ) data = mongo_data_append( data , fields->data , bson_size( fields ) ); bson_fatal_msg( (data == ((char*)mm) + mm->head.len), "query building fail!" ); res = mongo_message_send( conn , mm ); if(res != MONGO_OK){ return NULL; } cursor = (mongo_cursor*)bson_malloc(sizeof(mongo_cursor)); res = mongo_read_response( conn, (mongo_reply **)&(cursor->reply) ); if( res != MONGO_OK ) { free( cursor ); return NULL; } sl = strlen(ns)+1; cursor->ns = bson_malloc(sl); if (!cursor->ns){ free(cursor->reply); free( cursor ); return NULL; } memcpy( (void*)cursor->ns, ns, sl ); cursor->conn = conn; cursor->current.data = NULL; cursor->options = options; return (mongo_cursor*)cursor; }
static int mongo_cursor_get_more( mongo_cursor *cursor ) { int res; if( cursor->limit > 0 && cursor->seen >= cursor->limit ) { cursor->err = MONGO_CURSOR_EXHAUSTED; return MONGO_ERROR; } else if( ! cursor->reply ) { cursor->err = MONGO_CURSOR_INVALID; return MONGO_ERROR; } else if( ! cursor->reply->fields.cursorID ) { cursor->err = MONGO_CURSOR_EXHAUSTED; return MONGO_ERROR; } else { char *data; int sl = strlen( cursor->ns )+1; int limit = 0; mongo_message *mm; if( cursor->limit > 0 ) limit = cursor->limit - cursor->seen; mm = mongo_message_create( 16 /*header*/ +4 /*ZERO*/ +sl +4 /*numToReturn*/ +8 /*cursorID*/ , 0, 0, MONGO_OP_GET_MORE ); data = &mm->data; data = mongo_data_append32( data, &ZERO ); data = mongo_data_append( data, cursor->ns, sl ); data = mongo_data_append32( data, &limit ); data = mongo_data_append64( data, &cursor->reply->fields.cursorID ); bson_free( cursor->reply ); res = mongo_message_send( cursor->conn, mm ); if( res != MONGO_OK ) { mongo_cursor_destroy( cursor ); return MONGO_ERROR; } res = mongo_read_response( cursor->conn, &( cursor->reply ) ); if( res != MONGO_OK ) { mongo_cursor_destroy( cursor ); return MONGO_ERROR; } cursor->current.data = NULL; cursor->seen += cursor->reply->fields.num; return MONGO_OK; } }
mongo_cursor* mongo_find(mongo_connection* conn, const char* ns, bson* query, bson* fields, int nToReturn, int nToSkip, int options){ int sl; mongo_cursor * cursor; char * data; mongo_message * mm = mongo_message_create(conn->p, 16 + /* header */ 4 + /* options */ strlen( ns ) + 1 + /* ns */ 4 + 4 + /* skip,return */ bson_size( query ) + bson_size( fields ) , 0 , 0 , mongo_op_query ); data = &mm->data; data = mongo_data_append32( data , &options ); data = mongo_data_append( data , ns , strlen( ns ) + 1 ); data = mongo_data_append32( data , &nToSkip ); data = mongo_data_append32( data , &nToReturn ); data = mongo_data_append( data , query->data , bson_size( query ) ); if ( fields ) data = mongo_data_append( data , fields->data , bson_size( fields ) ); bson_fatal_msg( (data == ((char*)mm) + mm->head.len), "query building fail!" ); mongo_message_send( conn , mm ); cursor = (mongo_cursor*)apr_palloc(conn->p, sizeof(mongo_cursor)); MONGO_TRY{ cursor->mm = mongo_read_response(conn); }MONGO_CATCH{ //free(cursor); MONGO_RETHROW(); } sl = strlen(ns)+1; cursor->ns = apr_palloc(conn->p, sl); if (!cursor->ns){ /* //free(cursor->mm); //free(cursor); */ return 0; } memcpy((void*)cursor->ns, ns, sl); /* cast needed to silence GCC warning */ cursor->conn = conn; cursor->current.data = NULL; return cursor; }
static int mongo_cursor_op_query( mongo_cursor *cursor ) { int res; bson empty; char *data; mongo_message *mm; /* Set up default values for query and fields, if necessary. */ if( ! cursor->query ) cursor->query = bson_empty( &empty ); else if( mongo_cursor_bson_valid( cursor, cursor->query ) != MONGO_OK ) return MONGO_ERROR; if( ! cursor->fields ) cursor->fields = bson_empty( &empty ); else if( mongo_cursor_bson_valid( cursor, cursor->fields ) != MONGO_OK ) return MONGO_ERROR; mm = mongo_message_create( 16 + /* header */ 4 + /* options */ strlen( cursor->ns ) + 1 + /* ns */ 4 + 4 + /* skip,return */ bson_size( cursor->query ) + bson_size( cursor->fields ) , 0 , 0 , MONGO_OP_QUERY ); data = &mm->data; data = mongo_data_append32( data , &cursor->options ); data = mongo_data_append( data , cursor->ns , strlen( cursor->ns ) + 1 ); data = mongo_data_append32( data , &cursor->skip ); data = mongo_data_append32( data , &cursor->limit ); data = mongo_data_append( data , cursor->query->data , bson_size( cursor->query ) ); if ( cursor->fields ) data = mongo_data_append( data , cursor->fields->data , bson_size( cursor->fields ) ); bson_fatal_msg( ( data == ( ( char * )mm ) + mm->head.len ), "query building fail!" ); res = mongo_message_send( cursor->conn , mm ); if( res != MONGO_OK ) { return MONGO_ERROR; } res = mongo_read_response( cursor->conn, ( mongo_reply ** )&( cursor->reply ) ); if( res != MONGO_OK ) { return MONGO_ERROR; } cursor->seen += cursor->reply->fields.num; cursor->flags |= MONGO_CURSOR_QUERY_SENT; return MONGO_OK; }
void mongo_insert( mongo_connection * conn , const char * ns , bson * bson ){ char * data; mongo_message * mm = mongo_message_create( 16 /* header */ + 4 /* ZERO */ + strlen(ns) + 1 + bson_size(bson) , 0, 0, mongo_op_insert); data = &mm->data; data = mongo_data_append32(data, &zero); data = mongo_data_append(data, ns, strlen(ns) + 1); data = mongo_data_append(data, bson->data, bson_size(bson)); mongo_message_send(conn, mm); }
int mongo_remove(mongo_connection* conn, const char* ns, const bson* cond){ char * data; mongo_message * mm = mongo_message_create( 16 /* header */ + 4 /* ZERO */ + strlen(ns) + 1 + 4 /* ZERO */ + bson_size(cond) , 0 , 0 , MONGO_OP_DELETE ); data = &mm->data; data = mongo_data_append32(data, &ZERO); data = mongo_data_append(data, ns, strlen(ns) + 1); data = mongo_data_append32(data, &ZERO); data = mongo_data_append(data, cond->data, bson_size(cond)); return mongo_message_send(conn, mm); }
void mongo_remove(mongo_connection* conn, const char* ns, const bson* cond){ char * data; mongo_message * mm = mongo_message_create( 16 /* header */ + 4 /* ZERO */ + strlen(ns) + 1 + 4 /* ZERO */ + bson_size(cond) , 0 , 0 , mongo_op_delete ); data = &mm->data; data = mongo_data_append32(data, &zero); data = mongo_data_append(data, ns, strlen(ns) + 1); data = mongo_data_append32(data, &zero); data = mongo_data_append(data, cond->data, bson_size(cond)); mongo_message_send(conn, mm); }
void mongo_update(mongo_connection* conn, const char* ns, const bson* cond, const bson* op, int flags){ char * data; mongo_message * mm = mongo_message_create( 16 /* header */ + 4 /* ZERO */ + strlen(ns) + 1 + 4 /* flags */ + bson_size(cond) + bson_size(op) , 0 , 0 , mongo_op_update ); data = &mm->data; data = mongo_data_append32(data, &zero); data = mongo_data_append(data, ns, strlen(ns) + 1); data = mongo_data_append32(data, &flags); data = mongo_data_append(data, cond->data, bson_size(cond)); data = mongo_data_append(data, op->data, bson_size(op)); mongo_message_send(conn, mm); }
void mongo_insert_batch( mongo_connection * conn , const char * ns , bson ** bsons, int count){ int size = 16 + 4 + strlen( ns ) + 1; int i; mongo_message * mm; char* data; for(i=0; i<count; i++){ size += bson_size(bsons[i]); } mm = mongo_message_create( size , 0 , 0 , mongo_op_insert ); data = &mm->data; data = mongo_data_append32(data, &zero); data = mongo_data_append(data, ns, strlen(ns) + 1); for(i=0; i<count; i++){ data = mongo_data_append(data, bsons[i]->data, bson_size( bsons[i] ) ); } mongo_message_send(conn, mm); }
MONGO_EXPORT int mongo_insert( mongo *conn , const char *ns , const bson *bson ) { char *data; mongo_message *mm; /* Make sure that BSON is valid for insert. */ if( mongo_bson_valid( conn, bson, 1 ) != MONGO_OK ) { return MONGO_ERROR; } mm = mongo_message_create( 16 /* header */ + 4 /* ZERO */ + strlen( ns ) + 1 + bson_size( bson ) , 0, 0, MONGO_OP_INSERT ); data = &mm->data; data = mongo_data_append32( data, &ZERO ); data = mongo_data_append( data, ns, strlen( ns ) + 1 ); data = mongo_data_append( data, bson->data, bson_size( bson ) ); return mongo_message_send( conn, mm ); }
static int mongo_cursor_op_query( mongo_cursor *cursor ) { int res; bson empty; char *data; mongo_message *mm; bson temp; bson_iterator it; /* Clear any errors. */ bson_free( cursor->conn->lasterrstr ); cursor->conn->lasterrstr = NULL; cursor->conn->lasterrcode = 0; cursor->conn->err = 0; cursor->err = 0; /* Set up default values for query and fields, if necessary. */ if( ! cursor->query ) cursor->query = bson_empty( &empty ); else if( mongo_cursor_bson_valid( cursor, cursor->query ) != MONGO_OK ) return MONGO_ERROR; if( ! cursor->fields ) cursor->fields = bson_empty( &empty ); else if( mongo_cursor_bson_valid( cursor, cursor->fields ) != MONGO_OK ) return MONGO_ERROR; mm = mongo_message_create( 16 + /* header */ 4 + /* options */ strlen( cursor->ns ) + 1 + /* ns */ 4 + 4 + /* skip,return */ bson_size( cursor->query ) + bson_size( cursor->fields ) , 0 , 0 , MONGO_OP_QUERY ); data = &mm->data; data = mongo_data_append32( data , &cursor->options ); data = mongo_data_append( data , cursor->ns , strlen( cursor->ns ) + 1 ); data = mongo_data_append32( data , &cursor->skip ); data = mongo_data_append32( data , &cursor->limit ); data = mongo_data_append( data , cursor->query->data , bson_size( cursor->query ) ); if ( cursor->fields ) data = mongo_data_append( data , cursor->fields->data , bson_size( cursor->fields ) ); bson_fatal_msg( ( data == ( ( char * )mm ) + mm->head.len ), "query building fail!" ); res = mongo_message_send( cursor->conn , mm ); if( res != MONGO_OK ) { return MONGO_ERROR; } res = mongo_read_response( cursor->conn, ( mongo_reply ** )&( cursor->reply ) ); if( res != MONGO_OK ) { return MONGO_ERROR; } if( cursor->reply->fields.num == 1 ) { bson_init_data( &temp, &cursor->reply->objs ); if( bson_find( &it, &temp, "$err" ) ) { cursor->conn->lasterrstr = (char *)bson_malloc( bson_iterator_string_len( &it ) ); strcpy( cursor->conn->lasterrstr, bson_iterator_string( &it ) ); bson_find( &it, &temp, "code" ); cursor->conn->lasterrcode = bson_iterator_int( &it ); cursor->err = MONGO_CURSOR_QUERY_FAIL; return MONGO_ERROR; } } cursor->seen += cursor->reply->fields.num; cursor->flags |= MONGO_CURSOR_QUERY_SENT; return MONGO_OK; }