DscResources/MSFT_xMySqlDatabase/MSFT_xMySqlDatabase.psm1

<#
   DSC resource designed to create a database in a MySQL instance, given the parameters supplied as per schema.
 
   Copyright (c) Microsoft Corporation, 2014
#>


# NOTE: LocalizedData isn't used in this resource as there are no interactive/user visible strings

#constants
$mySqlVersion = "5.6"
$Debug = $true
$MySQLExePath = "$env:ProgramFiles\mySql\Mysql Server 5.6\bin\mysql.exe"


#########################################################################################################################################
# Trace-Message ([string]$Message). If Debug flag is set to true, it writes a verbose message given the input parameter
#########################################################################################################################################

Function Trace-Message
{
    param([string] $Message)

    if($Debug)
    {
        Write-Verbose $Message
    }
}

#########################################################################################################################################
# Set-MySqlPwdEnvVar ([pscredential] $ConnectionCredential). Given the input user password, set the MySQL pwd environment variable
#########################################################################################################################################

function Set-MySqlPwdEnvVar
{
    param
    (
        [pscredential] $ConnectionCredential
    )
    Trace-Message "setting mysqlpassword to: $($ConnectionCredential.GetNetworkCredential().Password)"
    [System.Environment]::SetEnvironmentVariable("MySql_PWD","$($ConnectionCredential.GetNetworkCredential().Password)")
}

#########################################################################################################################################
# Get-TargetResource ([string]$Ensure, [string]Name, [pscredential]$ConnectionCredential): given the database string and the user password
# determine whether the MySQL database is installed and return the result
#########################################################################################################################################

function Get-TargetResource
{
    [OutputType([Hashtable])]
    param
    (
        [parameter(Mandatory = $true)]
        [ValidateSet("Present", "Absent")]
        [string] $Ensure = "Present",

        [parameter(Mandatory = $true)]
        [string] $Name,
        
        [parameter(Mandatory = $true)]
        [pscredential] $ConnectionCredential
    )
    
    $Ensure = "Absent"

    Set-MySqlPwdEnvVar -ConnectionCredential $ConnectionCredential

    #note: we don't want to check and throw an exception in the case where the current configuration is Absent, and the
    # user calls into Test-DscConfiguration or Get-DscConfiguration. In those cases, we just want to return false but not
    # throw an exception as that is the wrong user experience.
    if ((Test-Path -Path $MySQLExePath))
    {
        $result = `
            &$MySQLExePath `
            "--execute=SELECT IF(EXISTS (SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = '$Name'), 'Yes','No')" `
                --user=root --silent

        if($result -ieq  "Yes")
        {
            $Ensure = "Present"
        }
    }

    return @{
        Ensure = $Ensure
        Name = $Name
    }
}

#########################################################################################################################################
# Test-TargetResource ([string]$Ensure, [string]Name, [pscredential]$ConnectionCredential): given the database string and the user password
# determine whether the database is installed and return true or false based on the findings
#########################################################################################################################################

function Test-TargetResource 
{
    [OutputType([Boolean])]
    [CmdletBinding(SupportsShouldProcess=$true)]
    param
    (
        [parameter(Mandatory = $true)]
        [ValidateSet("Present", "Absent")]
        [string] $Ensure = "Present",

        [parameter(Mandatory = $true)]
        [string] $Name,
        
        [parameter(Mandatory = $true)]
        [pscredential] $ConnectionCredential
    )
    
    Trace-Message "Ensure is $Ensure"

    $status = Get-TargetResource @psboundparameters
    
    if($status.Ensure -eq $Ensure)
    {
        return $true
    }
    else
    {
        return $false
    }
}

#########################################################################################################################################
# Set-TargetResource ([string]$Ensure, [string]Name, [pscredential]$ConnectionCredential): given the database string and the user password
# either drop the database or create it, depending on Ensure value
#########################################################################################################################################

function Set-TargetResource 
{
    [CmdletBinding(SupportsShouldProcess=$true)]
    param
    (
        [parameter(Mandatory = $true)]
        [ValidateSet("Present", "Absent")]
        [string] $Ensure = "Present",

        [parameter(Mandatory = $true)]
        [string] $Name,
        
        [parameter(Mandatory = $true)]
        [pscredential] $ConnectionCredential
    )
    
    if((Test-TargetResource @psboundparameters))
    {
        return
    }
    
    if($Ensure -eq "Present")
    {
        Trace-Message "Creating Database $Name..."
        Set-MySqlPwdEnvVar -ConnectionCredential $ConnectionCredential

        Trace-Message "$MySQLExePath --execute=create database $Name; --user=root --silent"
        $result = &"$MySQLExePath" "--execute=create database $Name;"  --user=root --silent
    }
    else
    {
        Trace-Message "Dropping Database $Name..."
        Trace-Message "$env:ProgramFiles\mySql\Mysql Server 5.6\bin\mysqladmin.exe" -f drop $Name --user=root --silent
        $result = &"$env:ProgramFiles\mySql\Mysql Server 5.6\bin\mysqladmin.exe" -f drop $Name --user=root --silent
    }
}


Export-ModuleMember -function Get-TargetResource, Set-TargetResource, Test-TargetResource