private void MigrateFreespace(IFreespaceManager oldFreespaceManager)
        {
            IFreespaceManager newFreespaceManager = AbstractFreespaceManager.CreateNew(this,
                                                                                       ConfigImpl.FreespaceSystem());

            newFreespaceManager.Start(0);
            SystemData().FreespaceSystem(ConfigImpl.FreespaceSystem());
            InstallFreespaceManager(newFreespaceManager);
            AbstractFreespaceManager.Migrate(oldFreespaceManager, newFreespaceManager);
            _fileHeader.WriteVariablePart(this);
        }
        /// <exception cref="Db4objects.Db4o.Ext.OldFormatException"></exception>
        internal virtual void ReadThis()
        {
            NewSystemData(AbstractFreespaceManager.FmLegacyRam, StandardIdSystemFactory.Legacy
                          );
            BlockSizeReadFromFile(1);
            _fileHeader = FileHeader.Read(this);
            if (Config().GenerateCommitTimestamps().IsUnspecified())
            {
                Config().GenerateCommitTimestamps(_systemData.IdToTimestampIndexId() != 0);
            }
            CreateStringIO(_systemData.StringEncoding());
            CreateIdSystem();
            InitializeClassMetadataRepository();
            InitalizeWeakReferenceSupport();
            SetNextTimeStampId(SystemData().LastTimeStampID());
            ClassCollection().SetID(_systemData.ClassCollectionID());
            ClassCollection().Read(SystemTransaction());
            Converter.Convert(new ConversionStage.ClassCollectionAvailableStage(this));
            _fileHeader.ReadIdentity(this);
            if (_config.IsReadOnly())
            {
                return;
            }
            if (!ConfigImpl.CommitRecoveryDisabled())
            {
                _fileHeader.CompleteInterruptedTransaction(this);
            }
            IFreespaceManager blockedFreespaceManager = AbstractFreespaceManager.CreateNew(this
                                                                                           , _systemData.FreespaceSystem());

            InstallFreespaceManager(blockedFreespaceManager);
            blockedFreespaceManager.Read(this, _systemData.InMemoryFreespaceSlot());
            blockedFreespaceManager.Start(_systemData.BTreeFreespaceId());
            _fileHeader = _fileHeader.Convert(this);
            if (FreespaceMigrationRequired(blockedFreespaceManager))
            {
                MigrateFreespace(blockedFreespaceManager);
            }
            WriteHeader(true, false);
            if (Converter.Convert(new ConversionStage.SystemUpStage(this)))
            {
                _systemData.ConverterVersion(Converter.Version);
                _fileHeader.WriteVariablePart(this);
                Transaction.Commit();
            }
        }
        private bool FreespaceMigrationRequired(IFreespaceManager freespaceManager)
        {
            if (freespaceManager == null)
            {
                return(false);
            }
            byte readSystem       = _systemData.FreespaceSystem();
            byte configuredSystem = ConfigImpl.FreespaceSystem();

            if (freespaceManager.SystemType() == configuredSystem)
            {
                return(false);
            }
            if (configuredSystem != 0)
            {
                return(true);
            }
            return(AbstractFreespaceManager.MigrationRequired(readSystem));
        }
        internal virtual void ConfigureNewFile()
        {
            BlockSize(ConfigImpl.BlockSize());
            _fileHeader = FileHeader.NewCurrentFileHeader();
            SetRegularEndAddress(_fileHeader.Length());
            NewSystemData(ConfigImpl.FreespaceSystem(), ConfigImpl.IdSystemType());
            SystemData().ConverterVersion(Converter.Version);
            CreateStringIO(_systemData.StringEncoding());
            CreateIdSystem();
            InitializeClassMetadataRepository();
            InitalizeWeakReferenceSupport();
            GenerateNewIdentity();
            AbstractFreespaceManager blockedFreespaceManager = AbstractFreespaceManager.CreateNew
                                                                   (this);

            InstallFreespaceManager(blockedFreespaceManager);
            InitNewClassCollection();
            InitializeEssentialClasses();
            _fileHeader.InitNew(this);
            blockedFreespaceManager.Start(0);
        }
 public virtual void TestMigrateTo()
 {
     for (int from = 0; from < fm.Length; from++)
     {
         for (int to = 0; to < fm.Length; to++)
         {
             if (to != from)
             {
                 Clear(fm[from]);
                 Clear(fm[to]);
                 AbstractFreespaceManager.Migrate(fm[from], fm[to]);
                 AssertSame(fm[from], fm[to]);
                 fm[from].Free(new Slot(5, 10));
                 fm[from].Free(new Slot(100, 5));
                 fm[from].Free(new Slot(140, 27));
                 AbstractFreespaceManager.Migrate(fm[from], fm[to]);
                 AssertSame(fm[from], fm[to]);
             }
         }
     }
 }