コード例 #1
0
        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);
        }
コード例 #2
0
ファイル: DataRowReader.cs プロジェクト: soroush01110011/MVP
 public Guid GetGuidValue(string columnName)
 {
     Guid typedValue = DataRowReader.GetGuidValue(this.Row, columnName);
     return typedValue;
 }