/********************************************************
* 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.Collections.Generic;
using System.Text;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.Windows.Forms;
using System.Drawing.Design;
using System.Data;
using System.Data.Common;
using System.Globalization;
internal class Column : IHaveConnection
{
private bool _allowNulls;
private string _dataType = String.Empty;
private string _defaultValue = String.Empty;
private string _columnName = String.Empty;
private string _origName = String.Empty;
private string _collate;
private DataGridViewRow _parent;
private Unique _unique;
private Table _table;
internal Column(Table table, DataGridViewRow row)
{
_parent = row;
_table = table as Table;
_unique = new Unique(this);
}
internal Column(DataRow row, Table source)
{
_table = source;
_unique = new Unique(this, row);
if (row.IsNull("AUTOINCREMENT") == false && (bool)row["AUTOINCREMENT"] == true)
_table.PrimaryKey.AutoIncrement = true;
_dataType = (row.IsNull("DATA_TYPE") == false) ? row["DATA_TYPE"].ToString() : String.Empty;
_columnName = row["COLUMN_NAME"].ToString();
_origName = _columnName;
_allowNulls = (bool)row["IS_NULLABLE"];
_defaultValue = (row.IsNull("COLUMN_DEFAULT") == false) ? row["COLUMN_DEFAULT"].ToString() : String.Empty;
_collate = (row.IsNull("COLLATION_NAME") == false) ? row["COLLATION_NAME"].ToString() : String.Empty;
string edmtype = (row.IsNull("EDM_TYPE") == false) ? row["EDM_TYPE"].ToString() : String.Empty;
if (edmtype == "nvarchar" || edmtype == "varchar" || edmtype == "blob" || edmtype == "nchar" || edmtype == "char")
{
int size = (row.IsNull("CHARACTER_MAXIMUM_LENGTH") == false) ? Convert.ToInt32(row["CHARACTER_MAXIMUM_LENGTH"], CultureInfo.InvariantCulture) : int.MaxValue;
if (size != int.MaxValue)
_dataType = string.Format(CultureInfo.InvariantCulture, "{0}({1})", _dataType, size);
}
else if (edmtype == "decimal")
{
int size = (row.IsNull("NUMERIC_PRECISION") == false) ? Convert.ToInt32(row["NUMERIC_PRECISION"], CultureInfo.InvariantCulture) : 53;
int scale = (row.IsNull("NUMERIC_SCALE") == false) ? Convert.ToInt32(row["NUMERIC_SCALE"], CultureInfo.InvariantCulture) : int.MaxValue;
if (size != 53)
{
string scalestr = (scale == int.MaxValue) ? String.Empty : String.Format(CultureInfo.InvariantCulture, ",{0}", scale);
_dataType = string.Format(CultureInfo.InvariantCulture, "{0}({1}{2})", _dataType, size, scalestr);
}
}
}
#region IHaveConnection Members
[Browsable(false)]
public ViewTableBase DesignTable
{
get { return _table; }
}
public DbConnection GetConnection()
{
return ((IHaveConnection)_table).GetConnection();
}
#endregion
[Browsable(false)]
internal Table Table
{
get { return _table; }
}
internal void Committed()
{
_origName = ColumnName;
}
internal DataGridViewRow Parent
{
get { return _parent; }
set
{
_parent = value;
_parent.Cells[0].Value = ColumnName;
_parent.Cells[1].Value = DataType;
_parent.Cells[2].Value = AllowNulls;
}
}
internal void RefreshGrid()
{
if (_parent == null) return;
_parent.DataGridView.Refresh();
}
internal void CellValueChanged(int rowIndex, int cellIndex)
{
if (_parent == null) return;
if (rowIndex != _parent.Index) return;
object value;
if (_parent.Cells[cellIndex].IsInEditMode == true)
{
if (_parent.DataGridView.EditingControl != null)
value = ((IDataGridViewEditingControl)_parent.DataGridView.EditingControl).EditingControlFormattedValue;
else
value = _parent.Cells[cellIndex].EditedFormattedValue;
}
else
value = _parent.Cells[cellIndex].EditedFormattedValue;
switch (cellIndex)
{
case 0:
ColumnName = value.ToString();
break;
case 1:
DataType = value.ToString();
break;
case 2:
try
{
AllowNulls = Convert.ToBoolean(value, CultureInfo.InvariantCulture);
}
catch
{
}
break;
}
}
[DefaultValue("BINARY")]
[Category("Constraints")]
[Editor(typeof(CollationTypeEditor), typeof(UITypeEditor))]
[Description("The collation sequence to use for the column. This will affect comparison and equality tests against the column.")]
public virtual string Collate
{
get { return _collate; }
set
{
if (String.IsNullOrEmpty(value)) value = "BINARY";
if (_collate != value)
{
_collate = value;
if (_table.PrimaryKey.Columns.Count == 1 && String.Compare(ColumnName, _table.PrimaryKey.Columns[0].Column, StringComparison.OrdinalIgnoreCase) == 0)
_table.PrimaryKey.Columns[0].Collate = value;
_table._owner.MakeDirty();
}
}
}
[Category("Constraints")]
[Description("The unique constraints of the column")]
public virtual Unique Unique
{
get { return _unique; }
}
[Browsable(false)]
public virtual string ColumnName
{
get { return _columnName; }
set
{
value = value.Trim();
if (value != _columnName)
{
_columnName = value;
_table.MakeDirty();
}
}
}
[Browsable(false)]
public virtual string OriginalName
{
get { return _origName; }
}
[DefaultValue(false)]
[DisplayName("Allow Nulls")]
[Category("Constraints")]
[Description("Specifies whether or not the column will allow NULL values.")]
public virtual bool AllowNulls
{
get { return _allowNulls; }
set
{
if (value != _allowNulls)
{
_allowNulls = value;
if (_parent == null) return;
_parent.Cells[2].Value = _allowNulls;
_table.MakeDirty();
}
}
}
[Browsable(false)]
public virtual string DataType
{
get { return _dataType; }
set
{
value = value.Trim();
if (value != _dataType)
{
_dataType = value;
_table.MakeDirty();
}
}
}
[DisplayName("Default Value")]
[Category("Constraints")]
[Description("The default value to populate in the column when an explicit value is not specified.")]
public virtual string DefaultValue
{
get { return _defaultValue; }
set
{
value = value.Trim();
if (value != _defaultValue)
{
_defaultValue = value;
_table.MakeDirty();
}
}
}
internal void WriteSql(StringBuilder builder)
{
builder.AppendFormat("[{0}]", ColumnName);
if (String.IsNullOrEmpty(DataType) == false)
builder.AppendFormat(" {0}", DataType);
bool isprimary = false;
if (_table.PrimaryKey.Columns.Count == 1 && String.Compare(_table.PrimaryKey.Columns[0].Column, ColumnName, StringComparison.OrdinalIgnoreCase) == 0)
{
isprimary = true;
builder.Append(" PRIMARY KEY");
if (_table.PrimaryKey.Columns[0].SortMode != ColumnSortMode.Ascending)
builder.Append(" DESC");
if (_table.PrimaryKey.Conflict != ConflictEnum.Abort)
builder.AppendFormat(" ON CONFLICT {0}", _table.PrimaryKey.Conflict.ToString().ToUpperInvariant());
if (_table.PrimaryKey.AutoIncrement == true)
builder.Append(" AUTOINCREMENT");
}
if (AllowNulls == false)
builder.Append(" NOT NULL");
if (String.IsNullOrEmpty(Collate) == false && String.Compare(Collate, "BINARY", StringComparison.OrdinalIgnoreCase) != 0)
builder.AppendFormat(" COLLATE {0}", Collate.ToUpperInvariant());
if (Unique.Enabled == true && isprimary == false)
{
builder.Append(" UNIQUE");
if (Unique.Conflict != ConflictEnum.Abort)
builder.AppendFormat(" ON CONFLICT {0}", Unique.Conflict.ToString().ToUpperInvariant());
}
if (String.IsNullOrEmpty(DefaultValue) == false)
builder.AppendFormat(" DEFAULT {0}", DefaultValue);
}
}
}