modules/Azure/Discovery/Public/New-CIEMAzureDiscoveryRun.ps1

function New-CIEMAzureDiscoveryRun {
    [CmdletBinding(DefaultParameterSetName = 'ByProperties')]
    [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseShouldProcessForStateChangingFunctions', '', Justification = 'Creates a data record in database')]
    [OutputType('CIEMAzureDiscoveryRun')]
    param(
        [Parameter(Mandatory, ParameterSetName = 'ByProperties')]
        [string]$Scope,

        [Parameter(Mandatory, ParameterSetName = 'ByProperties')]
        [string]$Status,

        [Parameter(Mandatory, ParameterSetName = 'ByProperties')]
        [string]$StartedAt,

        [Parameter(ParameterSetName = 'ByProperties')]
        [int]$PsuJobId,

        [Parameter(ParameterSetName = 'ByProperties')]
        [string]$CompletedAt,

        [Parameter(ParameterSetName = 'ByProperties')]
        [int]$ArmTypeCount,

        [Parameter(ParameterSetName = 'ByProperties')]
        [int]$ArmRowCount,

        [Parameter(ParameterSetName = 'ByProperties')]
        [int]$EntraTypeCount,

        [Parameter(ParameterSetName = 'ByProperties')]
        [int]$EntraRowCount,

        [Parameter(ParameterSetName = 'ByProperties')]
        [int]$WarningCount,

        [Parameter(ParameterSetName = 'ByProperties')]
        [string]$ErrorMessage,

        [Parameter(Mandatory, ParameterSetName = 'InputObject', ValueFromPipeline)]
        [PSObject[]]$InputObject
    )

    process {
        $ErrorActionPreference = 'Stop'
        if ($PSCmdlet.ParameterSetName -eq 'InputObject') {
            foreach ($obj in $InputObject) {
                New-CIEMAzureDiscoveryRun `
                    -Scope $obj.Scope `
                    -Status $obj.Status `
                    -StartedAt $obj.StartedAt `
                    -PsuJobId $obj.PsuJobId `
                    -CompletedAt $obj.CompletedAt `
                    -ArmTypeCount $obj.ArmTypeCount `
                    -ArmRowCount $obj.ArmRowCount `
                    -EntraTypeCount $obj.EntraTypeCount `
                    -EntraRowCount $obj.EntraRowCount `
                    -WarningCount $obj.WarningCount `
                    -ErrorMessage $obj.ErrorMessage
            }
            return
        }

        $parameters = @{
            psu_job_id       = $PsuJobId
            scope            = $Scope
            status           = $Status
            started_at       = $StartedAt
            completed_at     = $CompletedAt
            arm_type_count   = $ArmTypeCount
            arm_row_count    = $ArmRowCount
            entra_type_count = $EntraTypeCount
            entra_row_count  = $EntraRowCount
            warning_count    = $WarningCount
            error_message    = $ErrorMessage
        }

        # INSERT and last_insert_rowid() MUST share the same connection —
        # last_insert_rowid() is per-connection in SQLite and returns 0 on a new connection.
        $conn = Open-PSUSQLiteConnection -Database $script:DatabasePath
        try {
            Invoke-CIEMQuery -Query @"
INSERT INTO azure_discovery_runs (psu_job_id, scope, status, started_at, completed_at, arm_type_count, arm_row_count, entra_type_count, entra_row_count, warning_count, error_message)
VALUES (@psu_job_id, @scope, @status, @started_at, @completed_at, @arm_type_count, @arm_row_count, @entra_type_count, @entra_row_count, @warning_count, @error_message)
"@
 -Parameters $parameters -AsNonQuery -Connection $conn | Out-Null

            $idRow = Invoke-CIEMQuery -Query "SELECT last_insert_rowid() as id" -Connection $conn
        }
        finally {
            $conn.Dispose()
        }
        $newId = $idRow.id

        Get-CIEMAzureDiscoveryRun -Id $newId
    }
}