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
}