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.
192 lines
7.2 KiB
192 lines
7.2 KiB
using OpenDBDiff.Abstractions.Schema.Errors;
|
|
using OpenDBDiff.Abstractions.Schema.Events;
|
|
using OpenDBDiff.Abstractions.Schema.Misc;
|
|
using OpenDBDiff.SqlServer.Schema.Compare;
|
|
using OpenDBDiff.SqlServer.Schema.Generates.Util;
|
|
using OpenDBDiff.SqlServer.Schema.Model;
|
|
using OpenDBDiff.SqlServer.Schema.Options;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Data.SqlClient;
|
|
|
|
namespace OpenDBDiff.SqlServer.Schema.Generates
|
|
{
|
|
public class Generate
|
|
{
|
|
private readonly List<MessageLog> messages;
|
|
private ProgressEventArgs currentlyReading;
|
|
|
|
public Generate()
|
|
{
|
|
messages = new List<MessageLog>();
|
|
OnReading += Generate_OnReading;
|
|
}
|
|
|
|
public static int MaxValue
|
|
{
|
|
get { return Constants.READING_MAX; }
|
|
}
|
|
|
|
public string ConnectionString { get; set; }
|
|
|
|
private string Name
|
|
{
|
|
get
|
|
{
|
|
string name;
|
|
using (var conn = new SqlConnection(ConnectionString))
|
|
{
|
|
name = conn.Database;
|
|
}
|
|
return name;
|
|
}
|
|
}
|
|
|
|
public SqlOption Options { get; set; }
|
|
|
|
private event ProgressEventHandler.ProgressHandler OnReading;
|
|
|
|
public event ProgressEventHandler.ProgressHandler OnProgress;
|
|
|
|
private void Generate_OnReading(ProgressEventArgs e)
|
|
{
|
|
if (OnProgress != null) OnProgress(e);
|
|
}
|
|
|
|
public void RaiseOnReading(ProgressEventArgs e)
|
|
{
|
|
this.currentlyReading = e;
|
|
if (OnReading != null) OnReading(e);
|
|
}
|
|
|
|
public void RaiseOnReadingOne(object name)
|
|
{
|
|
if (name != null && this.OnReading != null && this.currentlyReading != null)
|
|
{
|
|
var eOne = new ProgressEventArgs(this.currentlyReading.Message, this.currentlyReading.Progress);
|
|
eOne.Message = eOne.Message.Replace("...", String.Format(": [{0}]", name));
|
|
this.OnReading(eOne);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Genera el schema de la base de datos seleccionada y devuelve un objeto Database.
|
|
/// </summary>
|
|
public Database Process()
|
|
{
|
|
string error = "";
|
|
var databaseSchema = new Database();
|
|
|
|
//tables.OnTableProgress += new Progress.ProgressHandler(tables_OnTableProgress);
|
|
databaseSchema.Options = Options;
|
|
databaseSchema.Name = Name;
|
|
databaseSchema.Info = (new GenerateDatabase(ConnectionString, Options)).Get(databaseSchema);
|
|
/*Thread t1 = new Thread(delegate()
|
|
{
|
|
try
|
|
{*/
|
|
(new GenerateRules(this)).Fill(databaseSchema, ConnectionString);
|
|
(new GenerateTables(this)).Fill(databaseSchema, ConnectionString, messages);
|
|
(new GenerateViews(this)).Fill(databaseSchema, ConnectionString, messages);
|
|
|
|
if (Options.Ignore.FilterIndex)
|
|
{
|
|
(new GenerateIndex(this)).Fill(databaseSchema, ConnectionString);
|
|
(new GenerateFullTextIndex(this)).Fill(databaseSchema, ConnectionString);
|
|
}
|
|
(new GenerateUserDataTypes(this)).Fill(databaseSchema, ConnectionString, messages);
|
|
(new GenerateXMLSchemas(this)).Fill(databaseSchema, ConnectionString);
|
|
(new GenerateSchemas(this)).Fill(databaseSchema, ConnectionString);
|
|
/*}
|
|
catch (Exception ex)
|
|
{
|
|
error = ex.StackTrace;
|
|
}
|
|
});
|
|
Thread t2 = new Thread(delegate()
|
|
{
|
|
try
|
|
{*/
|
|
|
|
//not supported in azure yet
|
|
if (databaseSchema.Info.Version != DatabaseInfo.SQLServerVersion.SQLServerAzure10)
|
|
{
|
|
(new GeneratePartitionFunctions(this)).Fill(databaseSchema, ConnectionString);
|
|
(new GeneratePartitionScheme(this)).Fill(databaseSchema, ConnectionString);
|
|
(new GenerateFileGroups(this)).Fill(databaseSchema, ConnectionString);
|
|
}
|
|
|
|
(new GenerateDDLTriggers(this)).Fill(databaseSchema, ConnectionString);
|
|
(new GenerateSynonyms(this)).Fill(databaseSchema, ConnectionString);
|
|
|
|
//not supported in azure yet
|
|
if (databaseSchema.Info.Version != DatabaseInfo.SQLServerVersion.SQLServerAzure10)
|
|
{
|
|
(new GenerateAssemblies(this)).Fill(databaseSchema, ConnectionString);
|
|
(new GenerateFullText(this)).Fill(databaseSchema, ConnectionString);
|
|
}
|
|
/*}
|
|
catch (Exception ex)
|
|
{
|
|
error = ex.StackTrace;
|
|
}
|
|
});
|
|
Thread t3 = new Thread(delegate()
|
|
{
|
|
try
|
|
{*/
|
|
(new GenerateStoredProcedures(this)).Fill(databaseSchema, ConnectionString);
|
|
(new GenerateFunctions(this)).Fill(databaseSchema, ConnectionString);
|
|
(new GenerateTriggers(this)).Fill(databaseSchema, ConnectionString, messages);
|
|
(new GenerateTextObjects(this)).Fill(databaseSchema, ConnectionString);
|
|
(new GenerateUsers(this)).Fill(databaseSchema, ConnectionString);
|
|
/*}
|
|
catch (Exception ex)
|
|
{
|
|
error = ex.StackTrace;
|
|
}
|
|
});
|
|
t1.Start();
|
|
t2.Start();
|
|
t3.Start();
|
|
t1.Join();
|
|
t2.Join();
|
|
t3.Join();*/
|
|
if (String.IsNullOrEmpty(error))
|
|
{
|
|
/*Las propiedades extendidas deben ir despues de haber capturado el resto de los objetos de la base*/
|
|
(new GenerateExtendedProperties(this)).Fill(databaseSchema, ConnectionString, messages);
|
|
databaseSchema.BuildDependency();
|
|
return databaseSchema;
|
|
}
|
|
else
|
|
throw new SchemaException(error);
|
|
}
|
|
|
|
private void tables_OnTableProgress(object sender, ProgressEventArgs e)
|
|
{
|
|
ProgressEventHandler.RaiseOnChange(e);
|
|
}
|
|
|
|
// TODO: Static because Compare method is static; static events are not my favorite
|
|
public static event ProgressEventHandler.ProgressHandler OnCompareProgress;
|
|
|
|
internal static void RaiseOnCompareProgress(string formatString, params object[] formatParams)
|
|
{
|
|
OnCompareProgress?.Invoke(new ProgressEventArgs(String.Format(formatString, formatParams), -1));
|
|
}
|
|
|
|
/// <summary>
|
|
/// Generates the differences to migrate a schema from origin to destination
|
|
/// </summary>
|
|
/// <param name="origin">The Origin schema is the schema before our generated actions are applied.</param>
|
|
/// <param name="destination">The Destination schema is the schema after our actions are applied.</param>
|
|
/// <returns></returns>
|
|
public static Database Compare(Database origin, Database destination)
|
|
{
|
|
Database merge = CompareDatabase.GenerateDifferences(origin, destination);
|
|
return merge;
|
|
}
|
|
}
|
|
}
|