コード例 #1
0
ファイル: SqlSchemaToModel.cs プロジェクト: nHydrate/nHydrate
		private static void UpdateTables(
			nHydrate.Generator.Models.Database newDatabase, 
			nHydrate.Generator.Models.Database oldDatabase,
			List<string> selectedTables,
			ImportModelSettings settings)
		{
			#region Add new tables
			foreach (Table t in newDatabase.Tables)
			{
				if (!oldDatabase.Tables.Contains(t.Name) && selectedTables.Contains(t.Name.ToLower()))
				{
					var newT = oldDatabase.Tables.Add(t.Name);
					var doc = new XmlDocument();
					var tableId = newT.Id;
					doc.LoadXml("<a></a>");
					t.XmlAppend(doc.DocumentElement);
					newT.XmlLoad(doc.DocumentElement);
					newT.ResetId(tableId);

					newT.Columns.Clear();
					foreach (Reference r in t.Columns)
					{
						var newCol = oldDatabase.Columns.Add(((Column)r.Object).Name);
						var colId = newCol.Id;
						var doc3 = new XmlDocument();
						doc3.LoadXml("<a></a>");
						((Column)r.Object).XmlAppend(doc3.DocumentElement);
						newCol.XmlLoad(doc3.DocumentElement);
						newCol.ResetId(colId);
						newCol.ParentTableRef = newT.CreateRef();

						var newRef = new Reference(newT.Root);
						newRef.Ref = newCol.Id;
						newRef.RefType = ReferenceType.Column;
						newT.Columns.Add(newRef);
					}
					newT.Relationships.Clear();
				}
			}
			#endregion

			#region Update existing tables
			foreach (var t in oldDatabase.Tables.OrderBy(x => x.Name))
			{
				if (selectedTables.Contains(t.Name.ToLower()))
				{
					var newT = newDatabase.Tables[t.Name];
					if (newT != null)
					{
						#region Update matching columns
						var delRefList = new List<Reference>();
						foreach (Reference r in t.Columns)
						{
							var oldCol = (Column)r.Object;
							var newColRef = newT.Columns.FindByName(oldCol.Name);
							Column newCol = null;
							if (newColRef != null) newCol = (Column)newColRef.Object;

							var doUpdate = ((newCol != null) && (oldCol.CorePropertiesHash != newCol.CorePropertiesHash));
							if (doUpdate && settings.OverridePrimaryKey)
								doUpdate = (oldCol.CorePropertiesHashNoPK != newCol.CorePropertiesHashNoPK);

							if (doUpdate)
							{
								oldCol.CancelUIEvents = true;
								var colId = oldCol.Id;
								var colKey = oldCol.Key;
								var isPrimaryKey = oldCol.PrimaryKey;
								newCol.CodeFacade = oldCol.CodeFacade;
								//newCol.ResetId(colId);
								//newCol.SetKey(colKey);
								var doc = new XmlDocument();
								doc.LoadXml("<a></a>");
								newCol.XmlAppend(doc.DocumentElement);
								oldCol.XmlLoad(doc.DocumentElement);
								oldCol.ResetId(colId);
								oldCol.SetKey(colKey);
								//oldCol.PrimaryKey = isPrimaryKey;
								oldCol.ParentTableRef = newDatabase.Tables[(newCol.ParentTableRef.Object as Table).Name].CreateRef();
								oldCol.CancelUIEvents = false;
							}
							else if (newCol == null)
							{
								delRefList.Add(r);
							}

						}

						//Remove deleted fields
						foreach (var r in delRefList)
						{
							t.Columns.Remove(r);
						}
						#endregion

						#region Add new columns
						foreach (var c in newT.GetColumns())
						{
							if (t.GetColumns().FirstOrDefault(x => x.Name == c.Name) == null)
							{
								var newCol = oldDatabase.Columns.Add(c.Name);
								var colId = newCol.Id;
								var doc = new XmlDocument();
								doc.LoadXml("<a></a>");
								c.XmlAppend(doc.DocumentElement);
								newCol.XmlLoad(doc.DocumentElement);
								newCol.ResetId(colId);
								newCol.ParentTableRef = t.CreateRef();

								var newRef = new Reference(t.Root);
								newRef.Ref = newCol.Id;
								newRef.RefType = ReferenceType.Column;
								t.Columns.Add(newRef);
							}
						}
						#endregion

						#region Delete old columns
						var delColumnList = new List<Column>();
						foreach (Reference r in t.Columns)
						{
							if (newT.GetColumns().FirstOrDefault(x => x.Name == ((Column)r.Object).Name) == null)
							{
								delColumnList.Add((Column)r.Object);
							}
						}
						foreach (var c in delColumnList)
						{
							oldDatabase.Columns.Remove(c);
						}
						#endregion

						#region Update table properties
						t.CancelUIEvents = true;
						t.Description = newT.Description;
						t.AssociativeTable = newT.AssociativeTable;
						t.Generated = newT.Generated;
						t.HasHistory = newT.HasHistory;
						//t.AllowModifiedAudit = newT.AllowModifiedAudit;
						//t.AllowCreateAudit = newT.AllowCreateAudit;
						//t.AllowTimestamp = newT.AllowTimestamp;
						t.TypedTable = newT.TypedTable;
						t.CreateMetaData = newT.CreateMetaData;
						t.FullIndexSearch = newT.FullIndexSearch;
						t.IsMetaData = newT.IsMetaData;
						t.IsMetaDataDefinition = newT.IsMetaDataDefinition;
						t.IsMetaDataMaster = newT.IsMetaDataMaster;
						t.DBSchema = newT.DBSchema;
						t.CancelUIEvents = false;
						#endregion
					}
				}
			}
			#endregion

			#region Delete removed tables
			var delTableList = new List<Table>();
			foreach (Table t in oldDatabase.Tables)
			{
				if (selectedTables.Contains(t.Name.ToLower()))
				{
					if (!newDatabase.Tables.Contains(t.Name))
						delTableList.Add(t);
				}
			}
			foreach (var t in delTableList)
			{
				oldDatabase.Tables.Remove(t);
			}
			#endregion

			#region DEBUG
			foreach (var t in oldDatabase.Tables.OrderBy(x => x.Name))
			{
				#region Columns
				foreach (var c in t.GetColumns())
				{
					if (c.ParentTableRef == null)
					{
						System.Diagnostics.Debug.Write("");
					}
					else if (c.ParentTableRef.Object == null)
					{
						System.Diagnostics.Debug.Write("");
					}
				}
				#endregion

				#region Relations
				foreach (Relation r in t.GetRelations())
				{
					if (r.ChildTableRef == null)
					{
						System.Diagnostics.Debug.Write("");
					}
					else if (r.ChildTableRef.Object == null)
					{
						System.Diagnostics.Debug.Write("");
					}

					if (r.ParentTableRef == null)
					{
						System.Diagnostics.Debug.Write("");
					}
					else if (r.ParentTableRef.Object == null)
					{
						System.Diagnostics.Debug.Write("");
					}

				}
				#endregion
			}
			#endregion
		}
コード例 #2
0
ファイル: SqlSchemaToModel.cs プロジェクト: nHydrate/nHydrate
		private static void UpdateViews(
			nHydrate.Generator.Models.Database newDatabase, 
			nHydrate.Generator.Models.Database oldDatabase,
			List<string> selectedViews,
			ImportModelSettings settings)
		{
			#region Update existing items
			foreach (CustomView t in oldDatabase.CustomViews)
			{
				if (selectedViews.Contains(t.Name.ToLower()))
				{
					var newV = newDatabase.CustomViews[t.Name];
					if (newV != null)
					{
						#region Update matching columns
						var delRefList = new List<Reference>();
						foreach (Reference r in t.Columns)
						{
							var oldCol = (CustomViewColumn)r.Object;
							var newColRef = newV.Columns.FindByName(oldCol.Name);
							CustomViewColumn newCol = null;
							if (newColRef != null) newCol = (CustomViewColumn)newColRef.Object;

							var doUpdate = ((newCol != null) && (oldCol.CorePropertiesHash != newCol.CorePropertiesHash));
							if (doUpdate && settings.OverridePrimaryKey)
								doUpdate = (oldCol.CorePropertiesHashNoPK != newCol.CorePropertiesHashNoPK);

							if (doUpdate)
							{
								oldCol.CancelUIEvents = true;
								var colId = oldCol.Id;
								var colKey = oldCol.Key;
								newCol.CodeFacade = oldCol.CodeFacade;
								//newCol.ResetId(colId);
								//newCol.SetKey(colKey);
								var doc = new XmlDocument();
								doc.LoadXml("<a></a>");
								newCol.XmlAppend(doc.DocumentElement);
								oldCol.XmlLoad(doc.DocumentElement);
								oldCol.ResetId(colId);
								oldCol.SetKey(colKey);
								oldCol.CancelUIEvents = false;
							}
							else if (newCol == null)
							{
								delRefList.Add(r);
							}

						}

						//Remove deleted fields
						foreach (var r in delRefList)
						{
							t.Columns.Remove(r);
						}
						#endregion

						#region Add new columns
						foreach (Reference r in newV.Columns)
						{
							var c = (CustomViewColumn)r.Object;
							if (t.GetColumns().FirstOrDefault(x => x.Name == c.Name) == null)
							{
								var newCol = oldDatabase.CustomViewColumns.Add(c.Name);
								var colId = newCol.Id;
								var doc = new XmlDocument();
								doc.LoadXml("<a></a>");
								c.XmlAppend(doc.DocumentElement);
								newCol.XmlLoad(doc.DocumentElement);
								newCol.ResetId(colId);
								newCol.ParentViewRef = t.CreateRef();

								var newRef = new Reference(t.Root);
								newRef.Ref = newCol.Id;
								newRef.RefType = ReferenceType.CustomViewColumn;
								t.Columns.Add(newRef);
							}
						}
						#endregion

						#region Delete old columns
						var delColumnList = new List<CustomViewColumn>();
						foreach (Reference r in t.Columns)
						{
							if (newV.GetColumns().FirstOrDefault(x => x.Name == ((CustomViewColumn)r.Object).Name) == null)
							{
								delColumnList.Add((CustomViewColumn)r.Object);
							}
						}
						foreach (var c in delColumnList)
						{
							oldDatabase.CustomViewColumns.Remove(c);
						}
						#endregion

						#region Update item properties
						t.CancelUIEvents = true;
						t.Description = newV.Description;
						t.Generated = newV.Generated;
						t.SQL = newV.SQL;
						t.CancelUIEvents = false;
						#endregion
					}
				}

			}
			#endregion

			#region Add new items
			foreach (CustomView t in newDatabase.CustomViews)
			{
				if (selectedViews.Contains(t.Name.ToLower()))
				{
					if (!oldDatabase.CustomViews.Contains(t.Name))
					{
						var newV = oldDatabase.CustomViews.Add(t.Name);
						var doc = new XmlDocument();
						var tableId = newV.Id;
						doc.LoadXml("<a></a>");
						t.XmlAppend(doc.DocumentElement);
						newV.XmlLoad(doc.DocumentElement);
						newV.ResetId(tableId);

						newV.Columns.Clear();
						foreach (Reference r in t.Columns)
						{
							var newCol = oldDatabase.CustomViewColumns.Add(((CustomViewColumn)r.Object).Name);
							var colId = newCol.Id;
							var doc3 = new XmlDocument();
							doc3.LoadXml("<a></a>");
							((CustomViewColumn)r.Object).XmlAppend(doc3.DocumentElement);
							newCol.XmlLoad(doc3.DocumentElement);
							newCol.ResetId(colId);
							newCol.ParentViewRef = newV.CreateRef();

							var newRef = new Reference(newV.Root);
							newRef.Ref = newCol.Id;
							newRef.RefType = ReferenceType.CustomViewColumn;
							newV.Columns.Add(newRef);
						}

					}
				}
			}
			#endregion

			#region Delete removed items
			var delViewList = new List<CustomView>();
			foreach (CustomView t in oldDatabase.CustomViews)
			{
				if (selectedViews.Contains(t.Name.ToLower()))
				{
					if (!newDatabase.CustomViews.Contains(t.Name))
						delViewList.Add(t);
				}
			}
			foreach (var t in delViewList)
			{
				oldDatabase.CustomViews.Remove(t);
			}
			#endregion
		}
コード例 #3
0
ファイル: SqlSchemaToModel.cs プロジェクト: nHydrate/nHydrate
		/// <summary>
		/// Show a windows to refresh teh model from a database
		/// </summary>
		public static ImportReturnConstants ImportModel(ModelRoot currentGraph,
			ModelRoot newGraph, 
			ImportModelSettings settings,
			List<string> selectedTables,
			List<string> selectedViews)
		{
			var processKey = string.Empty;
			try
			{
				//var newProject = new nHydrateGeneratorProject();
				//newProject.FileName = currentGraph.FileName;
				//var newRoot = newProject.RootController.Object as ModelRoot;
				var oldRoot = currentGraph;
				//newRoot.TransformNames = oldRoot.TransformNames;
				//newRoot.Database.CreatedByColumnName = oldRoot.Database.CreatedByColumnName;
				//newRoot.Database.CreatedDateColumnName = oldRoot.Database.CreatedDateColumnName;
				//newRoot.Database.ModifiedByColumnName = oldRoot.Database.ModifiedByColumnName;
				//newRoot.Database.ModifiedDateColumnName = oldRoot.Database.ModifiedDateColumnName;
				//newRoot.Database.TimestampColumnName = oldRoot.Database.TimestampColumnName;
				//if (!GetProjectFromSqlSchema(newProject))
				//{
				//  return ImportReturnConstants.Aborted;
				//}

				var newDatabase = newGraph.Database;
				var oldDatabase = currentGraph.Database;

				////Check if there are any changes and if so show the form
				//if (F.GetChangeCount() == 0)
				//{
				//  return ImportReturnConstants.NoChange;
				//}
				//else if (F.ShowDialog() != System.Windows.Forms.DialogResult.OK)
				//{
				//  return ImportReturnConstants.Aborted;
				//}
				//var settings = F.Settings;
				//var connectionString = F.GetConnectionString();

				//processKey = UIHelper.ProgressingStarted();
				try
				{
					UpdateTables(newDatabase, oldDatabase, selectedTables, settings);

					#region Relations
					var oldList = new List<Relation>();
					foreach (Relation r in oldDatabase.Relations)
						oldList.Add(r);

					oldDatabase.Relations.Clear();
					UpdateRelations(newDatabase, oldDatabase);

					//Now reset the role names where necessary
					foreach (Relation r1 in oldDatabase.Relations)
					{
						foreach (var r2 in oldList)
						{
							if (r1.Equals(r2) && (r1.RoleName != r2.RoleName)) r1.RoleName = r2.RoleName;
						}
					}

					#endregion

					UpdateViews(newDatabase, oldDatabase, selectedViews, settings);

					//this.UpdateStoredProcedures(newDatabase, oldDatabase, settings);

					//Refresh the tree
					//currentGraph.RootController.Node.RefreshDeep();
					//((ModelRootController)currentGraph.Controller).ClearTree();
				}
				catch (Exception ex)
				{
					throw;
				}
				finally
				{
					//UIHelper.ProgressingComplete(processKey);
				}
				return ImportReturnConstants.Success;

			}
			catch (SqlException ex)
			{
				MessageBox.Show(ex.Message, "Error!", MessageBoxButtons.OK, MessageBoxIcon.Information);
				return ImportReturnConstants.Aborted;
			}
			catch (Exception ex)
			{
				throw;
			}
			finally
			{
				//UIHelper.ProgressingComplete(processKey);
			}

		}