public void Delete(string fileName, StorageActionsAccessor actionsAccessor = null)
		{
			NameValueCollection metadata = null;

			Action<StorageActionsAccessor> delete = accessor =>
				                                        {
					                                        accessor.DeleteConfig(
						                                        RavenFileNameHelper.ConflictConfigNameForFile(fileName));
					                                        metadata = accessor.GetFile(fileName, 0, 0).Metadata;
					                                        metadata.Remove(SynchronizationConstants.RavenSynchronizationConflict);
					                                        metadata.Remove(
						                                        SynchronizationConstants.RavenSynchronizationConflictResolution);
					                                        accessor.UpdateFileMetadata(fileName, metadata);
				                                        };

			if (actionsAccessor != null)
			{
				delete(actionsAccessor);
			}
			else
			{
				storage.Batch(delete);
			}

			if (metadata != null)
			{
				index.Index(fileName, metadata);
			}
		}
		private void SaveSynchronizationSourceInformation(ServerInfo sourceServer, Guid lastSourceEtag,
		                                                  StorageActionsAccessor accessor)
		{
			var lastSynchronizationInformation = GetLastSynchronization(sourceServer.Id, accessor);
			if (Buffers.Compare(lastSynchronizationInformation.LastSourceFileEtag.ToByteArray(), lastSourceEtag.ToByteArray()) >
			    0)
			{
				return;
			}

			var synchronizationSourceInfo = new SourceSynchronizationInformation
				                                {
					                                LastSourceFileEtag = lastSourceEtag,
					                                SourceServerUrl = sourceServer.Url,
					                                DestinationServerId = Storage.Id
				                                };

			var key = SynchronizationConstants.RavenSynchronizationSourcesBasePath + "/" + sourceServer.Id;

			accessor.SetConfig(key, synchronizationSourceInfo.AsConfig());

			Log.Debug("Saved last synchronized file ETag {0} from {1} ({2})", lastSourceEtag, sourceServer.Url, sourceServer.Id);
		}
		private SourceSynchronizationInformation GetLastSynchronization(Guid from, StorageActionsAccessor accessor)
		{
			SourceSynchronizationInformation info;
			try
			{
				info =
					accessor.GetConfig(SynchronizationConstants.RavenSynchronizationSourcesBasePath + "/" + from).AsObject
						<SourceSynchronizationInformation>();
			}
			catch (FileNotFoundException)
			{
				info = new SourceSynchronizationInformation
					       {
						       LastSourceFileEtag = Guid.Empty,
						       DestinationServerId = Storage.Id
					       };
			}

			return info;
		}
		private void DeleteSynchronizationReport(string fileName, StorageActionsAccessor accessor)
		{
			var name = RavenFileNameHelper.SyncResultNameForFile(fileName);
			accessor.DeleteConfig(name);
			Search.Delete(name);
		}
		private void SaveSynchronizationReport(string fileName, StorageActionsAccessor accessor, SynchronizationReport report)
		{
			var name = RavenFileNameHelper.SyncResultNameForFile(fileName);
			accessor.SetConfig(name, report.AsConfig());
		}
		private void StartupProceed(string fileName, StorageActionsAccessor accessor)
		{
			// remove previous SyncResult
			DeleteSynchronizationReport(fileName, accessor);

			// remove previous .downloading file
			StorageOperationsTask.IndicateFileToDelete(RavenFileNameHelper.DownloadingFileName(fileName));
		}
		private static SignatureLevels GetSignatureLevel(string sigName, StorageActionsAccessor accessor)
		{
			var fileNameAndLevel = ExtractFileNameAndLevel(sigName);
			var signatureLevels = accessor.GetSignatures(fileNameAndLevel.FileName);
			return signatureLevels.FirstOrDefault(item => item.Level == fileNameAndLevel.Level);
		}
		private void ExecuteBatch(Action<StorageActionsAccessor> action)
		{
			if (current.Value != null)
			{
				action(current.Value);
				return;
			}

			try
			{
				using (var storageActionsAccessor = new StorageActionsAccessor(tableColumnsCache, instance, database))
				{
					current.Value = storageActionsAccessor;

					action(storageActionsAccessor);
					storageActionsAccessor.Commit();
				}
			}
			finally
			{
				current.Value = null;
			}
		}