Esempio n. 1
0
 private void ExecuteScripts(Schema schema, FileInfo[] files)
 {
     ExecuteScripts(schema, files, false);
 }
Esempio n. 2
0
        public Schema Prepare(ProviderType providerType, string connectionString, string database)
        {
            if (connectionString == null || connectionString.Length == 0 || database == null || database.Length == 0)
            {
                throw new ArgumentException("Missing a required parameter.");
            }

            Schema schema = null;

            switch (providerType)
            {
            case ProviderType.PostGres:
                schema = new Schema(new PostGresProvider());
                break;

            case ProviderType.Oracle:
                schema = new Schema(new OracleProvider());
                break;

            case ProviderType.SqlServer:
            default:
                schema = new Schema(new SqlProvider());
                break;
            }

            schema.Provider.ConnectionString = connectionString;
            schema.Provider.Database         = database;

            schema.Exists = schema.Provider.Exists();

            if (!Directory.Exists(targetDir))
            {
                throw new ArgumentException("Script directory missing: " + targetDir);
            }

            DirectoryInfo installScripts = new DirectoryInfo(Path.Combine(targetDir, "Install"));
            DirectoryInfo upgradeScripts = new DirectoryInfo(Path.Combine(targetDir, "Upgrade"));

            DirectoryInfo[] candidates = null;
            if (upgradeScripts.Exists)
            {
                candidates = upgradeScripts.GetDirectories();
                if (candidates.Length > 0)
                {
                    Array.Sort(candidates, new DirInfoSorter());
                    schema.Upgrade = candidates[candidates.Length - 1].Name;
                    foreach (DirectoryInfo di in candidates)
                    {
                        if (string.Compare(di.Name, Schema.RTM, true) == 0)
                        {
                            throw new ArgumentException("You cannot have an Upgrade directory with the reserved name: " + Schema.RTM);
                        }
                    }
                }
            }

            if (schema.Exists && (flags & RuntimeFlag.Drop) != RuntimeFlag.Drop)
            {
                string[] version = schema.Provider.GetVersion().Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries);
                if (version.Length == 2)
                {
                    schema.Version   = version[0];
                    schema.UpgradeBy = version[1];
                }
                if (upgradeScripts.Exists)
                {
                    if (candidates != null)
                    {
                        foreach (DirectoryInfo di in candidates)
                        {
                            int  comp  = string.Compare(schema.Version, di.Name, true);
                            bool retry = (flags & RuntimeFlag.Retry) == RuntimeFlag.Retry;
                            if ((!retry && comp < 0) || (retry && comp <= 0) || (string.Compare(schema.Version, Schema.RTM, true) == 0))
                            {
                                schema.ScriptsTotal += di.GetFiles("*.sql", SearchOption.AllDirectories).Length;
                            }
                        }
                    }
                }
                else if (installScripts.Exists)
                {
                    schema.ScriptsTotal = installScripts.GetFiles("*.sql", SearchOption.AllDirectories).Length;
                }
            }
            else if (installScripts.Exists)
            {
                schema.ScriptsTotal = installScripts.GetFiles("*.sql", SearchOption.AllDirectories).Length;
            }

            return(schema);
        }
Esempio n. 3
0
        public void Create(Schema schema)
        {
            string errorMessage = string.Empty;

            try
            {
                if (schema == null || schema.Provider == null)
                {
                    throw new ArgumentException("You must prepare the schema first.", "schema");
                }

                schema = schema.Clone();

                if (schema.Exists && (flags & RuntimeFlag.Drop) == RuntimeFlag.Drop)
                {
                    SetProgress(StatusMessage.Start, "Dropping Database " + schema.Provider.Database);
                    schema.Provider.DropDatabase();
                    SetProgress(StatusMessage.Complete, "Done.");
                    if ((this.flags & RuntimeFlag.Verbose) == RuntimeFlag.Verbose)
                    {
                        SetProgress(StatusMessage.Progress, string.Empty, 50);
                    }
                    schema.Exists = false;
                }

                DirectoryInfo installScripts = new DirectoryInfo(Path.Combine(targetDir, "Install"));
                DirectoryInfo upgradeScripts = new DirectoryInfo(Path.Combine(targetDir, "Upgrade"));

                if (!schema.Exists || !upgradeScripts.Exists)
                {
                    if ((flags & RuntimeFlag.Create) == RuntimeFlag.Create)
                    {
                        SetProgress(StatusMessage.Start, "Creating Database " + schema.Provider.Database);
                        schema.Provider.CreateDatabase();
                        if ((this.flags & RuntimeFlag.Verbose) == RuntimeFlag.Verbose)
                        {
                            SetProgress(StatusMessage.Progress, string.Empty, 100);
                        }
                        SetProgress(StatusMessage.Complete, "Done.");
                    }
                    if (installScripts.Exists)
                    {
                        SetProgress(StatusMessage.Start, "Installing Database " + schema.Provider.Database);

                        if ((this.flags & RuntimeFlag.Verbose) == RuntimeFlag.Verbose)
                        {
                            SetProgress(StatusMessage.Detail, string.Empty);
                        }
                        ExecuteScripts(schema, installScripts.GetFiles(Constants.PreInstallFilter, SearchOption.AllDirectories), true);
                        ExecuteScripts(schema, installScripts.GetFiles(Constants.TableFilter, SearchOption.AllDirectories));
                        ExecuteScripts(schema, installScripts.GetFiles(Constants.FunctionFilter, SearchOption.AllDirectories));
                        ExecuteScripts(schema, installScripts.GetFiles(Constants.ViewFilter, SearchOption.AllDirectories));
                        ExecuteScripts(schema, installScripts.GetFiles(Constants.StoredProcedureFilter, SearchOption.AllDirectories));
                        ExecuteScripts(schema, installScripts.GetFiles(Constants.TriggerFilter, SearchOption.AllDirectories));
                        ExecuteScripts(schema, installScripts.GetFiles(Constants.PostInstallFilter, SearchOption.AllDirectories));
                        ExecuteScripts(schema, installScripts.GetFiles(Constants.ForeignKeyFilter, SearchOption.AllDirectories));
                        SetProgress(StatusMessage.Complete, "Done.");
                        if (schema.ScriptsRun == 0)
                        {
                            SetProgress(StatusMessage.Complete, "WARNING: no scripts found. An empty database was created.");
                        }
                    }
                    else
                    {
                        SetProgress(StatusMessage.Complete, "WARNING: missing Install directory. An empty database was created.");
                    }
                    schema.Provider.SetVersion(schema.Upgrade, WindowsIdentity.GetCurrent().Name + " on " + DateTime.Now);
                }
                else
                {
                    DirectoryInfo[] candidates = new DirectoryInfo[] { };

                    if (upgradeScripts.Exists)
                    {
                        candidates = upgradeScripts.GetDirectories();
                        if (candidates.Length > 0)
                        {
                            if (schema.ScriptsTotal == 0)
                            {
                                SetProgress(StatusMessage.Complete, "WARNING: no new scripts found. Nothing to do.");
                            }
                            Array.Sort(candidates, new DirInfoSorter());
                        }
                        else
                        {
                            SetProgress(StatusMessage.Complete, "WARNING: no version directories found. Nothing to do.");
                        }
                    }
                    else
                    {
                        SetProgress(StatusMessage.Complete, "WARNING: missing Upgrade directory. Nothing to do.");
                    }

                    foreach (DirectoryInfo upgradeDir in candidates)
                    {
                        int  comp  = string.Compare(schema.Version, upgradeDir.Name, true);
                        bool retry = (flags & RuntimeFlag.Retry) == RuntimeFlag.Retry;
                        if ((!retry && comp < 0) || (retry && comp <= 0) || (string.Compare(schema.Version, Schema.RTM, true) == 0))
                        {
                            SetProgress(StatusMessage.Start, "Upgrading Database to version " + upgradeDir.Name);
                            if ((this.flags & RuntimeFlag.Verbose) == RuntimeFlag.Verbose)
                            {
                                SetProgress(StatusMessage.Detail, string.Empty);
                            }
                            ExecuteScripts(schema, upgradeDir.GetFiles(Constants.PreInstallFilter, SearchOption.AllDirectories), true);
                            ExecuteScripts(schema, upgradeDir.GetFiles(Constants.TableFilter, SearchOption.AllDirectories));
                            ExecuteScripts(schema, upgradeDir.GetFiles(Constants.FunctionFilter, SearchOption.AllDirectories));
                            ExecuteScripts(schema, upgradeDir.GetFiles(Constants.ViewFilter, SearchOption.AllDirectories));
                            ExecuteScripts(schema, upgradeDir.GetFiles(Constants.StoredProcedureFilter, SearchOption.AllDirectories));
                            ExecuteScripts(schema, upgradeDir.GetFiles(Constants.TriggerFilter, SearchOption.AllDirectories));
                            ExecuteScripts(schema, upgradeDir.GetFiles(Constants.PostInstallFilter, SearchOption.AllDirectories));
                            ExecuteScripts(schema, upgradeDir.GetFiles(Constants.ForeignKeyFilter, SearchOption.AllDirectories));
                            SetProgress(StatusMessage.Complete, "Done.");
                            if (schema.Errors > 0)
                            {
                                break;
                            }
                            schema.Provider.SetVersion(upgradeDir.Name, WindowsIdentity.GetCurrent().Name + " on " + DateTime.Now);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                schema.Errors++;
                SetProgress(StatusMessage.Complete, "Error.");
                errorMessage = ex.InnerException != null ? ex.InnerException.Message : ex.Message;
                SetProgress(StatusMessage.Detail, errorMessage);
            }
            finally
            {
                SetProgress(StatusMessage.Exit, errorMessage, schema.Errors);
            }
        }