Ejemplo n.º 1
0
 internal P21ToIndexParser(Stream inputP21, long streamSize, EsentEntityCursor table, PersistedEntityInstanceCache cache, int codePageOverride = -1)
     : base(inputP21)
 {
     this._table = table;
     //  this.transaction = transaction;
     _modelCache       = cache;
     _entityCount      = 0;
     _streamSize       = streamSize;
     _codePageOverride = codePageOverride;
 }
Ejemplo n.º 2
0
        protected void Init(IEntityFactory factory)
        {
            _factory       = factory;
            InstanceCache  = new PersistedEntityInstanceCache(this, factory);
            InstancesLocal = new XbimInstanceCollection(this);
            var r = new Random();

            UserDefinedId = (short)r.Next(short.MaxValue); // initialise value at random to reduce chance of duplicates
            Metadata      = ExpressMetaData.GetMetadata(factory.GetType().Module);
            ModelFactors  = new XbimModelFactors(Math.PI / 180, 1e-3, 1e-5);
        }
        /// <summary>
        /// Populates an entites properties from the binary stream
        /// </summary>
        /// <param name="entity"></param>
        /// <param name="cache"></param>
        /// <param name="br"></param>
        /// <param name="unCached">If true instances inside the properties are not added to the cache</param>
        /// <param name="fromCache"> If true the instance is read from the cache if not present it is created, used during parsing</param>
        internal static void ReadEntityProperties(this IPersistEntity entity, PersistedEntityInstanceCache cache, BinaryReader br, bool unCached = false, bool fromCache = false)
        {
            var action = (P21ParseAction)br.ReadByte();

            var parserState = new XbimParserState(entity);

            while (action != P21ParseAction.EndEntity)
            {
                switch (action)
                {
                case P21ParseAction.BeginList:
                    parserState.BeginList();
                    break;

                case P21ParseAction.EndList:
                    parserState.EndList();
                    break;

                case P21ParseAction.BeginComplex:
                    break;

                case P21ParseAction.EndComplex:
                    break;

                case P21ParseAction.SetIntegerValue:
                    parserState.SetIntegerValue(br.ReadInt64());
                    break;

                case P21ParseAction.SetHexValue:
                    parserState.SetHexValue(br.ReadInt64());
                    break;

                case P21ParseAction.SetFloatValue:
                    parserState.SetFloatValue(br.ReadDouble());
                    break;

                case P21ParseAction.SetStringValue:
                    parserState.SetStringValue(br.ReadString());
                    break;

                case P21ParseAction.SetEnumValue:
                    parserState.SetEnumValue(br.ReadString());
                    break;

                case P21ParseAction.SetBooleanValue:
                    parserState.SetBooleanValue(br.ReadBoolean());
                    break;

                case P21ParseAction.SetNonDefinedValue:
                    parserState.SetNonDefinedValue();
                    break;

                case P21ParseAction.SetOverrideValue:
                    parserState.SetOverrideValue();
                    break;

                case P21ParseAction.SetObjectValueUInt16:
                    if (fromCache)
                    {
                        int            label = br.ReadUInt16();
                        IPersistEntity refEntity;
                        if (!parserState.InList && cache.Read.TryGetValue(label, out refEntity))     //if we are in a list then make a forward reference anyway to make sure we maintain list order
                        {
                            parserState.SetObjectValue(refEntity);
                        }
                        else
                        {
                            cache.AddForwardReference(new StepForwardReference(label, parserState.CurrentPropertyId, entity, parserState.NestedIndex));
                            parserState.SkipProperty();
                        }
                    }
                    else
                    {
                        parserState.SetObjectValue(cache.GetInstance(br.ReadUInt16(), false, unCached));
                    }
                    break;

                case P21ParseAction.SetObjectValueInt32:
                    if (fromCache)
                    {
                        var            label = br.ReadInt32();
                        IPersistEntity refEntity;
                        if (!parserState.InList && cache.Read.TryGetValue(label, out refEntity))     //if we are in a list then make a forward reference anyway to make sure we maintain list order
                        {
                            parserState.SetObjectValue(refEntity);
                        }
                        else
                        {
                            cache.AddForwardReference(new StepForwardReference(label, parserState.CurrentPropertyId, entity, parserState.NestedIndex));
                            parserState.SkipProperty();
                        }
                    }
                    else
                    {
                        parserState.SetObjectValue(cache.GetInstance(br.ReadInt32(), false, unCached));
                    }
                    break;

                case P21ParseAction.SetObjectValueInt64:
                    throw new XbimException("Entity Label is int64, this is not currently supported");

                //parserState.SetObjectValue(cache.GetInstance(br.ReadInt64(), false, unCached));
                //break;
                case P21ParseAction.BeginNestedType:
                    parserState.BeginNestedType(br.ReadString());
                    break;

                case P21ParseAction.EndNestedType:
                    parserState.EndNestedType();
                    break;

                case P21ParseAction.EndEntity:
                    parserState.EndEntity();
                    break;

                case P21ParseAction.NewEntity:
                    parserState = new XbimParserState(entity);
                    break;

                default:
                    throw new XbimException("Invalid Property Record #" + entity.EntityLabel + " EntityType: " + entity.GetType().Name);
                }
                action = (P21ParseAction)br.ReadByte();
            }
        }
 internal XbimInstanceCollection(EsentModel esentModel)
 {
     Cache  = esentModel.Cache;
     _model = esentModel;
 }
Ejemplo n.º 5
0
 public XbimInstancesEntityEnumerator(PersistedEntityInstanceCache cache)
 {
     this.cache = cache;
     cursor     = cache.GetEntityTable();
     Reset();
 }