powerWamp.psm1

#=======================================================================================
# ____ __ __
# | _ \ _____ _____ _ _\ \ / /_ _ _ __ ___ _ __
# | |_) / _ \ \ /\ / / _ \ '__\ \ /\ / / _` | '_ ` _ \| '_ \
# | __/ (_) \ V V / __/ | \ V V / (_| | | | | | | |_) |
# |_| \___/ \_/\_/ \___|_| \_/\_/ \__,_|_| |_| |_| .__/
# |_|
#=======================================================================================
Function Connect-MySQL() {
    <#
        .SYNOPSIS
            A powershell function to connect to a MySQL Database.
        .DESCRIPTION
            Executes the Query.
        .PARAMETER ConnectionString
            A valid MySQL string is required.
        .EXAMPLE
            $MySQLconn = (Connect-MySQL $ConnectionString)
        .NOTES
            No additional notes.
    #>

    param(
        [Parameter(Mandatory=$true)]
            [string]$ConnectionString            
    )
    try {
        # Load MySQL .NET Connector Objects
        [void][System.Reflection.Assembly]::LoadWithPartialName("MySql.Data")
        $Connection = New-Object MySql.Data.MySqlClient.MySqlConnection
        $Connection.ConnectionString = $ConnectionString
        # Open Connection
        $Connection.Open()
        return $Connection
    }
    Catch {
        $ErrorMessage = $_.Exception.Message
        $FailedItem = $_.Exception.ItemName        
        write-host "Connection Error:" $ErrorMessage $FailedItem
        BREAK
    }
}
                                                    
#=======================================================================================
Function Invoke-MySQLQuery() {
    <#
        .SYNOPSIS
            A powershell function to run MySQL Queries.
        .DESCRIPTION
            Executes the Query.
        .PARAMETER query
            A valid SQL query is required.
        .PARAMETER ConnectionString
            A valid MySQL connection String is required.
        .PARAMETER MySQLUsername
            A valid MySQL username is required.
        .PARAMETER MySQLPassword
            A valid MySQL password is required.
        .PARAMETER MySQLDatabase
            A valid MySQL Database is required.
        .PARAMETER MySQLServer
            A valid MySQL Server is required.
        .EXAMPLE
            Query the DB for rows of information and setting that as an Object.
            $query = "select Testcase_name,Testcase_Status from test_cases"
            $MyConnectionString = "server=localhost;port=3306;uid=root;pwd=;database=summitrts"
            $Data = @(Invoke-MySQLQuery -Query $query -ConnectionString $MyConnectionString)
        .EXAMPLE
            Updating database row(s)
            $query = "update test_cases set Testcase_name = '$somevalue' where testcase_id = 1"
            $MyConnectionString = "server=localhost;port=3306;uid=root;pwd=;database=summitrts"
            Invoke-MySQLQuery -Query $query -ConnectionString $MyConnectionString
        .EXAMPLE
            Query the DB for rows of information and setting that as an Object.
            $query = "select Testcase_name,Testcase_Status from test_cases"
            $Data = @(Invoke-MySQLQuery -Query $query -MySQLUsername root -MySQLPassword "" -MySQLDatabase summitrts -MySQLServer localhost)
        .EXAMPLE
            Updating database row(s)
            $query = "update test_cases set Testcase_name = '$somevalue' where testcase_id = 1"
            Invoke-MySQLQuery -Query $query -MySQLUsername root -MySQLPassword "" -MySQLDatabase summitrts -MySQLServer localhost
        .NOTES
            No additional notes.
    #>

    [CmdletBinding(DefaultParameterSetName='ByConnectionString')]
    param(
        [Parameter(Mandatory=$true,ParameterSetName='ByConnectionString')]
        [Parameter(Mandatory=$true,ParameterSetName='ByItems')]
            [string]$Query,
        [Parameter(Mandatory=$true,ParameterSetName='ByConnectionString')]
            [string]$ConnectionString,
        [Parameter(Mandatory=$true,ParameterSetName='ByItems')]
            [string]$MySQLUsername,
        [Parameter(Mandatory=$true,ParameterSetName='ByItems')]
            [System.Security.SecureString]$MySQLPassword,
        [Parameter(Mandatory=$true,ParameterSetName='ByItems')]
            [string]$MySQLDatabase,
        [Parameter(Mandatory=$true,ParameterSetName='ByItems')]            
            [string]$MySQLServer            
    )
    try {
        if ($ConnectionString -eq "") {
            $BSTR = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($MySQLPassword)
            $UnsecurePassword = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR)
            $ConnectionString = "server=" + $MySQLServer + ";port=3306;uid=" + $MySQLUserName + ";pwd=" + $UnsecurePassword + ";database="+$MySQLDatabase
        }
        $Connection = (Connect-MySQL $ConnectionString)

        # Create command object
        $Command = New-Object MySql.Data.MySqlClient.MySqlCommand($Query, $Connection)
        $DataAdapter = New-Object MySql.Data.MySqlClient.MySqlDataAdapter($Command)
        $DataSet = New-Object System.Data.DataSet
        $RecordCount = $dataAdapter.Fill($dataSet, "data")
        #return the data
        return $DataSet.Tables[0]
    }
    Catch {
        $ErrorMessage = $_.Exception.Message
        $FailedItem = $_.Exception.ItemName        
        write-host "Query Error:" $ErrorMessage $FailedItem
        BREAK        
    }
    Finally{
        #Disconnect from MySQL
        Disconnect-MySQL $Connection
    }
}

#=======================================================================================
Function Invoke-MySQLInsert() {
    <#
        .SYNOPSIS
            A powershell function to insert data into MySQL and return the ID of the last inserted item.
        .DESCRIPTION
            Executes the MySQL insert.
        .PARAMETER query
            A valid SQL query is required.
        .PARAMETER ConnectionString
            A valid connection string is required.
        .PARAMETER MySQLUsername
            A valid MySQL username is required.
        .PARAMETER MySQLPassword
            A valid MySQL password is required.
        .PARAMETER MySQLDatabase
            A valid MySQL Database is required.
        .PARAMETER MySQLServer
            A valid MySQL Server is required.
        .EXAMPLE
            Inserting row(s)
            $query = "insert into rts_properties (name,val) VALUES ('SAMPLE_DATA_NAME','SAMPLE_VALUE')"
            $MyConnectionString = "server=localhost;port=3306;uid=root;pwd=;database=summitrts"
            $LastItemID = @(Invoke-MySQLInsert -Query $query -ConnectionString $MyConnectionString)[1]
        .EXAMPLE
            Inserting row(s)
            $query = "insert into rts_properties (name,val) VALUES ('SAMPLE_DATA_NAME','SAMPLE_VALUE')"
            $LastItemID = @(Invoke-MySQLInsert -Query $query -MySQLUsername root -MySQLPassword " " -MySQLDatabase summitrts -MySQLServer localhost)[1]
        .NOTES
            no additional notes.
    #>

    [CmdletBinding(DefaultParameterSetName='ByConnectionString')]
    param(
        [Parameter(Mandatory=$true,ParameterSetName='ByConnectionString')]
        [Parameter(Mandatory=$true,ParameterSetName='ByItems')]
            [string]$Query,
        [Parameter(Mandatory=$true,ParameterSetName='ByConnectionString')]
            [string]$ConnectionString,
        [Parameter(Mandatory=$true,ParameterSetName='ByItems')]
            [string]$MySQLUsername,
        [Parameter(Mandatory=$true,ParameterSetName='ByItems')]
            [System.Security.SecureString]$MySQLPassword,
        [Parameter(Mandatory=$true,ParameterSetName='ByItems')]
            [string]$MySQLDatabase,
        [Parameter(Mandatory=$true,ParameterSetName='ByItems')]            
            [string]$MySQLServer            
    )
    try {
        if ($ConnectionString -eq "") {
            $BSTR = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($MySQLPassword)
            $UnsecurePassword = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR)            
            $ConnectionString = "server=" + $MySQLServer + ";port=3306;uid=" + $MySQLUserName + ";pwd=" + $UnsecurePassword + ";database="+$MySQLDatabase
        }
        $Connection = (Connect-MySQL $ConnectionString)
    
        # Create command object
        $Command = New-Object MySql.Data.MySqlClient.MySqlCommand($Query, $Connection)
        $Command.ExecuteNonQuery()
        #return the LastInsertedId
        return $Command.LastInsertedId
    }
    Catch {
        $ErrorMessage = $_.Exception.Message
        $FailedItem = $_.Exception.ItemName        
        write-host "Query Error:" $ErrorMessage $FailedItem
        BREAK        
    }
    Finally {
        #Disconnect from MySQL
        Disconnect-MySQL $Connection
    }
}

#=======================================================================================
Function Disconnect-MySQL(){
    <#
    .SYNOPSIS
        A quick function to drop a MySQL connection.
    .DESCRIPTION
        disconnects a specified MySQL connection.
    .PARAMETER connection
        Please Specify a valid connection.
    .EXAMPLE
        Disconnect-MySQL $MySQLconn
    .NOTES
        No additional notes.
    #>

    param(
        [Parameter(Mandatory=$true)]
            $Connection
    )
    try {
        # Disconnect from MySQL Database
        $Connection.Close()
    }
    Catch {
        $ErrorMessage = $_.Exception.Message
        $FailedItem = $_.Exception.ItemName        
        write-host "Query Error:" $ErrorMessage $FailedItem
        BREAK            
    }
}

#=======================================================================================
Function Invoke-Wamp() {
    <#
    .SYNOPSIS
        A quick function to to Start/Stop/Restart Wamp Components.
    .DESCRIPTION
        Start/Stop/Restart Wamp Components
    .PARAMETER action
        Please Specify a valid connection.
    .PARAMETER Service
        Please specify a valid Service
    .EXAMPLE
        Invoke-Wamp -action Stop -Service apache
    .NOTES
        Additional information about the function or script.
    #>

    param(
        [cmdletbinding()]
        [Parameter(Mandatory=$true)]
            [validateset('stop','start','restart',IgnoreCase=$true)]
            [string]$action,
            [validateset('apache','mysql',IgnoreCase=$true)]
            [string]$Service
    )
    #Determine Service
    if ($service -eq 'apache') {
        $wampService = 'wampapache*'
    } elseif ($service -eq 'mysql') {
        $wampService = 'wampmysql*'
    } 

    try {
        #Determine Service Status
        $Status = (Get-Service $wampService).status
        #perform Action
        if($action -eq 'start'){
            if ($Status -eq 'Running') {
                write-host "The Service: '$wampService' is running, taking no action."
                BREAK
            } elseif ($Status -eq 'Stopped') {
                write-host "Starting Service: '$wampService'."
                Start-Service $wampService -confirm:$false
                BREAK
            } else {
                write-host "Unable to determine Service Status:'$status'"
                BREAK
            }
        } elseif ($action -eq 'stop') {
            if ($Status -eq 'Running') {
                write-host "Stopping Service: '$wampService'."
                Stop-Service $wampService -confirm:$false
                BREAK
            } elseif ($Status -eq 'Stopped') {
                write-host "The Service: '$wampService' is Stopped, taking no action."
                BREAK
            } else {
                write-host "Unable to determine Service Status:'$status'"
                BREAK
            }
        } elseif ($action -eq 'restart') {
            if ($Status -eq 'Running') {
                write-host "Restarting Service: '$wampService'."
                Restart-Service $wampService -confirm:$false
                BREAK
            } elseif ($Status -eq 'Stopped') {
                write-host "The Service: '$wampService' is Stopped, taking no action."
                BREAK
            } else {
                write-host "Unable to determine Service Status:'$status'"
                BREAK
            }
        } 
    }
    Catch {
        $ErrorMessage = $_.Exception.Message
        $FailedItem = $_.Exception.ItemName        
        write-host "Error:" $ErrorMessage $FailedItem
        BREAK        
    }
}
#=============================================================================================
# ___ _ _ _ _ _
# |_ _|_ ____ _____ | | _____ / \ _ _| |_ ___ _ __ ___ __ _| |_(_) ___ _ __
# | || '_ \ \ / / _ \| |/ / _ \_____ / _ \| | | | __/ _ \| '_ ` _ \ / _` | __| |/ _ \| '_ \
# | || | | \ V / (_) | < __/_____/ ___ \ |_| | || (_) | | | | | | (_| | |_| | (_) | | | |
# |___|_| |_|\_/ \___/|_|\_\___| /_/ \_\__,_|\__\___/|_| |_| |_|\__,_|\__|_|\___/|_| |_|
#=============================================================================================