/******************************************************** * ADO.NET 2.0 Data Provider for SQLite Version 3.X * Written by Robert Simpson (robert@blackcastlesoft.com) * * Released to the public domain, use at your own risk! ********************************************************/ namespace SQLite.Designer.Design { using System; using System.Data.Common; using System.ComponentModel.Design; using System.ComponentModel; using System.Drawing.Design; using System.Collections.Generic; using System.Data; using System.Text; using SQLite.Designer.Editors; internal class View : ViewTableBase, ICustomTypeDescriptor { private string _name; private string _oldname; private string _sql; private string _oldsql; private ViewDesignerDoc _owner; private string _catalog; private DbConnection _connection; List _triggers = new List(); List _oldtriggers = new List(); internal View(string viewName, DbConnection connection, ViewDesignerDoc parent) { _owner = parent; _name = viewName; _oldname = viewName; _catalog = connection.Database; _connection = connection; _owner.Name = _name; if (String.IsNullOrEmpty(viewName) == false) { using (DataTable tbl = connection.GetSchema("Views", new string[] { Catalog, null, Name })) { if (tbl.Rows.Count > 0) { _sql = tbl.Rows[0]["VIEW_DEFINITION"].ToString(); StringBuilder builder = new StringBuilder(); builder.Append(_sql); builder.AppendLine(";"); _triggers.Clear(); _oldtriggers.Clear(); using (DataTable ttbl = _connection.GetSchema("Triggers", new string[] { Catalog, null, Name })) { foreach (DataRow row in ttbl.Rows) { ViewTrigger t = new ViewTrigger(this, row); _triggers.Add(t); _oldtriggers.Add(((ICloneable)t).Clone() as ViewTrigger); builder.AppendFormat("{0};\r\n", t.OriginalSql); } } _oldsql = builder.ToString(); } else { _oldname = null; } } } } public override void MakeDirty() { _owner.MakeDirty(); } [Browsable(false)] public override object Triggers { get { return _triggers; } } public void Committed() { _oldsql = _sql; _oldname = _name; _oldtriggers = _triggers; _triggers.Clear(); foreach (ViewTrigger trig in _oldtriggers) { _triggers.Add(((ICloneable)trig).Clone() as ViewTrigger); } } public override string ToString() { return String.Format("[{0}].[{1}]", Catalog, Name); } [Category("Storage")] [RefreshProperties(RefreshProperties.All)] [ParenthesizePropertyName(true)] public override string Name { get { return _name; } set { if (_name != value) { _name = value; _owner.Name = value; _owner.MakeDirty(); } } } [Browsable(false)] public override string OldName { get { return _oldname; } } [Category("Storage")] [Editor(typeof(CatalogTypeEditor), typeof(UITypeEditor))] [DefaultValue("main")] [RefreshProperties(RefreshProperties.All)] public override string Catalog { get { return _catalog; } } [Category("Storage")] public string Database { get { return _connection.DataSource; } } [Browsable(false)] public string SqlText { get { return _sql; } set { if (String.Compare(_sql, value, StringComparison.OrdinalIgnoreCase) != 0) { _sql = value; _owner.MakeDirty(); } } } [Browsable(false)] public string OriginalSql { get { return _oldsql; } } public string GetSqlText() { if (String.Compare(_sql, _oldsql, StringComparison.OrdinalIgnoreCase) == 0 && String.Compare(_name, _oldname, StringComparison.OrdinalIgnoreCase) == 0) return null; StringBuilder builder = new StringBuilder(); if (String.IsNullOrEmpty(_oldname) == false) { foreach (ViewTrigger trig in _oldtriggers) { builder.AppendFormat("DROP TRIGGER [{0}].[{1}];\r\n", Catalog, trig.Name); } builder.AppendFormat("DROP VIEW [{0}].[{1}];\r\n", Catalog, _oldname); } builder.AppendFormat("CREATE VIEW [{0}].[{1}] AS {2};\r\n", Catalog, Name, SqlText); string sep = ""; foreach (ViewTrigger trig in _triggers) { builder.Append(sep); trig.WriteSql(builder); sep = "\r\n"; } return builder.ToString(); } #region ICustomTypeDescriptor Members AttributeCollection ICustomTypeDescriptor.GetAttributes() { return TypeDescriptor.GetAttributes(GetType()); } string ICustomTypeDescriptor.GetClassName() { return "View Design"; } string ICustomTypeDescriptor.GetComponentName() { return ToString(); } TypeConverter ICustomTypeDescriptor.GetConverter() { return TypeDescriptor.GetConverter(GetType()); } EventDescriptor ICustomTypeDescriptor.GetDefaultEvent() { return TypeDescriptor.GetDefaultEvent(GetType()); } PropertyDescriptor ICustomTypeDescriptor.GetDefaultProperty() { return TypeDescriptor.GetDefaultProperty(GetType()); } object ICustomTypeDescriptor.GetEditor(Type editorBaseType) { return TypeDescriptor.GetEditor(GetType(), editorBaseType); } EventDescriptorCollection ICustomTypeDescriptor.GetEvents(Attribute[] attributes) { return TypeDescriptor.GetEvents(GetType(), attributes); } EventDescriptorCollection ICustomTypeDescriptor.GetEvents() { return TypeDescriptor.GetEvents(GetType()); } PropertyDescriptorCollection ICustomTypeDescriptor.GetProperties(Attribute[] attributes) { return TypeDescriptor.GetProperties(GetType(), attributes); } PropertyDescriptorCollection ICustomTypeDescriptor.GetProperties() { return TypeDescriptor.GetProperties(GetType()); } object ICustomTypeDescriptor.GetPropertyOwner(PropertyDescriptor pd) { return this; } #endregion [Browsable(false)] public override ViewTableBase DesignTable { get { return this; } } public override DbConnection GetConnection() { return _connection; } } }