/// <summary> /// Performs an install of a database /// </summary> public void Install(InstallSetup setup) { if (setup.InstallStatus == InstallStatusConstants.Create) { //Connection cannot reference an existing database if (SqlServers.TestConnectionString(setup.ConnectionString)) { throw new Exception("The connection string references an existing database."); } //The new database name must be specified if (string.IsNullOrEmpty(setup.NewDatabaseName)) { throw new Exception("A new database name was not specified."); } //The connection string and the new database name must be the same var builder = new SqlConnectionStringBuilder(setup.ConnectionString); if (builder.InitialCatalog.ToLower() != setup.NewDatabaseName.ToLower()) { throw new Exception("A new database name does not match the specified connection string."); } SqlServers.CreateDatabase(setup); } else if (setup.InstallStatus == InstallStatusConstants.Upgrade) { //The connection string must reference an existing database if (!SqlServers.TestConnectionString(setup.ConnectionString)) { throw new Exception("The connection string does not reference a valid database."); } } try { UpgradeInstaller.UpgradeDatabase(setup); } catch (InvalidSQLException ex) { var sb = new StringBuilder(); sb.AppendLine(); sb.AppendLine("BEGIN ERROR SQL"); sb.AppendLine(ex.SQL); sb.AppendLine("END ERROR SQL"); sb.AppendLine(); System.Diagnostics.Trace.WriteLine(sb.ToString()); UpgradeInstaller.LogError(ex, sb.ToString()); throw; } catch (Exception ex) { throw; } }
/// <summary> /// Returns the upgrade script for the specified database /// </summary> public string GetScript(InstallSetup setup) { if (string.IsNullOrEmpty(setup.ConnectionString) && setup.Version == null) { throw new Exception("The connection string must be set."); } if (setup.SkipSections == null) { setup.SkipSections = new List <string>(); } return(UpgradeInstaller.GetScript(setup)); }
/// <summary> /// Performs an install of a database /// </summary> public override void Install(System.Collections.IDictionary stateSaver) { base.Install(stateSaver); var commandParams = GetCommandLineParameters(); var paramUICount = 0; var setup = new InstallSetup(); if (commandParams.Count > 0) { if (commandParams.ContainsKey(PARAMKEYS_SHOWSQL)) { if (commandParams[PARAMKEYS_SHOWSQL].ToLower() == "true" || commandParams[PARAMKEYS_SHOWSQL].ToLower() == "1" || commandParams[PARAMKEYS_SHOWSQL].ToLower() == string.Empty) { setup.ShowSql = true; } else if (commandParams[PARAMKEYS_SHOWSQL].ToLower() == "false" || commandParams[PARAMKEYS_SHOWSQL].ToLower() == "0") { setup.ShowSql = false; } else { throw new Exception("The /" + PARAMKEYS_SHOWSQL + " parameter must be set to 'true or false'."); } paramUICount++; } if (commandParams.ContainsKey(PARAMKEYS_LOGSQL)) { var logFile = commandParams[PARAMKEYS_LOGSQL]; if (!string.IsNullOrEmpty(logFile)) { //var isValid = !string.IsNullOrEmpty(logFile) && logFile.IndexOfAny(Path.GetInvalidFileNameChars()) < 0; //if (!isValid) // throw new Exception("The /" + PARAMKEYS_LOGSQL + " parameter must have a valid file name."); if (File.Exists(logFile)) { File.Delete(logFile); } setup.LogFilename = logFile; } paramUICount++; } if (commandParams.Any(x => PARAMKEYS_TRAN.Contains(x.Key))) { setup.UseTransaction = GetSetting(commandParams, PARAMKEYS_TRAN, true); paramUICount++; } if (commandParams.ContainsKey(PARAMKEYS_SKIPNORMALIZE)) { setup.SkipNormalize = true; paramUICount++; } if (commandParams.ContainsKey(PARAMKEYS_HASH)) { if (commandParams[PARAMKEYS_HASH].ToLower() == "true" || commandParams[PARAMKEYS_HASH].ToLower() == "1" || commandParams[PARAMKEYS_HASH].ToLower() == string.Empty) { setup.UseHash = true; } else if (commandParams[PARAMKEYS_HASH].ToLower() == "false" || commandParams[PARAMKEYS_HASH].ToLower() == "0") { setup.UseHash = false; } else { throw new Exception("The /" + PARAMKEYS_HASH + " parameter must be set to 'true or false'."); } paramUICount++; } if (commandParams.ContainsKey(PARAMKEYS_CHECKONLY)) { setup.CheckOnly = true; paramUICount++; } if (commandParams.ContainsKey(PARAMKEYS_QUIET)) { setup.SuppressUI = true; paramUICount++; } //Setup trace if need be. If showing SQL then auto trace on if (commandParams.ContainsKey(PARAMKEYS_TRACE) || setup.ShowSql) { var trc = new System.Diagnostics.ConsoleTraceListener(); System.Diagnostics.Trace.Listeners.Add(trc); paramUICount++; } if (commandParams.ContainsKey(PARAMKEYS_VERSIONWARN)) { if (commandParams[PARAMKEYS_VERSIONWARN].ToLower() == "all") { setup.AcceptVersionWarningsChangedScripts = true; setup.AcceptVersionWarningsNewScripts = true; } else if (commandParams[PARAMKEYS_VERSIONWARN].ToLower() == "none") { setup.AcceptVersionWarningsChangedScripts = false; setup.AcceptVersionWarningsNewScripts = false; } else if (commandParams[PARAMKEYS_VERSIONWARN].ToLower() == "new") { setup.AcceptVersionWarningsNewScripts = true; } else if (commandParams[PARAMKEYS_VERSIONWARN].ToLower() == "changed") { setup.AcceptVersionWarningsChangedScripts = true; } else { throw new Exception("The /" + PARAMKEYS_VERSIONWARN + " parameter must be set to 'all, none, new, or changed'."); } paramUICount++; } if (GetSetting(commandParams, PARAMKEYS_HELP, false)) { ShowHelp(); return; } //Try to drop database if (commandParams.Any(x => PARAMKEYS_DROP.Contains(x.Key))) { var masterConnectionString = GetSetting(commandParams, PARAMKEYS_MASTERDB, string.Empty); var dbname = commandParams.Where(x => PARAMKEYS_NEWNAME.Contains(x.Key)).Select(x => x.Value).FirstOrDefault(); if (commandParams.Count == 3 && !string.IsNullOrEmpty(masterConnectionString)) { if (!DropDatabase(dbname, masterConnectionString)) { throw new Exception("The database '" + dbname + "' could not dropped."); } System.Diagnostics.Trace.WriteLine("Database successfully dropped."); return; } throw new Exception("Invalid drop database configuration."); } setup.ConnectionString = GetSetting(commandParams, PARAMKEYS_APPDB, string.Empty); setup.MasterConnectionString = GetSetting(commandParams, PARAMKEYS_MASTERDB, string.Empty); if (GetSetting(commandParams, PARAMKEYS_UPGRADE, setup.IsUpgrade)) { setup.InstallStatus = InstallStatusConstants.Upgrade; } if (commandParams.Any(x => PARAMKEYS_CREATE.Contains(x.Key))) { setup.InstallStatus = InstallStatusConstants.Create; } if (commandParams.Any(x => PARAMKEYS_UPGRADE.Contains(x.Key)) && commandParams.Any(x => PARAMKEYS_CREATE.Contains(x.Key))) { throw new Exception("You cannot specify both the create and update action."); } if (commandParams.Count(x => PARAMKEYS_NEWNAME.Contains(x.Key)) > 1) { throw new Exception("The new database name was specified more than once."); } if (commandParams.Count(x => PARAMKEYS_MASTERDB.Contains(x.Key)) > 1) { throw new Exception("The master database connection string was specified more than once."); } if (commandParams.Count(x => PARAMKEYS_APPDB.Contains(x.Key)) > 1) { throw new Exception("The connection string was specified more than once."); } //Determine if calling as a script generator if (commandParams.ContainsKey(PARAMKEYS_SCRIPT)) { var scriptAction = commandParams[PARAMKEYS_SCRIPT].ToLower(); switch (scriptAction) { case "versioned": case "unversioned": case "create": break; default: throw new Exception("The script action must be 'create', 'versioned', or 'unversioned'."); } if (!commandParams.ContainsKey(PARAMKEYS_SCRIPTFILE)) { throw new Exception("The '" + PARAMKEYS_SCRIPTFILE + "' parameter must be set for script generation."); } var dumpFile = commandParams[PARAMKEYS_SCRIPTFILE]; if (!IsValidFileName(dumpFile)) { throw new Exception("The '" + PARAMKEYS_SCRIPTFILE + "' parameter is not valid."); } var fileCreate = true; if (commandParams.ContainsKey(PARAMKEYS_SCRIPTFILEACTION) && (commandParams[PARAMKEYS_SCRIPTFILEACTION] + string.Empty) == "append") { fileCreate = false; } if (File.Exists(dumpFile) && fileCreate) { File.Delete(dumpFile); System.Threading.Thread.Sleep(500); } switch (scriptAction) { case "versioned": if (commandParams.ContainsKey(PARAMKEYS_DBVERSION)) { if (!GeneratedVersion.IsValid(commandParams[PARAMKEYS_DBVERSION])) { throw new Exception("The '" + PARAMKEYS_DBVERSION + "' parameter is not valid."); } setup.Version = new GeneratedVersion(commandParams[PARAMKEYS_DBVERSION]); } else { if (string.IsNullOrEmpty(setup.ConnectionString)) { throw new Exception("Generation of versioned scripts requires a '" + PARAMKEYS_DBVERSION + "' parameter or valid connection string."); } else { var s = new nHydrateSetting(); s.Load(setup.ConnectionString); setup.Version = new GeneratedVersion(s.dbVersion); } } setup.InstallStatus = InstallStatusConstants.Upgrade; File.AppendAllText(dumpFile, UpgradeInstaller.GetScript(setup)); break; case "unversioned": setup.InstallStatus = InstallStatusConstants.Upgrade; setup.Version = UpgradeInstaller._def_Version; File.AppendAllText(dumpFile, UpgradeInstaller.GetScript(setup)); break; case "create": setup.InstallStatus = InstallStatusConstants.Create; setup.Version = new GeneratedVersion(-1, -1, -1, -1, -1); File.AppendAllText(dumpFile, UpgradeInstaller.GetScript(setup)); break; } return; } //If we processed all parameters and they were UI then we need to show UI if ((paramUICount < commandParams.Count) || setup.SuppressUI) { setup.NewDatabaseName = commandParams.Where(x => PARAMKEYS_NEWNAME.Contains(x.Key)).Select(x => x.Value).FirstOrDefault(); Install(setup); return; } } Console.WriteLine("Invalid configuration"); }