public virtual void Run() { if (!System.IO.File.Exists(m_options.Dbpath)) throw new Exception(string.Format("Database file does not exist: {0}", m_options.Dbpath)); using(var db = new LocalDeleteDatabase(m_options.Dbpath, true)) using(var tr = db.BeginTransaction()) { m_result.SetDatabase(db); Utility.UpdateOptionsFromDb(db, m_options); Utility.VerifyParameters(db, m_options); var changed = DoCompact(db, false, tr); if (changed && m_options.UploadVerificationFile) FilelistProcessor.UploadVerificationFile(m_backendurl, m_options, m_result.BackendWriter, db, null); if (!m_options.Dryrun) { using(new Logging.Timer("CommitCompact")) tr.Commit(); if (changed) { db.WriteResults(); db.Vacuum(); } } else tr.Rollback(); } }
private IEnumerable<KeyValuePair<string, long>> DoDelete(LocalDeleteDatabase db, BackendManager backend, IEnumerable<IRemoteVolume> deleteableVolumes, ref System.Data.IDbTransaction transaction) { // Mark all volumes as disposable foreach(var f in deleteableVolumes) db.UpdateRemoteVolume(f.Name, RemoteVolumeState.Deleting, f.Size, f.Hash, transaction); // Before we commit the current state, make sure the backend has caught up backend.WaitForEmpty(db, transaction); if (!m_options.Dryrun) { transaction.Commit(); transaction = db.BeginTransaction(); } return PerformDelete(backend, db.GetDeletableVolumes(deleteableVolumes, transaction)); }