public Tuple <Guid, Guid>[] GetReplicationFiles(IStorageMetadata requestNode, IFolderMetadata folder, DateTime from) { if (requestNode == null) { throw new ArgumentNullException("requestNode"); } if (folder == null) { throw new ArgumentNullException("folder"); } List <Tuple <Guid, Guid> > files = new List <Tuple <Guid, Guid> >(); string folderDBName = folder.Url.Trim('/').Replace('/', '_'); string versionsPostfix = "Versions"; string searchPattern = string.Format("Files_{0}_%_{1}", folderDBName, versionsPostfix); Dictionary <string, bool> partitions = this.GetExistsTables(searchPattern); List <FileVersionData> allVersions = new List <FileVersionData>(); //идентификатор узла хранилища, который запрашивает файлы //т.е. для текущего узла, на который пришел запрос он будет являтся //узлом назначения для отправки файлов. int targetStorageID = requestNode.ID; if (partitions != null && partitions.Count > 0) { int n = MetadataConsts.Replication.BatchSize / partitions.Count; //1 - получить TOP(n) файлов из каждого partition string partitionsQuery = string.Empty; foreach (string partition in partitions.Keys) { if (!string.IsNullOrEmpty(partitionsQuery)) { partitionsQuery += string.Format(" {0}UNION ALL{0} ", Environment.NewLine); } string filesTableName = partition.TrimEnd(string.Format("_{0}", versionsPostfix).ToCharArray()); partitionsQuery += string.Format(@"SELECT TOP {0} f.UniqueID as FID, v.UniqueID as VID, v.TimeCreated FROM [{1}] v WITH(NOLOCK) INNER JOIN [{2}] f ON f.ID = v.FileID AND v.CreatedStorageID <> {3} AND v.TimeCreated > @startDate", n, partition, filesTableName, targetStorageID); } if (!string.IsNullOrEmpty(partitionsQuery)) { string resultQuery = string.Format("WITH AllPartitions AS ({0}) SELECT FID, VID, TimeCreated FROM AllPartitions ORDER BY TimeCreated ASC", partitionsQuery); DateTime startDate; if (from == DateTime.MinValue) { //пришла пустая дата //выдаем минимальную дату ms sql startDate = new DateTime(1753, 1, 1, 0, 0, 0, DateTimeKind.Utc); } else { //пришла дата startDate = new DateTime(from.Year, from.Month, from.Day, from.Hour, from.Minute, from.Second, 0, DateTimeKind.Utc); } SqlParameter startDateParam = new SqlParameter("startDate", startDate); DataTable resultTable = this.DataAdapter.GetDataTable(resultQuery, startDateParam); if (resultTable != null && resultTable.Rows != null) { using (resultTable) { foreach (DataRow row in resultTable.Rows) { //FID, VID, TimeCreated Guid fileID = DataRowReader.GetGuidValue(row, "FID"); if (fileID == Guid.Empty) { throw new Exception(string.Format("Не удалось получить идентификатор файла")); } Guid versionID = DataRowReader.GetGuidValue(row, "VID"); if (versionID == Guid.Empty) { throw new Exception(string.Format("Не удалось получить идентификатор версии файла")); } DateTime versionTime = DataRowReader.GetDateTimeValue(row, "TimeCreated"); if (versionTime == DateTime.MinValue) { throw new Exception(string.Format("Не удалось получить дату создания версии файла")); } FileVersionData fileVersionData = new FileVersionData(fileID, versionID, versionTime); allVersions.Add(fileVersionData); } } } //сортируем и формируем кортеж идентификаторов if (allVersions.Count > 1) { var sortedVersions = allVersions.OrderBy(v => v.VersionTime); foreach (FileVersionData version in allVersions) { files.Add(Tuple.Create <Guid, Guid>(version.FileID, version.VersionID)); } } } } Tuple <Guid, Guid>[] filesToReplication = files.ToArray(); return(filesToReplication); }
public Guid GetGuidValue(string columnName) { Guid typedValue = DataRowReader.GetGuidValue(this.Row, columnName); return typedValue; }