using System; using CMS.DataEngine; using CMS.DatabaseHelper; using CMS.GlobalHelper; using CMS.Scheduler; using CMS.SettingsProvider; using CMS.UIControls; public partial class CMSInstall_Controls_WizardSteps_DatabaseDialog : CMSUserControl { #region "Properties" /// /// Gets new database name. /// public string NewDatabaseName { get { return txtNewDatabaseName.Text.Trim(); } } /// /// Indicates if database objects should be created. /// public bool CreateDatabaseObjects { get { return chkCreateDatabaseObjects.Checked; } } /// /// Schema name. /// public string SchemaText { get { return txtSchema.Text.Trim(); } } /// /// Schema control client ID. /// public string SchemaClientID { get { return txtSchema.ClientID; } } /// /// Schema label client ID. /// public string SchemaLabelClientID { get { return lblSchema.ClientID; } } /// /// Advanced label client ID. /// public string AdvancedLabelClientID { get { return lblAdvanced.ClientID; } } /// /// Gets or sets if use existing radio button is checked. /// public bool UseExistingChecked { get { return radUseExisting.Checked; } set { radUseExisting.Checked = value; } } /// /// Indicates if create new is checked. /// public bool CreateNewChecked { get { return radCreateNew.Checked; } set { radCreateNew.Checked = value; } } /// /// Existing database name, /// public string ExistingDatabaseName { get { return txtExistingDatabaseName.Text; } set { txtExistingDatabaseName.Text = value; } } /// /// Indicates if panel for creating new database should be always displayed. /// public bool IsDBSeparation { get; set; } /// /// Connection string. /// public string ConnectionString { get { return ValidationHelper.GetString(ViewState["ConnectionString"], null); } set { ViewState["ConnectionString"] = value; } } /// /// Password; /// public string Password { get { return ValidationHelper.GetString(ViewState["Password"], null); } set { ViewState["Password"] = value; } } /// /// Server name. /// public string ServerName { get { return ValidationHelper.GetString(ViewState["ServerName"], null); } set { ViewState["ServerName"] = value; } } /// /// Authentication type. /// public SQLServerAuthenticationModeEnum AuthenticationType { get { return (SQLServerAuthenticationModeEnum)ViewState["AuthenticationType"]; } set { ViewState["AuthenticationType"] = value; } } /// /// User name. /// public string Username { get { return ValidationHelper.GetString(ViewState["Username"], null); } set { ViewState["Username"] = value; } } /// /// Database. /// public string Database { get { return ValidationHelper.GetString(ViewState["Database"], null); } set { ViewState["Database"] = value; } } /// /// Indicates if scheduled tasks were manually stopped by a user. /// public bool TasksManuallyStopped { get { return ValidationHelper.GetBoolean(ViewState["TasksManuallyStopped"], false); } set { ViewState["TasksManuallyStopped"] = value; } } #endregion #region "Methods" protected void Page_Load(object sender, EventArgs e) { lblExistingDatabaseName.Text = ResHelper.GetFileString("Install.lblExistingDatabaseName"); lblAdvanced.Text = ResHelper.GetFileString("install.ShowAdvancedOptions"); lblAdvanced.NavigateUrl = "#"; lblAdvanced.Attributes.Add("onclick", " AdvancedOptions('?'); "); lblNewDatabaseName.Text = ResHelper.GetFileString("Install.lblNewDatabaseName"); lblSchema.Text = ResHelper.GetFileString("Install.Schema") + ":"; lblDatabase.Text = IsDBSeparation ? GetString("separationDB.database") : ResHelper.GetFileString("Install.lblDatabase"); radCreateNew.Text = ResHelper.GetFileString("Install.radCreateNew"); radUseExisting.Text = ResHelper.GetFileString("Install.radUseExisting"); chkCreateDatabaseObjects.Text = ResHelper.GetFileString("Install.chkCreateDatabaseObjects"); plcRunningTasks.Visible = IsDBSeparation; btnStopTasks.Click += btnStopTasks_Click; if (IsDBSeparation) { imgHelp.ImageUrl = GetImageUrl("/CMSModules/CMS_Settings/help.png"); imgHelp.ToolTip = GetString("separationDB.enabledtasksseparation"); } } protected override void OnPreRender(EventArgs e) { base.OnPreRender(e); if (IsDBSeparation) { DisplayTaskStatus(); } if (AzureHelper.IsSQLAzureServer(ServerName)) { plcNewDB.Visible = false; plcExistingRadio.Visible = false; plcRadNew.Visible = false; plcEmptyLine.Visible = false; radCreateNew.Checked = false; radUseExisting.Checked = true; lblAdvanced.Visible = false; } else { radCreateNew.Enabled = true; } plcCreateDatabaseObjects.Visible = !IsDBSeparation; txtNewDatabaseName.Enabled = radCreateNew.Checked; txtExistingDatabaseName.Enabled = radUseExisting.Checked; txtExistingDatabaseName.Text = null; if (radCreateNew.Checked) { chkCreateDatabaseObjects.Checked = true; chkCreateDatabaseObjects.Enabled = false; } else { chkCreateDatabaseObjects.Enabled = true; } if (!RequestHelper.IsPostBack()) { txtNewDatabaseName.Text = TextHelper.LimitLength(GetWebDirectory(), 90); if (SqlHelperClass.IsConnectionStringInitialized && !IsDBSeparation) { radUseExisting.Enabled = true; txtExistingDatabaseName.Text = ConnectionHelper.GetDatabaseName(SqlHelperClass.ConnectionString); txtExistingDatabaseName.Enabled = false; plcNewDB.Visible = false; } } } /// /// Gets web directory. /// private string GetWebDirectory() { string webDirectory = URLHelper.WebApplicationVirtualPath.Replace("/", ""); if ((webDirectory == "") || (webDirectory == "~")) { webDirectory = "KenticoCMS"; } return webDirectory; } /// /// Validates control. /// public bool ValidateForSeparation() { // Get database name if (radCreateNew.Checked && !AzureHelper.IsRunningOnAzure) { Database = txtNewDatabaseName.Text; } else { Database = txtExistingDatabaseName.Text; } Database = TextHelper.LimitLength(Database, 100, String.Empty); if (String.IsNullOrEmpty(Database)) { DisplaySeparationError(GetString("Install.ErrorDBNameEmpty")); return false; } // Set up the connection string ConnectionString = ConnectionHelper.GetConnectionString(AuthenticationType, ServerName, Database, Username, Password, 4800, false); // Test existing DB if (radUseExisting.Checked || AzureHelper.IsRunningOnAzure) { if (!String.IsNullOrEmpty(ConnectionHelper.TestConnection(AuthenticationType, ServerName, Database, Username, Password))) { DisplaySeparationError(String.Format(ResHelper.GetFileString("Install.ErrorDatabseDoesntExist"), Database)); return false; } if (DBSeparationHelper.CheckCMDatabase(ConnectionString)) { DisplaySeparationError(GetString("separationDB.errorCMexists")); return false; } if (!AzureHelper.IsRunningOnAzure) { if (!ConnectionHelper.CheckDBPermission(DatabasePermission.ModifyDatabase, AuthenticationType, ServerName, Username, Password)) { DisplaySeparationError(GetString("separationDB.permissionmodify")); return false; } } } // Test new DB else { if (ConnectionHelper.DatabaseExists(ConnectionString)) { DisplaySeparationError(GetString("separationDB.ErrorDBExists")); return false; } if (!AzureHelper.IsRunningOnAzure) { if (!ConnectionHelper.CheckDBPermission(DatabasePermission.ModifyDatabase, AuthenticationType, ServerName, Username, Password)) { DisplaySeparationError(GetString("separationDB.permissionmodify")); return false; } if (!ConnectionHelper.CheckDBPermission(DatabasePermission.CreateDatabase, AuthenticationType, ServerName, Username, Password)) { DisplaySeparationError(GetString("separationDB.permissioncreate")); return false; } } } // Test if tasks are stopped if (EnabledTasks()) { DisplaySeparationError(GetString("separationDB.stoptaskserror")); return false; } imgHelp.Visible = btnStopTasks.Visible = true; // Test if separation process is not already started. if (SystemHelper.DBSeparationInProgress) { DisplaySeparationError(GetString("separationDB.processalreadystarted")); return false; } return true; } /// /// Checks if any tasks are running. /// private void DisplayTaskStatus() { if (EnabledTasks()) { if (!btnStopTasks.Visible && TasksManuallyStopped && (hdnTurnedOff.Value != bool.TrueString)) { DisplayStoppingTasks(); } else { lblStatusValue.Text = "" + GetString("general.enabled") + ""; plcRunningTasks.Visible = true; lblTaskStatus.Visible = true; lblStatusValue.Visible = true; ltlStatus.Visible = false; imgHelp.Visible = btnStopTasks.Visible = true; } } else { if (TasksManuallyStopped) { lblTaskStatus.Visible = true; lblStatusValue.Visible = true; plcRunningTasks.Visible = true; ltlStatus.Visible = false; ltlStatus.Text = null; lblStatusValue.Text = "" + GetString("general.disabled") + ""; imgHelp.Visible = btnStopTasks.Visible = false; } else { plcRunningTasks.Visible = true; lblTaskStatus.Visible = false; lblStatusValue.Visible = false; ltlStatus.Visible = false; imgHelp.Visible = btnStopTasks.Visible = false; } hdnTurnedOff.Value = bool.TrueString; } } /// /// Checks if any tasks are enabled. /// public bool EnabledTasks() { InfoDataSet tasks = TaskInfoProvider.GetTasks("(TaskNextRunTime IS NULL) AND (TaskInterval NOT LIKE '" + SchedulingHelper.PERIOD_ONCE + "%') AND (TaskEnabled = 1)", null, -1, "TaskID"); return ((tasks != null) && (tasks.Items.Count > 0)) || SchedulingHelper.EnableScheduler; } /// /// Stop tasks. /// void btnStopTasks_Click(object sender, EventArgs e) { // Stop tasks PersistentStorageHelper.SetValue("CMSSchedulerTasksEnabled", SettingsKeyProvider.GetBoolValue("CMSSchedulerTasksEnabled")); if (SchedulingHelper.EnableScheduler) { SettingsKeyProvider.SetValue("CMSSchedulerTasksEnabled", false); } // Restart win service WinServiceItem def = WinServiceHelper.GetServiceDefinition(WinServiceHelper.HM_SERVICE_BASENAME); if (def != null) { WinServiceHelper.RestartService(def.GetServiceName()); } // Display stopping progress imgHelp.Visible = btnStopTasks.Visible = false; DisplayStoppingTasks(); TasksManuallyStopped = true; } /// /// Displays separation error. /// private void DisplaySeparationError(string error) { plcSeparationError.Visible = true; lblError.Text = TextHelper.LimitLength(error, 180); lblError.ToolTip = error; } /// /// Displays that tasks are being stopped. /// private void DisplayStoppingTasks() { ltlStatus.Text = "\"""; lblStatusValue.Text = "" + GetString("general.disabling") + ""; plcRunningTasks.Visible = true; lblTaskStatus.Visible = true; lblStatusValue.Visible = true; ltlStatus.Visible = true; imgHelp.Visible = btnStopTasks.Visible = false; } #endregion }