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 static void RestoreIndexFile(string fileStorageName, AddFileBehaviour addFileBehaviour, FileStorageHandler.ExposeProgressDelegate exposeProgressDelegate) { FileStorageHandler.RestoreIndexFile(fileStorageName, addFileBehaviour, exposeProgressDelegate); }
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 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 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 Replicate(string sourcefileStorageName, string targetfileStorageName, ReplicateBehaviour replicateBehaviour, AddFileBehaviour addFileBehaviour, FileStorageHandler.ExposeProgressDelegate exposeProgressDelegatePhase1, FileStorageHandler.ExposeProgressDelegate exposeProgressDelegatePhase2) { var sourceFileStorageHandler = FileStorageHandler.Open(sourcefileStorageName); switch (replicateBehaviour) { case ReplicateBehaviour.AddToExistingStorage: // // nothing to check here // break; case ReplicateBehaviour.ReplicateToNewStorage: // // ensure target does not yet exist // Create(targetfileStorageName, CreateFileStorageBehaviour.ThrowExceptionWhenExists); break; default: throw new NotSupportedException(string.Format("Unsupported replicate behaviour {0}", replicateBehaviour)); } var targetFileStorageHandler = FileStorageHandler.Open(targetfileStorageName); // // open source streams // using (sourceFileStorageHandler.indexStream = FileStreamFactory.CreateFileStream(sourceFileStorageHandler.indexFilename, StreamStateBehaviour.OpenNewStreamForReading)) { using (sourceFileStorageHandler.dataStream = FileStreamFactory.CreateFileStream(sourceFileStorageHandler.dataFilename, StreamStateBehaviour.OpenNewStreamForReading)) { // // open target streams // using (targetFileStorageHandler.indexStream = FileStreamFactory.CreateFileStream(targetFileStorageHandler.indexFilename, StreamStateBehaviour.OpenNewStreamForReadingAndWriting)) { using (targetFileStorageHandler.dataStream = FileStreamFactory.CreateFileStream(targetFileStorageHandler.dataFilename, StreamStateBehaviour.OpenNewStreamForReadingAndWriting)) { var allIdentifiers = sourceFileStorageHandler.GetAllDataIdentifiersBasedUponFileStorageIndexFile(StreamStateBehaviour.UseExistingStream, exposeProgressDelegatePhase1); // // start replicate process // foreach (var dataIdentifier in allIdentifiers) { sourceFileStorageHandler.ExportToOtherFileStorage(dataIdentifier, targetFileStorageHandler, addFileBehaviour, StreamStateBehaviour.UseExistingStream, StreamStateBehaviour.UseExistingStream, StreamStateBehaviour.UseExistingStream, StreamStateBehaviour.UseExistingStream); if (exposeProgressDelegatePhase2 != null) { exposeProgressDelegatePhase2.Invoke(dataIdentifier); } } if (exposeProgressDelegatePhase2 != null) { exposeProgressDelegatePhase2.Invoke(true); } } } } } }
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 static void RestoreIndexFile(string fileStorageName, AddFileBehaviour addFileBehaviour, ExposeProgressDelegate exposeProgressDelegate) { // // the following method also checks whether the index file exists or not, // if exists, it throws an exception // CreateNewFileStorage_IndexFile(FilenameFactory.GetFileStorageIndexFilename(fileStorageName)); var fileStorageHandler = new FileStorageHandler(fileStorageName, VersionBehaviour.ValidateVersion); fileStorageHandler.RestoreIndexFile(addFileBehaviour, StreamStateBehaviour.OpenNewStreamForReadingAndWriting, StreamStateBehaviour.OpenNewStreamForReading, exposeProgressDelegate); }
public static void Replicate(string sourcefileStorageName, string targetfileStorageName, ReplicateBehaviour replicateBehaviour, AddFileBehaviour addFileBehaviour, FileStorageHandler.ExposeProgressDelegate exposeProgressDelegatePhase1, FileStorageHandler.ExposeProgressDelegate exposeProgressDelegatePhase2) { FileStorageHandler sourceFileStorageHandler = FileStorageHandler.Open(sourcefileStorageName); switch (replicateBehaviour) { case ReplicateBehaviour.AddToExistingStorage: // // nothing to check here // break; case ReplicateBehaviour.ReplicateToNewStorage: // // ensure target does not yet exist // Create(targetfileStorageName, CreateFileStorageBehaviour.ThrowExceptionWhenExists); break; default: throw new NotSupportedException(string.Format("Unsupported replicate behaviour {0}", replicateBehaviour)); } FileStorageHandler targetFileStorageHandler = FileStorageHandler.Open(targetfileStorageName); // // open source streams // using (sourceFileStorageHandler.IndexStream = FileStreamFactory.CreateFileStream(sourceFileStorageHandler.IndexFilename, StreamStateBehaviour.OpenNewStreamForReading)) { using (sourceFileStorageHandler.DataStream = FileStreamFactory.CreateFileStream(sourceFileStorageHandler.DataFilename, StreamStateBehaviour.OpenNewStreamForReading)) { // // open target streams // using (targetFileStorageHandler.IndexStream = FileStreamFactory.CreateFileStream(targetFileStorageHandler.IndexFilename, StreamStateBehaviour.OpenNewStreamForReadingAndWriting)) { using (targetFileStorageHandler.DataStream = FileStreamFactory.CreateFileStream(targetFileStorageHandler.DataFilename, StreamStateBehaviour.OpenNewStreamForReadingAndWriting)) { List<Guid> allIdentifiers = sourceFileStorageHandler.GetAllDataIdentifiersBasedUponFileStorageIndexFile(StreamStateBehaviour.UseExistingStream, exposeProgressDelegatePhase1); // // start replicate process // foreach (Guid dataIdentifier in allIdentifiers) { sourceFileStorageHandler.ExportToOtherFileStorage(dataIdentifier, targetFileStorageHandler, addFileBehaviour, StreamStateBehaviour.UseExistingStream, StreamStateBehaviour.UseExistingStream, StreamStateBehaviour.UseExistingStream, StreamStateBehaviour.UseExistingStream); if (exposeProgressDelegatePhase2 != null) { exposeProgressDelegatePhase2.Invoke(dataIdentifier); } } if (exposeProgressDelegatePhase2 != null) { exposeProgressDelegatePhase2.Invoke(true); } } } } } }
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); }
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 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 void RestoreIndexFile(AddFileBehaviour addFileBehaviour, StreamStateBehaviour indexStreamStateBehaviour, StreamStateBehaviour dataStreamStateBehaviour, ExposeProgressDelegate exposeProgressDelegate) { // // the following method also checks whether the index file exists or not, // if exists, it throws an exception // CreateNewFileStorage_IndexFile(IndexFilename); switch (indexStreamStateBehaviour) { case StreamStateBehaviour.OpenNewStreamForReadingAndWriting: // ok break; default: throw new NotSupportedException(string.Format("Unexpected indexStreamStateBehaviour {0}", indexStreamStateBehaviour)); } switch (dataStreamStateBehaviour) { case StreamStateBehaviour.OpenNewStreamForReading: // ok break; default: throw new NotSupportedException(string.Format("Unexpected dataStreamStateBehaviour {0}", dataStreamStateBehaviour)); } using (IndexStream = FileStreamFactory.CreateFileStream(IndexFilename, StreamStateBehaviour.OpenNewStreamForReadingAndWriting)) { using (DataStream = FileStreamFactory.CreateFileStream(DataFilename, StreamStateBehaviour.OpenNewStreamForReading)) { long dataSize = DataStream.Length; long offset = OffsetFirstDataBlock; while (true) { InterpretedDataFileDataStruct retrieveFileStruct = GetInterpretedDataStructUsingExistingStream(offset); // // the offset in the index file should point to the starting location // of the data struct, this is not the offset where the actual data of // the file is stored, but the start of the struct before the actual data. // Guid dataIdentifier = retrieveFileStruct.DataIdentification; // // if the data file contains duplicate dataIdentifiers, we will override previous ones (which // is acceptable, as new files are appeneded to the data file, so more up to date files are stored // after older ones). // BuildIndex(dataIdentifier, offset, BuildIndexBehaviour.OverrideWhenAlreadyExists, StreamStateBehaviour.UseExistingStream); // // jump to the next data block // offset = retrieveFileStruct.BinaryDataOffset + retrieveFileStruct.BinaryDataSizeInBytes; // // inform the outside world about the progress we've made, // in case the outside world is interested // if (exposeProgressDelegate != null) { exposeProgressDelegate.Invoke(dataIdentifier); } if (offset >= dataSize) { // // reach the end of the file // break; } } } } if (exposeProgressDelegate != null) { exposeProgressDelegate.Invoke(true); } }
public void ExportToOtherFileStorage(Guid dataIdentifier, FileStorageHandler targetFileStorageHandler, AddFileBehaviour addFileBehaviour, StreamStateBehaviour sourceIndexStreamStateBehaviour, StreamStateBehaviour sourceDataStreamStateBehaviour, StreamStateBehaviour targetIndexStreamStateBehaviour, StreamStateBehaviour targetDataStreamStateBehaviour) { if (targetFileStorageHandler.FileStorageName.Equals(FileStorageName)) { throw new NotSupportedException(string.Format("Cannot export file from a filestorage to another filestorage with the same name ({0})", FileStorageName)); } byte[] fileData = GetFileByteData(dataIdentifier, sourceIndexStreamStateBehaviour, sourceDataStreamStateBehaviour); MetaDataContainer metaDataContainer = GetMetaDataContainer(dataIdentifier, sourceIndexStreamStateBehaviour, sourceDataStreamStateBehaviour); targetFileStorageHandler.StoreBytes(dataIdentifier, fileData, metaDataContainer.CustomMetaData, addFileBehaviour, targetIndexStreamStateBehaviour, targetDataStreamStateBehaviour); }
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 ExportToOtherFileStorage(string sourcefileStorageName, Guid dataIdentifier, AddFileBehaviour addFileBehaviour, string targetfileStorageName) { var sourceFileStorageHandler = FileStorageHandler.Open(sourcefileStorageName); var targetFileStorageHandler = FileStorageHandler.Open(targetfileStorageName); sourceFileStorageHandler.ExportToOtherFileStorage(dataIdentifier, targetFileStorageHandler, addFileBehaviour, StreamStateBehaviour.OpenNewStreamForReading, StreamStateBehaviour.OpenNewStreamForReading, 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 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 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 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 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 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 static void ExportToOtherFileStorage(string sourcefileStorageName, Guid dataIdentifier, AddFileBehaviour addFileBehaviour, string targetfileStorageName) { FileStorageHandler sourceFileStorageHandler = FileStorageHandler.Open(sourcefileStorageName); FileStorageHandler targetFileStorageHandler = FileStorageHandler.Open(targetfileStorageName); sourceFileStorageHandler.ExportToOtherFileStorage(dataIdentifier, targetFileStorageHandler, addFileBehaviour, StreamStateBehaviour.OpenNewStreamForReading, StreamStateBehaviour.OpenNewStreamForReading, StreamStateBehaviour.OpenNewStreamForReadingAndWriting, StreamStateBehaviour.OpenNewStreamForReadingAndWriting); }