/// <summary> /// PersistTo a single class info - This method is used by the XML Importer. /// </summary> /// <remarks> /// PersistTo a single class info - This method is used by the XML Importer. /// </remarks> private ClassInfo PersistClass(ClassInfo newClassInfo, int lastClassInfoIndex, bool addClass, bool addDependentClasses) { var metaModel = _session.GetMetaModel(); var classInfoId = newClassInfo.ClassInfoId; if (classInfoId == null) { classInfoId = GetIdManager().GetNextClassId(-1); newClassInfo.ClassInfoId = classInfoId; } var writePosition = FileSystemProcessor.FileSystemInterface.GetAvailablePosition(); newClassInfo.Position = writePosition; GetIdManager().UpdateClassPositionForId(classInfoId, writePosition, true); #region Logging if (OdbConfiguration.IsLoggingEnabled()) { var writePositionAsString = writePosition.ToString(); DLogger.Debug( string.Format("ObjectWriter: Persisting class into database : {0} with oid {1} at pos ", newClassInfo.FullClassName, classInfoId) + writePositionAsString); var numberOfAttributesAsString = newClassInfo.NumberOfAttributes.ToString(); DLogger.Debug("ObjectWriter: class " + newClassInfo.FullClassName + " has " + numberOfAttributesAsString + " attributes"); } #endregion // The class info oid is created in ObjectWriter.writeClassInfoHeader if (metaModel.GetNumberOfClasses() > 0 && lastClassInfoIndex != -2) { var lastClassinfo = lastClassInfoIndex == -1 ? metaModel.GetLastClassInfo() : metaModel.GetClassInfo(lastClassInfoIndex); lastClassinfo.NextClassOID = newClassInfo.ClassInfoId; #region Logging if (OdbConfiguration.IsLoggingEnabled()) { var positionAsString = lastClassinfo.Position.ToString(); var classOffsetAsString = StorageEngineConstant.ClassOffsetNextClassPosition.ToString(); DLogger.Debug("ObjectWriter: changing next class oid. of class info " + lastClassinfo.FullClassName + "@ " + positionAsString + " + offset " + classOffsetAsString + string.Format(" to {0}({1})", newClassInfo.ClassInfoId, newClassInfo.FullClassName)); } #endregion FileSystemProcessor.FileSystemInterface.SetWritePosition(lastClassinfo.Position + StorageEngineConstant.ClassOffsetNextClassPosition, true); FileSystemProcessor.FileSystemInterface.WriteLong(newClassInfo.ClassInfoId.ObjectId, true); // next class oid newClassInfo.PreviousClassOID = lastClassinfo.ClassInfoId; } if (addClass) metaModel.AddClass(newClassInfo); // updates number of classes FileSystemProcessor.WriteNumberOfClasses(metaModel.GetNumberOfClasses(), true); // If it is the first class , updates the first class OID if (newClassInfo.PreviousClassOID == null) FileSystemProcessor.WriteFirstClassInfoOID(newClassInfo.ClassInfoId, true); // Writes the header of the class - out of transaction (FIXME why out of // transaction) WriteClassInfoHeader(newClassInfo, writePosition, false); if (addDependentClasses) { var dependingAttributes = newClassInfo.GetAllNonNativeAttributes(); UpdateClass(dependingAttributes, metaModel); } WriteClassInfoBody(newClassInfo, FileSystemProcessor.FileSystemInterface.GetAvailablePosition(), true); return newClassInfo; }
public void UpdateClassInfo(ClassInfo classInfo, bool writeInTransaction) { // first check dependent classes var dependingAttributes = classInfo.GetAllNonNativeAttributes(); var metaModel = _session.GetMetaModel(); UpdateClass(dependingAttributes, metaModel); // To force the rewrite of class info body classInfo.AttributesDefinitionPosition = -1; var newCiPosition = FileSystemProcessor.FileSystemInterface.GetAvailablePosition(); classInfo.Position = newCiPosition; WriteClassInfoHeader(classInfo, newCiPosition, writeInTransaction); WriteClassInfoBody(classInfo, FileSystemProcessor.FileSystemInterface.GetAvailablePosition(), writeInTransaction); }