NEOERR* mmg_count(mmg_conn *db, char *dbname, char *collname, int *ret, char *querys) { bson *doc; MCS_NOT_NULLC(db, dbname, collname); MCS_NOT_NULLB(querys, ret); mtc_noise("count %s.%s %s", dbname, collname, querys); doc = mbson_new_from_string(querys, true); if (!doc) return nerr_raise(NERR_ASSERT, "build doc: %s: %s", querys, strerror(errno)); *ret = (int)mongo_sync_cmd_count(db->con, dbname, collname, doc); bson_free(doc); return STATUS_OK; }
void mongo_dump (config_t *config) { mongo_sync_connection *conn; mongo_sync_cursor *cursor; bson *b; int fd; glong cnt, pos = 0; gchar *error = NULL; int e; if (config->port == MONGO_CONN_LOCAL) { VLOG ("Connecting to %s/%s.%s...\n", config->addr, config->db, config->coll); } else { VLOG ("Connecting to %s:%d/%s.%s...\n", config->addr, config->port, config->db, config->coll); } conn = mongo_sync_connect (config->addr, config->port, config->slaveok); if (!conn) { e = errno; mongo_sync_cmd_get_last_error (conn, config->db, &error); fprintf (stderr, "Error connecting to %s:%d: %s\n", config->addr, config->port, (error) ? error : strerror (e)); g_free (error); exit (1); } if (config->master_sync) { VLOG ("Syncing to master...\n"); conn = mongo_sync_reconnect (conn, TRUE); if (!conn) { e = errno; mongo_sync_cmd_get_last_error (conn, config->db, &error); fprintf (stderr, "Error reconnecting to the master of %s:%d: %s\n", config->addr, config->port, (error) ? error : strerror (e)); exit (1); } } VLOG ("Counting documents...\n"); cnt = mongo_sync_cmd_count (conn, config->db, config->coll, NULL); if (cnt < 0) { e = errno; mongo_sync_cmd_get_last_error (conn, config->db, &error); fprintf (stderr, "Error counting documents in %s.%s: %s\n", config->db, config->coll, (error) ? error : strerror (e)); mongo_sync_disconnect (conn); exit (1); } VLOG ("Opening output file '%s'...\n", config->output); if (strcmp (config->output, "-") == 0) fd = 1; else { fd = open (config->output, O_RDWR | O_CREAT | O_TRUNC, 0600); if (fd == -1) { fprintf (stderr, "Error opening output file '%s': %s\n", config->output, strerror (errno)); mongo_sync_disconnect (conn); exit (1); } } VLOG ("Launching initial query...\n"); b = bson_new (); bson_finish (b); cursor = mongo_sync_cursor_new (conn, config->ns, mongo_sync_cmd_query (conn, config->ns, MONGO_WIRE_FLAG_QUERY_NO_CURSOR_TIMEOUT, 0, 10, b, NULL)); bson_free (b); while ((pos < cnt) && mongo_sync_cursor_next (cursor)) { bson *b = mongo_sync_cursor_get_data (cursor); pos++; if (!b) { e = errno; mongo_sync_cmd_get_last_error (conn, config->db, &error); fprintf (stderr, "Error advancing the cursor: %s\n", (error) ? error : strerror (e)); mongo_sync_disconnect (conn); exit (1); } if (pos % 10 == 0) VLOG ("\rDumping... %03.2f%%", (pos * 1.0) / (cnt * 1.0) * 100); if (write (fd, bson_data (b), bson_size (b)) != bson_size (b)) { perror ("write()"); exit (1); } bson_free (b); } VLOG ("\rDumping... %03.2f%%\n", (double)((pos / cnt) * 100)); mongo_sync_cursor_free (cursor); close (fd); mongo_sync_disconnect (conn); }
int mongo_dump (config_t *config) { mongo_sync_connection *conn; bson *b; int fd; mongo_packet *p; mongo_reply_packet_header rh; gint64 cid; gdouble cnt, pos = 0; gchar *error; int e; VLOG ("Connecting to %s:%d/%s.%s...\n", config->host, config->port, config->db, config->coll); conn = mongo_sync_connect (config->host, config->port, config->slaveok); if (!conn) { e = errno; mongo_sync_cmd_get_last_error (conn, config->db, &error); fprintf (stderr, "Error connecting to %s:%d: %s\n", config->host, config->port, (error) ? error : strerror (e)); g_free (error); exit (1); } if (config->master_sync) { VLOG ("Syncing to master...\n"); conn = mongo_sync_reconnect (conn, TRUE); if (!conn) { e = errno; mongo_sync_cmd_get_last_error (conn, config->db, &error); fprintf (stderr, "Error reconnecting to the master of %s:%d: %s\n", config->host, config->port, (error) ? error : strerror (e)); exit (1); } } VLOG ("Counting documents...\n"); cnt = mongo_sync_cmd_count (conn, config->db, config->coll, NULL); if (cnt < 0) { e = errno; mongo_sync_cmd_get_last_error (conn, config->db, &error); fprintf (stderr, "Error counting documents in %s.%s: %s\n", config->db, config->coll, (error) ? error : strerror (e)); mongo_sync_disconnect (conn); exit (1); } VLOG ("Opening output file '%s'...\n", config->output); if (strcmp (config->output, "-") == 0) fd = 1; else { fd = open (config->output, O_RDWR | O_CREAT | O_TRUNC, 0600); if (fd == -1) { fprintf (stderr, "Error opening output file '%s': %s\n", config->output, strerror (errno)); mongo_sync_disconnect (conn); exit (1); } } VLOG ("Launching initial query...\n"); b = bson_new (); bson_finish (b); p = mongo_sync_cmd_query (conn, config->ns, MONGO_WIRE_FLAG_QUERY_NO_CURSOR_TIMEOUT, 0, 10, b, NULL); if (!p) { e = errno; bson_free (b); unlink (config->output); close (fd); mongo_sync_cmd_get_last_error (conn, config->db, &error); fprintf (stderr, "Error retrieving the cursor: %s\n", (error) ? error : strerror (e)); mongo_sync_disconnect (conn); exit (1); } bson_free (b); mongo_wire_reply_packet_get_header (p, &rh); cid = rh.cursor_id; pos = mongo_dump_packet (config, p, pos, fd); mongo_wire_packet_free (p); while (pos < cnt) { gdouble pr = (pos + 10) / cnt; VLOG ("\rDumping... %03.2f%%", ((pr > 1) ? 1 : pr) * 100); if (config->verbose) fflush (stderr); p = mongo_sync_cmd_get_more (conn, config->ns, 10, cid); if (!p) { e = errno; unlink (config->output); close (fd); mongo_sync_cmd_get_last_error (conn, config->db, &error); fprintf (stderr, "Error advancing the cursor: %s\n", (error) ? error : strerror (e)); mongo_sync_disconnect (conn); exit (1); } pos = mongo_dump_packet (config, p, pos, fd); mongo_wire_packet_free (p); } close (fd); mongo_sync_disconnect (conn); return 0; }