/// <summary>Builds a meta model from a list of class infos</summary>
        /// <param name="classInfos"></param>
        /// <returns>The new Metamodel</returns>
        public static NeoDatis.Odb.Core.Layers.Layer2.Meta.MetaModel FromClassInfos(NeoDatis.Tool.Wrappers.List.IOdbList
                                                                                    <NeoDatis.Odb.Core.Layers.Layer2.Meta.ClassInfo> classInfos)
        {
            NeoDatis.Odb.Core.Layers.Layer2.Meta.MetaModel metaModel = new NeoDatis.Odb.Core.Layers.Layer2.Meta.SessionMetaModel
                                                                           ();
            int nbClasses = classInfos.Count;

            for (int i = 0; i < nbClasses; i++)
            {
                metaModel.AddClass(classInfos[i]);
            }
            return(metaModel);
        }
		public override NeoDatis.Odb.Core.Layers.Layer2.Meta.MetaModel Duplicate()
		{
			NeoDatis.Odb.Core.Layers.Layer2.Meta.SessionMetaModel model = new NeoDatis.Odb.Core.Layers.Layer2.Meta.SessionMetaModel
				();
			NeoDatis.Tool.Wrappers.List.IOdbList<NeoDatis.Odb.Core.Layers.Layer2.Meta.ClassInfo
				> classes = GetAllClasses();
			foreach (NeoDatis.Odb.Core.Layers.Layer2.Meta.ClassInfo ci in classes)
			{
				model.AddClass((NeoDatis.Odb.Core.Layers.Layer2.Meta.ClassInfo)ci.Duplicate(false
					));
			}
			model.changedClasses = new NeoDatis.Tool.Wrappers.Map.OdbHashMap<NeoDatis.Odb.Core.Layers.Layer2.Meta.ClassInfo
				, NeoDatis.Odb.Core.Layers.Layer2.Meta.ClassInfo>();
			model.changedClasses.PutAll(changedClasses);
			return model;
		}
 public override NeoDatis.Odb.Core.Layers.Layer2.Meta.MetaModel Duplicate()
 {
     NeoDatis.Odb.Core.Layers.Layer2.Meta.SessionMetaModel model = new NeoDatis.Odb.Core.Layers.Layer2.Meta.SessionMetaModel
                                                                       ();
     NeoDatis.Tool.Wrappers.List.IOdbList <NeoDatis.Odb.Core.Layers.Layer2.Meta.ClassInfo
                                           > classes = GetAllClasses();
     foreach (NeoDatis.Odb.Core.Layers.Layer2.Meta.ClassInfo ci in classes)
     {
         model.AddClass((NeoDatis.Odb.Core.Layers.Layer2.Meta.ClassInfo)ci.Duplicate(false
                                                                                     ));
     }
     model.changedClasses = new NeoDatis.Tool.Wrappers.Map.OdbHashMap <NeoDatis.Odb.Core.Layers.Layer2.Meta.ClassInfo
                                                                       , NeoDatis.Odb.Core.Layers.Layer2.Meta.ClassInfo>();
     model.changedClasses.PutAll(changedClasses);
     return(model);
 }
Beispiel #4
0
 public override NeoDatis.Odb.Core.Layers.Layer2.Meta.MetaModel GetMetaModel()
 {
     if (metaModel == null)
     {
         try
         {
             metaModel = new NeoDatis.Odb.Core.Layers.Layer2.Meta.SessionMetaModel();
             if (GetStorageEngine().GetObjectReader() != null)
             {
                 this.metaModel = GetStorageEngine().GetObjectReader().ReadMetaModel(metaModel, true
                                                                                     );
             }
         }
         catch (System.Exception e)
         {
             throw new NeoDatis.Odb.ODBRuntimeException(NeoDatis.Odb.Core.NeoDatisError.InternalError
                                                        .AddParameter("in ServerSession.getMetaModel"), e);
         }
     }
     return(metaModel);
 }
		public override NeoDatis.Odb.Core.Layers.Layer2.Meta.MetaModel GetMetaModel()
		{
			if (metaModel == null)
			{
				try
				{
					metaModel = new NeoDatis.Odb.Core.Layers.Layer2.Meta.SessionMetaModel();
					if (GetStorageEngine().GetObjectReader() != null)
					{
						this.metaModel = GetStorageEngine().GetObjectReader().ReadMetaModel(metaModel, true
							);
					}
				}
				catch (System.Exception e)
				{
					throw new NeoDatis.Odb.ODBRuntimeException(NeoDatis.Odb.Core.NeoDatisError.InternalError
						.AddParameter("in ServerSession.getMetaModel"), e);
				}
			}
			return metaModel;
		}
Beispiel #6
0
 /// <summary>
 /// Used to commit meta model : classes This is useful when running in client
 /// server mode TODO Check this
 /// </summary>
 protected virtual void CommitMetaModel()
 {
     NeoDatis.Odb.Core.Layers.Layer2.Meta.MetaModel sessionMetaModel = session.GetMetaModel
                                                                           ();
     // If meta model has not been modified, there is nothing to do
     if (!sessionMetaModel.HasChanged())
     {
         return;
     }
     if (NeoDatis.Odb.OdbConfiguration.IsDebugEnabled(LogId))
     {
         NeoDatis.Tool.DLogger.Debug("Start commitMetaModel");
     }
     NeoDatis.Odb.Core.Layers.Layer2.Meta.MetaModel lastCommitedMetaModel = new NeoDatis.Odb.Core.Layers.Layer2.Meta.SessionMetaModel
                                                                                ();
     if (isLocal)
     {
         // In local mode, we must not reload the meta model as there is no
         // concurrent access
         lastCommitedMetaModel = sessionMetaModel;
     }
     else
     {
         // In ClientServer mode, re-read the meta-model from the database
         // base to get last update.
         lastCommitedMetaModel = session.GetStorageEngine().GetObjectReader().ReadMetaModel
                                     (lastCommitedMetaModel, false);
     }
     // Gets the classes that have changed (that have modified ,deleted or
     // inserted objects)
     System.Collections.Generic.IEnumerator <NeoDatis.Odb.Core.Layers.Layer2.Meta.ClassInfo
                                             >      cis             = sessionMetaModel.GetChangedClassInfo().GetEnumerator();
     NeoDatis.Odb.Core.Layers.Layer2.Meta.ClassInfo newCi           = null;
     NeoDatis.Odb.Core.Layers.Layer2.Meta.ClassInfo lastCommittedCI = null;
     NeoDatis.Odb.Core.Layers.Layer3.IObjectWriter  writer          = session.GetStorageEngine()
                                                                      .GetObjectWriter();
     NeoDatis.Odb.OID lastCommittedObjectOIDOfThisTransaction = null;
     NeoDatis.Odb.OID lastCommittedObjectOIDOfPrevTransaction = null;
     // for all changes between old and new meta model
     while (cis.MoveNext())
     {
         newCi = cis.Current;
         if (lastCommitedMetaModel.ExistClass(newCi.GetFullClassName()))
         {
             // The last CI represents the last committed meta model of the
             // database
             lastCommittedCI = lastCommitedMetaModel.GetClassInfoFromId(newCi.GetId());
             // Just be careful to keep track of current CI committed zone
             // deleted objects
             lastCommittedCI.GetCommitedZoneInfo().SetNbDeletedObjects(newCi.GetCommitedZoneInfo
                                                                           ().GetNbDeletedObjects());
         }
         else
         {
             lastCommittedCI = newCi;
         }
         lastCommittedObjectOIDOfThisTransaction = newCi.GetCommitedZoneInfo().last;
         lastCommittedObjectOIDOfPrevTransaction = lastCommittedCI.GetCommitedZoneInfo().last;
         NeoDatis.Odb.OID lastCommittedObjectOID = lastCommittedObjectOIDOfPrevTransaction;
         // If some object have been created then
         if (lastCommittedObjectOIDOfPrevTransaction != null)
         {
             // Checks if last object of committed meta model has not been
             // deleted
             if (session.GetCache().IsDeleted(lastCommittedObjectOIDOfPrevTransaction))
             {
                 // TODO This is wrong: if a committed transaction deleted a
                 // committed object and creates x new
                 // objects, then all these new objects will be lost:
                 // if it has been deleted then use the last object of the
                 // session class info
                 lastCommittedObjectOID = lastCommittedObjectOIDOfThisTransaction;
                 newCi.GetCommitedZoneInfo().last = lastCommittedObjectOID;
             }
         }
         // Connect Unconnected zone to connected zone
         // make next oid of last committed object point to first
         // uncommitted object
         // make previous oid of first uncommitted object point to
         // last committed object
         if (lastCommittedObjectOID != null && newCi.GetUncommittedZoneInfo().HasObjects())
         {
             if (newCi.GetCommitedZoneInfo().HasObjects())
             {
                 // these 2 updates are executed directly without
                 // transaction, because
                 // We are in the commit process.
                 writer.UpdateNextObjectFieldOfObjectInfo(lastCommittedObjectOID, newCi.GetUncommittedZoneInfo
                                                              ().first, false);
                 writer.UpdatePreviousObjectFieldOfObjectInfo(newCi.GetUncommittedZoneInfo().first
                                                              , lastCommittedObjectOID, false);
             }
             else
             {
                 // Committed zone has 0 object
                 writer.UpdatePreviousObjectFieldOfObjectInfo(newCi.GetUncommittedZoneInfo().first
                                                              , null, false);
             }
         }
         // The number of committed objects must be updated with the number
         // of the last committed CI because a transaction may have been
         // committed changing this number.
         // Notice that the setNbObjects receive the full CommittedCIZoneInfo
         // object
         // because it will set the number of objects and the number of
         // deleted objects
         newCi.GetCommitedZoneInfo().SetNbObjects(lastCommittedCI.GetCommitedZoneInfo());
         // and don't forget to set the deleted objects
         // This sets the number of objects, the first object OID and the
         // last object OID
         newCi = BuildClassInfoForCommit(newCi);
         writer.UpdateInstanceFieldsOfClassInfo(newCi, false);
         if (NeoDatis.Odb.OdbConfiguration.IsDebugEnabled(LogId))
         {
             NeoDatis.Tool.DLogger.Debug("Analysing class " + newCi.GetFullClassName());
             NeoDatis.Tool.DLogger.Debug("\t-Commited CI   = " + newCi);
             NeoDatis.Tool.DLogger.Debug("\t-connect last commited object with oid " + lastCommittedObjectOID
                                         + " to first uncommited object " + newCi.GetUncommittedZoneInfo().first);
             NeoDatis.Tool.DLogger.Debug("\t-Commiting new Number of objects = " + newCi.GetNumberOfObjects
                                             ());
         }
     }
     sessionMetaModel.ResetChangedClasses();
     // To guarantee integrity after commit, the meta model is set to null
     // If the user continues using odb instance after commit the meta model
     // will be lazy-reloaded. Only for Client Server mode
     if (!isLocal)
     {
         session.SetMetaModel(null);
     }
 }
		/// <summary>Builds a meta model from a list of class infos</summary>
		/// <param name="classInfos"></param>
		/// <returns>The new Metamodel</returns>
		public static NeoDatis.Odb.Core.Layers.Layer2.Meta.MetaModel FromClassInfos(NeoDatis.Tool.Wrappers.List.IOdbList
			<NeoDatis.Odb.Core.Layers.Layer2.Meta.ClassInfo> classInfos)
		{
			NeoDatis.Odb.Core.Layers.Layer2.Meta.MetaModel metaModel = new NeoDatis.Odb.Core.Layers.Layer2.Meta.SessionMetaModel
				();
			int nbClasses = classInfos.Count;
			for (int i = 0; i < nbClasses; i++)
			{
				metaModel.AddClass(classInfos[i]);
			}
			return metaModel;
		}
		/// <summary>
		/// Used to commit meta model : classes This is useful when running in client
		/// server mode TODO Check this
		/// </summary>
		protected virtual void CommitMetaModel()
		{
			NeoDatis.Odb.Core.Layers.Layer2.Meta.MetaModel sessionMetaModel = session.GetMetaModel
				();
			// If meta model has not been modified, there is nothing to do
			if (!sessionMetaModel.HasChanged())
			{
				return;
			}
			if (NeoDatis.Odb.OdbConfiguration.IsDebugEnabled(LogId))
			{
				NeoDatis.Tool.DLogger.Debug("Start commitMetaModel");
			}
			NeoDatis.Odb.Core.Layers.Layer2.Meta.MetaModel lastCommitedMetaModel = new NeoDatis.Odb.Core.Layers.Layer2.Meta.SessionMetaModel
				();
			if (isLocal)
			{
				// In local mode, we must not reload the meta model as there is no
				// concurrent access
				lastCommitedMetaModel = sessionMetaModel;
			}
			else
			{
				// In ClientServer mode, re-read the meta-model from the database
				// base to get last update.
				lastCommitedMetaModel = session.GetStorageEngine().GetObjectReader().ReadMetaModel
					(lastCommitedMetaModel, false);
			}
			// Gets the classes that have changed (that have modified ,deleted or
			// inserted objects)
			System.Collections.Generic.IEnumerator<NeoDatis.Odb.Core.Layers.Layer2.Meta.ClassInfo
				> cis = sessionMetaModel.GetChangedClassInfo().GetEnumerator();
			NeoDatis.Odb.Core.Layers.Layer2.Meta.ClassInfo newCi = null;
			NeoDatis.Odb.Core.Layers.Layer2.Meta.ClassInfo lastCommittedCI = null;
			NeoDatis.Odb.Core.Layers.Layer3.IObjectWriter writer = session.GetStorageEngine()
				.GetObjectWriter();
			NeoDatis.Odb.OID lastCommittedObjectOIDOfThisTransaction = null;
			NeoDatis.Odb.OID lastCommittedObjectOIDOfPrevTransaction = null;
			// for all changes between old and new meta model
			while (cis.MoveNext())
			{
				newCi = cis.Current;
				if (lastCommitedMetaModel.ExistClass(newCi.GetFullClassName()))
				{
					// The last CI represents the last committed meta model of the
					// database
					lastCommittedCI = lastCommitedMetaModel.GetClassInfoFromId(newCi.GetId());
					// Just be careful to keep track of current CI committed zone
					// deleted objects
					lastCommittedCI.GetCommitedZoneInfo().SetNbDeletedObjects(newCi.GetCommitedZoneInfo
						().GetNbDeletedObjects());
				}
				else
				{
					lastCommittedCI = newCi;
				}
				lastCommittedObjectOIDOfThisTransaction = newCi.GetCommitedZoneInfo().last;
				lastCommittedObjectOIDOfPrevTransaction = lastCommittedCI.GetCommitedZoneInfo().last;
				NeoDatis.Odb.OID lastCommittedObjectOID = lastCommittedObjectOIDOfPrevTransaction;
				// If some object have been created then
				if (lastCommittedObjectOIDOfPrevTransaction != null)
				{
					// Checks if last object of committed meta model has not been
					// deleted
					if (session.GetCache().IsDeleted(lastCommittedObjectOIDOfPrevTransaction))
					{
						// TODO This is wrong: if a committed transaction deleted a
						// committed object and creates x new
						// objects, then all these new objects will be lost:
						// if it has been deleted then use the last object of the
						// session class info
						lastCommittedObjectOID = lastCommittedObjectOIDOfThisTransaction;
						newCi.GetCommitedZoneInfo().last = lastCommittedObjectOID;
					}
				}
				// Connect Unconnected zone to connected zone
				// make next oid of last committed object point to first
				// uncommitted object
				// make previous oid of first uncommitted object point to
				// last committed object
				if (lastCommittedObjectOID != null && newCi.GetUncommittedZoneInfo().HasObjects())
				{
					if (newCi.GetCommitedZoneInfo().HasObjects())
					{
						// these 2 updates are executed directly without
						// transaction, because
						// We are in the commit process.
						writer.UpdateNextObjectFieldOfObjectInfo(lastCommittedObjectOID, newCi.GetUncommittedZoneInfo
							().first, false);
						writer.UpdatePreviousObjectFieldOfObjectInfo(newCi.GetUncommittedZoneInfo().first
							, lastCommittedObjectOID, false);
					}
					else
					{
						// Committed zone has 0 object
						writer.UpdatePreviousObjectFieldOfObjectInfo(newCi.GetUncommittedZoneInfo().first
							, null, false);
					}
				}
				// The number of committed objects must be updated with the number
				// of the last committed CI because a transaction may have been
				// committed changing this number.
				// Notice that the setNbObjects receive the full CommittedCIZoneInfo
				// object
				// because it will set the number of objects and the number of
				// deleted objects
				newCi.GetCommitedZoneInfo().SetNbObjects(lastCommittedCI.GetCommitedZoneInfo());
				// and don't forget to set the deleted objects
				// This sets the number of objects, the first object OID and the
				// last object OID
				newCi = BuildClassInfoForCommit(newCi);
				writer.UpdateInstanceFieldsOfClassInfo(newCi, false);
				if (NeoDatis.Odb.OdbConfiguration.IsDebugEnabled(LogId))
				{
					NeoDatis.Tool.DLogger.Debug("Analysing class " + newCi.GetFullClassName());
					NeoDatis.Tool.DLogger.Debug("\t-Commited CI   = " + newCi);
					NeoDatis.Tool.DLogger.Debug("\t-connect last commited object with oid " + lastCommittedObjectOID
						 + " to first uncommited object " + newCi.GetUncommittedZoneInfo().first);
					NeoDatis.Tool.DLogger.Debug("\t-Commiting new Number of objects = " + newCi.GetNumberOfObjects
						());
				}
			}
			sessionMetaModel.ResetChangedClasses();
			// To guarantee integrity after commit, the meta model is set to null
			// If the user continues using odb instance after commit the meta model
			// will be lazy-reloaded. Only for Client Server mode
			if (!isLocal)
			{
				session.SetMetaModel(null);
			}
		}