# by parsing the JSON found in `data`.
# Only a single JSON object may exist in data or an error will be set and
# `NULL` returned.
- new from_json_string(data: NativeString) import set_mongoc_error `{
+ new from_json_string(data: CString) import set_mongoc_error `{
bson_error_t error;
bson_t *bson;
- bson = bson_new_from_json(data, -1, &error);
+ bson = bson_new_from_json((uint8_t *)data, -1, &error);
if(!bson) {
NativeBSON_set_mongoc_error(bson, &error);
return NULL;
# The `bson_as_json()` function shall encode bson as a JSON encoded UTF-8 string.
# The caller is responsible for freeing the resulting UTF-8 encoded string
# by calling `bson_free()` with the result.
- fun to_native_string: NativeString `{ return bson_as_json(self, NULL); `}
+ fun to_c_string: CString `{ return bson_as_json(self, NULL); `}
# Wrapper for `bson_destroy()`.
#
# Wrapper for `error.message`.
#
# The `error.message` field contains a human printable error message.
- fun message: NativeString `{ return self->message; `}
+ fun message: CString `{ return self->message; `}
end
# Wrapper for `bson_oid_t`.
# * a 2-byte process id (Big Endian), and
# * a 3-byte counter (Big Endian), starting with a random value.
extern class BSONObjectId `{ bson_oid_t * `}
+
+ # Generates a new `bson_oid_t`.
+ new `{
+ bson_oid_t *self = malloc(sizeof(bson_oid_t));
+ bson_oid_init(self, NULL);
+ return self;
+ `}
+
# Object id.
- fun id: String import NativeString.to_s_with_copy `{
+ fun id: String import CString.to_s `{
char str[25];
bson_oid_to_string(self, str);
- return NativeString_to_s_with_copy(str);
+ return CString_to_s(str);
`}
+
+ # Destroy `self`.
+ fun destroy `{ free(self); `}
end
redef class Sys
# Wrapper for `char**`.
#
-# Used to handle array of NativeString returned by MongoDB.
+# Used to handle array of CString returned by MongoDB.
redef class NativeCStringArray
# Frees `self`.
#
# Wrapper for `mongoc_client_new()`.
#
# Creates a new `mongoc_client_t` using the `uri` string provided.
- new(uri: NativeString) `{
+ new(uri: CString) `{
mongoc_init();
return mongoc_client_new(uri);
`}
import set_mongoc_error, NativeCStringArray, NativeCStringArray.as nullable `{
bson_error_t error;
char **strv;
- if(strv = mongoc_client_get_database_names(self, &error)) {
+ if((strv = mongoc_client_get_database_names(self, &error))) {
return NativeCStringArray_as_nullable(strv);
}
NativeMongoClient_set_mongoc_error(self, &error);
# Database are automatically created on the MongoDB server upon insertion of
# the first document into a collection.
# There is no need to create a database manually.
- new(client: NativeMongoClient, db_name: NativeString) `{
+ new(client: NativeMongoClient, db_name: CString) `{
return mongoc_client_get_database(client, db_name);
`}
import set_mongoc_error, NativeCStringArray, NativeCStringArray.as nullable `{
bson_error_t error;
char **strv;
- if(strv = mongoc_database_get_collection_names(self, &error)) {
+ if((strv = mongoc_database_get_collection_names(self, &error))) {
return NativeCStringArray_as_nullable(strv);
}
NativeMongoDb_set_mongoc_error(self, &error);
#
# Allocates a new `mongoc_collection_t` structure for the collection named
# `name` in database.
- fun collection(name: NativeString): NativeMongoCollection `{
+ fun collection(name: CString): NativeMongoCollection `{
return mongoc_database_get_collection(self, name);
`}
#
# This function checks to see if a collection exists on the MongoDB server
# within database.
- fun has_collection(name: NativeString): Bool import set_mongoc_error `{
+ fun has_collection(name: CString): Bool import set_mongoc_error `{
bson_error_t error;
if(!mongoc_database_has_collection(self, name, &error)) {
NativeMongoDb_set_mongoc_error(self, &error);
# Collections are automatically created on the MongoDB server upon insertion
# of the first document.
# There is no need to create a collection manually.
- new(client: NativeMongoClient, db, collection: NativeString) `{
+ new(client: NativeMongoClient, db, collection: CString) `{
return mongoc_client_get_collection(client, db, collection);
`}
#
# If you would like to specify options such as a sort order,
# the query must be placed inside of `{"$query": {}}`.
- fun find(query: NativeBSON): nullable NativeMongoCursor import
+ fun find(query: NativeBSON, skip, limit: Int): nullable NativeMongoCursor import
NativeMongoCursor.as nullable, set_mongoc_error `{
bson_error_t error;
mongoc_cursor_t *cursor;
- cursor = mongoc_collection_find(self, MONGOC_QUERY_NONE, 0, 0, 0, query, NULL, NULL);
-
+ cursor = mongoc_collection_find(self, MONGOC_QUERY_NONE, skip, limit, 0, query, NULL, NULL);
if (mongoc_cursor_error(cursor, &error)) {
NativeMongoCollection_set_mongoc_error(self, &error);
return null_NativeMongoCursor();
}
+ return NativeMongoCursor_as_nullable(cursor);
+ `}
+ # Wrapper for `mongoc_collection_aggregate()`.
+ #
+ # This function shall execute an aggregation `pipeline` on the underlying collection.
+ #
+ # The `pipeline` parameter should contain a field named `pipeline` containing
+ # a BSON array of pipeline stages.
+ fun aggregate(pipeline: NativeBSON): nullable NativeMongoCursor import
+ NativeMongoCursor.as nullable, set_mongoc_error `{
+ bson_error_t error;
+ mongoc_cursor_t *cursor;
+ cursor = mongoc_collection_aggregate(self, MONGOC_QUERY_NONE, pipeline, NULL, NULL);
+ if (mongoc_cursor_error(cursor, &error)) {
+ NativeMongoCollection_set_mongoc_error(self, &error);
+ return null_NativeMongoCursor();
+ }
return NativeMongoCursor_as_nullable(cursor);
`}
# The name of the collection will also be updated internally so it is safe
# to continue using this collection after the rename.
# Additional operations will occur on renamed collection.
- fun rename(new_database, new_name: NativeString): Bool `{
+ fun rename(new_database, new_name: CString): Bool `{
bson_error_t error;
if(!mongoc_collection_rename(self, new_database, new_name, false, &error)){
NativeMongoCollection_set_mongoc_error(self, &error);
# Wrapper for `mongoc_cursor_current()`.
#
# Fetches the cursors current document or NULL if there has been an error.
- fun current: NativeBSON `{ return (bson_t*) mongoc_cursor_current(self); `}
+ fun current: NativeBSON `{
+ // As said in documentation, BSON objects should not be freed manually.
+ bson_t* bson = (bson_t*) mongoc_cursor_current(self);
+ // Copy BSON so we can let the GC free it automatically.
+ return bson_copy(bson);
+ `}
# Wrapper for `mongoc_cursor_next()`.
#
return mongoc_cursor_next(self, &doc);
`}
- # Wrapper for `mongoc_cursor_more()`.
- #
- # This function shall indicate if there is more data to be read from the cursor.
- fun more: Bool `{ return mongoc_cursor_more(self); `}
-
# Wrapper for `mongoc_cursor_destroy()`.
#
# This instance should not be used beyond this point!