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); }
/* {{{ 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; }