/// <summary> /// Gets the type name as is displayed in dialogs. /// </summary> /// <param name="typeName">A MySQL type name.</param> /// <param name="isValid">Flag indicating whether the supplied type name is a valid one.</param> /// <returns>The type name as is displayed in dialogs.</returns> public static string GetDisplayTypeName(string typeName, out bool isValid) { if (string.IsNullOrEmpty(typeName)) { isValid = true; return(string.Empty); } var mySqlDisplayType = DataTypesList.FirstOrDefault(mType => mType.IsBaseType && mType.Name.Equals(typeName, StringComparison.InvariantCultureIgnoreCase)); isValid = mySqlDisplayType != null; return(isValid ? mySqlDisplayType.Name : CultureInfo.CurrentCulture.TextInfo.ToTitleCase(typeName)); }
/// <summary> /// Loads the data. /// </summary> /// <exception cref="InvalidOperationException">Data Types List cannot be null. Fatal error</exception> private void LoadData() { // Get target lookup TargetLookup = Service.GetDatasetTargets(); string saveSelectedDataSetTypeName = null; if (SelectedDataType != null) { saveSelectedDataSetTypeName = SelectedDataType.DataTypeName; } DataTypesList = GetInstalledDatasets(); var toReconcile = DataTypesList.Where(item => item.RecordsList.Any(d => !d.Entry.IsFinished)).SelectMany(s => s.RecordsList).ToList(); foreach (var item in toReconcile.Where(item => !item.Entry.IsFinished).Select(item => item.Entry).ToList()) { DeleteItem(item); } // try to return to the same dataset the user clicked previously, or select item 0 if (saveSelectedDataSetTypeName != null) { var ds = DataTypesList.FirstOrDefault(a => a.DataTypeName == saveSelectedDataSetTypeName); if (ds != null) { SelectedDataType = ds; return; } } if (DataTypesList == null) { throw new InvalidOperationException("Data Types List cannot be null. Fatal error"); } SelectedDataType = DataTypesList[0]; }
/// <summary> /// Polls the entity status. /// </summary> /// <param name="item">The item.</param> /// <param name="reset">if set to <c>true</c> [reset].</param> /// <param name="terminate">if set to <c>true</c> [terminate].</param> private void PollEntityStatus(Dataset item, bool reset, bool terminate = false) { EntityPoller <Dataset> poller = null; if (reset) { poller = new EntityPoller <Dataset>(o => o.Id == item.Id) { ActiveCycle = 200, //milliseconds IdleCycle = 30000, //30 seconds RetryAttempts = 5, RetryInitialInterval = 20000 //20 seconds }; poller.EntityReceived += entity => { var datasetType = DataTypesList.OfType <DataTypeModel>().FirstOrDefault( e => e.DataTypeName.ToLower() == item.ContentType.Name.ToLower()); if (datasetType != null && datasetType.RecordsList.Any(dr => dr.Entry.Id == entity.Id)) { var dsItem = datasetType.RecordsList.FirstOrDefault(dr => dr.Entry.Id == entity.Id); if (dsItem != null) { dsItem.Entry = entity; } } }; poller.Error += exception => Events.GetEvent <ErrorNotificationEvent>().Publish(exception); poller.Start(); } if (terminate && poller != null) { poller.Stop(); } }
/// <summary> /// Gets a corresponding <see cref="MySqlDisplayDataType"/> from the given <see cref="MySqlDataType"/>. /// </summary> /// <param name="fromMySqlDataType">A <see cref="MySqlDataType"/> instance.</param> /// <returns>A corresponding <see cref="MySqlDisplayDataType"/>.</returns> public static MySqlDisplayDataType GetDisplayType(MySqlDataType fromMySqlDataType) { return(fromMySqlDataType == null ? null : DataTypesList.FirstOrDefault(dispType => dispType.Name.Equals(fromMySqlDataType.TypeName, StringComparison.InvariantCultureIgnoreCase))); }
/// <summary> /// Deletes the item. /// </summary> /// <param name="entry">The entry.</param> /// <param name="showDeletePrompt">if set to <c>true</c> [show delete prompt].</param> private void DeleteItem(Dataset entry, bool showDeletePrompt = true) { try { if (TargetLookup == null || !TargetLookup.Any()) { return; } if (TargetLookup[entry.ContentType.Name] == null) { return; } if (!TargetLookup[entry.ContentType.Name].IsCustom && string.IsNullOrEmpty(TargetLookup[entry.ContentType.Name].ClrType)) { return; } if (showDeletePrompt) { var attachedWebsites = Service.GetWebsitesForDataset(entry.Id); if (attachedWebsites.Any()) { string websiteNames = string.Join(",", attachedWebsites); var warningMessage = string.Format("Unable to delete dataset \"{0}\" because it is associated with the following websites:", entry.Name); warningMessage += string.Format("{0}{0}Associated Websites: {1}", Environment.NewLine, websiteNames); MessageBox.Show(warningMessage, "Dataset Deletion Warning", MessageBoxButton.OK); return; } // Show blanket warning against dataset deletion. But only show warning if this Dataset is Finished. if (entry.IsFinished) { var warningMessage = string.Format("Dataset \"{0}\" will be deleted. Are you sure you want to delete this data set?", entry.Name); var result = MessageBox.Show(warningMessage, "Dataset Deletion Warning", MessageBoxButton.YesNo); if (result == MessageBoxResult.No || result == MessageBoxResult.Cancel || result == MessageBoxResult.None) { return; } } } if (DataTypesList == null) { return; } foreach (var dataTypeModel in DataTypesList.Where(dataTypeModel => dataTypeModel.RecordsList.Any(ds => ds.Entry.Id == entry.Id)).ToList()) { dataTypeModel.RecordsList.ToList().RemoveAll(ds => ds.Entry.Id != entry.Id); } if (SelectedDataType != null) { var item = SelectedDataType.RecordsList.FirstOrDefault(model => model.Entry.Id == entry.Id); if (item != null) { SelectedDataType.RecordsList.Remove(item); } } using (var session = SessionProvider.SessionFactory.OpenSession()) { using (var trans = session.BeginTransaction()) { session.Evict(entry); var target = TargetLookup[entry.ContentType.Name]; #region Delete queries string targetDeleteQuery; var tableName = target.IsCustom ? entry.ContentType.DbSchemaName : entry.ContentType.ClrType != null?Type.GetType(entry.ContentType.ClrType).EntityTableName() : string.Empty; if (string.IsNullOrEmpty(tableName)) { return; } //Disable Dataset Constraint //var disableConstraint = string.Format("ALTER TABLE {0} NOCHECK CONSTRAINT FK_TARGETS_{1}_DATASETS", tableName, tableName.Replace("Targets_", "")); var disableConstraint = string.Format("ALTER TABLE {0} NOCHECK CONSTRAINT ALL;", tableName /*, tableName.Replace("Targets_", "")*/); session.CreateSQLQuery(disableConstraint) .SetTimeout(25000) .ExecuteUpdate(); // Delete Transactional record var transactionDelete = string.Format("delete from DatasetTransactionRecord ct where ct.Dataset.Id = {0}", entry.Id); session.CreateQuery(transactionDelete) .SetTimeout(25000) .ExecuteUpdate(); //Delete websites with no website_id but have reference to this dataset being deleted var orphanWesbite = string.Format("delete from Websites_WebsiteDatasets where Website_Id IS NULL and Dataset_Id = {0}", entry.Id); session.CreateSQLQuery(orphanWesbite) .SetTimeout(25000) .ExecuteUpdate(); // finally delete content item record. var importDelete = string.Format("delete from Dataset c where c.Id = {0}", entry.Id); session.CreateQuery(importDelete) .SetTimeout(25000) .ExecuteUpdate(); #endregion if (TargetDeletionVisitors != null) { TargetDeletionVisitors = TargetDeletionVisitors.OrderBy(v => v.Order).ToList(); var options = new VisitorOptions() { DataProvider = this.SessionProvider, Logger = this.Logger }; var factory = new TaskFactory(new MonahrqTaskScheduler(2)); var token = new CancellationTokenSource(); Dispatcher.CurrentDispatcher.BeginInvoke(DispatcherPriority.Background, new Action(() => ListExtensions.ForEach(TargetDeletionVisitors, visitor => factory.StartNew(() => entry.Accept(visitor, options), token.Token)))); } trans.Commit(); } } } catch (Exception ex) { Events.GetEvent <ErrorNotificationEvent>().Publish(ex); } }