public FileIndexKeyValueStorage( IEnumerable <KeyValuePair <TKey, TValue> > values, FileInfo fi, long initialSize, ISerializer <TValue> serializer, long count, IRandomAccessStore reader, IIndexSerializer <TKey> indexSerializer = null, IEnumerable <KeyValuePair <string, object> > additionalData = null, JsonSerializerSettings additionalDataSerializerSettings = null) { this.serializer = serializer; indexSerializer = indexSerializer ?? new DictionaryIndexSerializer <TKey>(); this.reader = reader; try { this.WriteData(values, serializer, indexSerializer, count, fi, additionalData, additionalDataSerializerSettings); } catch (Exception) { // if something unexpectedly breaks during population (easy to happen externally as we are fed an IEnumerable) // then ensure no partially populated files are left around this.Dispose(); File.Delete(fi.FullName); throw; } }
public static FileIndexKeyValueStorage <TKey, TValue> CreateOrOpen( IEnumerable <KeyValuePair <TKey, TValue> > values, string filename, long initialSize, long count, ISerializer <TValue> serializer = null, AccessStrategy strategy = AccessStrategy.MemoryMapped, IIndexSerializer <TKey> indexSerializer = null, IEnumerable <KeyValuePair <string, object> > additionalMetadata = null) { var fi = new FileInfo(filename); IRandomAccessStore reader = GetCreateReaderForStrategy(initialSize, strategy, fi); if (fi.Exists) { try { return(new FileIndexKeyValueStorage <TKey, TValue>(fi, reader, serializer, indexSerializer)); } catch (NoMagicException) { // no magic almost certainly means the file was partially written as the header is written last return(new FileIndexKeyValueStorage <TKey, TValue>(values, fi, initialSize, serializer, count, reader, indexSerializer, additionalData: additionalMetadata)); } } else { return(new FileIndexKeyValueStorage <TKey, TValue>(values, fi, initialSize, serializer, count, reader, indexSerializer, additionalData: additionalMetadata)); } }
public void Dispose() { if (this.reader != null) { this.reader.Dispose(); this.reader = null; } }
public unsafe FileIndexKeyValueStorage( FileInfo fi, IRandomAccessStore reader, ISerializer <TValue> serializer = null, IIndexSerializer <TKey> indexSerializer = null) { indexSerializer = indexSerializer ?? new DictionaryIndexSerializer <TKey>(); this.reader = reader; try { // file begins with header Header header = reader.Read <Header>(0); if (header.magic == Guid.Empty) { throw new NoMagicException(fi.FullName); } if (header.magic != Header.expectedMagic) { throw new InvalidMagicException(fi.FullName); } if (serializer == null) { this.serializer = this.ReadSerializerFromHeader(header); } else { this.serializer = serializer; } byte[] indexJsonBytes = reader.ReadArray(header.IndexPosition, header.IndexLength); this.index = indexSerializer.Deserialize(indexJsonBytes); var blocks = new List <CustomDataBlock>(header.customBlockCount); for (int i = 0; i < header.customBlockCount; i++) { long customBlockPosition = GetCustomBlockPosition(header, i); var block = reader.Read <CustomDataBlock>(customBlockPosition); blocks.Add(block); } this.customBlockIndex = blocks.ToDictionary(b => new string(b.Name).Trim()); } catch (Exception) { this.Dispose(); throw; } }
public PolicyStore(IRandomAccessStore source, Policy policy) { this.source = source; this.policy = policy; }