private RecordLockedData CreateLockData(OpenFileItemData itemParam, ref LogicFileInfoData logicFileInfo, Guid userID, DbTransaction trans)
        {
            RecordLockedData result     = null;
            FileAccess       access     = itemParam.FileAccess;
            FileMode         mode       = itemParam.FileMode;
            long             fileLength = -1;

            if (mode == FileMode.Truncate)
            {
                access    |= FileAccess.Write;
                fileLength = 0;
            }
            bool canWrite = (access & FileAccess.Write) != 0;

            if (canWrite)
            {
                if (logicFileInfo == null)
                {
                    logicFileInfo = CreateNewFile(itemParam, userID, trans);
                }
                else
                {
                    logicFileInfo = UpdateFile(itemParam, logicFileInfo, fileLength, userID, trans);
                }
                if (logicFileInfo != null)
                {
                    result = Lock(logicFileInfo.ID, userID);
                }
            }

            return(result);
        }
        private LogicFileInfoItemData CreateFetchItemParam(OpenFileItemData itemParam)
        {
            LogicFileInfoItemData result = new LogicFileInfoItemData();

            result.ID      = itemParam.FileID;
            result.Version = itemParam.Version;
            result.WithPhysicalFileInfo = true;
            return(result);
        }
        protected OpenFileResultItemData OpenFileItem(OpenFileItemData itemParam, Guid userID, DbTransaction trans)
        {
            OpenFileResultItemData item          = new OpenFileResultItemData();
            LogicFileInfoData      logicFileInfo = this.DataProvider.FetchFileInfo(CreateFetchItemParam(itemParam), trans);

            item.LockedData    = this.CreateLockData(itemParam, ref logicFileInfo, userID, trans);
            item.LogicFileInfo = logicFileInfo;
            return(item);
        }
        private LogicFileInfoData UpdateFile(OpenFileItemData itemParam, LogicFileInfoData logicFileInfo, long fileLength, Guid userID, DbTransaction trans)
        {
            LogicFileInfoData result     = logicFileInfo;
            UpdateMode        updateMode = itemParam.UpdateMode;
            FileMode          mode       = itemParam.FileMode;
            long length = 0;

            if (updateMode == UpdateMode.None)
            {
                updateMode = UpdateMode.Override;
            }
            if (updateMode == UpdateMode.NewVersion)
            {
                PhysicalFileInfoData oldFileData = logicFileInfo.PhysicalFileInfos[logicFileInfo.PhysicalFileInfos.Count - 1];
                Guid physcicalFileID             = CombineGuid.NewComboGuid();
                switch (mode)
                {
                case FileMode.Truncate:
                case FileMode.Create:
                    FileStorageManager.SetFileLength(this.DataProvider, physcicalFileID, result.LogicFileExt, 0);
                    break;

                default:
                    length = FileStorageManager.CopyFile(this.DataProvider, oldFileData.ID, physcicalFileID, logicFileInfo.LogicFileExt);
                    break;
                }
                PhysicalFileInfoData fileData = new PhysicalFileInfoData();
                fileData.ID          = physcicalFileID;
                fileData.LogicFileID = result.ID;
                fileData.FileLength  = length;
                fileData.Version     = GetFileVersion(logicFileInfo, trans);
                fileData.StoreModeID = FileStorageManager.GetCurrentStoreModeID(this.DataProvider);
                this.DataProvider.CreatePhysicalFileInfo(fileData, trans);
                result.PhysicalFileInfos.Add(fileData);
                result.LatestPhysicalFileID = physcicalFileID;
                this.DataProvider.UpdateFileInfo(logicFileInfo, trans);
            }
            else if (updateMode == UpdateMode.Override)
            {
                switch (mode)
                {
                case FileMode.Truncate:
                case FileMode.Create:
                    FileStorageManager.SetFileLength(this.DataProvider, logicFileInfo.LatestPhysicalFileID, result.LogicFileExt, 0);
                    break;
                }
            }
            return(result);
        }
        private LogicFileInfoData CreateNewFile(OpenFileItemData itemParam, Guid userID, DbTransaction trans)
        {
            LogicFileInfoData result = new LogicFileInfoData();
            Guid physcicalFileID     = CombineGuid.NewComboGuid();

            if (itemParam.FileID != Guid.Empty)
            {
                result.ID = itemParam.FileID;
            }
            else
            {
                result.ID = CombineGuid.NewComboGuid();
            }
            if (!string.IsNullOrEmpty(itemParam.ClientFileName))
            {
                result.LogicFileName = Path.GetFileName(itemParam.ClientFileName);
                result.LogicFileExt  = Path.GetExtension(itemParam.ClientFileName);
            }
            result.LogicFileStatus      = LogicFileStatus.Normal;
            result.IsReadOnly           = false;
            result.LatestPhysicalFileID = physcicalFileID;
            result.CurrentUserID        = userID;
            this.DataProvider.CreateFileInfo(result, trans);

            PhysicalFileInfoData fileData = new PhysicalFileInfoData();

            fileData.ID          = physcicalFileID;
            fileData.LogicFileID = result.ID;
            fileData.FileLength  = 0;
            fileData.Version     = 1;
            fileData.StoreModeID = FileStorageManager.GetCurrentStoreModeID(this.DataProvider);
            this.DataProvider.CreatePhysicalFileInfo(fileData, trans);
            result.PhysicalFileInfos.Add(fileData);
            FileStorageManager.CreateNewFile(this.DataProvider, physcicalFileID, result.LogicFileExt);
            return(result);
        }