function OpenSQLConnection([string]$cs)
{
	$cn2 = new-object system.data.SqlClient.SQLConnection($cs);
	$cn2.Open();
	return $cn2;
}
function CloseSQLConnection($cn)
{
	$cn.Close();
}
function ExecuteCommand([string]$conStr, [string]$SQLCommand)
{
	try{
	$cn = OpenSQLConnection -cs:$conStr;
	$cmd = new-object system.data.sqlclient.sqlcommand($SQLCommand, $cn);
	$cmd.ExecuteNonQuery()
	}
	catch{
		[System.Exception] 
        $connectionDetails = $error[0] 
		Write-Host "Ошибка при выполеннии SQL запроса. $connectionDetails"  -ForegroundColor Red;
        Write-Host "Exiting";
		throw "Ошибка при выполеннии SQL запроса.";
	}
	finally{
	CloseSQLConnection -cn:$cn;
	}
}
function ExecuteCommand_Query([string]$conStr, [string]$SQLCommand)
{
	try{
	$cn = OpenSQLConnection -cs:$conStr;
	$cmd = new-object system.data.sqlclient.sqlcommand($SQLCommand, $cn);
	$cmd.CommandTimeout = 120;
	
	$ds=New-Object system.Data.DataSet
	$da=New-Object system.Data.SqlClient.SqlDataAdapter($cmd)
	[void]$da.fill($ds)
	}
	catch{
	  [System.Exception] 
	 	$connectionDetails = $error[0] 
        Write-Host "Exception details: $connectionDetails" 
        Write-Host "Exiting" 
	}
	finally{
	CloseSQLConnection -cn:$cn;
	}
	return $ds;
}

#------------------------------------------

#------------------------------------------

function BackupDB ([string]$serverIp, [string]$database, [string]$path)
{
	<#
	.SYNOPSIS
		Создает бэкап базы данных

	.DESCRIPTION

	.PARAMETER serverIp 
		IP адресс SQL сервера
	.PARAMETER $dbUser
		Логин пользователя с правами администратора (sysadmin)
	.PARAMETER $dbPsw
		Пароль пользователя с правами администратора (sysadmin)
	.PARAMETER $database
		Имя базы данных
	.PARAMETER $path
		Путь к bak файлу (включая имя файла)который будет содержать бэкап

	.EXAMPLE 

	.NOTES
	#>
	Write-Host ($BACKUP_DB_START -f $database, $serverIp)
	$cs = $CONNECTION_STRING_IP -f $serverIp;
	$SQLCommand = $BACKUP_DB -f $database, $path;
	ExecuteCommand -conStr:$cs -SQLCommand:$SQLCommand;
	Write-Host ($BACKUP_DB_END -f $database, $serverIp, $path ) -ForegroundColor Yellow;
}

function RestoreDB ([string]$serverIp, [string]$database, [string]$path)
{
	<#
	.SYNOPSIS
		Создает бэкап базы данных

	.DESCRIPTION

	.PARAMETER serverIp 
		IP адресс SQL сервера
	.PARAMETER $dbUser
		Логин пользователя с правами администратора (sysadmin)
	.PARAMETER $dbPsw
		Пароль пользователя с правами администратора (sysadmin)
	.PARAMETER $database
		Имя базы данных
	.PARAMETER $path
		Путь к bak файлу (включая имя файла)который будет содержать бэкап

	.EXAMPLE 

	.NOTES
	#>
	Write-Host ($RESTORE_DB_START -f $database)
	$cs = $CONNECTION_STRING_IP -f $serverIp;
	$SQLCommand1 = $CLOSE_CONNECTIONS -f $database;
	$SQLCommand2 = $RESTORE_DB -f $database, $path;
	$SqlCmd = $SQLCommand1+$SQLCommand2;
	ExecuteCommand -conStr:$cs -SQLCommand:$SqlCmd;
	Write-Host ($RESTORE_DB_END -f $database) -ForegroundColor Yellow
}

function CreateUser([string]$serverIp, [string]$newdbUser)
{
	<#
	.SYNOPSIS
		Создает пользователя на сервере

	.DESCRIPTION

	.PARAMETER serverIp 
		IP адресс SQL сервера
	.PARAMETER $dbUser
		Логин пользователя с правами администратора (sysadmin)
	.PARAMETER $dbPsw
		Пароль пользователя с правами администратора (sysadmin)
	.PARAMETER $newdbUser
		Логин нового пользователя (будет создан) с правами db_owner для новой базы
	.PARAMETER $newdbUserPsw
		Пароль нового пользователя (будет создан) с правами db_owner для новой базы

	.EXAMPLE 

	.NOTES
	#>
	Write-Host ($CREATE_USER_START -f $newdbUser, $serverIp)
	$cs = $CONNECTION_STRING_IP -f $serverIp;
	$SQLCommand = $CREATE_SQL_USER_Windows -f $newdbUser;
	ExecuteCommand -conStr:$cs -SQLCommand:$SQLCommand;
	Write-Host ($CREATE_USER_END -f $newdbUser, $serverIp) -ForegroundColor Yellow;
}


function CreateDB([string]$serverIp, [string]$dbOwner, [string]$newDbName, [string]$collation )
{
	<#
	.SYNOPSIS
		Создает новую базу данных и нового пользовотеля с правами владельца для этой базы

	.DESCRIPTION

	.PARAMETER serverIp 
		IP адресс SQL сервера
	.PARAMETER $dbUser
		Логин пользователя с правами администратора (sysadmin)
	.PARAMETER $dbPsw
		Пароль пользователя с правами администратора (sysadmin)
	.PARAMETER $newdbUser
		Логин нового пользователя (будет создан) с правами db_owner для новой базы
	.PARAMETER $newdbUserPsw
		Пароль нового пользователя (будет создан) с правами db_owner для новой базы
	.PARAMETER $newDbName
		Имя новой базы данных
	.PARAMETER $collation
		collation

	.EXAMPLE 

	.NOTES
	#>
	try{
	Write-Host ($CREATE_DB_START -f $newDbName, $serverIp)
	$cs = $CONNECTION_STRING_IP -f $serverIp;
	$firstSQLCommand = $CREATE_DATABASE -f $newDbName;
	ExecuteCommand -conStr:$cs -SQLCommand:$firstSQLCommand;
	$cs1 = $CONNECTION_STRING_IP_db -f $serverIp, $newDbName;
	$secondSQLCommand1 = $ADD_SQLUSER -f $dbOwner;
	$secondSQLCommand2 = $CHANGE_DBOWNER -f $dbOwner;
	$secondSQLCommand = $secondSQLCommand1 + $secondSQLCommand2;
	if([string]::IsNullOrEmpty($collation)) {$collation = "DATABASE_DEFAULT"}
	$result = ExecuteCommand -conStr:$cs1 -SQLCommand:$secondSQLCommand;}
	catch
	{
		RemoveDB -serverIp:$serverIp -dbName:$newDbName;	
	
	}
	Write-Host ($CREATE_DB_END -f $newDbName, $serverIp) -ForegroundColor Yellow
}

function RemoveDB([string]$serverIp, [string]$dbName)
{
	<#
	.SYNOPSIS
		Удаляет базу данных с сервера

	.DESCRIPTION

	.PARAMETER serverIp 
		IP адресс SQL сервера
	.PARAMETER $dbUser
		Логин пользователя с правами администратора (sysadmin)
	.PARAMETER $dbPsw
		Пароль пользователя с правами администратора (sysadmin)
	.PARAMETER $dbName
		Имя базы данных

	.EXAMPLE 

	.NOTES
	#>
	Write-Host ($REMOVE_DB_START -f $dbName, $serverIp)
	$cs = $CONNECTION_STRING_IP -f $serverIp;
	$SQLCommand1 = $CLOSE_CONNECTIONS -f $dbName;
	$SQLCommand2 = $REMOVE_DATABASE -f $dbName;
	$SqlCmd = $SQLCommand1+$SQLCommand2;
	ExecuteCommand -conStr:$cs -SQLCommand:$SqlCmd;
	Write-Host ($REMOVE_DB_END -f $dbName) -ForegroundColor Yellow
}

function ShrinkDB([string]$serverIp, [string]$dbName)
{
	<#
	.SYNOPSIS
		Сжимает базу данных на сервере

	.DESCRIPTION

	.PARAMETER serverIp 
		IP адресс SQL сервера
	.PARAMETER $dbName
		Имя базы данных

	.EXAMPLE 

	.NOTES
	#>
	Write-Host ($SHRINK_DB_START -f $dbName, $serverIp)
	$cs = $CONNECTION_STRING_IP -f $serverIp;
	$SQLCommand1 = $CLOSE_CONNECTIONS -f $dbName;
	$SQLCommand2 = $SHRINK_DATABASE -f $dbName;
	$SQLCommand3 = $SET_MULTIUSER_MODE -f $dbName;
	$SqlCmd = $SQLCommand1+$SQLCommand2+$SQLCommand3;
	ExecuteCommand -conStr:$cs -SQLCommand:$SqlCmd;
	Write-Host ($SHRINK_DB_END -f $dbName,$serverIp) -ForegroundColor Yellow;
}

function AlterLogin([string]$serverIp, [string]$login, [string]$newPsw)
{
	<#
	.SYNOPSIS
		Меняет пароль у пользователя

	.DESCRIPTION

	.PARAMETER serverIp 
		IP адресс SQL сервера
	.PARAMETER $dbUser
		Логин пользователя с правами администратора (sysadmin)
	.PARAMETER $dbPsw
		Пароль пользователя с правами администратора (sysadmin)
	.PARAMETER $login
		Логин пользователя
	.PARAMETER $newPsw
		Новый пароль
	
	.EXAMPLE 

	.NOTES
	#>
	Write-Host ($CHANGE_PASSWORD_START -f $login)
	$cs = $CONNECTION_STRING_IP -f $serverIp;
	$SqlCmd = $ALTER_LOGIN -f $login, $newPsw;
	ExecuteCommand -conStr:$cs -SQLCommand:$SqlCmd;
	Write-Host ($CHANGE_PASSWORD_END -f $login) -ForegroundColor Yellow
}

function DeletePermissions([string]$serverIp, [string]$login, [string]$dbName)
{
	<#
	.SYNOPSIS
		Меняет пароль у пользователя

	.DESCRIPTION

	.PARAMETER serverIp 
		IP адресс SQL сервера
	.PARAMETER $dbUser
		Логин пользователя с правами администратора (sysadmin)
	.PARAMETER $dbPsw
		Пароль пользователя с правами администратора (sysadmin)
	.PARAMETER $login
		Логин пользователя
	.PARAMETER $dbName
		Имя базы данных

	
	
	.EXAMPLE 

	.NOTES
	#>
	Write-Host ($REVOKE_PERMISSION_START -f $login, $dbName)
	$cs = $CONNECTION_STRING_IP_db -f $serverIp, $dbName;
	$SqlCmd = $REMOVE_USER_FROM_DB -f $login;
	ExecuteCommand -conStr:$cs -SQLCommand:$SqlCmd;
	Write-Host ($REVOKE_PERMISSION_FINISH -f $login, $dbName) -ForegroundColor Yellow
}

function ChangeDBOwner([string]$serverIp,  [string]$dbName, [string]$newOwner)
{
	$cs1 = $CONNECTION_STRING_IP_db -f $serverIp, $dbName;
	$SQLCommand1 = $ADD_SQLUSER -f $newOwner;
	$SQLCommand2 = $CHANGE_DBOWNER -f $newOwner;
	$SQLCommand = $SQLCommand1 + $SQLCommand2;
	ExecuteCommand -conStr:$cs1 -SQLCommand:$SQLCommand;
}


function ChangeDBSize([string]$serverIp, [string]$dbName, [int]$size)
{
	<#
	.SYNOPSIS
		Устанавливает максимальный размер на файл базы данных

	.DESCRIPTION

	.PARAMETER serverIp 
		IP адресс SQL сервера
	.PARAMETER $dbUser
		Логин пользователя с правами администратора (sysadmin)
	.PARAMETER $dbPsw
		Пароль пользователя с правами администратора (sysadmin)
	.PARAMETER $dbName
		Имя базы данных
	.PARAMETER $size
		Размер
	
	.EXAMPLE 

	.NOTES
	#>
	Write-Host ($CHANGE_DB_SIZE_START -f $newDbName)
	$cs = $CONNECTION_STRING_IP_db -f $serverIp, $dbName;
	$SqlCmd = $GET_SQL_Files;
	$ds = ExecuteCommand_Query -conStr:$cs -SQLCommand:$SqlCmd;
	$SqlCmd1 = "";
	foreach ($file in $ds.Tables[0] ) 
	{
	 	$usage = $file | % {$_.usage};
	 	$name = $file | % {$_.name};
	 	if ($usage -eq 'data only'){
			$SqlCmd1 = $SqlCmd1 + $SET_MAXSIZE -f $dbName,$name,$size;
	 	}
	}
	ExecuteCommand -conStr:$cs -SQLCommand:$SqlCmd1;
	Write-Host ($CHANGE_DB_SIZE_END -f $newDbName, $size) -ForegroundColor Yellow
}

function AddPermission([string]$serverIp, [string]$login, [string]$dbName)
{
	<#
	.SYNOPSIS
		Меняет пароль у пользователя

	.DESCRIPTION

	.PARAMETER serverIp 
		IP адресс SQL сервера
	.PARAMETER $dbUser
		Логин пользователя с правами администратора (sysadmin)
	.PARAMETER $dbPsw
		Пароль пользователя с правами администратора (sysadmin)
	.PARAMETER $login
		Логин пользователя
	.PARAMETER $dbName
		Имя базы данных

	
	
	.EXAMPLE 

	.NOTES
	#>
	Write-Host ($ADD_USE_DB_STAR -f $login, $dbName)
	$cs = $CONNECTION_STRING_IP_db -f $serverIp, $dbName;
	$secondSQLCommand1 = $ADD_SQLUSER -f $login;
	$secondSQLCommand2 = $CHANGE_DBOWNER -f $login;
	$secondSQLCommand = $secondSQLCommand1 + $secondSQLCommand2;
	ExecuteCommand -conStr:$cs -SQLCommand:$secondSQLCommand;
	Write-Host ($ADD_USE_DB_END -f $login, $dbName) -ForegroundColor Yellow
}

function ReadBackupPath($server, $backupCatalog)
{
<#
.SYNOPSIS
Считывает и файла с расположением $PATH_TO_BACKUP путь к каталогу бэкапов на указанном IIS-сервере

.DESCRIPTION

.PARAMETER iisserver 
IP-адрес или DNS-имя IIS-сервера

.EXAMPLE 
ReadBackupPath -server 172.21.41.134

.NOTES
#>
	$Root = Invoke-Command -ComputerName $server -ScriptBlock ${function:ReadBackupPathInternal} -ArgumentList $PATH_TO_BACKUP_CONFIG,$backupCatalog;
	return $Root;
}

function ReadBackupPathInternal($ConfigPath, $backupCatalog)
{
	$FileExists = Test-Path -Path $ConfigPath;
	$Root = "";
	if($FileExists)
	{
		$Root = Get-Content -Path $ConfigPath -TotalCount 1;
	}
	if([string]::IsNullOrEmpty($Root))
	{
		$Root = "C:\Backup";
	}
	
	$ResultPath = "$Root\$backupCatalog";
	
	if(!(Test-Path $ResultPath))
	{
		$Folder = New-Item -Path $ResultPath -ItemType "directory";
	}
	return $ResultPath;
}

function GetSpaceUsage([string]$serverIp, [string]$dbName)
{
	<#
	.SYNOPSIS
		Меняет пароль у пользователя

	.DESCRIPTION

	.PARAMETER serverIp 
		IP адресс SQL сервера
	.PARAMETER $dbUser
		Логин пользователя с правами администратора (sysadmin)
	.PARAMETER $dbPsw
		Пароль пользователя с правами администратора (sysadmin)
	.PARAMETER $login
		Логин пользователя
	.PARAMETER $dbName
		Имя базы данных

	
	
	.EXAMPLE 

	.NOTES
	#>
	Write-Host ($SPACE_USAGE_START -f $dbName)
	$cs = $CONNECTION_STRING_IP -f $serverIp, $dbName;
	$SQLCommand = $SPACE_USAGE -f $dbName;
	$resultSet = ExecuteCommand_Query -conStr:$cs -SQLCommand:$SQLCommand;
	Write-Host ($SPACE_USAGE_END -f $dbName) -ForegroundColor Yellow
	$data = $resultSet.Tables[0]
	foreach ($dataitem in $data.Rows)
	{	
		$result = $dataitem[1]
	}
	$result = $result.Trim(" MB");
	return [math]::Round([double]$result);
}