int Db::key_range(DbTxn *txnid, Dbt *key,
		  DB_KEY_RANGE *results, u_int32_t flags)
{
	DB *db = unwrap(this);
	int err;

	if ((err = db->key_range(db, unwrap(txnid), key,
				 results, flags)) != 0) {
		DB_ERROR("Db::key_range", err, error_policy());
		return (err);
	}
	return (0);
}
Exemple #2
0
/* {{{ rberkeley_db_key_range */
SEXP rberkeley_db_key_range (SEXP _dbp, SEXP _txnid, SEXP _key, SEXP _flags)
{
  DB *dbp;
  DB_TXN *txnid;
  DBT key;
  DB_KEY_RANGE key_range;
  u_int32_t flags = (u_int32_t)INTEGER(_flags)[0];
  int ret;

  if(!isNull(_txnid)) {
    txnid = R_ExternalPtrAddr(_txnid);
  } else txnid = NULL;
  
  memset(&key, 0, sizeof(DBT));
  if(isNull(_key))
    error("key must be set");
  key.data = (unsigned char *)RAW(_key);
  key.size = length(_key);

  dbp = R_ExternalPtrAddr(_dbp);
  if(R_ExternalPtrTag(_dbp) != RBerkeley_DB || dbp == NULL)
    error("invalid 'db' handle");
 
  ret = dbp->key_range(dbp, txnid, &key, &key_range, flags); 
  if(ret != 0)
    return ScalarInteger(ret);
   
  SEXP KeyRange, names;
  PROTECT(KeyRange = allocVector(VECSXP, 3));
  SET_VECTOR_ELT(KeyRange, 0, ScalarReal(key_range.less));
  SET_VECTOR_ELT(KeyRange, 1, ScalarReal(key_range.equal));
  SET_VECTOR_ELT(KeyRange, 2, ScalarReal(key_range.greater));
  PROTECT(names = allocVector(STRSXP, 3));
  SET_STRING_ELT(names, 0, mkChar("less")); 
  SET_STRING_ELT(names, 1, mkChar("equal")); 
  SET_STRING_ELT(names, 2, mkChar("greater")); 
  
  setAttrib(KeyRange, R_NamesSymbol, names);
  UNPROTECT(2);
  return KeyRange;
}