Heh, make it so you can actually update a value. Setting to nil explicitly deletes.
FossilOrigin-Name: 3bbf504a1fd842c17af3909efdb182aaef700d5fb833724d246e4643375c266e
This commit is contained in:
parent
1b3aa55004
commit
2b745bc756
1 changed files with 9 additions and 5 deletions
|
|
@ -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) );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue