Esempio n. 1
0
        public Storage(string fileName)
        {
            DB2Reader reader;

            var stream = File.Open(fileName, FileMode.Open, FileAccess.Read, FileShare.Read);

            using (var bin = new BinaryReader(stream))
            {
                var identifier = new string(bin.ReadChars(4));
                stream.Position = 0;
                switch (identifier)
                {
                case "WDC3":
                    reader = new WDC3Reader(stream);
                    break;

                case "WDC2":
                    reader = new WDC2Reader(stream);
                    break;

                case "WDC1":
                    reader = new WDC1Reader(stream);
                    break;

                default:
                    throw new Exception("DBC type " + identifier + " is not supported!");
                }
            }

            FieldInfo[] fields = typeof(T).GetFields();

            FieldCache <T>[] fieldCache = new FieldCache <T> [fields.Length];

            for (int i = 0; i < fields.Length; ++i)
            {
                bool indexMapAttribute = reader.Flags.HasFlagExt(DB2Flags.Index) ? Attribute.IsDefined(fields[i], typeof(IndexAttribute)) : false;

                fieldCache[i] = new FieldCache <T>(fields[i], fields[i].FieldType.IsArray, fields[i].GetSetter <T>(), indexMapAttribute);
            }

            Parallel.ForEach(reader.AsEnumerable(), row =>
            {
                T entry = new T();

                row.Value.GetFields(fieldCache, entry);

                TryAdd(row.Key, entry);
            });
        }
Esempio n. 2
0
        public Storage(Stream stream)
        {
            DB2Reader reader;

            using (stream)
                using (var bin = new BinaryReader(stream))
                {
                    var identifier = new string(bin.ReadChars(4));
                    stream.Position = 0;
                    switch (identifier)
                    {
                    case "WDC3":
                        reader = new WDC3Reader(stream);
                        break;

                    case "WDC2":
                    case "1SLC":
                        reader = new WDC2Reader(stream);
                        break;

                    case "WDC1":
                        reader = new WDC1Reader(stream);
                        break;

                    case "WDB6":
                        reader = new WDB6Reader(stream);
                        break;

                    case "WDB5":
                        reader = new WDB5Reader(stream);
                        break;

                    case "WDB4":
                        reader = new WDB4Reader(stream);
                        break;

                    case "WDB3":
                        reader = new WDB3Reader(stream);
                        break;

                    case "WDB2":
                        reader = new WDB2Reader(stream);
                        break;

                    case "WDBC":
                        reader = new WDBCReader(stream);
                        break;

                    default:
                        throw new Exception("DB type " + identifier + " is not supported!");
                    }
                }

            FieldInfo[] fields = typeof(T).GetFields();

            FieldCache <T>[] fieldCache = new FieldCache <T> [fields.Length];
            for (int i = 0; i < fields.Length; ++i)
            {
                bool indexMapAttribute = reader.Flags.HasFlagExt(DB2Flags.Index) ? Attribute.IsDefined(fields[i], typeof(IndexAttribute)) : false;
                fieldCache[i] = new FieldCache <T>(fields[i], indexMapAttribute);
            }

            Parallel.ForEach(reader.AsEnumerable(), new ParallelOptions()
            {
                MaxDegreeOfParallelism = 1
            }, row =>
            {
                T entry = new T();
                row.Value.GetFields(fieldCache, entry);
                lock (this)
                    Add(row.Value.Id, entry);
            });
        }