Esempio n. 1
0
        private IScriptWriter CreateScriptWriter(IScriptingOptions scriptingOptions, IConnectionSettings connSettings)
        {
            IScriptWriter writer;

            if (scriptingOptions.UseMultipleFiles)
            {
                writer = new MultiFileScriptWriter(scriptingOptions.ExportDirectory);
            }
            else
            {
                writer = new SingleFileScriptWriter(scriptingOptions.ExportDirectory, connSettings.Database);
            }

            writer.MessageManager = messageManager;
            return(writer);
        }
Esempio n. 2
0
        protected static int CalculateScriptObjectCount(IScriptingOptions options)
        {
            Throw.If(options, "options").IsNull();

            int tableWeight = options.ScriptSchema ? 1 : 0;

            tableWeight += options.ScriptIndexes ? 1 : 0;
            //tableWeight += options.ScriptForeignKeys ? 1 : 0;
            tableWeight += options.ScriptData ? 1 : 0;

            int exportObjectTotal = options.TablesToScript.Count * tableWeight;

            exportObjectTotal += options.ViewsToScript.Count;
            exportObjectTotal += options.SprocsToScript.Count;

            return(exportObjectTotal);
        }
Esempio n. 3
0
        /// <summary>
        /// Scripts a database to disk for use in creating a brand new db.  This
        /// method scripts the entire object, i.e. no differntial or comparisons
        /// are done.
        /// </summary>
        /// <param name="connectionInfo">The db connection parameters.</param>
        /// <param name="scriptingOptions">The export scripting settings.</param>
        public virtual void Script(IConnectionSettings connectionInfo, IScriptingOptions scriptingOptions)
        {
            Throw.If(connectionInfo, "connectionInfo").IsNull();
            Throw.If(scriptingOptions, "scriptingOptions").IsNull();

            messageManager.OnScriptMessage("Starting database scripting.");

            IDatabase db = DatabaseConnectionFactory.CreateDbConnection(connectionInfo);

            List <ITable> tablesToScript = new List <ITable>();

            foreach (DbObjectName tableName in scriptingOptions.TablesToScript)
            {
                ITable table = db.Tables[tableName.ShortName];
                if (table == null)
                {
                    throw new SqlMigrationException(
                              string.Format("Unable to find the table {0} in database {1} on server.",
                                            tableName, connectionInfo.Database));
                }

                tablesToScript.Add(table);
            }

            IScriptWriter writer       = CreateScriptWriter(scriptingOptions, connectionInfo);
            int           totalObjects = CalculateScriptObjectCount(scriptingOptions);

            int exportCount = 0;

            if (scriptingOptions.ScriptSchema)
            {
                foreach (ITable table in tablesToScript)
                {
                    ScriptTableSchema(table, writer);
                    OnProgressEvent(++exportCount, totalObjects);
                }
            }

            if (scriptingOptions.ScriptIndexes)
            {
                foreach (ITable table in tablesToScript)
                {
                    ScriptTableIndexes(table, writer);
                    OnProgressEvent(++exportCount, totalObjects);
                }
            }

            if (scriptingOptions.ScriptData || scriptingOptions.ScriptDataAsXml)
            {
                IScriptWriter dataWriter   = writer;
                IDataMigrator dataMigrator = new DataMigrator();
                if (scriptingOptions.ScriptDataAsXml)
                {
                    dataMigrator = new XmlDataMigrator();
                    dataWriter   = new XmlDataWriter(scriptingOptions.ExportDirectory, messageManager);
                }

                foreach (ITable table in tablesToScript)
                {
                    ScriptTableData(dataMigrator, table, dataWriter);
                    OnProgressEvent(++exportCount, totalObjects);
                }
            }

            if (scriptingOptions.ScriptForeignKeys)
            {
                foreach (ITable table in tablesToScript)
                {
                    ScriptTableForeignKeys(table, writer);
                    OnProgressEvent(++exportCount, totalObjects);
                }
            }

            foreach (DbObjectName sprocName in scriptingOptions.SprocsToScript)
            {
                IProcedure sproc = db.Procedures[sprocName.ShortName];
                if (sproc == null)
                {
                    throw new SqlMigrationException(
                              string.Format("Unable to find the procedure {0} in database {1} on server.",
                                            sprocName, connectionInfo.Database));
                }
                ScriptSproc(sproc, writer);
                OnProgressEvent(++exportCount, totalObjects);
            }

            foreach (DbObjectName viewName in scriptingOptions.ViewsToScript)
            {
                IView view = db.Views[viewName.ShortName];
                if (view == null)
                {
                    throw new SqlMigrationException(
                              string.Format("Unable to find the view {0} in database {1} on server.",
                                            viewName, connectionInfo.Database));
                }
                ScriptView(view, writer);
                OnProgressEvent(++exportCount, totalObjects);
            }

            messageManager.OnScriptMessage("Finished database scripting.");
        }
Esempio n. 4
0
        /// <summary>
        /// Returns an alter script to upgrade a database from target version
        /// to source version.
        /// </summary>
        /// <remarks>
        /// <para>This method is not thread safe.</para>
        /// <para>Operations are scripted in the following order:
        /// <list type="number">
        ///     <item>create new tables</item>
        ///     <item>add new columns to existing tables</item>
        ///     <item>drop removed foreign keys</item>
        ///     <item>drop removed columns</item>
        ///     <item>drop removed tables</item>
        ///     <item>alter any changed columns (like if you added a new default to a column)</item>
        ///     <item>add new foreign keys</item>
        ///     <item>add new indexes</item>
        ///     <item>functions</item>
        ///     <item>views</item>
        ///     <item>sprocs</item>
        /// </list>
        /// </para>
        /// </remarks>
        /// <param name="connectionInfoSourceDb">The newer, source db.</param>
        /// <param name="connectionInfoTargetDb">The older, target db to upgrade.</param>
        /// <param name="scriptingOptions">The export scripting settings.</param>
        public virtual void ScriptDifferences(IConnectionSettings connectionInfoSourceDb,
                                              IConnectionSettings connectionInfoTargetDb,
                                              IScriptingOptions scriptingOptions)
        {
            Throw.If(connectionInfoSourceDb, "connectionInfoSourceDb").IsNull();
            Throw.If(connectionInfoTargetDb, "connectionInfoTargetDb").IsNull();
            Throw.If(scriptingOptions, "scriptingOptions").IsNull();

            messageManager.OnScriptMessage("Starting scripting database differences.");

            IDatabase srcDb    = DatabaseConnectionFactory.CreateDbConnection(connectionInfoSourceDb);
            IDatabase targetDb = DatabaseConnectionFactory.CreateDbConnection(connectionInfoTargetDb);

            IScriptWriter writer       = CreateScriptWriter(scriptingOptions, connectionInfoTargetDb);
            int           totalObjects = CalculateScriptObjectCount(scriptingOptions);

            int exportCount = 0;

            foreach (DbObjectName tableName in scriptingOptions.TablesToScript)
            {
                // TODO: Need to split this up like the Script() method to order things correctly?
                ITable table = srcDb.Tables[tableName.ShortName];
                if (table == null)
                {
                    throw new SqlMigrationException(
                              string.Format("Unable to find the source table {0} in database {1} on server.",
                                            tableName, connectionInfoSourceDb.Database));
                }

                ITable targetTable = targetDb.Tables[tableName.ShortName];
                if (targetTable == null)
                {
                    throw new SqlMigrationException(
                              string.Format("Unable to find the target table {0} in database {1} on server.",
                                            tableName, connectionInfoTargetDb.Database));
                }

                if (scriptingOptions.ScriptData)
                {
                    ScriptTableDataDifferences(table, targetTable, writer);
                    OnProgressEvent(++exportCount, totalObjects);
                }

                // TODO: constraints, Schema, Indexes?
            }

            messageManager.OnScriptMessage("Finished scripting database differences.");

//            sourceDB = source;
//            targetDB = target;
//
//            messageManager.OnScriptMessage("Starting database differencing.");
//
//            script = new SqlScript();
//
//            ScriptNewTablesAndColumns();
//            ScriptRemovedForeignKeys();
//            ScriptRemovedIndexes();
//            ScriptRemovedTablesAndColumns();
//            ScriptAlteredColumns();
//            ScriptNewForeignKeys();
//            ScriptNewIndexes();
//
//            ScriptNewAndAlteredSprocs();
//            ScriptRemovedSprocs();
//
//            messageManager.OnScriptMessage("Finished database differencing.");
        }