diff options
author | Jörg Frings-Fürst <debian@jff-webhosting.net> | 2014-12-02 10:06:21 +0100 |
---|---|---|
committer | Jörg Frings-Fürst <debian@jff-webhosting.net> | 2014-12-02 10:06:21 +0100 |
commit | fd841e416881cc0392e61ec312c1870f3a0004bd (patch) | |
tree | 8357ba56e79d614ba57f722e7878b853591dc339 /src/mongo-sync-cursor.c |
Initial import of libmongo-client version 0.1.8-2
Diffstat (limited to 'src/mongo-sync-cursor.c')
-rw-r--r-- | src/mongo-sync-cursor.c | 118 |
1 files changed, 118 insertions, 0 deletions
diff --git a/src/mongo-sync-cursor.c b/src/mongo-sync-cursor.c new file mode 100644 index 0000000..b2492be --- /dev/null +++ b/src/mongo-sync-cursor.c @@ -0,0 +1,118 @@ +/* mongo-sync-cursor.c - libmongo-client cursor API on top of Sync + * Copyright 2011, 2012 Gergely Nagy <algernon@balabit.hu> + * + * 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. + */ + +/** @file src/mongo-sync-cursor.c + * MongoDB Cursor API implementation. + */ + +#include "config.h" +#include "mongo.h" +#include "libmongo-private.h" + +#include <errno.h> + +mongo_sync_cursor * +mongo_sync_cursor_new (mongo_sync_connection *conn, const gchar *ns, + mongo_packet *packet) +{ + mongo_sync_cursor *c; + + if (!conn) + { + errno = ENOTCONN; + return NULL; + } + if (!ns || !packet) + { + errno = EINVAL; + return NULL; + } + + c = g_new0 (mongo_sync_cursor, 1); + c->conn = conn; + c->ns = g_strdup (ns); + c->results = packet; + c->offset = -1; + + mongo_wire_reply_packet_get_header (c->results, &c->ph); + + return c; +} + +gboolean +mongo_sync_cursor_next (mongo_sync_cursor *cursor) +{ + if (!cursor) + { + errno = EINVAL; + return FALSE; + } + errno = 0; + + if (cursor->offset >= cursor->ph.returned - 1) + { + gint32 ret = cursor->ph.returned; + gint64 cid = cursor->ph.cursor_id; + + mongo_wire_packet_free (cursor->results); + cursor->offset = -1; + cursor->results = mongo_sync_cmd_get_more (cursor->conn, cursor->ns, + ret, cid); + if (!cursor->results) + return FALSE; + mongo_wire_reply_packet_get_header (cursor->results, &cursor->ph); + } + cursor->offset++; + return TRUE; +} + +void +mongo_sync_cursor_free (mongo_sync_cursor *cursor) +{ + if (!cursor) + { + errno = ENOTCONN; + return; + } + errno = 0; + + mongo_sync_cmd_kill_cursors (cursor->conn, 1, cursor->ph.cursor_id); + g_free (cursor->ns); + mongo_wire_packet_free (cursor->results); + g_free (cursor); +} + +bson * +mongo_sync_cursor_get_data (mongo_sync_cursor *cursor) +{ + bson *r; + + if (!cursor) + { + errno = EINVAL; + return NULL; + } + + if (!mongo_wire_reply_packet_get_nth_document (cursor->results, + cursor->offset + 1, + &r)) + { + errno = ERANGE; + return NULL; + } + bson_finish (r); + return r; +} |