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

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);
}
}
}
}