Example #1
0
        private ReplicationFolder GetReplicationFolder(ConfigReplicationFolder configReplicationFolder)
        {
            if (configReplicationFolder == null)
            {
                throw new ArgumentNullException("configReplicationFolder");
            }

            ReplicationFolder replicationFolder = null;

            IStorageMetadata replicationNodeMetadata = this.Engine.MetadataAdapter.GetStorage(configReplicationFolder.SourceNode);

            if (replicationNodeMetadata != null)
            {
                StorageNode replicationNode = this.GetStorage(replicationNodeMetadata.UniqueID);
                if (replicationNode == null)
                {
                    throw new Exception(string.Format("Невозможно найти узел репликации {0} для папки {1}",
                                                      configReplicationFolder.SourceNode,
                                                      configReplicationFolder.Url));
                }

                replicationFolder = this.GetReplicationFolder(replicationNode.UniqueID, configReplicationFolder.Url);
            }
            return(replicationFolder);
        }
        private IStorageTransferTask PutData(NSData data, IStorageMetadata metadata = null)
        {
            var wrapper = new StorageTransferTaskWrapper <StorageUploadTask, NativeStorageMetadata>();

            wrapper.TransferTask = _wrapped.PutData(data, metadata?.ToNative(), (x, e) => wrapper.CompletionHandler(x, e));
            return(wrapper);
        }
Example #3
0
        private void InitSchema()
        {
            object initConfig = ConfigurationManager.GetSection("StorageInitConfiguration");

            if (initConfig == null)
            {
                throw new Exception(string.Format("Не задана секция инициализации конфигурации хранилища"));
            }
            XmlNode initNode = (XmlNode)initConfig;

            string       currentStorageHost = null;
            XmlAttribute currentStorageAttr = initNode.Attributes["CurrentStorage"];

            if (currentStorageAttr != null)
            {
                currentStorageHost = currentStorageAttr.Value;
            }

            if (string.IsNullOrEmpty(currentStorageHost))
            {
                throw new Exception(string.Format("В настройках не задан адрес текущего узла хранилища."));
            }

            bool             requiredUpdate = true;
            IStorageMetadata currentStorage = this.MetadataAdapter.CurrentStorage;

            if (currentStorage == null)
            {
                currentStorage = this.MetadataAdapter.GetStorage(currentStorageHost);
            }
            else
            {
                //текущая нода есть в метаданных, проверяем соответствие хоста
                string metadataHost = currentStorage.Host;
                if (currentStorage.IsCurrent &&
                    !string.IsNullOrEmpty(metadataHost) &&
                    metadataHost.ToLower() == currentStorageHost.ToLower())
                {
                    requiredUpdate = false;
                }
            }

            if (requiredUpdate)
            {
                //нет ни текущей ноды, ни ноды с адресом из настройки
                if (currentStorage == null)
                {
                    //=> создаем текущую ноду
                    currentStorage = this.MetadataAdapter.CreateCurrentStorageNode(currentStorageHost);
                }
                else
                {
                    currentStorage.Host      = currentStorageHost.ToLower();
                    currentStorage.IsCurrent = true;
                }

                this.MetadataAdapter.SaveStorage(currentStorage);
            }
        }
Example #4
0
 public static NativeStorageMetadata ToNative(this IStorageMetadata @this)
 {
     return(new NativeStorageMetadata {
         ContentDisposition = @this.ContentDisposition,
         ContentEncoding = @this.ContentEncoding,
         ContentLanguage = @this.ContentLanguage,
         ContentType = @this.ContentType,
         CustomMetadata = @this.CustomMetadata?.ToNSDictionary()
     });
 }
Example #5
0
        public StorageNode(StorageEngine storage, IStorageMetadata metadata)
        {
            if (storage == null)
            {
                throw new ArgumentNullException("storage");
            }

            if (metadata == null)
            {
                throw new ArgumentNullException("metadata");
            }

            this.TypedStorage = storage;
            this.Metadata     = metadata;
        }
Example #6
0
        public void SaveStorage(IStorageMetadata storage)
        {
            if (storage == null)
            {
                throw new ArgumentNullException("storage");
            }

            this.Logger.WriteFormatMessage("SaveStorage: начало host: '{0}' isCurrent: '{1}'", storage.Host, storage.IsCurrent);

            StorageMetadata typedStorage = (StorageMetadata)storage;

            this.StorageAdapter.Update(typedStorage);

            this.Logger.WriteMessage("SaveStorage: конец.");
        }
Example #7
0
        public static NativeStorageMetadata ToNative(this IStorageMetadata @this)
        {
            var builder = new NativeStorageMetadata.Builder()
                          .SetCacheControl(@this.CacheControl)
                          .SetContentDisposition(@this.ContentDisposition)
                          .SetContentEncoding(@this.ContentEncoding)
                          .SetContentLanguage(@this.ContentLanguage)
                          .SetContentType(@this.ContentType);

            @this
            .CustomMetadata?
            .ToList()
            .ForEach(x => builder.SetCustomMetadata(x.Key, x.Value));

            return(builder.Build());
        }
Example #8
0
        internal ReplicationFolderMetadata(IFolderMetadata folder, IStorageMetadata storage)
        {
            if (folder == null)
            {
                throw new ArgumentNullException("folder");
            }

            if (storage == null)
            {
                throw new ArgumentNullException("storage");
            }

            this.SourceStorage = storage;
            this.Folder        = folder;
            this.StorageID     = storage.ID;
            this.FolderID      = folder.ID;
        }
Example #9
0
        private StorageNode EnsureNode(Guid uniqueID, string host, out bool justCreated)
        {
            if (uniqueID == Guid.Empty)
            {
                throw new ArgumentNullException("uniqueID");
            }

            justCreated = false;
            StorageNode savedNode = this.GetStorage(uniqueID);

            if (savedNode == null)
            {
                lock (_updateStorageLocker)
                {
                    savedNode = this.GetStorage(uniqueID);
                    if (savedNode == null)
                    {
                        //ноды нет в словаре, создаем
                        IStorageMetadata nodeMetadata = this.Engine.MetadataAdapter.CreateStorageNode(host, uniqueID);
                        nodeMetadata.LastAccessTime = DateTime.Now;
                        savedNode = new StorageNode(this.Engine, nodeMetadata);
                        this.Engine.MetadataAdapter.SaveStorage(nodeMetadata);

                        //добавляем в словарь
                        this.AddStorageNode(savedNode);
                        justCreated = true;

                        //после сохранения узла, может стать доступна настройка
                        //репликации с тим узлом
                        this.RebuildStorageReplicationFolders(savedNode);
                    }
                }
            }

            return(savedNode);
        }
Example #10
0
 public IStorageTransferTask PutBytes(byte[] bytes, IStorageMetadata metadata = null)
 {
     return(metadata == null
         ? _wrapped.PutBytes(bytes).ToAbstract()
         : _wrapped.PutBytes(bytes, metadata.ToNative()).ToAbstract());
 }
 public async Task <IStorageMetadata> UpdateMetadataAsync(IStorageMetadata metadata)
 {
     return((await _wrapped.UpdateMetadataAsync(metadata.ToNative())).ToAbstract());
 }
 public IStorageTransferTask PutStream(Stream stream, IStorageMetadata metadata = null)
 {
     return(PutData(NSData.FromStream(stream), metadata));
 }
 public IStorageTransferTask PutFile(string filePath, IStorageMetadata metadata = null)
 {
     return(PutData(NSData.FromStream(File.Open(filePath, FileMode.Open)), metadata));
 }
Example #14
0
 public IStorageTransferTask PutStream(Stream stream, IStorageMetadata metadata = null)
 {
     return(metadata == null
         ? _wrapped.PutStream(stream).ToAbstract()
         : _wrapped.PutStream(stream, metadata.ToNative()).ToAbstract());
 }
 public IStorageTransferTask PutBytes(byte[] bytes, IStorageMetadata metadata = null)
 {
     return(PutData(NSData.FromArray(bytes), metadata));
 }
Example #16
0
        /// <summary>
        /// Создает метаданные существующего файла.
        /// </summary>
        /// <param name="storageMetadata">Метаданные хранилища.</param>
        /// <param name="blobMetadata">Метаданные блоба.</param>
        /// <param name="folderMetadata">Метаданные папки.</param>
        /// <param name="fileHeader">Заголовок файла.</param>
        /// <param name="blobStartPosition">Начальная позиция файла в блобе.</param>
        /// <param name="blobEndPosition">Конечная позиция файла в блобе.</param>
        /// <returns></returns>
        public IBlobFileMetadata AddExistsFileVersion(IStorageMetadata storageMetadata, IBlobMetadata blobMetadata, IFolderMetadata folderMetadata, IFileHeader fileHeader, long blobStartPosition, long blobEndPosition)
        {
            if (storageMetadata == null)
            {
                throw new ArgumentNullException("storageMetadata");
            }

            if (blobMetadata == null)
            {
                throw new ArgumentNullException("blobMetadata");
            }

            if (folderMetadata == null)
            {
                throw new ArgumentNullException("folderMetadata");
            }

            if (fileHeader == null)
            {
                throw new ArgumentNullException("fileHeader");
            }

            if (blobStartPosition < 0)
            {
                throw new ArgumentNullException("blobStartPosition");
            }

            IBlobFileHeader blobHeader  = (IBlobFileHeader)((object)fileHeader);
            FileMetadata    file        = this.FileAdapter.GetFile(fileHeader.UniqueID, folderMetadata);
            bool            justCreated = false;

            if (file == null)
            {
                justCreated          = true;
                file                 = new FileMetadata(this.FileAdapter);
                file.UniqueID        = fileHeader.UniqueID;
                file.VersionUniqueID = fileHeader.VersionUniqueID;
                file.FolderID        = folderMetadata.ID;
                file.FolderMetadata  = folderMetadata;
                file.Name            = fileHeader.FileName;

                file.BlobID            = blobMetadata.ID;
                file.BlobStartPosition = blobStartPosition;
                file.BlobEndPosition   = blobEndPosition;
                file.Deleted           = false;
                file.Size         = blobHeader.ContentLength;
                file.TimeCreated  = fileHeader.TimeCreated;
                file.TimeModified = fileHeader.TimeCreated;

                this.FileAdapter.UpdateFileTransparent(file);
            }
            else
            {
                if (file.Versions.Any(x => x.UniqueID == fileHeader.VersionUniqueID))
                {
                    throw new Exception(String.Format("Версия с идентификатором [{0}] уже существует.", fileHeader.VersionUniqueID.ToString()));
                }
            }

            //создание версии файла
            FileVersionMetadata version = new FileVersionMetadata(file);

            version.UniqueID          = fileHeader.VersionUniqueID;
            version.BlobID            = blobMetadata.ID;
            version.BlobStartPosition = blobStartPosition;
            version.BlobEndPosition   = blobEndPosition;
            version.Size             = blobHeader.ContentLength;
            version.TimeCreated      = fileHeader.TimeCreated;
            version.CreatedStorageID = storageMetadata.ID;
            version.Name             = fileHeader.FileName;

            //сохранение версии
            this.FileAdapter.VersionAdapter.InsertVerion(file, version);
            file.ResetVersions();

            //обновление параметров существующего файла
            if (!justCreated)
            {
                bool fileUpdate = false;
                if (version.TimeCreated > file.TimeModified)
                {
                    file.TimeModified    = version.TimeCreated;
                    file.VersionUniqueID = version.UniqueID;
                    file.BlobID          = version.BlobID;
                    fileUpdate           = true;
                }

                if (version.TimeCreated < file.TimeCreated)
                {
                    file.TimeCreated = version.TimeCreated;
                    fileUpdate       = true;
                }

                //обновление файла
                if (fileUpdate)
                {
                    this.FileAdapter.UpdateFileTransparent(file);
                }
            }

            return(file);
        }
Example #17
0
        public IReplicationFolderMetadata CreateReplicationFolder(IFolderMetadata folder, IStorageMetadata targetStorage)
        {
            if (folder == null)
            {
                throw new ArgumentNullException("folder");
            }

            if (targetStorage == null)
            {
                throw new ArgumentNullException("targetStorage");
            }

            ReplicationFolderMetadata metadata = new ReplicationFolderMetadata(folder, targetStorage);

            return(metadata);
        }
Example #18
0
 public IStorageTransferTask PutFile(string filePath, IStorageMetadata metadata = null)
 {
     return(metadata == null
         ? _wrapped.PutFile(AndroidUri.FromFile(new File(filePath))).ToAbstract()
         : _wrapped.PutFile(AndroidUri.FromFile(new File(filePath)), metadata.ToNative()).ToAbstract());
 }
Example #19
0
        public IReplicationFolderMetadata GetReplicationFolder(IFolderMetadata folder, IStorageMetadata storage)
        {
            if (folder == null)
            {
                throw new ArgumentNullException("folder");
            }

            if (storage == null)
            {
                throw new ArgumentNullException("storage");
            }

            string condition = string.Format("[StorageID] = {0} AND [FolderID] = {1}",
                                             storage.ID,
                                             folder.ID);

            IReplicationFolderMetadata result = null;
            DBCollection <ReplicationFolderMetadata> replicationFolders = this.ReplicationFolderAdapter.GetReplicationFolders(condition);

            if (replicationFolders != null && replicationFolders.Count > 0)
            {
                result = replicationFolders[0];
            }

            return(result);
        }
Example #20
0
        /// <summary>
        /// Возвращает метаданные папки репликации. Если ее не существует, то создает ее.
        /// </summary>
        /// <param name="folder">Папка.</param>
        /// <param name="sourceStorage">Узел источник для репликации.</param>
        /// <returns></returns>
        public IReplicationFolderMetadata EnsureReplicationFolder(IFolderMetadata folder, IStorageMetadata sourceStorage)
        {
            if (folder == null)
            {
                throw new ArgumentNullException("folder");
            }

            if (sourceStorage == null)
            {
                throw new ArgumentNullException("sourceStorage");
            }

            IReplicationFolderMetadata replicationFolder = this.GetReplicationFolder(folder, sourceStorage);

            if (replicationFolder == null)
            {
                replicationFolder = new ReplicationFolderMetadata(folder, sourceStorage);
                this.SaveReplicationFolder(replicationFolder);
            }

            return(replicationFolder);
        }
Example #21
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);
        }