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; }
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); } }