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.
145 lines
6.5 KiB
145 lines
6.5 KiB
using OpenDBDiff.Schema.Events;
|
|
using OpenDBDiff.Schema.SQLServer.Generates.Generates.Util;
|
|
using OpenDBDiff.Schema.SQLServer.Generates.Model;
|
|
using System.Data.SqlClient;
|
|
using System.Linq;
|
|
|
|
namespace OpenDBDiff.Schema.SQLServer.Generates.Generates
|
|
{
|
|
public class GenerateStoredProcedures
|
|
{
|
|
private static int NameIndex = -1;
|
|
private static int object_idIndex = -1;
|
|
private static int ownerIndex = -1;
|
|
private static int typeIndex = -1;
|
|
|
|
private Generate root;
|
|
|
|
public GenerateStoredProcedures(Generate root)
|
|
{
|
|
this.root = root;
|
|
}
|
|
|
|
private static void InitIndex(SqlDataReader reader)
|
|
{
|
|
if (NameIndex == -1)
|
|
{
|
|
object_idIndex = reader.GetOrdinal("object_id");
|
|
NameIndex = reader.GetOrdinal("Name");
|
|
ownerIndex = reader.GetOrdinal("owner");
|
|
typeIndex = reader.GetOrdinal("type");
|
|
}
|
|
}
|
|
|
|
private static string GetSQLParameters()
|
|
{
|
|
return SQLQueries.SQLQueryFactory.Get("GetParameters");
|
|
}
|
|
|
|
private static string GetSQL(DatabaseInfo.SQLServerVersion version)
|
|
{
|
|
if (version == DatabaseInfo.SQLServerVersion.SQLServerAzure10)
|
|
{
|
|
return SQLQueries.SQLQueryFactory.Get("GetProcedures", DatabaseInfo.SQLServerVersion.SQLServerAzure10);
|
|
}
|
|
else
|
|
{
|
|
return SQLQueries.SQLQueryFactory.Get("GetProcedures");
|
|
}
|
|
}
|
|
|
|
private static void FillParameters(Database database, string connectionString)
|
|
{
|
|
using (SqlConnection conn = new SqlConnection(connectionString))
|
|
{
|
|
using (SqlCommand command = new SqlCommand(GetSQLParameters(), conn))
|
|
{
|
|
conn.Open();
|
|
command.CommandTimeout = 0;
|
|
using (SqlDataReader reader = command.ExecuteReader())
|
|
{
|
|
while (reader.Read())
|
|
{
|
|
var objectName = reader["ObjectName"].ToString();
|
|
|
|
if (database.CLRProcedures.Contains(objectName))
|
|
{
|
|
Parameter param = new Parameter();
|
|
param.Name = reader["Name"].ToString();
|
|
param.Type = reader["TypeName"].ToString();
|
|
param.Size = (short)reader["max_length"];
|
|
param.Scale = (byte)reader["scale"];
|
|
param.Precision = (byte)reader["precision"];
|
|
param.Output = (bool)reader["is_output"];
|
|
if (param.Type.Equals("nchar") || param.Type.Equals("nvarchar"))
|
|
{
|
|
if (param.Size != -1)
|
|
param.Size = param.Size / 2;
|
|
}
|
|
database.CLRProcedures[objectName].Parameters.Add(param);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public void Fill(Database database, string connectionString)
|
|
{
|
|
if ((database.Options.Ignore.FilterStoredProcedure) || (database.Options.Ignore.FilterCLRStoredProcedure))
|
|
{
|
|
root.RaiseOnReading(new ProgressEventArgs("Reading stored procedures...", Constants.READING_PROCEDURES));
|
|
using (SqlConnection conn = new SqlConnection(connectionString))
|
|
{
|
|
using (SqlCommand command = new SqlCommand(GetSQL(database.Info.Version), conn))
|
|
{
|
|
conn.Open();
|
|
command.CommandTimeout = 0;
|
|
using (SqlDataReader reader = command.ExecuteReader())
|
|
{
|
|
while (reader.Read())
|
|
{
|
|
InitIndex(reader);
|
|
root.RaiseOnReadingOne(reader[NameIndex]);
|
|
|
|
var objectType = reader[typeIndex].ToString().Trim();
|
|
switch (objectType)
|
|
{
|
|
case "P":
|
|
if (database.Options.Ignore.FilterStoredProcedure)
|
|
{
|
|
StoredProcedure item = new StoredProcedure(database);
|
|
item.Id = (int)reader[object_idIndex];
|
|
item.Name = (string)reader[NameIndex];
|
|
item.Owner = (string)reader[ownerIndex];
|
|
database.Procedures.Add(item);
|
|
}
|
|
break;
|
|
|
|
case "PC":
|
|
if (database.Options.Ignore.FilterCLRStoredProcedure)
|
|
{
|
|
CLRStoredProcedure item = new CLRStoredProcedure(database);
|
|
item.Id = (int)reader[object_idIndex];
|
|
item.Name = reader[NameIndex].ToString();
|
|
item.Owner = reader[ownerIndex].ToString();
|
|
item.IsAssembly = true;
|
|
item.AssemblyId = (int)reader["assembly_id"];
|
|
item.AssemblyName = reader["assembly_name"].ToString();
|
|
item.AssemblyClass = reader["assembly_class"].ToString();
|
|
item.AssemblyExecuteAs = reader["ExecuteAs"].ToString();
|
|
item.AssemblyMethod = reader["assembly_method"].ToString();
|
|
database.CLRProcedures.Add(item);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (database.CLRProcedures.Any())
|
|
FillParameters(database, connectionString);
|
|
}
|
|
}
|
|
}
|
|
} |