Public/Read-FirebirdDatabase.ps1

<#
.SYNOPSIS
    Reads and returns detailed information about a Firebird database and its environment.
.DESCRIPTION
    Retrieves properties from MON$DATABASE and RDB$DATABASE for the specified database.
.PARAMETER Database
    Path to the Firebird database file to inspect.
.PARAMETER Environment
    Firebird environment to use. Uses the current environment if not specified.
.EXAMPLE
    Read-FirebirdDatabase -Database '/tmp/test.fdb' -Environment $fbEnv
    Returns details for the database at '/tmp/test.fdb' using the specified environment.
.EXAMPLE
    Read-FirebirdDatabase -Database '/tmp/test.fdb'
    Returns details for the database at '/tmp/test.fdb' using the current environment.
.OUTPUTS
    Hashtable with properties from MON$DATABASE and RDB$DATABASE system tables.
#>

function Read-FirebirdDatabase {
    [CmdletBinding()]
    param(
        [Parameter(Position = 0, Mandatory, ValueFromPipeline)]
        [FirebirdDatabase]$Database,

        [FirebirdEnvironment]$Environment = [FirebirdEnvironment]::default()
    )

    $query = 'SET LIST ON; SELECT * FROM mon$database CROSS JOIN rdb$database;'

    $isqlOutput = $query | Invoke-FirebirdIsql -Database $Database -Environment $Environment -bail -quiet 

    # Parse isql list output. Discard first 2 lines, stop at first blank line.
    $result = [ordered]@{
        Environment  = $Environment
        Database = $Database
    }

    $resultLines = $isqlOutput | Select-Object -Skip 2
    foreach ($line in $resultLines) {
        if ($line.Trim() -eq '') { break }
        if ($line -match '^(\S+)\s+(.*)$') {
            $key = $Matches[1]
            $value = $Matches[2].Trim()
            $result[$key] = $value
        }
    }

    return $result
}