From 12386fe11d26e8c5d9a18cd0ebcd18a3961834b9 Mon Sep 17 00:00:00 2001 From: Russ Kollmansberger Date: Mon, 1 Sep 2025 08:27:18 -0500 Subject: [PATCH] DB operations now occur w/in transactions, added Open DB Form to tester --- DbToolsTester/DbToolsTester.csproj | 10 ++ DbToolsTester/Forms/MainForm.Designer.cs | 193 +++++++++++++---------- DbToolsTester/Forms/MainForm.cs | 37 ++++- DbToolsTester/Forms/MainForm.resx | 156 +++++++++--------- DbToolsTester/Forms/OpenForm.Designer.cs | 178 +++++++++++++++++++++ DbToolsTester/Forms/OpenForm.cs | 35 ++++ DbToolsTester/Forms/OpenForm.resx | 120 ++++++++++++++ DbToolsTester/Properties/licenses.licx | 2 + Delta.cs | 25 ++- Migrations.cs | 17 +- 10 files changed, 598 insertions(+), 175 deletions(-) create mode 100644 DbToolsTester/Forms/OpenForm.Designer.cs create mode 100644 DbToolsTester/Forms/OpenForm.cs create mode 100644 DbToolsTester/Forms/OpenForm.resx diff --git a/DbToolsTester/DbToolsTester.csproj b/DbToolsTester/DbToolsTester.csproj index 22473a6..91a7a98 100644 --- a/DbToolsTester/DbToolsTester.csproj +++ b/DbToolsTester/DbToolsTester.csproj @@ -42,6 +42,7 @@ + @@ -64,11 +65,20 @@ MainForm.cs + + Form + + + OpenForm.cs + MainForm.cs + + OpenForm.cs + ResXFileCodeGenerator diff --git a/DbToolsTester/Forms/MainForm.Designer.cs b/DbToolsTester/Forms/MainForm.Designer.cs index 0cbf914..b7778d1 100644 --- a/DbToolsTester/Forms/MainForm.Designer.cs +++ b/DbToolsTester/Forms/MainForm.Designer.cs @@ -30,24 +30,26 @@ DevExpress.XtraEditors.Controls.EditorButtonImageOptions editorButtonImageOptions2 = new DevExpress.XtraEditors.Controls.EditorButtonImageOptions(); DevExpress.Utils.SerializableAppearanceObject serializableAppearanceObject2 = new DevExpress.Utils.SerializableAppearanceObject(); this.barManager1 = new DevExpress.XtraBars.BarManager(this.components); + this.bar1 = new DevExpress.XtraBars.Bar(); + this.bbiDelta = new DevExpress.XtraBars.BarButtonItem(); + this.bbiMigrations = new DevExpress.XtraBars.BarButtonItem(); + this.bbiApplyBoth = new DevExpress.XtraBars.BarButtonItem(); + this.bar2 = new DevExpress.XtraBars.Bar(); + this.bar3 = new DevExpress.XtraBars.Bar(); this.barDockControlTop = new DevExpress.XtraBars.BarDockControl(); this.barDockControlBottom = new DevExpress.XtraBars.BarDockControl(); this.barDockControlLeft = new DevExpress.XtraBars.BarDockControl(); this.barDockControlRight = new DevExpress.XtraBars.BarDockControl(); - this.bar1 = new DevExpress.XtraBars.Bar(); - this.bar2 = new DevExpress.XtraBars.Bar(); - this.bar3 = new DevExpress.XtraBars.Bar(); - this.bbiDelta = new DevExpress.XtraBars.BarButtonItem(); - this.bbiMigrations = new DevExpress.XtraBars.BarButtonItem(); - this.bbiApplyBoth = new DevExpress.XtraBars.BarButtonItem(); this.XtraTabControl1 = new DevExpress.XtraTab.XtraTabControl(); this.xtraTabPage1 = new DevExpress.XtraTab.XtraTabPage(); - this.xtraTabPage2 = new DevExpress.XtraTab.XtraTabPage(); - this.xtraTabPage3 = new DevExpress.XtraTab.XtraTabPage(); - this.xtraTabPage4 = new DevExpress.XtraTab.XtraTabPage(); this.db1Sql = new System.Windows.Forms.RichTextBox(); + this.xtraTabPage2 = new DevExpress.XtraTab.XtraTabPage(); this.db2Sql = new System.Windows.Forms.RichTextBox(); + this.xtraTabPage3 = new DevExpress.XtraTab.XtraTabPage(); this.deltaSql = new System.Windows.Forms.RichTextBox(); + this.xtraTabPage4 = new DevExpress.XtraTab.XtraTabPage(); + this.btsRemoveUnusedTables = new DevExpress.XtraBars.BarToggleSwitchItem(); + this.btsRemoveUnusedColumns = new DevExpress.XtraBars.BarToggleSwitchItem(); ((System.ComponentModel.ISupportInitialize)(this.barManager1)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.XtraTabControl1)).BeginInit(); this.XtraTabControl1.SuspendLayout(); @@ -70,11 +72,70 @@ this.barManager1.Items.AddRange(new DevExpress.XtraBars.BarItem[] { this.bbiDelta, this.bbiMigrations, - this.bbiApplyBoth}); + this.bbiApplyBoth, + this.btsRemoveUnusedTables, + this.btsRemoveUnusedColumns}); this.barManager1.MainMenu = this.bar2; - this.barManager1.MaxItemId = 3; + this.barManager1.MaxItemId = 6; this.barManager1.StatusBar = this.bar3; // + // bar1 + // + this.bar1.BarName = "Tools"; + this.bar1.DockCol = 0; + this.bar1.DockRow = 1; + this.bar1.DockStyle = DevExpress.XtraBars.BarDockStyle.Top; + this.bar1.LinksPersistInfo.AddRange(new DevExpress.XtraBars.LinkPersistInfo[] { + new DevExpress.XtraBars.LinkPersistInfo(this.bbiDelta), + new DevExpress.XtraBars.LinkPersistInfo(this.bbiMigrations), + new DevExpress.XtraBars.LinkPersistInfo(this.bbiApplyBoth), + new DevExpress.XtraBars.LinkPersistInfo(this.btsRemoveUnusedTables, true), + new DevExpress.XtraBars.LinkPersistInfo(this.btsRemoveUnusedColumns)}); + this.bar1.Text = "Tools"; + // + // bbiDelta + // + this.bbiDelta.Caption = "Generate Delta"; + this.bbiDelta.Id = 0; + this.bbiDelta.Name = "bbiDelta"; + this.bbiDelta.ItemClick += new DevExpress.XtraBars.ItemClickEventHandler(this.ToolbarItemClicked); + // + // bbiMigrations + // + this.bbiMigrations.Caption = "Get Migration List"; + this.bbiMigrations.Id = 1; + this.bbiMigrations.Name = "bbiMigrations"; + this.bbiMigrations.ItemClick += new DevExpress.XtraBars.ItemClickEventHandler(this.ToolbarItemClicked); + // + // bbiApplyBoth + // + this.bbiApplyBoth.Caption = "Apply Delta && Migrations"; + this.bbiApplyBoth.Id = 2; + this.bbiApplyBoth.Name = "bbiApplyBoth"; + this.bbiApplyBoth.ItemClick += new DevExpress.XtraBars.ItemClickEventHandler(this.ToolbarItemClicked); + // + // bar2 + // + this.bar2.BarName = "Main menu"; + this.bar2.DockCol = 0; + this.bar2.DockRow = 0; + this.bar2.DockStyle = DevExpress.XtraBars.BarDockStyle.Top; + this.bar2.OptionsBar.MultiLine = true; + this.bar2.OptionsBar.UseWholeRow = true; + this.bar2.Text = "Main menu"; + // + // bar3 + // + this.bar3.BarName = "Status bar"; + this.bar3.CanDockStyle = DevExpress.XtraBars.BarCanDockStyle.Bottom; + this.bar3.DockCol = 0; + this.bar3.DockRow = 0; + this.bar3.DockStyle = DevExpress.XtraBars.BarDockStyle.Bottom; + this.bar3.OptionsBar.AllowQuickCustomization = false; + this.bar3.OptionsBar.DrawDragBorder = false; + this.bar3.OptionsBar.UseWholeRow = true; + this.bar3.Text = "Status bar"; + // // barDockControlTop // this.barDockControlTop.CausesValidation = false; @@ -107,58 +168,6 @@ this.barDockControlRight.Manager = this.barManager1; this.barDockControlRight.Size = new System.Drawing.Size(0, 417); // - // bar1 - // - this.bar1.BarName = "Tools"; - this.bar1.DockCol = 0; - this.bar1.DockStyle = DevExpress.XtraBars.BarDockStyle.Top; - this.bar1.LinksPersistInfo.AddRange(new DevExpress.XtraBars.LinkPersistInfo[] { - new DevExpress.XtraBars.LinkPersistInfo(this.bbiDelta), - new DevExpress.XtraBars.LinkPersistInfo(this.bbiMigrations), - new DevExpress.XtraBars.LinkPersistInfo(this.bbiApplyBoth)}); - this.bar1.Text = "Tools"; - // - // bar2 - // - this.bar2.BarName = "Main menu"; - this.bar2.DockCol = 0; - this.bar2.DockStyle = DevExpress.XtraBars.BarDockStyle.Top; - this.bar2.OptionsBar.MultiLine = true; - this.bar2.OptionsBar.UseWholeRow = true; - this.bar2.Text = "Main menu"; - // - // bar3 - // - this.bar3.BarName = "Status bar"; - this.bar3.CanDockStyle = DevExpress.XtraBars.BarCanDockStyle.Bottom; - this.bar3.DockCol = 0; - this.bar3.DockStyle = DevExpress.XtraBars.BarDockStyle.Bottom; - this.bar3.OptionsBar.AllowQuickCustomization = false; - this.bar3.OptionsBar.DrawDragBorder = false; - this.bar3.OptionsBar.UseWholeRow = true; - this.bar3.Text = "Status bar"; - // - // bbiDelta - // - this.bbiDelta.Caption = "Generate Delta"; - this.bbiDelta.Id = 0; - this.bbiDelta.Name = "bbiDelta"; - this.bbiDelta.ItemClick += new DevExpress.XtraBars.ItemClickEventHandler(this.ToolbarItemClicked); - // - // bbiMigrations - // - this.bbiMigrations.Caption = "Get Migration List"; - this.bbiMigrations.Id = 1; - this.bbiMigrations.Name = "bbiMigrations"; - this.bbiMigrations.ItemClick += new DevExpress.XtraBars.ItemClickEventHandler(this.ToolbarItemClicked); - // - // bbiApplyBoth - // - this.bbiApplyBoth.Caption = "Apply Delta && Migrations"; - this.bbiApplyBoth.Id = 2; - this.bbiApplyBoth.Name = "bbiApplyBoth"; - this.bbiApplyBoth.ItemClick += new DevExpress.XtraBars.ItemClickEventHandler(this.ToolbarItemClicked); - // // XtraTabControl1 // editorButtonImageOptions1.Image = ((System.Drawing.Image)(resources.GetObject("editorButtonImageOptions1.Image"))); @@ -186,26 +195,6 @@ this.xtraTabPage1.Size = new System.Drawing.Size(838, 375); this.xtraTabPage1.Text = "Live / Production DB"; // - // xtraTabPage2 - // - this.xtraTabPage2.Controls.Add(this.db2Sql); - this.xtraTabPage2.Name = "xtraTabPage2"; - this.xtraTabPage2.Size = new System.Drawing.Size(838, 392); - this.xtraTabPage2.Text = "Schema / Updated DB"; - // - // xtraTabPage3 - // - this.xtraTabPage3.Controls.Add(this.deltaSql); - this.xtraTabPage3.Name = "xtraTabPage3"; - this.xtraTabPage3.Size = new System.Drawing.Size(838, 392); - this.xtraTabPage3.Text = "Delta SQL"; - // - // xtraTabPage4 - // - this.xtraTabPage4.Name = "xtraTabPage4"; - this.xtraTabPage4.Size = new System.Drawing.Size(0, 0); - this.xtraTabPage4.Text = "Migrations"; - // // db1Sql // this.db1Sql.Dock = System.Windows.Forms.DockStyle.Fill; @@ -217,6 +206,13 @@ this.db1Sql.TabIndex = 0; this.db1Sql.Text = "This database is the one that is currently in use by the application. This databa" + "se needs to be updated to fit the most recent schema."; + // + // xtraTabPage2 + // + this.xtraTabPage2.Controls.Add(this.db2Sql); + this.xtraTabPage2.Name = "xtraTabPage2"; + this.xtraTabPage2.Size = new System.Drawing.Size(838, 375); + this.xtraTabPage2.Text = "Schema / Updated DB"; // // db2Sql // @@ -225,10 +221,17 @@ this.db2Sql.Location = new System.Drawing.Point(0, 0); this.db2Sql.Name = "db2Sql"; this.db2Sql.ReadOnly = true; - this.db2Sql.Size = new System.Drawing.Size(838, 392); + this.db2Sql.Size = new System.Drawing.Size(838, 375); this.db2Sql.TabIndex = 1; this.db2Sql.Text = resources.GetString("db2Sql.Text"); // + // xtraTabPage3 + // + this.xtraTabPage3.Controls.Add(this.deltaSql); + this.xtraTabPage3.Name = "xtraTabPage3"; + this.xtraTabPage3.Size = new System.Drawing.Size(838, 375); + this.xtraTabPage3.Text = "Delta SQL"; + // // deltaSql // this.deltaSql.Dock = System.Windows.Forms.DockStyle.Fill; @@ -236,10 +239,28 @@ this.deltaSql.Location = new System.Drawing.Point(0, 0); this.deltaSql.Name = "deltaSql"; this.deltaSql.ReadOnly = true; - this.deltaSql.Size = new System.Drawing.Size(838, 392); + this.deltaSql.Size = new System.Drawing.Size(838, 375); this.deltaSql.TabIndex = 1; this.deltaSql.Text = "This SQL script contains all of the SQL commands required to make the production " + "(existing) database the same as the new template database."; + // + // xtraTabPage4 + // + this.xtraTabPage4.Name = "xtraTabPage4"; + this.xtraTabPage4.Size = new System.Drawing.Size(838, 375); + this.xtraTabPage4.Text = "Migrations"; + // + // btsRemoveUnusedTables + // + this.btsRemoveUnusedTables.Caption = "Remove Unused Tables"; + this.btsRemoveUnusedTables.Id = 4; + this.btsRemoveUnusedTables.Name = "btsRemoveUnusedTables"; + // + // btsRemoveUnusedColumns + // + this.btsRemoveUnusedColumns.Caption = "Remove Unused Columns"; + this.btsRemoveUnusedColumns.Id = 5; + this.btsRemoveUnusedColumns.Name = "btsRemoveUnusedColumns"; // // MainForm // @@ -286,5 +307,7 @@ private System.Windows.Forms.RichTextBox db1Sql; private System.Windows.Forms.RichTextBox db2Sql; private System.Windows.Forms.RichTextBox deltaSql; + private DevExpress.XtraBars.BarToggleSwitchItem btsRemoveUnusedTables; + private DevExpress.XtraBars.BarToggleSwitchItem btsRemoveUnusedColumns; } } \ No newline at end of file diff --git a/DbToolsTester/Forms/MainForm.cs b/DbToolsTester/Forms/MainForm.cs index 4c9b1da..d15d8a5 100644 --- a/DbToolsTester/Forms/MainForm.cs +++ b/DbToolsTester/Forms/MainForm.cs @@ -5,22 +5,24 @@ using System.Windows.Forms; namespace DbToolsTester.Forms { public partial class MainForm : DevExpress.XtraEditors.XtraForm { + public static MainForm Instance { get; private set; } public string DatabaseName { get; set; } public string Database1File { get; set; } public string Database2File { get; set; } public MainForm() { InitializeComponent(); + Instance = this; } private void XtraTabControl1_CustomHeaderButtonClick(object sender, DevExpress.XtraTab.ViewInfo.CustomHeaderButtonEventArgs e) { string tag = e.Button.Tag?.ToString(); if (tag == "open") { - Database1File = getDatabaseFile("Select Original / Production Database..."); - Database2File = getDatabaseFile("Select Template / New Schema Database..."); - - DatabaseName = Path.GetFileNameWithoutExtension(Database1File); - Text += " [ Production DB = " + Path.GetFileName(Database1File) + "; Schema DB = " + Path.GetFileName(Database2File) + " ]"; + OpenForm frm = new OpenForm(); + if (frm.ShowDialog(this) == DialogResult.OK) { + // Databases are set in OpenForm + SetDatabases(frm.Db1Path, frm.Db2Path); + } } else if (tag == "clear") { Database1File = null; Database2File = null; @@ -33,6 +35,13 @@ namespace DbToolsTester.Forms { } } + public void SetDatabases(string db1File, string db2File) { + Database1File = db1File; + Database2File = db2File; + DatabaseName = Path.GetFileNameWithoutExtension(Database1File); + Text += " [ Production DB = " + Path.GetFileName(Database1File) + "; Schema DB = " + Path.GetFileName(Database2File) + " ]"; + } + private string getDatabaseFile(string title = "Select Database File...") { OpenFileDialog dlg = new OpenFileDialog() { Filter = "Database Files (*.sql;*.sqlite;*.db)|*.sql;*.sqlite;*.db|SQL Files (*.sql)|*.sql|Sqlite Files (*.sqlite;*.db)|*.sqlite;*.db|Text Files (*.txt)|*.txt|All Files (*.*)|*.*", @@ -52,9 +61,25 @@ namespace DbToolsTester.Forms { SQLiteConnection db2 = new SQLiteConnection("Data Source=" + Database2File + ";Version=3;"); Delta delta = new Delta(); - deltaSql.Text = delta.BuildDelta(db1, db2, true, true); + deltaSql.Text = delta.BuildDelta(db1, db2, btsRemoveUnusedTables.Checked, btsRemoveUnusedColumns.Checked); db1Sql.Text = delta.Db1Sql; db2Sql.Text = delta.Db2Sql; + } else if (e.Item.Equals(bbiApplyBoth)) { + if (string.IsNullOrEmpty(deltaSql.Text)) { + MessageBox.Show("No delta SQL to apply.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + + using (var db1 = new SQLiteConnection("Data Source=" + Database1File + ";Version=3;")) { + db1.Open(); + Delta delta = new Delta(); + bool success = delta.ApplyDelta(db1, deltaSql.Text); + if (success) { + MessageBox.Show("Delta applied successfully.", "Success", MessageBoxButtons.OK, MessageBoxIcon.Information); + } else { + MessageBox.Show("Failed to apply delta." + (delta.LastError != null ? "\r\n\r\n" + delta.LastError.Message : ""), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } } } } diff --git a/DbToolsTester/Forms/MainForm.resx b/DbToolsTester/Forms/MainForm.resx index 02a0f93..eea81cb 100644 --- a/DbToolsTester/Forms/MainForm.resx +++ b/DbToolsTester/Forms/MainForm.resx @@ -123,88 +123,88 @@ - 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 + rwED/gtPhKgGMZyDxQAAAABJRU5ErkJggg== - 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 diff --git a/DbToolsTester/Forms/OpenForm.Designer.cs b/DbToolsTester/Forms/OpenForm.Designer.cs new file mode 100644 index 0000000..2f15533 --- /dev/null +++ b/DbToolsTester/Forms/OpenForm.Designer.cs @@ -0,0 +1,178 @@ +namespace DbToolsTester.Forms { + partial class OpenForm { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) { + if (disposing && (components != null)) { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() { + this.layoutControl1 = new DevExpress.XtraLayout.LayoutControl(); + this.Root = new DevExpress.XtraLayout.LayoutControlGroup(); + this.Db1File = new DevExpress.XtraEditors.ButtonEdit(); + this.layoutControlItem1 = new DevExpress.XtraLayout.LayoutControlItem(); + this.emptySpaceItem1 = new DevExpress.XtraLayout.EmptySpaceItem(); + this.db2File = new DevExpress.XtraEditors.ButtonEdit(); + this.layoutControlItem2 = new DevExpress.XtraLayout.LayoutControlItem(); + this.btnOpen = new DevExpress.XtraEditors.SimpleButton(); + this.btnCancel = new DevExpress.XtraEditors.SimpleButton(); + ((System.ComponentModel.ISupportInitialize)(this.layoutControl1)).BeginInit(); + this.layoutControl1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.Root)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.Db1File.Properties)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.layoutControlItem1)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.emptySpaceItem1)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.db2File.Properties)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.layoutControlItem2)).BeginInit(); + this.SuspendLayout(); + // + // layoutControl1 + // + this.layoutControl1.Controls.Add(this.db2File); + this.layoutControl1.Controls.Add(this.Db1File); + this.layoutControl1.Dock = System.Windows.Forms.DockStyle.Top; + this.layoutControl1.Location = new System.Drawing.Point(0, 0); + this.layoutControl1.Name = "layoutControl1"; + this.layoutControl1.Root = this.Root; + this.layoutControl1.Size = new System.Drawing.Size(561, 167); + this.layoutControl1.TabIndex = 0; + this.layoutControl1.Text = "layoutControl1"; + // + // Root + // + this.Root.EnableIndentsWithoutBorders = DevExpress.Utils.DefaultBoolean.True; + this.Root.GroupBordersVisible = false; + this.Root.Items.AddRange(new DevExpress.XtraLayout.BaseLayoutItem[] { + this.layoutControlItem1, + this.emptySpaceItem1, + this.layoutControlItem2}); + this.Root.Name = "Root"; + this.Root.Size = new System.Drawing.Size(561, 167); + this.Root.TextVisible = false; + // + // Db1File + // + this.Db1File.EditValue = "C:\\Users\\rlkollman\\AppData\\Local\\LEMS\\MDB6\\data.db"; + this.Db1File.Location = new System.Drawing.Point(12, 28); + this.Db1File.Name = "Db1File"; + this.Db1File.Properties.Buttons.AddRange(new DevExpress.XtraEditors.Controls.EditorButton[] { + new DevExpress.XtraEditors.Controls.EditorButton()}); + this.Db1File.Size = new System.Drawing.Size(537, 20); + this.Db1File.StyleController = this.layoutControl1; + this.Db1File.TabIndex = 4; + this.Db1File.ButtonClick += new DevExpress.XtraEditors.Controls.ButtonPressedEventHandler(this.Db1File_ButtonClick); + // + // layoutControlItem1 + // + this.layoutControlItem1.Control = this.Db1File; + this.layoutControlItem1.Location = new System.Drawing.Point(0, 0); + this.layoutControlItem1.Name = "layoutControlItem1"; + this.layoutControlItem1.Size = new System.Drawing.Size(541, 40); + this.layoutControlItem1.Text = "Production Database (in-use database)"; + this.layoutControlItem1.TextLocation = DevExpress.Utils.Locations.Top; + this.layoutControlItem1.TextSize = new System.Drawing.Size(188, 13); + // + // emptySpaceItem1 + // + this.emptySpaceItem1.AllowHotTrack = false; + this.emptySpaceItem1.Location = new System.Drawing.Point(0, 80); + this.emptySpaceItem1.Name = "emptySpaceItem1"; + this.emptySpaceItem1.Size = new System.Drawing.Size(541, 67); + this.emptySpaceItem1.TextSize = new System.Drawing.Size(0, 0); + // + // db2File + // + this.db2File.EditValue = "F:\\programming\\net\\MobileDataBrowser\\MobileDataBrowser6\\data with codelists separ" + + "ated.db"; + this.db2File.Location = new System.Drawing.Point(12, 68); + this.db2File.Name = "db2File"; + this.db2File.Properties.Buttons.AddRange(new DevExpress.XtraEditors.Controls.EditorButton[] { + new DevExpress.XtraEditors.Controls.EditorButton()}); + this.db2File.Size = new System.Drawing.Size(537, 20); + this.db2File.StyleController = this.layoutControl1; + this.db2File.TabIndex = 5; + this.db2File.ButtonClick += new DevExpress.XtraEditors.Controls.ButtonPressedEventHandler(this.Db1File_ButtonClick); + // + // layoutControlItem2 + // + this.layoutControlItem2.Control = this.db2File; + this.layoutControlItem2.Location = new System.Drawing.Point(0, 40); + this.layoutControlItem2.Name = "layoutControlItem2"; + this.layoutControlItem2.Size = new System.Drawing.Size(541, 40); + this.layoutControlItem2.Text = "New / Template Database"; + this.layoutControlItem2.TextLocation = DevExpress.Utils.Locations.Top; + this.layoutControlItem2.TextSize = new System.Drawing.Size(188, 13); + // + // btnOpen + // + this.btnOpen.DialogResult = System.Windows.Forms.DialogResult.OK; + this.btnOpen.Location = new System.Drawing.Point(307, 173); + this.btnOpen.Name = "btnOpen"; + this.btnOpen.Size = new System.Drawing.Size(118, 43); + this.btnOpen.TabIndex = 1; + this.btnOpen.Text = "&Open"; + this.btnOpen.Click += new System.EventHandler(this.btnOpen_Click); + // + // btnCancel + // + this.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.btnCancel.Location = new System.Drawing.Point(431, 173); + this.btnCancel.Name = "btnCancel"; + this.btnCancel.Size = new System.Drawing.Size(118, 43); + this.btnCancel.TabIndex = 2; + this.btnCancel.Text = "&Cancel"; + // + // OpenForm + // + this.AcceptButton = this.btnOpen; + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.CancelButton = this.btnCancel; + this.ClientSize = new System.Drawing.Size(561, 233); + this.Controls.Add(this.btnCancel); + this.Controls.Add(this.btnOpen); + this.Controls.Add(this.layoutControl1); + this.Name = "OpenForm"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Open Databases ..."; + ((System.ComponentModel.ISupportInitialize)(this.layoutControl1)).EndInit(); + this.layoutControl1.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.Root)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.Db1File.Properties)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.layoutControlItem1)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.emptySpaceItem1)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.db2File.Properties)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.layoutControlItem2)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + + private DevExpress.XtraLayout.LayoutControl layoutControl1; + private DevExpress.XtraLayout.LayoutControlGroup Root; + private DevExpress.XtraEditors.ButtonEdit db2File; + private DevExpress.XtraEditors.ButtonEdit Db1File; + private DevExpress.XtraLayout.LayoutControlItem layoutControlItem1; + private DevExpress.XtraLayout.EmptySpaceItem emptySpaceItem1; + private DevExpress.XtraLayout.LayoutControlItem layoutControlItem2; + private DevExpress.XtraEditors.SimpleButton btnOpen; + private DevExpress.XtraEditors.SimpleButton btnCancel; + } +} \ No newline at end of file diff --git a/DbToolsTester/Forms/OpenForm.cs b/DbToolsTester/Forms/OpenForm.cs new file mode 100644 index 0000000..43e0d62 --- /dev/null +++ b/DbToolsTester/Forms/OpenForm.cs @@ -0,0 +1,35 @@ +using System; +using System.Windows.Forms; + +namespace DbToolsTester.Forms { + public partial class OpenForm : DevExpress.XtraEditors.XtraForm { + public string Db1Path => Db1File.Text; + public string Db2Path => db2File.Text; + + public OpenForm() { + InitializeComponent(); + } + + private void btnOpen_Click(object sender, EventArgs e) { + MainForm.Instance.SetDatabases(Db1File.Text, db2File.Text); + } + + private void Db1File_ButtonClick(object sender, DevExpress.XtraEditors.Controls.ButtonPressedEventArgs e) { + if (e.Button.Kind == DevExpress.XtraEditors.Controls.ButtonPredefines.Ellipsis) { + OpenFileDialog dlg = new OpenFileDialog() { + Filter = "Database Files (*.sql;*.sqlite;*.db)|*.sql;*.sqlite;*.db|SQL Files (*.sql)|*.sql|Sqlite Files (*.sqlite;*.db)|*.sqlite;*.db|Text Files (*.txt)|*.txt|All Files (*.*)|*.*", + CheckFileExists = true, + Multiselect = false, + Title = "Select Database File" + }; + if (dlg.ShowDialog() == DialogResult.OK) { + if (sender.Equals(Db1File)) { + Db1File.Text = dlg.FileName; + } else if (sender.Equals(db2File)) { + db2File.Text = dlg.FileName; + } + } + } + } + } +} \ No newline at end of file diff --git a/DbToolsTester/Forms/OpenForm.resx b/DbToolsTester/Forms/OpenForm.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/DbToolsTester/Forms/OpenForm.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/DbToolsTester/Properties/licenses.licx b/DbToolsTester/Properties/licenses.licx index a79ac09..12db65a 100644 --- a/DbToolsTester/Properties/licenses.licx +++ b/DbToolsTester/Properties/licenses.licx @@ -1 +1,3 @@ +DevExpress.XtraEditors.ButtonEdit, DevExpress.XtraEditors.v23.2, Version=23.2.3.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a +DevExpress.XtraLayout.LayoutControl, DevExpress.XtraLayout.v23.2, Version=23.2.3.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a DevExpress.XtraBars.BarManager, DevExpress.XtraBars.v23.2, Version=23.2.3.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a diff --git a/Delta.cs b/Delta.cs index 8f30626..6fe6f8b 100644 --- a/Delta.cs +++ b/Delta.cs @@ -1,4 +1,5 @@ using DbTools.Model; +using System; using System.Data; using System.Linq; using System.Text; @@ -8,6 +9,7 @@ namespace DbTools { public class Delta { public string Db1Sql { get; set; } public string Db2Sql { get; set; } + public Exception LastError { get; private set; } public string BuildDelta(IDbConnection currentDb, IDbConnection newDb, bool removeUnusedTables = false, bool removeUnusedColumns = false, bool removeUnusedTriggers = true, bool removeUnusedIndexes = true) { Database db1 = new Database(currentDb, true); @@ -44,9 +46,20 @@ namespace DbTools { public bool ApplyDelta(IDbConnection cn, string sql) { bool success = false; - using (var cmd = cn.CreateCommand()) { - cmd.CommandText = sql; - success = cmd.ExecuteNonQuery() > 0; + using (var transaction = cn.BeginTransaction()) { + try { + using (var cmd = cn.CreateCommand()) { + cmd.Transaction = transaction; + cmd.CommandText = sql; + cmd.ExecuteNonQuery(); + } + transaction.Commit(); + success = true; + } catch (Exception ex) { + transaction.Rollback(); + success = false; + LastError = ex; + } } return success; } @@ -70,6 +83,8 @@ namespace DbTools { var table1 = db1.Tables[table2.TableName]; if (table1 == null) { sb.AppendLine(table2.FullSql()); + sb.AppendLine("-- TODO : Insert records from existing database"); + sb.AppendLine(""); } else { // Remove unused triggers if requested if (removeUnusedTriggers) { @@ -118,6 +133,10 @@ namespace DbTools { } } } + + if (string.IsNullOrWhiteSpace(sb.ToString().Trim())) { + sb.AppendLine("-- BOTH DATABASES ARE EQUAL - NO CHANGES ARE REQUIRED --"); + } return sb.ToString(); } diff --git a/Migrations.cs b/Migrations.cs index 1e0e61b..68bfa43 100644 --- a/Migrations.cs +++ b/Migrations.cs @@ -81,9 +81,20 @@ namespace DbTools { Exception error = null; bool wasSuccessful = false; try { - using (var cmd = dbConnection.CreateCommand()) { - cmd.CommandText = File.ReadAllText(migration); - wasSuccessful = cmd.ExecuteNonQuery() > 0; + using (var transaction = dbConnection.BeginTransaction()) { + try { + using (var cmd = dbConnection.CreateCommand()) { + cmd.CommandText = File.ReadAllText(migration); + cmd.Transaction = transaction; + cmd.ExecuteNonQuery(); + } + transaction.Commit(); + wasSuccessful = true; + } catch (Exception ex) { + transaction.Rollback(); + error = ex; + wasSuccessful = false; + } } } catch (Exception ex) { error = ex;