ssasTools.psm1

# SSAS Tools and Library
# (v) Deepak, Prodata Feb 2020
# History
# 12/02/2020 First Version
#
#Install-Module -Name SqlServer
      

function Invoke-ssasProcess
{
    param(
        [Parameter(Mandatory=$True)]  [object]$Server ,                       #Analysis Services Server
        [Parameter(Mandatory=$True)]  [String]$DatabaseName,                  #Database name in Analysis Server
        [Parameter(Mandatory=$True)]  [String]$RefreshType,                   #Refresh type for cube processing
        [Parameter(Mandatory=$True)]  [String]$Workspace,                     #Workspace name requied for Process log
        [parameter(Mandatory=$false)] [switch]$MailOnFailure=$False,          #Email on Failure
        [parameter(Mandatory=$false)] [String]$SqlServer ="localhost" ,       #Sql Server to Log Results. Will Log if this is present
        [parameter(Mandatory=$false)] [String]$SqlDatabaseName  ,             #Sql Server to Log Results to. Will Log if this is present
        [parameter(Mandatory=$false)] [String]$SqlSchemaName ="dbo" ,         #Sql Server to Log Schema to. Will Log if this is present
        [parameter(Mandatory=$false)] [String]$SqlTableName ="ProcessView",   #Sql Table to Log Results to
        [parameter(Mandatory=$false)] [switch]$IgnoreProcessError,            #Raise Error if any Process Errors. Default is to Fail on any Error
        [parameter(Mandatory=$false)] [switch]$NoOutput                       #Output Status When Finished
    )
    $ErrorActionPreference = "Stop"
    $Error = ""
    Check-ssasModules
    try {
        [DateTime]$StartTime=(Get-Date -Format "yyyy-M-d HH:mm:ss") 
        Write-Host ("Process started at", $StartTime)      
        $xmla = Invoke-ProcessASDatabase -Server $Server -DatabaseName $DatabaseName -RefreshType $RefreshType           
    }    
    catch 
    {
        $Error =  $_.Exception.Message
        $RefreshStatus = "Failed"
        Write-Host $Error    
    }
    if($Error -eq "")
    {
        $RefreshStatus= "Completed"
    }
    
    [DateTime]$EndTime=(Get-Date -Format "yyyy-M-d HH:mm:ss")
    $DataSetList=@()
    $obj=$null
    $obj = New-Object System.Object  
    $obj | Add-Member -type NoteProperty -Name WorkSpace -Value $Workspace 
    $obj | Add-Member -type NoteProperty -Name DataSetId -Value $null
    $obj | Add-Member -type NoteProperty -Name DataSet -Value $DatabaseName
    $obj | Add-Member -type NoteProperty -Name ConfiguredBy $null
    $obj | Add-Member -type NoteProperty -Name IsOnPremGatewayRequired  1 
    $obj | Add-Member -type NoteProperty -Name refreshStatus $RefreshStatus
    $obj | Add-Member -type NoteProperty -Name refreshType "ViaApi"
    $obj | Add-Member -type NoteProperty -Name startTime $StartTime
    $obj | Add-Member -type NoteProperty -Name EndTime $EndTime
    $obj | Add-Member -type NoteProperty -Name Error $Error
    $obj | Add-Member -type NoteProperty -Name CreatedBy $(whoami)
    $obj | Add-Member -type NoteProperty -Name ProcessKey ""
    $obj | Add-Member -type NoteProperty -Name DatasetType "SSAS"
    $DataSetList+=$obj


    Write-Host "Process ended at "  $EndTime "with status:" $RefreshStatus
     
    if (($SqlServer) -and ($SqlDatabaseName)) {
    Write-Verbose -Message "Logging to $SqlServer.$SqlDatabaseName.$SqlSchemaName.$SqlTableName"
    $DataSetList | Select-Object -Property * | Write-SqlTableData -ServerInstance $SqlServer -DatabaseName $SqlDatabaseName -TableName $SqlTableName -SchemaName $SqlSchemaName
    
    }  
}


function Load-Module ($m) {

    # If module is imported say that and do nothing
    if (Get-Module | Where-Object {$_.Name -eq $m}) {
        return
    }
    else {

        # If module is not imported, but available on disk then import
        if (Get-Module -ListAvailable | Where-Object {$_.Name -eq $m}) {
            Import-Module $m 
        }
        else {

            # If module is not imported, not available on disk, but is in online gallery then install and import
            if (Find-Module -Name $m | Where-Object {$_.Name -eq $m}) {
                Install-Module -Name $m -Force -Verbose -Scope CurrentUser
                Import-Module $m 
            }
            else {

                # If module is not imported, not available and not in online gallery then abort
                write-host "Module $m not imported, not available and not in online gallery, exiting."
                Exit 1
            }
        }
    }
}


function Check-ssasModules {
    Load-Module("SqlServer")
}


function Get-LastProcessedDate
{
  param(
      [Parameter(Mandatory=$True)]  [object]$Server ,                       #Analysis Services Server
      [Parameter(Mandatory=$True)]  [String]$DatabaseName,                  #Database name in Analysis Server
  )
  Begin {
    $serverObj = New-Object Microsoft.AnalysisServices.Server
    $serverObj.Connect("Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=$DatabaseName;Data Source=$Server")
  }
  Process {
    Try {
    $DatabaseName = $serverObj.Databases.GetByName($DatabaseName)  
    
    return $DatabaseName.LastProcessed
    }
    Catch [System.Exception] {
      Write-Host $Error[0].Exception
    }
    Finally {
      if ($DatabaseName -ne $null) {
          $DatabaseName.Dispose()
      }    
    }
  }
  End {
    $serverObj.Dispose()
  }
}

export-modulemember -function Invoke-ssasProcess
export-modulemember -function Get-LastProcessedDate