Ejemplo n.º 1
0
        /// <summary>
        /// Saves records loaded in memory to disk.
        /// </summary>
        /// <remarks>
        /// <see cref="IsamDataFileBase{T}.Save"/> is equivalent to <see cref="FileStream.Flush()"/> when records are not loaded in memory.
        /// </remarks>
        public override void Save()
        {
            if (m_legacyMode == MetadataFileLegacyMode.Enabled)
            {
                base.Save();
            }

            if (m_legacyMode == MetadataFileLegacyMode.Compatible)
            {
                SaveLegacyMetadataFile();
            }

            if (m_legacyMode == MetadataFileLegacyMode.Disabled || m_legacyMode == MetadataFileLegacyMode.Compatible)
            {
                if (!IsOpen)
                {
                    throw new InvalidOperationException(string.Format("MetadataFile \"{0}\" is not open", FileName));
                }

                // Waits for any pending request to save records before completing.
                SaveWaitHandle.Wait();

                // Waits for any prior request to load records before completing.
                LoadWaitHandle.Wait();
                SaveWaitHandle.Reset();

                try
                {
                    OnDataSaving();

                    lock (FileDataLock)
                    {
                        FileData.SetLength(0);
                        BinaryWriter writer = new BinaryWriter(FileData);
                        writer.Write(m_records.Count);

                        foreach (MetadataRecord record in m_records.Values)
                        {
                            record.WriteImage(writer);
                        }

                        FileData.Flush();
                        File.SetLastWriteTime(FileName, DateTime.Now);
                    }

                    OnDataSaved();
                }
                finally
                {
                    SaveWaitHandle.Set();
                }
            }
        }