Skip to content

Commit 08427c7

Browse files
committed
Merge pull request #57 from gusmanb/master
Update SnapshotWriter.cs for Mono build
2 parents 07b5250 + 86f3bb0 commit 08427c7

File tree

1 file changed

+39
-5
lines changed

1 file changed

+39
-5
lines changed

FoundationDB.Storage.Memory/IO/SnapshotWriter.cs

Lines changed: 39 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,8 @@ namespace FoundationDB.Storage.Memory.IO
1414
using System.Diagnostics.Contracts;
1515
using System.Threading;
1616
using System.Threading.Tasks;
17-
17+
using System.Runtime.InteropServices;
18+
1819
internal class SnapshotWriter
1920
{
2021
private readonly Win32SnapshotFile m_file;
@@ -161,15 +162,48 @@ public async Task WriteLevelAsync(int level, IntPtr[] segment, CancellationToken
161162
{
162163
unsafe
163164
{
164-
//REVIEW: need a better way to read raw values,
165-
// maybe the DB handler could give us a Func<...> ?
166-
// or maybe a Stream or Iterator view over the segment's data ?
165+
#if MONO
166+
var valuePointer =new IntPtr((void*) MemoryDatabaseHandler.ResolveValueAtVersion(segment[i], m_sequence));
167+
168+
if (valuePointer == IntPtr.Zero)
169+
continue;
170+
171+
Value value = new Value();
172+
Marshal.PtrToStructure(valuePointer, value);
173+
174+
var keyPointer = new IntPtr((void*)segment[i]);
175+
176+
Key key = new Key();
177+
Marshal.PtrToStructure(keyPointer, key);
178+
179+
Contract.Assert(key.Size <= MemoryDatabaseHandler.MAX_KEY_SIZE);
180+
181+
// Key Size
182+
uint size = key.Size;
183+
m_writer.WriteVarint32(size);
184+
m_writer.WriteBytesUnsafe(&(key.Data), (int)size);
185+
186+
// Value
187+
m_writer.WriteVarint64(value.Sequence); // sequence
188+
size = value.Size;
189+
if (size == 0)
190+
{ // empty key
191+
m_writer.WriteByte(0);
192+
}
193+
else
194+
{
195+
m_writer.WriteVarint32(size); // value size
196+
m_writer.WriteBytesUnsafe(&(value.Data), (int)size); // value data
197+
}
198+
#else
199+
167200
Value* value = MemoryDatabaseHandler.ResolveValueAtVersion(segment[i], m_sequence);
168201
if (value == null)
169202
{
170203
continue;
171204
}
172205
Key* key = (Key*)segment[i]; //.ToPointer();
206+
173207
Contract.Assert(key != null && key->Size <= MemoryDatabaseHandler.MAX_KEY_SIZE);
174208

175209
// Key Size
@@ -190,7 +224,7 @@ public async Task WriteLevelAsync(int level, IntPtr[] segment, CancellationToken
190224
m_writer.WriteVarint32(size); // value size
191225
m_writer.WriteBytesUnsafe(&(value->Data), (int)size); // value data
192226
}
193-
227+
#endif
194228
}
195229

196230
if (m_writer.Position >= SnapshotFormat.FLUSH_SIZE)

0 commit comments

Comments
 (0)