Heh, make it so you can actually update a value. Setting to nil explicitly deletes.

FossilOrigin-Name: 3bbf504a1fd842c17af3909efdb182aaef700d5fb833724d246e4643375c266e
This commit is contained in:
Mahlon E. Smith 2020-12-01 04:17:11 +00:00
parent 1b3aa55004
commit 2b745bc756

View file

@ -191,14 +191,18 @@ rmdbx_put_val( VALUE self, VALUE key, VALUE val )
if ( RTEST(rmdbx_closed_p(self)) ) rb_raise( rmdbx_eDatabaseError, "Closed database." ); if ( RTEST(rmdbx_closed_p(self)) ) rb_raise( rmdbx_eDatabaseError, "Closed database." );
rmdbx_open_txn( self, MDBX_TXN_READWRITE ); rmdbx_open_txn( self, MDBX_TXN_READWRITE );
MDBX_val ckey = rmdbx_vec_for( key ); MDBX_val ckey = rmdbx_vec_for( key );
MDBX_val data = rmdbx_vec_for( val );
rc = mdbx_get( db->txn, db->dbi, &ckey, &data );
// FIXME: DUPSORT is enabled -- different api? // FIXME: DUPSORT is enabled -- different api?
// See: MDBX_NODUPDATA / MDBX_NOOVERWRITE // See: MDBX_NODUPDATA / MDBX_NOOVERWRITE
rc = mdbx_put( db->txn, db->dbi, &ckey, &data, 0 ); if ( NIL_P(val) ) { /* remove if set to nil */
rc = mdbx_del( db->txn, db->dbi, &ckey, NULL );
}
else {
MDBX_val old;
MDBX_val data = rmdbx_vec_for( val );
rc = mdbx_replace( db->txn, db->dbi, &ckey, &data, &old, 0 );
}
mdbx_txn_commit( db->txn ); mdbx_txn_commit( db->txn );
@ -206,7 +210,7 @@ rmdbx_put_val( VALUE self, VALUE key, VALUE val )
case MDBX_SUCCESS: case MDBX_SUCCESS:
return val; return val;
default: default:
rb_raise( rmdbx_eDatabaseError, "Unable to fetch value: (%d) %s", rc, mdbx_strerror(rc) ); rb_raise( rmdbx_eDatabaseError, "Unable to store value: (%d) %s", rc, mdbx_strerror(rc) );
} }
} }