using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Runtime.InteropServices;
using System.IO;
using SqliteDotNet;
namespace SqliteGUI
{
///
/// Summary description for Form1.
///
public class Form1 : System.Windows.Forms.Form
{
private SqliteGUI.NewAddTestForm addTestForm;
private System.Windows.Forms.MainMenu mainMenu1;
private System.Windows.Forms.MenuItem menuItem1;
private System.Windows.Forms.MenuItem menuItem2;
private System.Windows.Forms.MenuItem menuItem3;
private System.Windows.Forms.OpenFileDialog openFileDialog1;
private SqliteDb database;
private string databaseName;
private System.Windows.Forms.RichTextBox richTextBox1;
private System.Windows.Forms.ComboBox comboBox1;
private System.Windows.Forms.Splitter splitter1;
private System.Windows.Forms.TreeView treeView1;
private System.Windows.Forms.Splitter splitter2;
private System.Windows.Forms.MenuItem menuItem4;
private System.Windows.Forms.MenuItem menuItem5;
private System.Windows.Forms.MenuItem menuAddTest;
private System.Windows.Forms.MenuItem newDbItem;
private System.Windows.Forms.MenuItem newBlankDatabaseMenuItem;
private System.Windows.Forms.MenuItem newTemplateDbMenuItem;
private System.Windows.Forms.MenuItem menuItem10;
private System.Windows.Forms.MenuItem saveDbMenuItem;
private System.Windows.Forms.MenuItem saveAsMenuItem;
private System.Windows.Forms.MenuItem menuItem13;
private System.Windows.Forms.MenuItem menuItem14;
private System.Windows.Forms.SaveFileDialog saveFileDialog1;
///
/// Required designer variable.
///
private System.ComponentModel.Container components = null;
public Form1()
{
//
// Required for Windows Form Designer support
//
InitializeComponent();
//
// TODO: Add any constructor code after InitializeComponent call
//
this.addTestForm = new SqliteGUI.NewAddTestForm();
}
///
/// Clean up any resources being used.
///
protected override void Dispose( bool disposing )
{
//Dispose the addTestForm. This will save the current data on the form
if (!this.addTestForm.IsDisposed)
{
this.addTestForm.Dispose();
}
if( disposing )
{
if (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.mainMenu1 = new System.Windows.Forms.MainMenu();
this.menuItem1 = new System.Windows.Forms.MenuItem();
this.newDbItem = new System.Windows.Forms.MenuItem();
this.newBlankDatabaseMenuItem = new System.Windows.Forms.MenuItem();
this.newTemplateDbMenuItem = new System.Windows.Forms.MenuItem();
this.menuItem2 = new System.Windows.Forms.MenuItem();
this.menuItem10 = new System.Windows.Forms.MenuItem();
this.saveDbMenuItem = new System.Windows.Forms.MenuItem();
this.saveAsMenuItem = new System.Windows.Forms.MenuItem();
this.menuItem13 = new System.Windows.Forms.MenuItem();
this.menuAddTest = new System.Windows.Forms.MenuItem();
this.menuItem14 = new System.Windows.Forms.MenuItem();
this.menuItem3 = new System.Windows.Forms.MenuItem();
this.menuItem4 = new System.Windows.Forms.MenuItem();
this.menuItem5 = new System.Windows.Forms.MenuItem();
this.openFileDialog1 = new System.Windows.Forms.OpenFileDialog();
this.richTextBox1 = new System.Windows.Forms.RichTextBox();
this.comboBox1 = new System.Windows.Forms.ComboBox();
this.splitter1 = new System.Windows.Forms.Splitter();
this.treeView1 = new System.Windows.Forms.TreeView();
this.splitter2 = new System.Windows.Forms.Splitter();
this.saveFileDialog1 = new System.Windows.Forms.SaveFileDialog();
this.SuspendLayout();
//
// mainMenu1
//
this.mainMenu1.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
this.menuItem1,
this.menuItem4});
//
// menuItem1
//
this.menuItem1.Index = 0;
this.menuItem1.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
this.newDbItem,
this.menuItem2,
this.menuItem10,
this.saveDbMenuItem,
this.saveAsMenuItem,
this.menuItem13,
this.menuAddTest,
this.menuItem14,
this.menuItem3});
this.menuItem1.Text = "Database";
//
// newDbItem
//
this.newDbItem.Index = 0;
this.newDbItem.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
this.newBlankDatabaseMenuItem,
this.newTemplateDbMenuItem});
this.newDbItem.Text = "New";
//
// newBlankDatabaseMenuItem
//
this.newBlankDatabaseMenuItem.Index = 0;
this.newBlankDatabaseMenuItem.Text = "Blank Database";
this.newBlankDatabaseMenuItem.Click += new System.EventHandler(this.newBlankDatabaseMenuItem_Click);
//
// newTemplateDbMenuItem
//
this.newTemplateDbMenuItem.Index = 1;
this.newTemplateDbMenuItem.Text = "Unit Test Template Db";
this.newTemplateDbMenuItem.Click += new System.EventHandler(this.newTemplateDbMenuItem_Click);
//
// menuItem2
//
this.menuItem2.Index = 1;
this.menuItem2.Shortcut = System.Windows.Forms.Shortcut.CtrlO;
this.menuItem2.Text = "Open";
this.menuItem2.Click += new System.EventHandler(this.DatabaseOpen_Click);
//
// menuItem10
//
this.menuItem10.Index = 2;
this.menuItem10.Text = "-";
//
// saveDbMenuItem
//
this.saveDbMenuItem.Enabled = false;
this.saveDbMenuItem.Index = 3;
this.saveDbMenuItem.Shortcut = System.Windows.Forms.Shortcut.CtrlS;
this.saveDbMenuItem.Text = "Save";
this.saveDbMenuItem.Click += new System.EventHandler(this.saveDbMenuItem_Click);
//
// saveAsMenuItem
//
this.saveAsMenuItem.Enabled = false;
this.saveAsMenuItem.Index = 4;
this.saveAsMenuItem.Text = "Save as";
this.saveAsMenuItem.Click += new System.EventHandler(this.saveAsMenuItem_Click);
//
// menuItem13
//
this.menuItem13.Index = 5;
this.menuItem13.Text = "-";
//
// menuAddTest
//
this.menuAddTest.Enabled = false;
this.menuAddTest.Index = 6;
this.menuAddTest.Text = "Add/Edit Tests";
this.menuAddTest.Click += new System.EventHandler(this.menuAddTest_Click);
//
// menuItem14
//
this.menuItem14.Index = 7;
this.menuItem14.Text = "-";
//
// menuItem3
//
this.menuItem3.Enabled = false;
this.menuItem3.Index = 8;
this.menuItem3.Text = "Close";
this.menuItem3.Click += new System.EventHandler(this.DatabaseClose_Click);
//
// menuItem4
//
this.menuItem4.Index = 1;
this.menuItem4.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
this.menuItem5});
this.menuItem4.Text = "Sql";
//
// menuItem5
//
this.menuItem5.Index = 0;
this.menuItem5.Text = "Execute";
this.menuItem5.Click += new System.EventHandler(this.SqlExecute_Click);
//
// richTextBox1
//
this.richTextBox1.Dock = System.Windows.Forms.DockStyle.Bottom;
this.richTextBox1.Location = new System.Drawing.Point(0, 537);
this.richTextBox1.Name = "richTextBox1";
this.richTextBox1.Size = new System.Drawing.Size(864, 88);
this.richTextBox1.TabIndex = 7;
this.richTextBox1.Text = "Sqlite statement...";
//
// comboBox1
//
this.comboBox1.Dock = System.Windows.Forms.DockStyle.Bottom;
this.comboBox1.Items.AddRange(new object[] {
"CREATE TABLE name (col1 INTEGER, col2 REAL, col3 TEXT, col4 BLOB);",
"CREATE TABLE name AS SELECT ...;",
"VACUUM;",
"DROP TABLE name;"});
this.comboBox1.Location = new System.Drawing.Point(0, 516);
this.comboBox1.Name = "comboBox1";
this.comboBox1.Size = new System.Drawing.Size(864, 21);
this.comboBox1.TabIndex = 8;
this.comboBox1.Text = "Sqlite constructs";
this.comboBox1.SelectedIndexChanged += new System.EventHandler(this.comboBox1_SelectedIndexChanged);
//
// splitter1
//
this.splitter1.Dock = System.Windows.Forms.DockStyle.Bottom;
this.splitter1.Location = new System.Drawing.Point(0, 513);
this.splitter1.Name = "splitter1";
this.splitter1.Size = new System.Drawing.Size(864, 3);
this.splitter1.TabIndex = 9;
this.splitter1.TabStop = false;
//
// treeView1
//
this.treeView1.Dock = System.Windows.Forms.DockStyle.Left;
this.treeView1.ImageIndex = -1;
this.treeView1.Location = new System.Drawing.Point(0, 0);
this.treeView1.Name = "treeView1";
this.treeView1.SelectedImageIndex = -1;
this.treeView1.Size = new System.Drawing.Size(176, 513);
this.treeView1.TabIndex = 10;
this.treeView1.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.treeView1_AfterSelect);
//
// splitter2
//
this.splitter2.Location = new System.Drawing.Point(176, 0);
this.splitter2.Name = "splitter2";
this.splitter2.Size = new System.Drawing.Size(3, 513);
this.splitter2.TabIndex = 11;
this.splitter2.TabStop = false;
//
// Form1
//
this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
this.ClientSize = new System.Drawing.Size(864, 625);
this.Controls.Add(this.splitter2);
this.Controls.Add(this.treeView1);
this.Controls.Add(this.splitter1);
this.Controls.Add(this.comboBox1);
this.Controls.Add(this.richTextBox1);
this.IsMdiContainer = true;
this.Menu = this.mainMenu1;
this.Name = "Form1";
this.Text = "Sqlite GUI";
this.ResumeLayout(false);
}
#endregion
///
/// The main entry point for the application.
///
[STAThread]
static void Main()
{
Application.Run(new Form1());
}
private void OpenDatabase(string fName)
{
if (database != null)
{
CloseDatabase();
}
if (fName.Length > 0)
{
database = new SqliteDb();
int err = database.Open(fName);
if (err != 0)
{
database = null;
}
}
if (database != null)
{
databaseName = fName;
treeView1.BeginUpdate();
// Clear the TreeView each time the method is called.
treeView1.Nodes.Clear();
TreeNode databaseNode = new TreeNode(fName);
SqliteVm vm = new SqliteVm(database, true);
string tableList = "SELECT name FROM sqlite_master WHERE type='table' ORDER BY name;";
int fini = vm.Execute(tableList);
while (fini == Sqlite.Row)
{
string tableName = vm.GetString("name");
databaseNode.Nodes.Add(tableName);
fini = vm.NextRow();
}
vm.SqlFinalize();
vm = null;
treeView1.Nodes.Add(databaseNode);
treeView1.EndUpdate();
//Enable menu items
this.menuItem3.Enabled = true;
this.menuAddTest.Enabled = true;
this.saveAsMenuItem.Enabled = true;
this.saveDbMenuItem.Enabled = true;
}
}
private void CloseDatabase()
{
if (database != null)
{
//If the file is not read only save the data first else close all forms
if (!IsReadOnly(database.GetName()))
{
this.SaveDatabase();
}
else
{
this.CloseForms();
}
database.Close();
database = null;
treeView1.BeginUpdate();
treeView1.Nodes.Clear();
treeView1.EndUpdate();
}
//Disable menu items
this.menuItem3.Enabled = false;
this.menuAddTest.Enabled = false;
this.saveAsMenuItem.Enabled = false;
this.saveDbMenuItem.Enabled = false;
}
private void DatabaseOpen_Click(object sender, System.EventArgs e)
{
openFileDialog1.Filter = "db files (*.db)|*.db|All files (*.*)|*.*";
openFileDialog1.RestoreDirectory = true;
string fName = "";
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
fName = openFileDialog1.FileName;
}
OpenDatabase(fName);
}
private void DatabaseClose_Click(object sender, System.EventArgs e)
{
CloseDatabase();
}
private void treeView1_AfterSelect(object sender, System.Windows.Forms.TreeViewEventArgs e)
{
if (e.Node.Parent != null)
{
TableEditForm tableForm = new TableEditForm();
tableForm.Text = tableForm.Name = e.Node.Text;
tableForm.LoadTable(database, tableForm.Text);
tableForm.MdiParent = this;
tableForm.Show();
}
}
private void SqlExecute_Click(object sender, System.EventArgs e)
{
if (richTextBox1.Text.Length > 0 && database != null)
{
SqliteVm vm = new SqliteVm(database, true);
string sql = richTextBox1.Text;
int sqlErr = Sqlite.Error;
try
{
sqlErr = vm.Execute(sql);
}
catch (SEHException)
{
// Do nothing. Execution failed...
}
if (sqlErr != Sqlite.Done && sqlErr != Sqlite.Ok)
{
string errMsg = vm.GetErrMsg();
errMsg += "\n";
errMsg += vm.GetQueryTail();
MessageBox.Show(errMsg, "Sqlite Execution Error");
vm.SqlFinalize();
vm = null;
}
else
{
vm.SqlFinalize();
vm = null;
// reload database
OpenDatabase(databaseName);
}
}
}
private void comboBox1_SelectedIndexChanged(object sender, System.EventArgs e)
{
ComboBox comboBox = (ComboBox) sender;
richTextBox1.Text = comboBox.SelectedItem.ToString();
}
public SqliteDb GetDb()
{
return database;
}
//Opens add test form
private void menuAddTest_Click(object sender, System.EventArgs e)
{
if (null != this.database)
{
string sqlStmt = "SELECT name FROM sqlite_master WHERE type='table' AND name='TestCase';";
SqliteVm vm = new SqliteVm(this.database, true);
if (Sqlite.Row == vm.Execute(sqlStmt))
{
//Hack...if the form is not visible then the user must have closed it->create a new one
//If it is visible bring it to focus
if (!this.addTestForm.Visible)
{
this.addTestForm = new SqliteGUI.NewAddTestForm();
this.addTestForm.LoadForm(database);
this.addTestForm.MdiParent = this;
this.addTestForm.Show();
}
else
{
this.addTestForm.Activate();
}
}
else
{
System.Windows.Forms.MessageBox.Show("TestCase table does not exist!",
"Error",
System.Windows.Forms.MessageBoxButtons.OK,
System.Windows.Forms.MessageBoxIcon.Hand);
}
vm.SqlFinalize();
}
}
private void newBlankDatabaseMenuItem_Click(object sender, System.EventArgs e)
{
this.NewDatabase(false);
}
private void newTemplateDbMenuItem_Click(object sender, System.EventArgs e)
{
this.NewDatabase(true);
}
private void saveDbMenuItem_Click(object sender, System.EventArgs e)
{
this.SaveDatabase();
}
private void saveAsMenuItem_Click(object sender, System.EventArgs e)
{
this.SaveAs();
}
private void NewDatabase(bool template)
{
saveFileDialog1.Filter = "db files (*.db)|*.db|All files (*.*)|*.*";
saveFileDialog1.RestoreDirectory = true;
SqliteDb db = null;
string dbName = "";
if (saveFileDialog1.ShowDialog() == DialogResult.OK)
{
dbName = saveFileDialog1.FileName;
if (!IsReadOnly(dbName))
{
//Close the existing database
if (null != this.database)
{
this.CloseDatabase();
}
//Delete the file
this.DeleteFile(dbName);
//Open the database. SQLite will create the file for us
db = new SqliteDb();
db.Open(dbName);
//Create a template database for the unit test infrastructure
if (template && (db != null))
{
SqliteVm templateVm = new SqliteVm(db, true);
templateVm.Execute("CREATE TABLE TestCase (ExecuteSequence INTEGER, TestName TEXT, ParamSets TEXT, Description TEXT, TestType TEXT, Prerequisite TEXT)");
templateVm.Execute("CREATE TABLE Params (ParamSet INTEGER, ParamName TEXT, ParamValue TEXT)");
templateVm.Execute("CREATE TABLE CommonParams (ParamName text, ParamValue text)");
templateVm.Execute("CREATE TABLE ApiTestResults (Description TEXT, ParamSet INTEGER, ContentType TEXT, Result TEXT)");
templateVm.Execute("CREATE TABLE HttpTestResults (Description TEXT, ParamSet INTEGER, ContentType TEXT, Result BLOB)");
templateVm.SqlFinalize();
templateVm = null;
}
db.Close();
//Open the new database
this.OpenDatabase(dbName);
}
else
{
string errMsg;
errMsg = String.Format("File {0} is readOnly and cannot be replaced", dbName);
System.Windows.Forms.MessageBox.Show(errMsg,
"Error",
System.Windows.Forms.MessageBoxButtons.OK,
System.Windows.Forms.MessageBoxIcon.Hand);
this.NewDatabase(template);
}
}
}
private void SaveDatabase()
{
if (!this.addTestForm.IsDisposed)
{
this.addTestForm.Dispose();
}
if (database != null)
{
string dbName = database.GetName();
if (!IsReadOnly(dbName))
{
this.CloseForms();
}
else
{
//If the file is read only show a warning message and if the user wants, make the file writeable
string errMsg = String.Format("File {0} is read only! \nOverwrite it?",
dbName);
DialogResult result = System.Windows.Forms.MessageBox.Show(errMsg,
"Error",
System.Windows.Forms.MessageBoxButtons.YesNo,
System.Windows.Forms.MessageBoxIcon.Hand,
System.Windows.Forms.MessageBoxDefaultButton.Button1);
if (DialogResult.Yes == result)
{
FileInfo dbFile = new FileInfo(dbName);
dbFile.Attributes = FileAttributes.Archive;
//Hack...if the database is not read only we can write to it.
//Nevertheles, if the ReadOnly property has changed after the database handler was created
//then, we need to re-create it or SQLite will throw exception
database.Close();
database = new SqliteDb();
database.Open(dbName);
this.CloseForms();
}
}
}
}
//Checks if a file is read only
public static bool IsReadOnly(string fileName)
{
bool readOnly = false;
int i=0;
FileInfo file = new FileInfo(fileName);
//Get all attributes and put them into array
string [] attributes = file.Attributes.ToString().Split(',');
//Parse the array
while ((i 0) && this.addTestForm.IsDisposed)
{
if ("SqliteGUI.TableEditForm" == this.MdiChildren[0].GetType().ToString() )
{
TableEditForm child = this.MdiChildren[0] as TableEditForm;
child.SetDatabase(database);
child.Close();
child = null;
}
}
}
//Implements SaveAs functionality
private void SaveAs()
{
saveFileDialog1.Filter = "db files (*.db)|*.db|All files (*.*)|*.*";
saveFileDialog1.RestoreDirectory = true;
if (saveFileDialog1.ShowDialog() == DialogResult.OK)
{
string newName = saveFileDialog1.FileName;
//Should never be hit
if (null == database)
{
System.Windows.Forms.MessageBox.Show("No database is open",
"Error",
System.Windows.Forms.MessageBoxButtons.OK,
System.Windows.Forms.MessageBoxIcon.Hand,
System.Windows.Forms.MessageBoxDefaultButton.Button1);
}
else if (IsReadOnly(newName))
{
string errMsg = String.Format("File {0} is read only! \nSave the file under different name?",
newName);
DialogResult result = System.Windows.Forms.MessageBox.Show(errMsg,
"Error",
System.Windows.Forms.MessageBoxButtons.YesNo,
System.Windows.Forms.MessageBoxIcon.Hand,
System.Windows.Forms.MessageBoxDefaultButton.Button1);
if (DialogResult.Yes == result)
{
this.SaveAs();
}
}
else
{
//If the source file is read only the CopyTo method will also create a ReadOnly file
//Take the new file and remove the ReadOnly attribute in order to be able to save any new changes
System.IO.FileAttributes attribute = new System.IO.FileAttributes();
FileInfo oldDbFile = new FileInfo(database.GetName());
oldDbFile.CopyTo(newName, true);
if (IsReadOnly(database.GetName()))
{
FileInfo newDbFile = new FileInfo(newName);
newDbFile.Attributes = FileAttributes.Archive;
}
//Open the new file
database.Close();
database = new SqliteDb();
database.Open(newName);
this.SaveDatabase();
this.OpenDatabase(newName);
}
}
}
public void SetDatabase(SqliteDb newDatabase)
{
this.database = newDatabase;
}
}
}