/// <summary>
 /// Gets the data set for a particular date.
 /// </summary>
 /// <param name="date">The date.</param>
 /// <returns></returns>
 public DataLogModel GetDataSet(DateTime date)
 {
     DataLogModel data = new DataLogModel();
     string fileName = Path.Combine(GetDataDirectory(), date.ToString("yyyy-MM-dd") + ".dsx");
     if (File.Exists(fileName))
     {
         data.ReadXml(fileName, System.Data.XmlReadMode.IgnoreSchema);
         foreach (var row in data.Impacts.Where(row => row.Timestamp.Date != date).ToList()) data.Impacts.RemoveImpactsRow(row);
         foreach (var row in data.Scores.Where(row => row.Timestamp.Date != date).ToList()) data.Scores.RemoveScoresRow(row);
         data.AcceptChanges();
     }
     return data;
 }
        /// <summary>
        /// Writes the database to disk.
        /// </summary>
        private void WriteDatabaseToDisk()
        {
            if (GameDataLog.HasChanges())
            {
                Logger.Log("Flushing dataset to disk", Category.Info, Priority.None);
                try
                {
                    string fileName = Path.Combine(CreateDataDirectory(), GetDataSetFileName());

                    using (ReaderWriterLockMgr impactLockMgr = new ReaderWriterLockMgr(GameDataLog.Impacts.Lock))
                        using (ReaderWriterLockMgr scoreLockMgr = new ReaderWriterLockMgr(GameDataLog.Scores.Lock))
                        {
                            impactLockMgr.EnterWriteLock();
                            scoreLockMgr.EnterWriteLock();
                            foreach (var row in GameDataLog.Impacts.Where(row => row.Timestamp.Date != DateTime.Today).ToList())
                            {
                                GameDataLog.Impacts.RemoveImpactsRow(row);
                            }
                            foreach (var row in GameDataLog.Scores.Where(row => row.Timestamp.Date != DateTime.Today).ToList())
                            {
                                GameDataLog.Scores.RemoveScoresRow(row);
                            }
                            GameDataLog.AcceptChanges();
                            GameDataLog.WriteXml(fileName, XmlWriteMode.WriteSchema);
                        }
                }
                catch (IOException ex)
                {
                    Logger.Log(ex.GetBaseException().ToString(), Category.Exception, Priority.High);
                    EventAggregator.GetEvent <ApplicationEvents.NotifyUserEvent>().Publish(new ApplicationEvents.NotifyUserEvent()
                    {
                        Message = "Trying to write game data. " + ex.GetBaseException().Message,
                        Buttons = System.Windows.MessageBoxButton.OK,
                        Image   = System.Windows.MessageBoxImage.Error
                    });
                }
            }
            else
            {
                Logger.Log("Skipping flushing of dataset (no changes)", Category.Info, Priority.None);
            }
        }
        /// <summary>
        /// Gets the data set for a particular date.
        /// </summary>
        /// <param name="date">The date.</param>
        /// <returns></returns>
        public DataLogModel GetDataSet(DateTime date)
        {
            DataLogModel data     = new DataLogModel();
            string       fileName = Path.Combine(GetDataDirectory(), date.ToString("yyyy-MM-dd") + ".dsx");

            if (File.Exists(fileName))
            {
                data.ReadXml(fileName, System.Data.XmlReadMode.IgnoreSchema);
                foreach (var row in data.Impacts.Where(row => row.Timestamp.Date != date).ToList())
                {
                    data.Impacts.RemoveImpactsRow(row);
                }
                foreach (var row in data.Scores.Where(row => row.Timestamp.Date != date).ToList())
                {
                    data.Scores.RemoveScoresRow(row);
                }
                data.AcceptChanges();
            }
            return(data);
        }
        /// <summary>
        /// Writes the database to disk.
        /// </summary>
        /// <param name="sender">The sender.</param>
        /// <param name="e">The <see cref="System.ComponentModel.DoWorkEventArgs"/> instance containing the event data.</param>
        private void WriteDatabaseToDisk()
        {
            if (_dataLog.HasChanges())
            {
                _logger.Log("Flushing dataset to disk", Category.Info, Priority.None);
                try
                {
                    string fileName = Path.Combine(CreateDataDirectory(), GetDataSetFileName());

                    using (ReaderWriterLockMgr impactLockMgr = new ReaderWriterLockMgr(_dataLog.Impacts.Lock))
                        using (ReaderWriterLockMgr scoreLockMgr = new ReaderWriterLockMgr(_dataLog.Scores.Lock))
                        {
                            impactLockMgr.EnterWriteLock();
                            scoreLockMgr.EnterWriteLock();
                            foreach (var row in _dataLog.Impacts.Where(row => row.Timestamp.Date != DateTime.Today).ToList())
                            {
                                _dataLog.Impacts.RemoveImpactsRow(row);
                            }
                            foreach (var row in _dataLog.Scores.Where(row => row.Timestamp.Date != DateTime.Today).ToList())
                            {
                                _dataLog.Scores.RemoveScoresRow(row);
                            }
                            _dataLog.AcceptChanges();
                            _dataLog.WriteXml(fileName, XmlWriteMode.WriteSchema);
                        }
                }
                catch (IOException ex)
                {
                    _logger.Log(ex.GetBaseException().ToString(), Category.Exception, Priority.High);
                    //FIXME: Need to handle this exception with a user notification
                }
            }
            else
            {
                _logger.Log("Skipping flushing of dataset (no changes)", Category.Info, Priority.None);
            }
        }