|
|
Isam
|
public abstract class IsamDataFileBase<T> : ISupportLifecycle, IDisposable, IProvideStatus, IPersistSettings where T : ISupportBinaryImage
The IsamDataFileBaseT type exposes the following members.
| Name | Description | |
|---|---|---|
| IsamDataFileBaseT | Initializes a new instance of the IsamDataFileBaseT class. |
| Name | Description | |
|---|---|---|
| AutoSaveInterval | Gets or sets the interval in milliseconds at which the records loaded in memory are to be persisted to disk. | |
| Enabled | Gets or sets a boolean value that indicates whether the file is currently enabled. | |
| FileAccessMode | Gets or sets the FileAccess value to use when opening the file. | |
| FileData | Gets the underlying FileStream of the file. | |
| FileDataLock | Gets the locking object for the FileData stream. | |
| FileName | Gets or sets the name of the file. | |
| IsCorrupt | Gets a boolean value that indicates whether the file data on disk is corrupt. | |
| IsDisposed | Gets a flag that indicates whether the object has been disposed. | |
| IsOpen | Gets a boolean value that indicates whether the file is open. | |
| LoadOnOpen | Gets or sets a boolean value that indicates whether records are to be loaded automatically in memory when the file is opened. | |
| LoadWaitHandle | Gets wait handle for loading data. | |
| MemoryUsage | Gets the approximate memory consumption (in KB) of the file. | |
| Name | Gets the unique identifier of the file. | |
| PersistSettings | Gets or sets a boolean value that indicates whether the file settings are to be saved to the config file. | |
| RecordsInMemory | Gets the number of file records loaded in memory. | |
| RecordsOnDisk | Gets the number of file records on the disk. | |
| ReloadOnModify | Gets or sets a boolean value that indicates whether records loaded in memory are to be re-loaded when the file is modified on disk. | |
| SaveOnClose | Gets or sets a boolean value that indicates whether records loaded in memory are to be persisted to disk when the file is closed. | |
| SaveWaitHandle | Gets wait handle for saving data. | |
| SettingsCategory | Gets or sets the category under which the file settings are to be saved to the config file if the PersistSettings property is set to true. | |
| Status | Gets the descriptive status of the file. |
| Name | Description | |
|---|---|---|
| Close | Closes the file. | |
| CreateNewRecord | When overridden in a derived class, returns a new empty record. | |
| Dispose | Releases all the resources used by the file. | |
| Dispose(Boolean) | Releases the unmanaged resources used by the file and optionally releases the managed resources. | |
| Equals | Determines whether the specified object is equal to the current object. (Inherited from Object) | |
| Finalize |
Releases the unmanaged resources before the file is reclaimed by GC.
(Overrides ObjectFinalize) | |
| GetHashCode | Serves as the default hash function. (Inherited from Object) | |
| GetRecordSize | When overridden in a derived class, gets the size of a record (in bytes). | |
| GetType | Gets the Type of the current instance. (Inherited from Object) | |
| Initialize | Initializes the file. | |
| Load | Loads records from disk into memory. | |
| LoadSettings | Loads saved settings of the file from the config file if the PersistSettings property is set to true. | |
| MemberwiseClone | Creates a shallow copy of the current Object. (Inherited from Object) | |
| OnDataLoaded | Raises the DataLoaded event. | |
| OnDataLoading | Raises the DataLoading event. | |
| OnDataSaved | Raises the DataSaved event. | |
| OnDataSaving | Raises the DataSaving event. | |
| OnFileModified | Raises the FileModified event. | |
| Open | Opens the file. | |
| Read | Reads file records from disk if records were not loaded in memory otherwise returns the records in memory. | |
| Read(Int32) | Reads specified file record from disk if records were not loaded in memory otherwise returns the record in memory. | |
| Save | Saves records loaded in memory to disk. | |
| SaveSettings | Saves settings of the file to the config file if the PersistSettings property is set to true. | |
| ToString | Returns a string that represents the current object. (Inherited from Object) | |
| Write(IEnumerableT) | Writes specified records to disk if records were not loaded in memory otherwise updates the records in memory. | |
| Write(Int32, T) | Writes specified record to disk if records were not loaded in memory otherwise updates the record in memory. |
| Name | Description | |
|---|---|---|
| DataLoaded | Occurs when data has been read from disk into memory. | |
| DataLoading | Occurs when data is being read from disk into memory. | |
| DataSaved | Occurs when data has been saved from memory onto disk. | |
| DataSaving | Occurs when data is being saved from memory onto disk. | |
| Disposed | Occurs when the class has been disposed. | |
| FileModified | Occurs when file data on the disk is modified. |
| Name | Description | |
|---|---|---|
| DefaultAutoSaveInterval | Specifies the default value for the AutoSaveInterval property. | |
| DefaultFileAccessMode | Specifies the default value for the FileAccessMode property. | |
| DefaultFileName | Specifies the default value for the FileName property. | |
| DefaultLoadOnOpen | Specifies the default value for the LoadOnOpen property. | |
| DefaultPersistSettings | Specifies the default value for the PersistSettings property. | |
| DefaultReloadOnModify | Specifies the default value for the ReloadOnModify property. | |
| DefaultSaveOnClose | Specifies the default value for the SaveOnClose property. | |
| DefaultSettingsCategory | Specifies the default value for the SettingsCategory property. |
| Name | Description | |
|---|---|---|
| GetEnumValueOrDefault |
Gets the enumeration constant for value, if defined in the enumeration, or a default value.
(Defined by EnumExtensions) | |
| GetEnumValueOrDefaultT |
Gets the enumeration constant for this value, if defined in the enumeration, or a default value.
(Defined by EnumExtensions) |
This ISAM implementation keeps all the records in memory, so it may not be suitable for very large files. Since data is stored in memory using a list, the maximum number of possible supported records will be 2,147,483,647 (i.e., Int32.MaxValue).
See http://en.wikipedia.org/wiki/ISAM for more information on ISAM files.
using System; using System.Text; using GSF; using GSF.IO; using GSF.Parsing; class Program { static void Main(string[] args) { // Create a few test records. TestIsamFileRecord r1 = new TestIsamFileRecord(1); r1.Name = "TestRecord1"; r1.Value = double.MinValue; r1.Description = "Test record with minimum double value"; TestIsamFileRecord r2 = new TestIsamFileRecord(2); r2.Name = "TestRecord2"; r2.Value = double.MaxValue; r2.Description = "Test record with maximum double value"; // Open ISAM file. TestIsamFile testFile = new TestIsamFile(); testFile.FileName = "TestIsamFile.dat"; testFile.Open(); // Write test records. testFile.Write(r1.Index, r1); testFile.Write(r2.Index, r2); // Read test records. Console.WriteLine(testFile.Read(1)); Console.WriteLine(testFile.Read(2)); // Close ISAM file. testFile.Close(); Console.ReadLine(); } } class TestIsamFile : IsamDataFileBase<TestIsamFileRecord> { /// <summary> /// Size of a single file record. /// </summary> protected override int GetRecordSize() { return TestIsamFileRecord.RecordLength; } /// <summary> /// Creates a new empty file record. /// </summary> protected override TestIsamFileRecord CreateNewRecord(int id) { return new TestIsamFileRecord(id); } } class TestIsamFileRecord : ISupportBinaryImage { private int m_index; private string m_name; // 20 * 1 = 20 private double m_value; // 1 * 8 = 8 private string m_description; // 100 * 1 = 100 public const int RecordLength = 128; // Total = 128 public TestIsamFileRecord(int recordIndex) { m_index = recordIndex; Name = string.Empty; Value = double.NaN; Description = string.Empty; } /// <summary> /// 1-based index of the record. /// </summary> public int Index { get { return m_index; } } /// <summary> /// Name of the record. /// </summary> public string Name { get { return m_name; } set { m_name = value.TruncateRight(20).PadRight(20); } } /// <summary> /// Value of the record. /// </summary> public double Value { get { return m_value; } set { m_value = value; } } /// <summary> /// Description of the record. /// </summary> public string Description { get { return m_description; } set { m_description = value.TruncateRight(100).PadRight(100); } } /// <summary> /// Serialized record length. /// </summary> public int BinaryLength { get { return RecordLength; } } /// <summary> /// Serialized record data. /// </summary> public byte[] BinaryImage { get { // Serialize TestIsamFileRecord into byte array. byte[] image = new byte[RecordLength]; Buffer.BlockCopy(Encoding.ASCII.GetBytes(Name), 0, image, 0, 20); Buffer.BlockCopy(BitConverter.GetBytes(Value), 0, image, 20, 8); Buffer.BlockCopy(Encoding.ASCII.GetBytes(Description), 0, image, 28, 100); return image; } } /// <summary> /// Deserializes the record. /// </summary> public int Initialize(byte[] binaryImage, int startIndex, int length) { if (length >= RecordLength) { // Deserialize byte array into TestIsamFileRecord. Name = Encoding.ASCII.GetString(binaryImage, startIndex, 20); Value = BitConverter.ToDouble(binaryImage, startIndex + 20); Description = Encoding.ASCII.GetString(binaryImage, startIndex + 28, 100); } else throw new InvalidOperationException("Invalid record size, not enough data to deserialize record"); return RecordLength; } /// <summary> /// String representation of the record. /// </summary> public override string ToString() { return string.Format("Name: {0}, Value: {1}, Description: {2}", Name, Value, Description); } }