MeasureTrace.Database.psm1

Set-StrictMode -Version Latest

function Add-MtDbTrace {
    param(
        [Parameter(Mandatory=$true)]
        [string] $ConnectionString
        ,
        [Parameter(Mandatory=$true, ValueFromPipeline=$true)]
        [MeasureTrace.TraceModel.Trace[]]$MeasuredTrace
    )
    begin{
        $repository = Connect-MtDbRepository -ConnectionString $ConnectionString
        $repository.Database.EnsureCreated()
    }
    process{
        foreach($trace in $MeasuredTrace){
            $repository.SaveTraceAndMeasurements($trace)
        }
    }
    end{
        $repository.Dispose()
    }
}

function Connect-MtDbRepository {
    param(
        [Parameter(Mandatory=$true)]
        [string]$ConnectionString
    )
    $r = New-Object MeasureTrace.Database.Repository -ArgumentList $ConnectionString
    try{
        $r.TryToProvisionDatabase()
    }
    catch{}
    $r

}

function Compare-MtDbTraceFileStatus {
    param(
        [Parameter(Mandatory=$true)]
        [string]$ConnectionString,
        [Parameter(Mandatory=$true,ValueFromPipelineByPropertyName=$true)]
        [Alias('Path')]
        [string[]]$FullName
    )
    begin{
        $repo = Connect-MtDbRepository -ConnectionString $ConnectionString
    }
    process{
        foreach($pathX in $FullName){
            $packageFileName = Split-Path -Path $pathX -Leaf
            [pscustomobject]@{
                PackageFileNameFull = $pathX
                PackageFIleName = $packageFileName
                IsInDatabase = $repo.IsTraceAlreadyInDb( $packageFileName )
            }
        }
    }
}

function Compare-MtDbFolderVsRepository{
    param(
        [string[]]$FolderPath,
        [Parameter(Mandatory=$true)]
        [string]$ConnectionString,
        [string[]]$Filter = @("*.etl","*.zip")
    )
    
    foreach($folder in $FolderPath){
        foreach($filterX in $Filter){
            Get-ChildItem -Path $folder -Filter $filterX | Compare-MtDbTraceFileStatus -ConnectionString $ConnectionString
        }
    }
}

function Measure-MtDbNewTracesFromFolder{
    param(
        [string[]]$FolderPath,
        [string]$ConnectionString,
        [int]$MaxCount = 100,
        [int]$ParallelThrottle = $([Environment]::ProcessorCount + 2)
    )
    begin{
        $batchLabel = [Guid]::NewGuid().ToString()
    }
    process{
        Compare-MtDbFolderVsRepository -FolderPath $FolderPath -ConnectionString $ConnectionString |
          Where-Object {-not $_.IsInDatabase} | Select-Object -First $MaxCount |
          #Foreach-Object{
          Start-RSJob -ModulesToImport $psscriptroot -Throttle ([Environment]::ProcessorCount + 2) -Batch $batchLabel -ScriptBlock {
            Measure-Trace -Path $_.PackageFileNameFull | Add-MtDbTrace -ConnectionString $Using:ConnectionString
          }
          }
        #Wait-RSJob -Batch $batchLabel
        #Receive-RSJob -Batch $batchLabel | Where-Object {$_ -is [MeasureTrace.TraceModel.Trace]} |
        # Add-MtDbTrace -ConnectionString $ConnectionString
    end{
        Get-RSJob -Batch $batchLabel | Wait-RSJob -ShowProgress
        Get-RSJob -Batch $batchLabel | Receive-RSJob
    }
}