예제 #1
0
        /// <summary>
        /// Get Document
        /// </summary>
        /// <param name="uow">Uow</param>
        /// <param name="request">Request</param>
        /// <param name="document">Document</param>
        /// <returns>Document Id</returns>
        private int GetDocument(IFlowDocsUnitOfWork uow, DownloadDocumentRequest request, ref Document document)
        {
            var docs = from d in uow.Documents.AsQueryable()
                       where d.OidDocument == request.OidDocument
                       orderby d.Version descending
                       select d;

            Document        doc        = docs.FirstOrDefault();
            List <Document> listOfDocs = new List <Document>();

            while (doc != null)
            {
                listOfDocs.Add(doc);
                doc = doc.DocumentPrevious;
            }

            if (request.Mode == DocumentDownloadMode.SpecifiedVersion)
            {
                doc = listOfDocs.Where(d => d.Version == request.Version).FirstOrDefault();
            }
            if (doc == null || request.Mode == DocumentDownloadMode.LastVersion)
            {
                doc = docs.First();
            }

            var dbId = uow.Attachments.First(a => a.DocumentId == doc.DocumentId);

            document = doc;
            return(dbId.AttachmentId);
        }
예제 #2
0
        /// <summary>
        /// Document Infos
        /// </summary>
        /// <param name="uow">FlowDocsUnitOfWork</param>
        /// <param name="request">Request</param>
        /// <param name="response">Response</param>
        private void DocumentInfos(IFlowDocsUnitOfWork uow, DocumentInfoRequest request, ref DocumentInfoResponse response)
        {
            var docs = new List <DocumentInfo>();

            if (request.OidDocuments != null)
            {
                foreach (var doc in request.OidDocuments)
                {
                    var found = uow.Documents.FirstOrDefault(d => d.OidDocument == doc);
                    if (found != null)
                    {
                        docs.Add(new DocumentInfo
                        {
                            DocumentName = found.DocumentName,
                            Description  = found.Description,
                            MimeType     = found.MimeType,
                            OidDocument  = found.OidDocument,
                            Owner        = found.Owner
                        });
                    }
                }
            }

            response = new DocumentInfoResponse
            {
                DocumentInfos = docs.ToArray()
            };
        }
예제 #3
0
        /// <summary>
        /// Upload Chunk
        /// </summary>
        /// <param name="uow">Uow</param>
        /// <param name="oid">Oid</param>
        /// <param name="request">Request</param>
        private void UploadChunk(IFlowDocsUnitOfWork uow, Guid oid, UploadDocumentRequest request)
        {
            var dbId = uow.Attachments.FirstOrDefault(a => a.OidDocument == oid);

            int identity = request.ChunkNumber == 0 ? -1 : dbId.AttachmentId;

            CheckHash(uow, oid, request);

            SqlServerBlobStream blob = null;

            try
            {
                blob = new SqlServerBlobStream(
                    _provider.ConnectionString, _provider.TableName, _provider.DataColumnName, _provider.PartialFlagColumnName,
                    _provider.FileNameColumnName, request.DocumentName, _provider.MIMETypeColumnName, "",
                    _provider.CreateProcedure, _provider.OpenProcedure, _provider.WriteProcedure, _provider.ReadProcedure, _provider.CleanupProcedure, _provider.RenameProcedure, _provider.StoreHashProcedure, _provider.DeleteProcedure,
                    identity);

                blob.Seek(0, SeekOrigin.End);
                blob.Write(request.DataField, 0, request.DataField.Length);
            }
            finally
            {
                if (blob != null)
                {
                    blob.Close();
                    //blob.Dispose();
                }
            }

            UpdateDbForUpload(uow, oid, request, identity, blob.Identity);
        }
예제 #4
0
        /// <summary>
        /// Download Chunk
        /// </summary>
        /// <param name="uow">Uow</param>
        /// <param name="request">Request</param>
        /// <param name="response">Response</param>
        private void DownloadChunk(IFlowDocsUnitOfWork uow, DownloadDocumentRequest request, ref DownloadDocumentResponse response)
        {
            Document doc      = null;
            int      identity = 0;

            identity = GetDocument(uow, request, ref doc);

            response = new DownloadDocumentResponse();
            response.DocumentName = doc.DocumentName;
            response.Version      = doc.Version;
            response.Description  = doc.Description;
            response.Owner        = doc.Owner;
            response.Path         = doc.Path;
            response.MimeType     = doc.MimeType;
            response.FileSize     = doc.FileSize;

            SqlServerBlobStream blob = null;

            try
            {
                if (_provider.OpenProcedure != null && _provider.ReadProcedure != null)
                {
                    blob = new SqlServerBlobStream(
                        _provider.ConnectionString, identity, _provider.OpenProcedure, _provider.ReadProcedure, FileAccess.Read);
                }
                else
                {
                    blob = new SqlServerBlobStream(
                        _provider.ConnectionString, _provider.TableName, _provider.DataColumnName, identity,
                        _provider.FileNameColumnName, _provider.MIMETypeColumnName, FileAccess.Read);
                }

                blob.Seek(request.ChunkNumber * request.ChunkSize, SeekOrigin.Begin);
                response.DataField   = new byte[request.ChunkSize];
                response.ChunkSize   = blob.Read(response.DataField, 0, request.ChunkSize);
                response.ChunkNumber = request.ChunkNumber;
                response.ChunkTotal  = (int)Math.Ceiling((decimal)blob.Length / request.ChunkSize);
                response.FileHash    = Md5Hash.CreateMd5Hash(response.DataField);
            }
            finally
            {
                if (blob != null)
                {
                    blob.Close();
                    //blob.Dispose();
                }
            }
        }
예제 #5
0
        /// <summary>
        /// Check Hash
        /// </summary>
        /// <param name="uow">Uow</param>
        /// <param name="oid">Oid</param>
        /// <param name="request">Request</param>
        private void CheckHash(IFlowDocsUnitOfWork uow, Guid oid, UploadDocumentRequest request)
        {
            var hash = Md5Hash.CreateMd5Hash(request.DataField);

            if (hash != request.FileHash)
            {
                var attachs = uow.Attachments.Find(a => a.OidDocument == oid);
                foreach (var a in attachs)
                {
                    uow.Attachments.Delete(a);
                }

                uow.Commit();
                throw new Exception(Flow.Library.Properties.Resources.ER_HASH);
            }
        }
예제 #6
0
        /// <summary>
        /// Update Db For Upload
        /// </summary>
        /// <param name="uow">Uow</param>
        /// <param name="oid">Oid</param>
        /// <param name="request">Request</param>
        /// <param name="DbId">DbId</param>
        /// <param name="blobId">blobId</param>
        private void UpdateDbForUpload(IFlowDocsUnitOfWork uow, Guid oid, UploadDocumentRequest request, int DbId, int blobId)
        {
            var newAttachment = uow.Attachments.FirstOrDefault(a => a.AttachmentId == DbId || a.AttachmentId == blobId);

            if (request.ChunkNumber == 0)
            {
                if (newAttachment != null)
                {
                    newAttachment.OidDocument = oid;
                    newAttachment.DateCreated = DateTime.Now;
                }
            }

            if (IsLastChunk(request))
            {
                var prevDoc = ProcessUploadMode(uow, request);

                var newDocument = new Document
                {
                    DateCreated      = DateTime.Now,
                    DateLastUpdated  = DateTime.Now,
                    Description      = request.Description,
                    DocumentName     = request.DocumentName,
                    OidDocument      = oid,
                    Owner            = request.Owner,
                    Path             = request.Path,
                    Version          = request.Version,
                    MimeType         = request.MimeType,
                    FileSize         = request.FileSize,
                    DocumentPrevious = prevDoc
                };

                uow.Documents.Insert(newDocument);
                if (newAttachment != null)
                {
                    newAttachment.Document = newDocument;
                }
            }

            try
            {
                uow.Commit();
            }
            catch (Exception ex)
            {
            }
        }
예제 #7
0
        /// <summary>
        /// Process Upload Mode
        /// </summary>
        /// <param name="uow">Uow</param>
        /// <param name="request">Request</param>
        /// <returns>Document</returns>
        private Document ProcessUploadMode(IFlowDocsUnitOfWork uow, UploadDocumentRequest request)
        {
            Document document = null;

            // If don't have the previous oid check by name and path
            if (request.PreviousOid == Guid.Empty)
            {
                var documents = uow.Documents.Find(d => d.DocumentName == request.DocumentName && d.Path == request.Path).OrderByDescending(d => d.Version);
                if (documents.Count() > 0)
                {
                    document            = documents.First();
                    request.PreviousOid = document.OidDocument;
                }
            }
            else
            {
                document = uow.Documents.FirstOrDefault(d => d.OidDocument == request.PreviousOid);
            }

            if (request.Mode == DocumentUploadMode.Overwrite)
            {
                if (document != null)
                {
                    uow.Documents.Delete(document);
                }

                document        = null;
                request.Version = 1;
            }
            else if (request.Mode == DocumentUploadMode.NewVersion)
            {
                request.Version = document == null ? 1 : document.Version + 1;
            }

            return(document);
        }
예제 #8
0
 protected FlowDocsOperationsBase(IFlowDocsUnitOfWork flowDocsUnitOfWork)
 {
     FlowDocsUnitOfWork = flowDocsUnitOfWork;
 }
예제 #9
0
 public void MyTestInitialize()
 {
     ctx = new FlowDocsEntities();
     adp = new FlowDocsContextAdapter(ctx);
     uow = new FlowDocsUnitOfWork(adp);
 }
예제 #10
0
 public FlowDocsOperationsDatabase(IFlowDocsUnitOfWork flowDocsUnitOfWork, UploadStorageProvider provider)
     : base(flowDocsUnitOfWork)
 {
     _provider = provider as SqlServerUploadStorageProvider;
 }