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; }
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; }
public XbimInstancesEntityEnumerator(PersistedEntityInstanceCache cache) { this.cache = cache; cursor = cache.GetEntityTable(); Reset(); }