@@ -14,7 +14,8 @@ namespace FoundationDB.Storage.Memory.IO
14
14
using System . Diagnostics . Contracts ;
15
15
using System . Threading ;
16
16
using System . Threading . Tasks ;
17
-
17
+ using System . Runtime . InteropServices ;
18
+
18
19
internal class SnapshotWriter
19
20
{
20
21
private readonly Win32SnapshotFile m_file ;
@@ -161,15 +162,48 @@ public async Task WriteLevelAsync(int level, IntPtr[] segment, CancellationToken
161
162
{
162
163
unsafe
163
164
{
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
+
167
200
Value * value = MemoryDatabaseHandler . ResolveValueAtVersion ( segment [ i ] , m_sequence ) ;
168
201
if ( value == null )
169
202
{
170
203
continue ;
171
204
}
172
205
Key * key = ( Key * ) segment [ i ] ; //.ToPointer();
206
+
173
207
Contract . Assert ( key != null && key ->Size <= MemoryDatabaseHandler . MAX_KEY_SIZE ) ;
174
208
175
209
// Key Size
@@ -190,7 +224,7 @@ public async Task WriteLevelAsync(int level, IntPtr[] segment, CancellationToken
190
224
m_writer . WriteVarint32 ( size ) ; // value size
191
225
m_writer . WriteBytesUnsafe ( & ( value ->Data ) , ( int ) size ) ; // value data
192
226
}
193
-
227
+ #endif
194
228
}
195
229
196
230
if ( m_writer . Position >= SnapshotFormat . FLUSH_SIZE )
0 commit comments