You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
106 lines
5.4 KiB
106 lines
5.4 KiB
using System.Data.SqlClient;
|
|
using OpenDBDiff.Schema.Events;
|
|
using OpenDBDiff.Schema.Model;
|
|
using OpenDBDiff.Schema.SQLServer.Generates.Generates.SQLCommands;
|
|
using OpenDBDiff.Schema.SQLServer.Generates.Generates.Util;
|
|
using OpenDBDiff.Schema.SQLServer.Generates.Model;
|
|
|
|
namespace OpenDBDiff.Schema.SQLServer.Generates.Generates
|
|
{
|
|
public class GenerateIndex
|
|
{
|
|
private Generate root;
|
|
|
|
public GenerateIndex(Generate root)
|
|
{
|
|
this.root = root;
|
|
}
|
|
|
|
public void Fill(Database database, string connectionString)
|
|
{
|
|
int indexid = 0;
|
|
int parentId = 0;
|
|
bool change = false;
|
|
string type;
|
|
ISchemaBase parent = null;
|
|
root.RaiseOnReading(new ProgressEventArgs("Reading Index...", Constants.READING_INDEXES));
|
|
using (SqlConnection conn = new SqlConnection(connectionString))
|
|
{
|
|
using (SqlCommand command = new SqlCommand(IndexSQLCommand.Get(database.Info.Version, database.Info.Edition), conn))
|
|
{
|
|
conn.Open();
|
|
command.CommandTimeout = 0;
|
|
using (SqlDataReader reader = command.ExecuteReader())
|
|
{
|
|
Index item = null;
|
|
while (reader.Read())
|
|
{
|
|
root.RaiseOnReadingOne(reader["Name"]);
|
|
type = reader["ObjectType"].ToString().Trim();
|
|
if (parentId != (int)reader["object_id"])
|
|
{
|
|
parentId = (int)reader["object_id"];
|
|
if (type.Equals("V"))
|
|
parent = database.Views.Find(parentId);
|
|
else
|
|
parent = database.Tables.Find(parentId);
|
|
change = true;
|
|
}
|
|
else
|
|
change = false;
|
|
|
|
if (parent != null)
|
|
{
|
|
if (indexid != (int)reader["index_id"] || change)
|
|
{
|
|
item = new Index(parent);
|
|
item.Name = reader["Name"].ToString();
|
|
item.Owner = parent.Owner;
|
|
item.Type = (Index.IndexTypeEnum)(byte)reader["type"];
|
|
item.Id = (int)reader["index_id"];
|
|
item.IgnoreDupKey = (bool)reader["ignore_dup_key"];
|
|
item.IsAutoStatistics = (bool)reader["NoAutomaticRecomputation"];
|
|
item.IsDisabled = (bool)reader["is_disabled"];
|
|
item.IsPrimaryKey = (bool)reader["is_primary_key"];
|
|
item.IsUniqueKey = (bool)reader["is_unique"];
|
|
if (database.Options.Ignore.FilterIndexRowLock)
|
|
{
|
|
item.AllowPageLocks = (bool)reader["allow_page_locks"];
|
|
item.AllowRowLocks = (bool)reader["allow_row_locks"];
|
|
}
|
|
if (database.Options.Ignore.FilterIndexFillFactor)
|
|
{
|
|
item.FillFactor = (byte)reader["fill_factor"];
|
|
item.IsPadded = (bool)reader["is_padded"];
|
|
}
|
|
if ((database.Options.Ignore.FilterTableFileGroup) && (item.Type != Index.IndexTypeEnum.XML))
|
|
item.FileGroup = reader["FileGroup"].ToString();
|
|
|
|
if ((database.Info.Version == DatabaseInfo.SQLServerVersion.SQLServer2008) && (database.Options.Ignore.FilterIndexFilter))
|
|
{
|
|
item.FilterDefintion = reader["FilterDefinition"].ToString();
|
|
}
|
|
indexid = (int)reader["index_id"];
|
|
if (type.Equals("V"))
|
|
((View)parent).Indexes.Add(item);
|
|
else
|
|
((Table)parent).Indexes.Add(item);
|
|
}
|
|
IndexColumn ccon = new IndexColumn(item.Parent);
|
|
ccon.Name = reader["ColumnName"].ToString();
|
|
ccon.IsIncluded = (bool)reader["is_included_column"];
|
|
ccon.Order = (bool)reader["is_descending_key"];
|
|
ccon.Id = (int)reader["column_id"];
|
|
ccon.KeyOrder = (byte)reader["key_ordinal"];
|
|
ccon.DataTypeId = (int)reader["user_type_id"];
|
|
if ((!ccon.IsIncluded) || (ccon.IsIncluded && database.Options.Ignore.FilterIndexIncludeColumns))
|
|
item.Columns.Add(ccon);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|