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;
}
Exemple #2
0
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;
}
Exemple #3
0
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);
}