functions/Export-MySQLiteDB.ps1



Function Export-MySQLiteDB {
    [cmdletbinding(SupportsShouldProcess)]
    Param(
        [Parameter(
            Mandatory,
            Position = 0,
            HelpMessage = "The path to the SQLite database file"
        )]
        [ValidatePattern("\.((sqlite(3)?)|(db(3)?)|(sl3)|(s3db))$")]
        [ValidateScript({ Test-Path $_ })]
        [string]$Path,

        [Parameter(
            Mandatory,
            Position = 1,
            HelpMessage = "The destination path for the exported JSON file"
        )]
        [ValidatePattern("\.json$")]
        [ValidateScript({ Split-Path $_ -Parent | Test-Path })]
        [string]$Destination,

        [switch]$PassThru
    )
    Begin {
        Write-Verbose "[$((Get-Date).TimeOfDay) BEGIN ] Starting $($MyInvocation.MyCommand)"
        Write-Verbose "[$((Get-Date).TimeOfDay) BEGIN ] Opening a connection to $Path"
        Try {
            #always open the database
            $conn = Open-MySQLiteDB -Path $path -ErrorAction Stop -WhatIf:$False
        }
        Catch {
            Throw $_
        }
    } #begin

    Process {
        if ($conn.state -eq 'open') {
            #initialize a hashtable
            $hash = @{}
            Write-Verbose "[$((Get-Date).TimeOfDay) PROCESS] Getting tables"
            $tables = (Get-MySQLiteTable -Connection $conn -KeepAlive -ErrorAction Stop).Name
            Write-Verbose "[$((Get-Date).TimeOfDay) PROCESS] Exporting $Path"
            foreach ($table in $tables) {
                $query = "Select * from $table"
                Write-Verbose "[$((Get-Date).TimeOfDay) PROCESS] $query"
                Try {
                    $data = Invoke-MySQLiteQuery -Query $query -Connection $conn -KeepAlive -ErrorAction Stop
                    $hash.add($table, $data)
                }
                Catch {
                    Write-Warning "There was an error invoking the last query."
                    Close-MySQLiteDB -Connection $conn
                    Throw $_
                }
            }
            Write-Verbose "[$((Get-Date).TimeOfDay) PROCESS] Saving to $Destination"
            if ($PSCmdlet.ShouldProcess($Destination, "Export database $path")) {
                $hash | ConvertTo-Json -Depth 100 | Set-Content -Path $destination -Encoding utf8
                if ($PassThru) {
                    Get-Item -Path $Destination
                }
            } #whatIf
        }
    } #process

    End {
        if ($conn.state -eq 'open') {
            Write-Verbose "[$((Get-Date).TimeOfDay) END ] Closing database connection."
        }
        Write-Verbose "[$((Get-Date).TimeOfDay) END ] Ending $($MyInvocation.MyCommand)"
    } #end

} #close Export-MySQLiteDB