Beispiel #1
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;
        }