static struct dlr_entry* dlr_mongodb_get(const Octstr *smsc, const Octstr *ts, const Octstr *dst) { DBPoolConn *pconn; bson cond, obj; bson_buffer cond_buf; bson_iterator it; struct dlr_entry *res = NULL; bson_bool_t found = 0; mongo_connection *conn = NULL; pconn = dbpool_conn_consume(pool); if (pconn == NULL) { return NULL; } conn = (mongo_connection*)pconn->conn; bson_buffer_init(&cond_buf); bson_append_string(&cond_buf, octstr_get_cstr(fields->field_smsc), octstr_get_cstr(smsc)); bson_append_string(&cond_buf, octstr_get_cstr(fields->field_ts), octstr_get_cstr(ts)); if (dst) { bson_append_string(&cond_buf, octstr_get_cstr(fields->field_dst), octstr_get_cstr(dst)); } bson_from_buffer(&cond, &cond_buf); memset(&obj, 0, sizeof(bson)); MONGO_TRY { found = mongo_find_one(conn, mongodb_namespace, &cond, NULL, &obj); } MONGO_CATCH { mongodb_error("dlr_mongodb_get", conn->exception.type); found = 0; } if (found) { res = dlr_entry_create(); gw_assert(res != NULL); bson_find(&it, &obj, octstr_get_cstr(fields->field_mask)); res->mask = bson_iterator_int(&it); bson_find(&it, &obj, octstr_get_cstr(fields->field_serv)); res->service = octstr_create(bson_iterator_string(&it)); bson_find(&it, &obj, octstr_get_cstr(fields->field_url)); res->url = octstr_create(bson_iterator_string(&it)); bson_find(&it, &obj, octstr_get_cstr(fields->field_src)); res->source = octstr_create(bson_iterator_string(&it)); bson_find(&it, &obj, octstr_get_cstr(fields->field_dst)); res->destination = octstr_create(bson_iterator_string(&it)); bson_find(&it, &obj, octstr_get_cstr(fields->field_boxc)); res->boxc_id = octstr_create(bson_iterator_string(&it)); bson_find(&it, &obj, octstr_get_cstr(fields->field_smsc)); res->smsc = octstr_create(bson_iterator_string(&it)); bson_find(&it, &obj, octstr_get_cstr(fields->field_account)); res->account = octstr_create(bson_iterator_string(&it)); bson_find(&it, &obj, octstr_get_cstr(fields->field_binfo)); res->binfo = octstr_create(bson_iterator_string(&it)); } dbpool_conn_produce(pconn); bson_destroy(&cond); bson_destroy(&obj); return res; }
int gridfs_init(mongo_connection * client, const char * dbname, const char * prefix, gridfs* gfs) { int options; bson_buffer bb; bson b; bson out; bson_bool_t success; gfs->client = client; /* Allocate space to own the dbname */ gfs->dbname = (const char *)malloc(strlen(dbname)+1); if (gfs->dbname == NULL) { return FALSE; } strcpy((char*)gfs->dbname, dbname); /* Allocate space to own the prefix */ if (prefix == NULL) prefix = "fs"; gfs->prefix = (const char *)malloc(strlen(prefix)+1); if (gfs->prefix == NULL) { free((char*)gfs->dbname); return FALSE; } strcpy((char *)gfs->prefix, prefix); /* Allocate space to own files_ns */ gfs->files_ns = (const char *) malloc (strlen(prefix)+strlen(dbname)+strlen(".files")+2); if (gfs->files_ns == NULL) { free((char*)gfs->dbname); free((char*)gfs->prefix); return FALSE; } strcpy((char*)gfs->files_ns, dbname); strcat((char*)gfs->files_ns, "."); strcat((char*)gfs->files_ns, prefix); strcat((char*)gfs->files_ns, ".files"); /* Allocate space to own chunks_ns */ gfs->chunks_ns = (const char *) malloc(strlen(prefix) + strlen(dbname) + strlen(".chunks") + 2); if (gfs->chunks_ns == NULL) { free((char*)gfs->dbname); free((char*)gfs->prefix); free((char*)gfs->files_ns); return FALSE; } strcpy((char*)gfs->chunks_ns, dbname); strcat((char*)gfs->chunks_ns, "."); strcat((char*)gfs->chunks_ns, prefix); strcat((char*)gfs->chunks_ns, ".chunks"); bson_buffer_init(&bb); bson_append_int(&bb, "filename", 1); bson_from_buffer(&b, &bb); options = 0; success = mongo_create_index(gfs->client, gfs->files_ns, &b, options, &out); bson_destroy(&b); if (!success) { free((char*)gfs->dbname); free((char*)gfs->prefix); free((char*)gfs->files_ns); free((char*)gfs->chunks_ns); return FALSE; } bson_buffer_init(&bb); bson_append_int(&bb, "files_id", 1); bson_append_int(&bb, "n", 1); bson_from_buffer(&b, &bb); options = MONGO_INDEX_UNIQUE; success = mongo_create_index(gfs->client, gfs->chunks_ns, &b, options, &out); bson_destroy(&b); if (!success) { free((char*)gfs->dbname); free((char*)gfs->prefix); free((char*)gfs->files_ns); free((char*)gfs->chunks_ns); return FALSE; } return TRUE; }
static void make_query(bson* b){ bson_buffer bb; bson_buffer_init(&bb); bson_append_int(&bb, "x", PER_TRIAL/2); bson_from_buffer(b, &bb); }