/// <summary>
        ///     Makes a clone of a source filestorage, and re-allocates the data identifiers in the destination filestorage (the first
        ///     data identifier will get 0001, the next one 0002, etc. Next to outputting a new target filestorage with new indexes,
        ///     the method also produces a sql file that should be used to update your DAL logic, since the references need to be
        ///     updated too ofcourse.
        /// </summary>
        public static void Upgrade(string sourceFileStorageName, string destinationFileStorageName, FileStorageHandler.ExposeProgressDelegate exposeProgressDelegateA, FileStorageHandler.ExposeProgressDelegate exposeProgressDelegateB)
        {
            Create(destinationFileStorageName, CreateFileStorageBehaviour.ThrowExceptionWhenExists);

            FileStorageHandler sourceFileStorageHandler      = FileStorageHandler.Open(sourceFileStorageName, VersionBehaviour.BypassVersionCheck);
            FileStorageHandler destinationFileStorageHandler = FileStorageHandler.Open(destinationFileStorageName);

            List <Guid> dataIdentifiers = sourceFileStorageHandler.GetAllDataIdentifiersBasedUponFileStorageIndexFile(StreamStateBehaviour.OpenNewStreamForReading, exposeProgressDelegateA);

            for (int currentDataIdentifierIndex = 0; currentDataIdentifierIndex < dataIdentifiers.Count; currentDataIdentifierIndex++)
            {
                Guid   currentSourceDataIdentifier = dataIdentifiers[currentDataIdentifierIndex];
                byte[] theBytes = sourceFileStorageHandler.GetFileByteData(currentSourceDataIdentifier, StreamStateBehaviour.OpenNewStreamForReading, StreamStateBehaviour.OpenNewStreamForReading);

                ICustomMetaData customMetaData = sourceFileStorageHandler.SupportsFeature(FileStorageFeatureEnum.StoreMetaData)
                                                     ? sourceFileStorageHandler.GetMetaDataContainer(currentSourceDataIdentifier, StreamStateBehaviour.OpenNewStreamForReading, StreamStateBehaviour.OpenNewStreamForReading).CustomMetaData
                                                     : new EmptyCustomMetaData();

                Guid currentDestinationDataIdentifier = currentSourceDataIdentifier;

                //
                // store item in destination
                //
                destinationFileStorageHandler.StoreBytes(currentDestinationDataIdentifier, theBytes, customMetaData, AddFileBehaviour.ThrowExceptionWhenAlreadyExists, StreamStateBehaviour.OpenNewStreamForReadingAndWriting, StreamStateBehaviour.OpenNewStreamForReadingAndWriting);

                if (exposeProgressDelegateB != null)
                {
                    exposeProgressDelegateB.Invoke(currentDestinationDataIdentifier);
                }
            }
        }
        /// <summary>
        ///     Makes a clone of a source filestorage, and re-allocates the data identifiers in the destination filestorage (the first
        ///     data identifier will get 0001, the next one 0002, etc. Next to outputting a new target filestorage with new indexes,
        ///     the method also produces a sql file that should be used to update your DAL logic, since the references need to be
        ///     updated too ofcourse.
        /// </summary>
        public static void DefragDataIdentifiers(string sourceFileStorageName, string destinationFileStorageName, string sqlTable, string sqlColumn, FileStorageHandler.ExposeProgressDelegate exposeProgressDelegateA, FileStorageHandler.ExposeProgressDelegate exposeProgressDelegateB)
        {
            Create(destinationFileStorageName, CreateFileStorageBehaviour.ThrowExceptionWhenExists);

            string sqlOutputFileName = destinationFileStorageName + ".FileStorage.index.fc.sql";

            if (File.Exists(sqlOutputFileName))
            {
                throw new Exception(string.Format("File {0} already exists", sqlOutputFileName));
            }

            FileStorageHandler sourceFileStorageHandler      = FileStorageHandler.Open(sourceFileStorageName);
            FileStorageHandler destinationFileStorageHandler = FileStorageHandler.Open(destinationFileStorageName);

            using (StreamWriter sw = File.CreateText(sqlOutputFileName))
            {
                sw.WriteLine("-- SQL Patch script to adjust the dataidentifiers");

                List <Guid> dataIdentifiers = sourceFileStorageHandler.GetAllDataIdentifiersBasedUponFileStorageIndexFile(StreamStateBehaviour.OpenNewStreamForReading, exposeProgressDelegateA);

                for (int currentDataIdentifierIndex = 0; currentDataIdentifierIndex < dataIdentifiers.Count; currentDataIdentifierIndex++)
                {
                    Guid   currentSourceDataIdentifier = dataIdentifiers[currentDataIdentifierIndex];
                    byte[] theBytes = sourceFileStorageHandler.GetFileByteData(currentSourceDataIdentifier, StreamStateBehaviour.OpenNewStreamForReading, StreamStateBehaviour.OpenNewStreamForReading);

                    ICustomMetaData customMetaData = sourceFileStorageHandler.SupportsFeature(FileStorageFeatureEnum.StoreMetaData)
                                                         ? sourceFileStorageHandler.GetMetaDataContainer(currentSourceDataIdentifier, StreamStateBehaviour.OpenNewStreamForReading, StreamStateBehaviour.OpenNewStreamForReading).CustomMetaData
                                                         : new EmptyCustomMetaData();

                    //
                    // determine the new identifier
                    //
                    int b1AsInt = (currentDataIdentifierIndex >> 24) & 255;
                    var b1      = (byte)b1AsInt;
                    int b2AsInt = (currentDataIdentifierIndex >> 16) & 255;
                    var b2      = (byte)b2AsInt;
                    int b3AsInt = (currentDataIdentifierIndex >> 8) & 255;
                    var b3      = (byte)b3AsInt;
                    int b4AsInt = (currentDataIdentifierIndex >> 0) & 255;
                    var b4      = (byte)b4AsInt;
                    var currentDestinationDataIdentifier = new Guid(0, 0, 0, 0, 0, 0, 0, b1, b2, b3, b4);

                    string line = String.Format("update {0} set {1}='{2}' where {1}='{3}'", sqlTable, sqlColumn, currentSourceDataIdentifier, currentDestinationDataIdentifier);
                    sw.WriteLine(line);

                    //
                    // store item in destination
                    //
                    destinationFileStorageHandler.StoreBytes(currentDestinationDataIdentifier, theBytes, customMetaData, AddFileBehaviour.ThrowExceptionWhenAlreadyExists, StreamStateBehaviour.OpenNewStreamForReadingAndWriting, StreamStateBehaviour.OpenNewStreamForReadingAndWriting);

                    if (exposeProgressDelegateB != null)
                    {
                        exposeProgressDelegateB.Invoke(currentDestinationDataIdentifier);
                    }
                }

                sw.WriteLine("-- EOF");
            }
        }
        public void StoreBytesForExistingStreams(Guid dataIdentifier, byte[] fileData, ICustomMetaData customMetaData, AddFileBehaviour addFileBehaviour)
        {
            #region Preconditions and initialization ...

            if (fileData.LongLength > fileData.Length)
            {
                throw new Exception("NFileStorage is (currently) limited to a max length of 32bit (about 4.294.967.296 bytes)");
            }

            //
            // first check the behaviour conditions
            //
            switch (addFileBehaviour)
            {
                case AddFileBehaviour.SkipWhenAlreadyExists:
                    if (Exists(dataIdentifier, StreamStateBehaviour.UseExistingStream))
                    {
                        return;
                    }
                    break;
                case AddFileBehaviour.ThrowExceptionWhenAlreadyExists:
                    if (Exists(dataIdentifier, StreamStateBehaviour.UseExistingStream))
                    {
                        throw new Exception(string.Format("File {0} already exists", dataIdentifier));
                    }
                    break;
                case AddFileBehaviour.OverrideWhenAlreadyExists:
                    if (Exists(dataIdentifier, StreamStateBehaviour.UseExistingStream))
                    {
                        DeleteDataIdentifier(dataIdentifier, DeleteFileBehaviour.ThrowExceptionWhenNotExists,
                                             StreamStateBehaviour.UseExistingStream);
                    }
                    break;
                default:
                    throw new NotSupportedException(string.Format("Unsupported behaviour; {0}", addFileBehaviour));
            }

            #endregion

            bool supportsMetaData = SupportsFeature(FileStorageFeatureEnum.StoreMetaData);

            long dataOffset = DataStream.Length;
            int dataLength = fileData.Length;
            Int64 metaDataOffsetInFileFromBegin;
            if (supportsMetaData)
            {
                if (customMetaData == null)
                {
                    customMetaData = new EmptyCustomMetaData();
                }
                metaDataOffsetInFileFromBegin = dataOffset + DataFileDataStructSize + dataLength;
            }
            else
            {
                metaDataOffsetInFileFromBegin = 0;
            }

            // create a new struct with offsets 0 for each index in guid
            var newFileStruct = new DataFileDataStruct
                {
                    DataIdentification = dataIdentifier,
                    BinaryDataSizeInBytes = dataLength,
                    DataStateEnumID = 0,
                    MetaDataOffsetInFileFromBegin = metaDataOffsetInFileFromBegin,
                    ReservedB = 0
                };

            #region Store the information in the data file

            #region Store struct in data file

            StoreStruct(dataOffset, newFileStruct);

            #endregion

            #region Store actual data in data file

            //
            // the stream is intentionally left open
            //
            var bufferedDataFileStream = new BufferedStream(DataStream);
            // write the actual data
            bufferedDataFileStream.Write(fileData, 0, dataLength);
            // flush, to ensure we don't have bytes in the queue when we close the file
            bufferedDataFileStream.Flush();

            #endregion

            #region Store meta data in data file

            if (supportsMetaData)
            {
                //
                // use the DynamiteXML feature to store metadata
                //
                var metaDataContainer = new MetaDataContainer(customMetaData, DateTime.UtcNow, dataLength);
                string metaDataString = DynamiteXmlLogic.Serialize(metaDataContainer);
                byte[] metaDataBytes = Encoding.UTF8.GetBytes(metaDataString);

                //
                // write the length of the bytes of the metadata
                //
                var binaryWriter = new BinaryWriter(DataStream);
                binaryWriter.Write(metaDataBytes.Length);

                bufferedDataFileStream.Write(metaDataBytes, 0, metaDataBytes.Length);
                // flush, to ensure we don't have bytes in the queue when we close the file
                bufferedDataFileStream.Flush();
            }

            #endregion

            #endregion

            #region Store the information in the index file

            //
            // derive the build index behaviour from the add file behaviour
            //
            BuildIndexBehaviour buildIndexBehaviour;
            switch (addFileBehaviour)
            {
                case AddFileBehaviour.ThrowExceptionWhenAlreadyExists:
                    buildIndexBehaviour = BuildIndexBehaviour.ThrowExceptionWhenIndexAlreadyExists;
                    break;
                case AddFileBehaviour.SkipWhenAlreadyExists:
                    //
                    // this should have been intercepted before, should be impossible
                    //
                    buildIndexBehaviour = BuildIndexBehaviour.ThrowExceptionWhenIndexAlreadyExists;
                    break;
                case AddFileBehaviour.OverrideWhenAlreadyExists:
                    buildIndexBehaviour = BuildIndexBehaviour.OverrideWhenAlreadyExists;
                    break;
                default:
                    throw new NotSupportedException(string.Format("Unexpected addFileBehaviour {0}", addFileBehaviour));
            }

            // we update the index file
            BuildIndex(dataIdentifier, dataOffset, buildIndexBehaviour, StreamStateBehaviour.UseExistingStream);

            #endregion
        }
        public void StoreString(Guid dataIdentifier, Encoding encoding, string stringToStore, ICustomMetaData customMetaData, AddFileBehaviour addFileBehaviour, StreamStateBehaviour indexStreamStateBehaviour, StreamStateBehaviour dataStreamStateBehaviour)
        {
            Byte[] bytes = encoding.GetBytes(stringToStore);

            StoreBytes(dataIdentifier, bytes, customMetaData, addFileBehaviour, indexStreamStateBehaviour, dataStreamStateBehaviour);
        }
        public static void StoreHttpRequest(string fileStorageName, Guid dataIdentifier, string url, ICustomMetaData customMetaData, AddFileBehaviour addFileBehaviour, string userAgent)
        {
            var fileStorageHandler = FileStorageHandler.Open(fileStorageName);

            fileStorageHandler.StoreHttpRequest(dataIdentifier, url, customMetaData, addFileBehaviour, userAgent, StreamStateBehaviour.OpenNewStreamForReadingAndWriting, StreamStateBehaviour.OpenNewStreamForReadingAndWriting);
        }
 public static void StoreBytes(string fileStorageName, Guid dataIdentifier, byte[] fileData, ICustomMetaData customMetaData, AddFileBehaviour addFileBehaviour)
 {
     FileStorageHandler fileStorageHandler = FileStorageHandler.Open(fileStorageName);
     fileStorageHandler.StoreBytes(dataIdentifier, fileData, customMetaData, addFileBehaviour, StreamStateBehaviour.OpenNewStreamForReadingAndWriting, StreamStateBehaviour.OpenNewStreamForReadingAndWriting);
 }
 public void StoreFile(Guid dataIdentifier, string filename, ICustomMetaData customMetaData, AddFileBehaviour addFileBehaviour, StreamStateBehaviour indexStreamStateBehaviour, StreamStateBehaviour dataStreamStateBehaviour)
 {
     StoreBytes(dataIdentifier, File.ReadAllBytes(filename), customMetaData, addFileBehaviour, indexStreamStateBehaviour, dataStreamStateBehaviour);
 }
        public static void StoreStream(string fileStorageName, Guid dataIdentifier, Stream streamToStore, int numberOfBytes, ICustomMetaData customMetaData, AddFileBehaviour addFileBehaviour)
        {
            var fileStorageHandler = FileStorageHandler.Open(fileStorageName);

            fileStorageHandler.StoreStream(dataIdentifier, streamToStore, numberOfBytes, customMetaData, addFileBehaviour, StreamStateBehaviour.OpenNewStreamForReadingAndWriting, StreamStateBehaviour.OpenNewStreamForReadingAndWriting);
        }
 public static void StoreObject(string fileStorageName, Guid dataIdentifier, IDynamiteXml objectToStore, ICustomMetaData customMetaData, AddFileBehaviour addFileBehaviour)
 {
     FileStorageHandler fileStorageHandler = FileStorageHandler.Open(fileStorageName);
     fileStorageHandler.StoreObject(dataIdentifier, objectToStore, customMetaData, addFileBehaviour, StreamStateBehaviour.OpenNewStreamForReadingAndWriting, StreamStateBehaviour.OpenNewStreamForReadingAndWriting);
 }
        public void StoreHttpRequest(Guid dataIdentifier, string url, ICustomMetaData customMetaData, AddFileBehaviour addFileBehaviour, string userAgent, StreamStateBehaviour indexStreamStateBehaviour, StreamStateBehaviour dataStreamStateBehaviour)
        {
            var request = (HttpWebRequest) WebRequest.Create(url);
            request.UserAgent = userAgent;

            // execute the web request
            var response = (HttpWebResponse) request.GetResponse();

            using (Stream webStream = response.GetResponseStream())
            {
                StoreBytes(dataIdentifier, webStream.ReadAllBytes(), customMetaData, addFileBehaviour, indexStreamStateBehaviour, dataStreamStateBehaviour);
            }
        }
 public static void StoreHttpRequest(string fileStorageName, Guid dataIdentifier, string url, ICustomMetaData customMetaData, AddFileBehaviour addFileBehaviour, string userAgent)
 {
     FileStorageHandler fileStorageHandler = FileStorageHandler.Open(fileStorageName);
     fileStorageHandler.StoreHttpRequest(dataIdentifier, url, customMetaData, addFileBehaviour, userAgent, StreamStateBehaviour.OpenNewStreamForReadingAndWriting, StreamStateBehaviour.OpenNewStreamForReadingAndWriting);
 }
 public static void StoreString(string fileStorageName, Guid dataIdentifier, Encoding encoding, string stringToStore, ICustomMetaData customMetaData, AddFileBehaviour addFileBehaviour)
 {
     FileStorageHandler fileStorageHandler = FileStorageHandler.Open(fileStorageName);
     fileStorageHandler.StoreString(dataIdentifier, encoding, stringToStore, customMetaData, addFileBehaviour, StreamStateBehaviour.OpenNewStreamForReadingAndWriting, StreamStateBehaviour.OpenNewStreamForReadingAndWriting);
 }
 public static void StoreStream(string fileStorageName, Guid dataIdentifier, Stream streamToStore, int numberOfBytes, ICustomMetaData customMetaData, AddFileBehaviour addFileBehaviour)
 {
     FileStorageHandler fileStorageHandler = FileStorageHandler.Open(fileStorageName);
     fileStorageHandler.StoreStream(dataIdentifier, streamToStore, numberOfBytes, customMetaData, addFileBehaviour, StreamStateBehaviour.OpenNewStreamForReadingAndWriting, StreamStateBehaviour.OpenNewStreamForReadingAndWriting);
 }
Exemple #14
0
 public MetaDataContainer(ICustomMetaData customMetaData, DateTime creationDateUtc, Int64 binaryDataSizeInBytes)
 {
     CustomMetaDataString = DynamiteXmlLogic.Serialize(customMetaData);
     CreationDateUtc      = creationDateUtc;
     BinarySizeInBytes    = binaryDataSizeInBytes;
 }
 public void StoreStream(Guid dataIdentifier, Stream streamToStore, int numberOfBytes, ICustomMetaData customMetaData, AddFileBehaviour addFileBehaviour, StreamStateBehaviour indexStreamStateBehaviour, StreamStateBehaviour dataStreamStateBehaviour)
 {
     using (var binaryReader = new BinaryReader(streamToStore))
     {
         byte[] fileData = binaryReader.ReadBytes(numberOfBytes);
         StoreBytes(dataIdentifier, fileData, customMetaData, addFileBehaviour, indexStreamStateBehaviour, dataStreamStateBehaviour);
     }
 }
        public static void StoreBytes(string fileStorageName, Guid dataIdentifier, byte[] fileData, ICustomMetaData customMetaData, AddFileBehaviour addFileBehaviour)
        {
            var fileStorageHandler = FileStorageHandler.Open(fileStorageName);

            fileStorageHandler.StoreBytes(dataIdentifier, fileData, customMetaData, addFileBehaviour, StreamStateBehaviour.OpenNewStreamForReadingAndWriting, StreamStateBehaviour.OpenNewStreamForReadingAndWriting);
        }
 public void StoreObject(Guid dataIdentifier, IDynamiteXml objectToStore, ICustomMetaData customMetaData, AddFileBehaviour addFileBehaviour, StreamStateBehaviour indexStreamStateBehaviour, StreamStateBehaviour dataStreamStateBehaviour)
 {
     string serializedObject = DynamiteXmlLogic.Serialize(objectToStore);
     StoreString(dataIdentifier, serializedObject, customMetaData, addFileBehaviour, indexStreamStateBehaviour, dataStreamStateBehaviour);
 }
        public static void StoreString(string fileStorageName, Guid dataIdentifier, Encoding encoding, string stringToStore, ICustomMetaData customMetaData, AddFileBehaviour addFileBehaviour)
        {
            var fileStorageHandler = FileStorageHandler.Open(fileStorageName);

            fileStorageHandler.StoreString(dataIdentifier, encoding, stringToStore, customMetaData, addFileBehaviour, StreamStateBehaviour.OpenNewStreamForReadingAndWriting, StreamStateBehaviour.OpenNewStreamForReadingAndWriting);
        }
 public void StoreBytes(Guid dataIdentifier, byte[] fileData, ICustomMetaData customMetaData, AddFileBehaviour addFileBehaviour, StreamStateBehaviour indexStreamStateBehaviour, StreamStateBehaviour dataStreamStateBehaviour)
 {
     switch (indexStreamStateBehaviour)
     {
         case StreamStateBehaviour.OpenNewStreamForReadingAndWriting:
             //
             // open the stream and make a recursive call
             //
             using (IndexStream = FileStreamFactory.CreateFileStream(IndexFilename, indexStreamStateBehaviour))
             {
                 StoreBytes(dataIdentifier, fileData, customMetaData, addFileBehaviour, StreamStateBehaviour.UseExistingStream, dataStreamStateBehaviour);
             }
             break;
         case StreamStateBehaviour.UseExistingStream:
             // 
             // check state of data file stream
             //
             switch (dataStreamStateBehaviour)
             {
                 case StreamStateBehaviour.OpenNewStreamForReadingAndWriting:
                     //
                     // open the stream and make a recursive call
                     //
                     using (DataStream = FileStreamFactory.CreateFileStream(DataFilename, dataStreamStateBehaviour))
                     {
                         StoreBytes(dataIdentifier, fileData, customMetaData, addFileBehaviour, indexStreamStateBehaviour, StreamStateBehaviour.UseExistingStream);
                     }
                     break;
                 case StreamStateBehaviour.UseExistingStream:
                     //
                     //
                     //
                     StoreBytesForExistingStreams(dataIdentifier, fileData, customMetaData, addFileBehaviour);
                     //
                     break;
                 default:
                     throw new NotSupportedException(string.Format("Unexpected dataStreamStateBehaviour {0}", dataStreamStateBehaviour));
             }
             //
             break;
         default:
             throw new NotSupportedException(string.Format("Unexpected indexStreamStateBehaviour {0}", indexStreamStateBehaviour));
     }
 }
        public static void StoreObject(string fileStorageName, Guid dataIdentifier, IDynamiteXml objectToStore, ICustomMetaData customMetaData, AddFileBehaviour addFileBehaviour)
        {
            var fileStorageHandler = FileStorageHandler.Open(fileStorageName);

            fileStorageHandler.StoreObject(dataIdentifier, objectToStore, customMetaData, addFileBehaviour, StreamStateBehaviour.OpenNewStreamForReadingAndWriting, StreamStateBehaviour.OpenNewStreamForReadingAndWriting);
        }
 public MetaDataContainer(ICustomMetaData customMetaData, DateTime creationDateUtc, Int64 binaryDataSizeInBytes)
 {
     CustomMetaDataString = DynamiteXmlLogic.Serialize(customMetaData);
     CreationDateUtc = creationDateUtc;
     BinarySizeInBytes = binaryDataSizeInBytes;
 }