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/libmongo-private.h |
Initial import of libmongo-client version 0.1.8-2
Diffstat (limited to 'src/libmongo-private.h')
-rw-r--r-- | src/libmongo-private.h | 276 |
1 files changed, 276 insertions, 0 deletions
diff --git a/src/libmongo-private.h b/src/libmongo-private.h new file mode 100644 index 0000000..e13f0da --- /dev/null +++ b/src/libmongo-private.h @@ -0,0 +1,276 @@ +/* libmongo-private.h - private headers for libmongo-client + * 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 libmongo-private.h + * + * Private types and functions, for internal use in libmongo-client only. + */ + +#ifndef LIBMONGO_PRIVATE_H +#define LIBMONGO_PRIVATE_H 1 + +#include "mongo.h" +#include "compat.h" + +/** @internal BSON structure. + */ +struct _bson +{ + GByteArray *data; /**< The actual data of the BSON object. */ + gboolean finished; /**< Flag to indicate whether the object is open + or finished. */ +}; + +/** @internal Mongo Connection state object. */ +struct _mongo_connection +{ + gint fd; /**< The file descriptor associated with the connection. */ + gint32 request_id; /**< The last sent command's requestID. */ +}; + +/** @internal Mongo Replica Set object. */ +typedef struct _replica_set +{ + GList *seeds; /**< Replica set seeds, as a list of strings. */ + GList *hosts; /**< Replica set members, as a list of strings. */ + gchar *primary; /**< The replica master, if any. */ +} replica_set; /**< Replica Set properties. */ + +/** @internal MongoDb Authentication Credentials object. + * These values are mlock()'ed. + */ +typedef struct _auth_credentials +{ + gchar *db; /**< The database to authenticate against. */ + gchar *user; /**< The username to authenticate with. */ + gchar *pw; /**< The password to authenticate with. */ +} auth_credentials; + +/** @internal Connection Recovery Cache for MongoDb. */ +struct _mongo_sync_conn_recovery_cache +{ + replica_set rs; /**< The replica set. */ + auth_credentials auth; /**< The authentication credentials.*/ +}; + +/** @internal Synchronous connection object. */ +struct _mongo_sync_connection +{ + mongo_connection super; /**< The parent object. */ + gboolean slaveok; /**< Whether queries against slave nodes are + acceptable. */ + gboolean safe_mode; /**< Safe-mode signal flag. */ + gboolean auto_reconnect; /**< Auto-reconnect flag. */ + + gchar *last_error; /**< The last error from the server, caught + during queries. */ + gint32 max_insert_size; /**< Maximum number of bytes an insert + command can be before being split to + smaller chunks. Used for bulk inserts. */ + + replica_set rs; /**< Replica set. */ + auth_credentials auth; /**< Authentication credentials. */ + + mongo_sync_conn_recovery_cache *recovery_cache; /**< Reference to the externally managed recovery cache. */ +}; + +/** @internal MongoDB cursor object. + * + * The cursor object can be used to conveniently iterate over a query + * result set. + */ +struct _mongo_sync_cursor +{ + mongo_sync_connection *conn; /**< The connection associated with + the cursor. Owned by the caller. */ + gchar *ns; /**< The namespace of the cursor. */ + mongo_packet *results; /**< The current result set, as a mongo + packet. */ + + gint32 offset; /**< Offset of the cursor within the active result + set. */ + mongo_reply_packet_header ph; /**< The reply headers extracted from + the active result set. */ +}; + +/** @internal Synchronous pool connection object. */ +struct _mongo_sync_pool_connection +{ + mongo_sync_connection super; /**< The parent object. */ + + gint pool_id; /**< ID of the connection. */ + gboolean in_use; /**< Whether the object is in use or not. */ +}; + +/** @internal GridFS object */ +struct _mongo_sync_gridfs +{ + mongo_sync_connection *conn; /**< Connection the object is + associated to. */ + + struct + { + gchar *prefix; /**< The namespace prefix. */ + gchar *files; /**< The file metadata namespace. */ + gchar *chunks; /**< The chunk namespace. */ + + gchar *db; /**< The database part of the namespace. */ + } ns; /**< Namespaces */ + + gint32 chunk_size; /**< The default chunk size. */ +}; + +/** @internal GridFS file types. */ +typedef enum +{ + LMC_GRIDFS_FILE_CHUNKED, /**< Chunked file. */ + LMC_GRIDFS_FILE_STREAM_READER, /**< Streamed file, reader. */ + LMC_GRIDFS_FILE_STREAM_WRITER, /**< Streamed file, writer. */ +} _mongo_gridfs_type; + +/** @internal GridFS common file properties. + * + * This is shared between chunked and streamed files. + */ +typedef struct +{ + gint32 chunk_size; /**< Maximum chunk size for this file. */ + gint64 length; /**< Total length of the file. */ + + union + { + /** Chunked file data. */ + struct + { + const guint8 *oid; /**< The file's ObjectID. */ + const gchar *md5; /**< MD5 sum of the file. */ + gint64 date; /**< The upload date. */ + bson *metadata; /**< Full file metadata, including user-set + keys. */ + }; + + /** Streamed file data */ + struct + { + gint64 offset; /**< Offset we're into the file. */ + gint64 current_chunk; /**< The current chunk we're on. */ + guint8 *id; /**< A copy of the file's ObjectID. */ + }; + }; + + _mongo_gridfs_type type; /**< The type of the GridFS file. */ +} mongo_sync_gridfs_file_common; + +/** @internal GridFS file object. */ +struct _mongo_sync_gridfs_chunked_file +{ + mongo_sync_gridfs_file_common meta; /**< The file metadata. */ + mongo_sync_gridfs *gfs; /**< The GridFS the file is on. */ +}; + +/** @internal GridFS file stream object. */ +struct _mongo_sync_gridfs_stream +{ + mongo_sync_gridfs_file_common file; /**< Common file data. */ + mongo_sync_gridfs *gfs; /**< The GridFS the file is on. */ + + /** Reader & Writer structure union. + */ + union + { + /** Reader-specific data. + */ + struct + { + bson *bson; /**< The current chunk as BSON. */ + + /** Chunk state information. + */ + struct + { + const guint8 *data; /**< The current chunk data, pointing + into ->reader.bson. */ + gint32 start_offset; /**< Offset to start reading data from, + needed to support the binary subtype. */ + gint32 size; /**< Size of the current chunk. */ + gint32 offset; /**< Offset we're into the chunk. */ + } chunk; + } reader; + + /** Writer-specific data. + */ + struct + { + bson *metadata; /**< Copy of the user-supplied metadata. */ + guint8 *buffer; /**< The current output buffer. */ + gint32 buffer_offset; /**< Offset into the output buffer. */ + + GChecksum *checksum; /**< The running checksum of the output + file. */ + } writer; + }; +}; + +/** @internal Construct a kill cursors command, using a va_list. + * + * @param id is the sequence id. + * @param n is the number of cursors to delete. + * @param ap is the va_list of cursors to kill. + * + * @note One must supply exaclty @a n number of cursor IDs. + * + * @returns A newly allocated packet, or NULL on error. It is the + * responsibility of the caller to free the packet once it is not used + * anymore. + */ +mongo_packet *mongo_wire_cmd_kill_cursors_va (gint32 id, gint32 n, + va_list ap); + +/** @internal Get the header data of a packet, without conversion. + * + * Retrieve the mongo packet's header data, but do not convert the + * values from little-endian. Use only when the source has the data in + * the right byte order already. + * + * @param p is the packet which header we seek. + * @param header is a pointer to a variable which will hold the data. + * + * @note Allocating the @a header is the responsibility of the caller. + * + * @returns TRUE on success, FALSE otherwise. + */ +gboolean +mongo_wire_packet_get_header_raw (const mongo_packet *p, + mongo_packet_header *header); + +/** @internal Set the header data of a packet, without conversion. + * + * Override the mongo packet's header data, but do not convert the + * values from little-endian. Use only when the source has the data in + * the right byte order already. + * + * @note No sanity checks are done, use this function with great care. + * + * @param p is the packet whose header we want to override. + * @param header is the header structure to use. + * + * @returns TRUE on success, FALSE otherwise. + */ +gboolean +mongo_wire_packet_set_header_raw (mongo_packet *p, + const mongo_packet_header *header); + +#endif |