private readonly BinaryFormatter _formatter = new BinaryFormatter();
private readonly MemoryStream _keyStream = new MemoryStream();
private readonly MemoryStream _dataStream = new MemoryStream();
void InitStreams()
{
_formatter = new BinaryFormatter();
_keyStream = new MemoryStream();
_dataStream = new MemoryStream();
}
public interface IPut { string Key { get; } }
所有存儲實體必須實現,指定作為 BDB 主鍵的屬性。
public bool Set(IPut put)
{
Reset(); // 重置事務狀態
_keyStream.Position = 0;
_formatter.Serialize(_keyStream, put.Key);
DbEntry key = DbEntry.InOut(_keyStream.GetBuffer(), 0, (int)_keyStream.Position);
_dataStream.Position = 0;
_formatter.Serialize(_dataStream, put);
DbEntry data = DbEntry.InOut(_dataStream.GetBuffer(), 0, (int)_dataStream.Position);
WriteStatus status = _btree.Put(_txn, ref key, ref data);
switch (status)
{
case WriteStatus.Success: return true;
case WriteStatus.NotFound:
case WriteStatus.KeyExist:
default: return false;
}
}
MemoryStream。DbEntry.InOut(buffer, offset, count) 包裝有效字節區間。btree.Put(txn, ref key, ref data) 在事務中寫入。WriteStatus 判斷成功/失敗(KeyExist 視為成功語義可自行調整)。Get 操作(含 BufferSmall 重試邏輯)、Remove 操作、事務提交與資源釋放。