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;
            }
        }
Пример #2
0
        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;
            }
        }
Пример #5
0
 public PolicyStore(IRandomAccessStore source, Policy policy)
 {
     this.source = source;
     this.policy = policy;
 }