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); } }