Ejemplo n.º 1
0
Datum
ldbm_fetch( LDBM ldbm, Datum key )
{
	Datum	d;
	kvpair	k;
	int	retry = 0;

	/* This hack is needed because MDBM does not take keys
	 * which begin with NULL when working in the chaining
	 * mode.
	 */

#ifdef NO_NULL_KEY
	k.key.dsize = key.dsize + 1;			
	k.key.dptr = malloc(k.key.dsize);
	*(k.key.dptr) = 'l';
	AC_MEMCPY( (void *)(k.key.dptr + 1), key.dptr, key.dsize );	
#else
	k.key = key;
#endif	

	k.val.dptr = NULL;
	k.val.dsize = 0;

	/* LDBM_RLOCK; */
	do {
		d = mdbm_fetch( ldbm, k );

		if ( d.dsize > 0 ) {
			if ( k.val.dptr != NULL ) {
				free( k.val.dptr );
			}

			if ( (k.val.dptr = malloc( d.dsize )) != NULL ) {
				k.val.dsize = d.dsize;
				d = mdbm_fetch( ldbm, k );

			} else { 
				d.dsize = 0;
				break;
			}
		}/* if ( d.dsize > 0 ) */
	} while ((d.dsize > k.val.dsize) && (++retry < MAX_MDBM_RETRY));
	/* LDBM_RUNLOCK; */

#ifdef NO_NULL_KEY
	free(k.key.dptr);
#endif

	return d;
}
Ejemplo n.º 2
0
static range* _expand_cluster(range_request* rr, const char* cluster, const char* section)
{
  set * ret_set;
  MDBM * db = _open_mdbm(rr);
  apr_pool_t* req_pool = range_request_pool(rr);
  // return a range * of the section
  // build the key:val
  strncpy(fetch_key, cluster, MAX_CLUSTER_STRING);
  strncat(fetch_key, ":", MAX_CLUSTER_STRING);
  strncat(fetch_key, section, MAX_CLUSTER_STRING);
  // first, query the data from mdbm
  datum val;
  datum key;
  key.dptr = fetch_key;
  key.dsize = strlen(fetch_key);
  val = mdbm_fetch(db, key);
  if (val.dsize) {
    ret_set = set_unpack(req_pool, val.dptr);
    return range_from_set(rr, ret_set);
  } else {
    /* FIXME warn -- ok fixed*/
    range_request_warn_type(rr, "NOCLUSTER", fetch_key);
    return range_new(rr);
  }
}