Exemplo n.º 1
0
 public void UpdateFromEntry(EntryInfo entity)
 {
     ID = entity.ID;
     FileUrl = entity.FileUrl;
     FileLength = entity.FileLength;
     HasLongFileName = entity.HasLongFileName;
 }
Exemplo n.º 2
0
 public void UpdateFromEntry(EntryInfo entity)
 {
     ID            = entity.ID;
     FileName      = Path.GetFileNameWithoutExtension(entity.FileName);
     FileExtension = Path.GetExtension(entity.FileName).Replace(".", "");
     FileLength    = entity.FileLength;
 }
Exemplo n.º 3
0
        /// <summary>
        /// Store a stream inside database
        /// </summary>
        /// <param name="fileName">Just a name of file, to get future reference (eg: MyPhoto.jpg)</param>
        /// <param name="input">Stream thats contains the file</param>
        /// <returns>EntryInfo with information store</returns>
        public EntryInfo Store(string fileName, Stream input)
        {
            var entry = new EntryInfo(fileName);

            _engine.Write(entry, input);
            return(entry);
        }
Exemplo n.º 4
0
 public static void ReadFileContent(string dbFileName, EntryInfo entry, Stream output)
 {
     using (var db = new FileDB(dbFileName, FileAccess.Read))
     {
         db.ReadContent(entry, output);
     }
 }
Exemplo n.º 5
0
 public void UpdateFromEntry(EntryInfo entity)
 {
     ID              = entity.ID;
     FileUrl         = entity.FileUrl;
     FileLength      = entity.FileLength;
     HasLongFileName = entity.HasLongFileName;
 }
Exemplo n.º 6
0
 public void UpdateFromEntry(EntryInfo entity)
 {
     ID = entity.ID;
     FileName = Path.GetFileNameWithoutExtension(entity.FileName);
     FileExtension = Path.GetExtension(entity.FileName).Replace(".", "");
     FileLength = entity.FileLength;
 }
Exemplo n.º 7
0
        public static IndexNode BinaryInsert(EntryInfo target, IndexNode baseNode, Engine engine)
        {
            var dif = baseNode.ID.CompareTo(target.ID);

            if (dif == 1) // > Maior (Right)
            {
                if (baseNode.Right.IsEmpty)
                {
                    return(BinaryInsertNode(baseNode.Right, baseNode, target, engine));
                }
                else
                {
                    return(BinaryInsert(target, GetChildIndexNode(baseNode.Right, engine), engine));
                }
            }
            else if (dif == -1) // < Menor (Left)
            {
                if (baseNode.Left.IsEmpty)
                {
                    return(BinaryInsertNode(baseNode.Left, baseNode, target, engine));
                }
                else
                {
                    return(BinaryInsert(target, GetChildIndexNode(baseNode.Left, engine), engine));
                }
            }
            else
            {
                throw new FileDBException("Same GUID?!?");
            }
        }
Exemplo n.º 8
0
        public static void ReadFile(IndexNode node, EntryInfo entry, Stream stream, Engine engine)
        {
            var dataPage         = PageFactory.GetDataPage(node.DataPageID, engine.Reader, false);
            int metaDataStartPos = 0;
            int metaDataLength   = entry.FileMetadataLength;
            int dataStartPos     = metaDataStartPos + metaDataLength;

            int curReadPos = 0;

            if (dataPage != null && entry.FileMetadataLength > 0)
            {
                //first round
                //read file meta data
                while (curReadPos < metaDataLength)
                {
                    //1.marker
                    byte marker = ReadByte(dataPage.DataBlock, curReadPos, out curReadPos);
                    switch (marker)
                    {
                    case 1:    //date time
                        long binaryTime = ReadInt64(dataPage.DataBlock, curReadPos, out curReadPos);
                        entry.FileDateTime = DateTime.FromBinary(binaryTime);
                        break;

                    case 2:
                        //long filename
                        int    nameLen    = (int)ReadUInt16(dataPage.DataBlock, curReadPos, out curReadPos);
                        byte[] nameBuffer = new byte[nameLen];
                        Array.Copy(dataPage.DataBlock, curReadPos, nameBuffer, 0, nameLen);
                        entry.FileUrl = System.Text.Encoding.UTF8.GetString(nameBuffer);
                        curReadPos   += nameLen;
                        break;

                    default:
                        throw new NotSupportedException();
                    }
                }
            }
            //-----------------------------------
            //data part
            int toReadLen = dataPage.DataBlockLength - curReadPos;

            while (dataPage != null)
            {
                stream.Write(dataPage.DataBlock, curReadPos, toReadLen);
                if (dataPage.NextPageID == uint.MaxValue)
                {
                    dataPage = null;
                }
                else
                {
                    dataPage = PageFactory.GetDataPage(dataPage.NextPageID, engine.Reader, false);
                    //reset
                    curReadPos = 0;
                    toReadLen  = dataPage.DataBlockLength;
                }
            }
        }
Exemplo n.º 9
0
 public static EntryInfo Store(string dbFileName, string fileName, byte[] inputBuffer)
 {
     using (MemoryStream ms = new MemoryStream(inputBuffer))
         using (var db = new FileDB(dbFileName, FileAccess.ReadWrite))
         {
             EntryInfo en = db.Store(fileName, ms);
             ms.Close();
             return(en);
         }
 }
Exemplo n.º 10
0
        internal FileDBStream(Engine engine, Guid id)
        {
            _engine = engine;

            var indexNode = _engine.Search(id);
            if (indexNode != null)
            {
                _streamLength = indexNode.FileLength;
                _currentPage = PageFactory.GetDataPage(indexNode.DataPageID, engine.Reader, false);
                _info = new EntryInfo(indexNode);
            }
        }
Exemplo n.º 11
0
        void FillMetadata(EntryInfo entry)
        {
            // Search from index node
            var indexNode = Search(entry.ID);

            // If index node is null, not found the guid
            if (indexNode == null)
            {
                return;
            }
            // Read data from the index pointer to stream
            DataFactory.ReadFileMetadata(indexNode, entry, this);
        }
Exemplo n.º 12
0
        internal FileDBStream(Engine engine, Guid id)
        {
            _engine = engine;

            var indexNode = _engine.Search(id);

            if (indexNode != null)
            {
                _streamLength = indexNode.FileLength;
                _currentPage  = PageFactory.GetDataPage(indexNode.DataPageID, engine.Reader, false);
                _info         = new EntryInfo(indexNode);
            }
        }
Exemplo n.º 13
0
        public void ReadContent(EntryInfo entry, Stream stream)
        {
            // Search from index node
            var indexNode = Search(entry.ID);

            // If index node is null, not found the guid
            if (indexNode == null)
            {
                return;
            }


            // Create a entry based on index node

            // Read data from the index pointer to stream
            DataFactory.ReadOnlyFileContent(indexNode, entry, stream, this);
        }
Exemplo n.º 14
0
        public EntryInfo Read(Guid id, Stream stream)
        {
            // Search from index node
            var indexNode = Search(id);

            // If index node is null, not found the guid
            if (indexNode == null)
            {
                return(null);
            }

            // Create a entry based on index node
            EntryInfo entry = new EntryInfo(indexNode);

            // Read data from the index pointer to stream
            DataFactory.ReadFile(indexNode, stream, this);

            return(entry);
        }
Exemplo n.º 15
0
        private static IndexNode BinaryInsertNode(IndexLink baseLink, IndexNode baseNode, EntryInfo entry, Engine engine)
        {
            // Must insert my new nodo
            var pageIndex = engine.GetFreeIndexPage();
            var newNode = pageIndex.Nodes[pageIndex.NodeIndex];

            baseLink.PageID = pageIndex.PageID;
            baseLink.Index = pageIndex.NodeIndex;

            newNode.UpdateFromEntry(entry);
            newNode.DataPageID = DataFactory.GetStartDataPageID(engine);

            if (pageIndex.PageID != baseNode.IndexPage.PageID)
                engine.CacheIndexPage.AddPage(baseNode.IndexPage, true);

            engine.CacheIndexPage.AddPage(pageIndex, true);

            return newNode;
        }
Exemplo n.º 16
0
        // Implement file physic storage
        public void Write(EntryInfo entry, Stream stream)
        {
            // Take the first index page
            IndexNode rootIndexNode = IndexFactory.GetRootIndexNode(this);

            // Search and insert the index
            var indexNode = IndexFactory.BinaryInsert(entry, rootIndexNode, this);

            // In this moment, the index are ready and saved. I use to add the file
            DataFactory.InsertFile(indexNode, stream, this);

            // Update entry information with file length (I know file length only after read all)
            entry.FileLength = indexNode.FileLength;

            // Only after insert all stream file I confirm that index node is valid
            indexNode.IsDeleted = false;

            // Mask header as dirty for save on dispose
            Header.IsDirty = true;
        }
Exemplo n.º 17
0
        // Implement file physic storage
        public void Write(EntryInfo entry, Stream stream)
        {
            // Take the first index page
            IndexNode rootIndexNode = IndexFactory.GetRootIndexNode(this);

            // Search and insert the index
            var indexNode = IndexFactory.BinaryInsert(entry, rootIndexNode, this);

            // In this moment, the index are ready and saved. I use to add the file
            DataFactory.InsertFile(indexNode, entry, stream, this);

            // Update entry information with file length (I know file length only after read all)
            entry.FileMetadataLength = indexNode.FileMetaDataLength;
            entry.FileLength = indexNode.FileLength;


            // Only after insert all stream file I confirm that index node is valid
            indexNode.IsDeleted = false;

            // Mask header as dirty for save on dispose
            Header.IsDirty = true;
        }
Exemplo n.º 18
0
        public static IndexNode BinaryInsert(EntryInfo target, IndexNode baseNode, Engine engine)
        {
            var dif = baseNode.ID.CompareTo(target.ID);

            if (dif == 1) // > Maior (Right)
            {
                if (baseNode.Right.IsEmpty)
                    return BinaryInsertNode(baseNode.Right, baseNode, target, engine);
                else
                    return BinaryInsert(target, GetChildIndexNode(baseNode.Right, engine), engine);
            }
            else if (dif == -1) // < Menor (Left)
            {
                if (baseNode.Left.IsEmpty)
                    return BinaryInsertNode(baseNode.Left, baseNode, target, engine);
                else
                    return BinaryInsert(target, GetChildIndexNode(baseNode.Left, engine), engine);
            }
            else
            {
                throw new FileDBException("Same GUID?!?");
            }
        }
Exemplo n.º 19
0
 /// <summary>
 /// Store a stream inside database
 /// </summary>
 /// <param name="fileName">Just a name of file, to get future reference (eg: MyPhoto.jpg)</param>
 /// <param name="input">Stream thats contains the file</param>
 /// <returns>EntryInfo with information store</returns>
 public EntryInfo Store(string fileName, Stream input)
 {
     var entry = new EntryInfo(fileName);
     _engine.Write(entry, input);
     return entry;
 }
Exemplo n.º 20
0
        public static void InsertFile(IndexNode node, EntryInfo enInfo, Stream stream, Engine engine)
        {
            var buffer = new byte[DataPage.DATA_PER_PAGE];

            int      dataFreeInPage = DataPage.DATA_PER_PAGE;
            int      writePos       = 0;
            int      read           = 0;
            DataPage dataPage       = engine.GetDataPage(node.DataPageID);

            if (!dataPage.IsEmpty) // This is never to happend!!
            {
                throw new FileDBException("Page {0} is not empty", dataPage.PageID);
            }
            //-----------------------
            //write metadata
            //1. datetime of file
            DateTime filedtm = enInfo.FileDateTime;

            //--------------------------
            writePos = WriteByte(dataPage.DataBlock, 0, 1);                          //marker - 1
            writePos = WriteInt64(dataPage.DataBlock, writePos, filedtm.ToBinary()); //data part
            //--------------------------
            //2. long filename (if has long filename)
            //-----------------------
            if (enInfo.HasLongFileName)
            {
                //write full filename here
                byte[] longFileNameBuff = System.Text.Encoding.UTF8.GetBytes(enInfo.FileUrl);
                int    buffLen          = longFileNameBuff.Length;
                if (buffLen > 512)
                {
                    //for this version ***
                    throw new Exception("file name must not longer than 512 bytes");
                }
                writePos = WriteByte(dataPage.DataBlock, writePos, 2);                  //marker 2 long filename
                //--------
                writePos = WriteUInt16(dataPage.DataBlock, writePos, (ushort)buffLen);  //2 bytes length of buffer
                writePos = WriteBuffer(dataPage.DataBlock, writePos, longFileNameBuff); //buffer
                //--------
            }

            dataPage.IsEmpty         = false;
            dataPage.DataBlockLength = (short)writePos;
            dataFreeInPage          -= writePos;


            node.FileMetaDataLength = (ushort)writePos;
            //-----------------------
            bool isFirstRound = true;
            uint fileLength   = 0;

            while ((read = stream.Read(buffer, 0, dataFreeInPage)) > 0)
            {
                //if we have some data to write
                fileLength += (uint)read;
                if (!isFirstRound)
                {
                    dataPage = GetNewDataPage(dataPage, engine);
                    if (!dataPage.IsEmpty) // This is never to happend!!
                    {
                        throw new FileDBException("Page {0} is not empty", dataPage.PageID);
                    }
                }
                writePos                 = WriteBuffer(dataPage.DataBlock, writePos, buffer, read);
                dataPage.IsEmpty         = false;
                dataPage.DataBlockLength = (short)writePos;
                //----------------------------------------------
                //reset  for next
                dataFreeInPage = DataPage.DATA_PER_PAGE;
                writePos       = 0;
                isFirstRound   = false;
                //----------------------------------------------
            }


            // If the last page point to another one, i need to fix that
            if (dataPage.NextPageID != uint.MaxValue)
            {
                engine.Header.FreeDataPageID = dataPage.NextPageID;
                dataPage.NextPageID          = uint.MaxValue;
            }

            // Save the last page on disk
            PageFactory.WriteToFile(dataPage, engine.Writer);

            // Save on node index that file length
            node.FileLength = fileLength;
        }
Exemplo n.º 21
0
        public EntryInfo Read(Guid id, Stream stream)
        {
            // Search from index node
            var indexNode = Search(id);

            // If index node is null, not found the guid
            if (indexNode == null)
                return null;

            // Create a entry based on index node
            EntryInfo entry = new EntryInfo(indexNode);

            // Read data from the index pointer to stream
            DataFactory.ReadFile(indexNode, stream, this);

            return entry;
        }
Exemplo n.º 22
0
        void FillMetadata(EntryInfo entry)
        {
            // Search from index node
            var indexNode = Search(entry.ID);

            // If index node is null, not found the guid
            if (indexNode == null)
            {
                return;
            }
            // Read data from the index pointer to stream
            DataFactory.ReadFileMetadata(indexNode, entry, this);
        }
Exemplo n.º 23
0
 public void ReadContent(EntryInfo en, Stream outputStream)
 {
     _engine.ReadContent(en, outputStream);
 }
Exemplo n.º 24
0
        private static IndexNode BinaryInsertNode(IndexLink baseLink, IndexNode baseNode, EntryInfo entry, Engine engine)
        {
            // Must insert my new nodo
            var pageIndex = engine.GetFreeIndexPage();
            var newNode   = pageIndex.Nodes[pageIndex.UsedNodeCount];

            baseLink.PageID = pageIndex.PageID;
            baseLink.Index  = pageIndex.UsedNodeCount;

            newNode.UpdateFromEntry(entry);
            newNode.DataPageID = DataFactory.GetStartDataPageID(engine);

            if (pageIndex.PageID != baseNode.IndexPage.PageID)
            {
                engine.CacheIndexPage.AddPage(baseNode.IndexPage, true);
            }

            engine.CacheIndexPage.AddPage(pageIndex, true);

            return(newNode);
        }
Exemplo n.º 25
0
 internal void Store(EntryInfo entry, Stream input)
 {
     _engine.Write(entry, input);
 }
Exemplo n.º 26
0
 public void ReadContent(EntryInfo en, Stream outputStream)
 {
     _engine.ReadContent(en, outputStream);
 }
Exemplo n.º 27
0
 internal void Store(EntryInfo entry, Stream input)
 {
     _engine.Write(entry, input);
 }
Exemplo n.º 28
0
        public void ReadContent(EntryInfo entry, Stream stream)
        {
            // Search from index node
            var indexNode = Search(entry.ID);

            // If index node is null, not found the guid
            if (indexNode == null) { return; }


            // Create a entry based on index node             

            // Read data from the index pointer to stream
            DataFactory.ReadOnlyFileContent(indexNode, entry, stream, this);
        }
Exemplo n.º 29
-1
 public static void ReadFileContent(string dbFileName, EntryInfo entry, Stream output)
 {
     using (var db = new FileDB(dbFileName, FileAccess.Read))
     {
         db.ReadContent(entry, output);
     }
 }