Compress-SQLite.ps1

Function Compress-SQLite { 
<#
    .SYNOPSIS
        Compress a Sqlite database file

    .DESCRIPTION
        Calls VACUUM on a Sqlite database to remove empty spaces and shrink the file.

    .EXAMPLE
        PS C:\> Compress-SQLite -Connection <SQLiteConnection>
                
        Shrinked database with 36,65 MB

    .EXAMPLE
        PS C:\> <SQLiteConnection> | Compress-SQLite
            
    Shrinked database with 36,65 MB

    .EXAMPLE
        PS C:\> $conn = Connect-SQLite -path "$env:temp\database.db" | Compress-SQLite -PassThru
            
        this will open the database run the Vacuum method and return the object to the variable $conn

    .INPUTS
        SQLiteConnection

    .NOTES
        Author: Proxx
        Web: www.Proxx.nl
        Date: 10-06-2015


    .LINK
        http://www.proxx.nl/Wiki/Compress-SQLite
#>

    [cmdletbinding(SupportsShouldProcess=$true)]
    Param(
        [Parameter(
            Mandatory=$true,
            ValueFromPipeline=$true
        )]
        [ValidateScript({
            if ($_ -is [System.Data.SQLite.SQLiteConnection]) { 
                if ($_.State -eq "Open"){ $true } else { Throw "Connection has state $($_.State)! Open connection first." } 
            } else { Throw "The argument is null, empty, or an element of the argument collection contains a null value. Supply a collection that does not contain any null values and then try the command again." }    
        })]
        [System.Data.SQLite.SQLiteConnection] $Connection,
        [Switch] $PassThru
    )

    $Location = $Connection.ConnectionString.Replace("Data Source = ","")
    if ($Location -ne ":memory:") {
        $Pre = (Get-ChildItem -Path $Location).Length
        $command = $Connection.CreateCommand()
        $command.CommandText = "VACUUM;"
        if ($PSCmdlet.ShouldProcess($Location, "Compress")) { 
            try { [Void]$command.ExecuteNonQuery() }
            Catch {    Write-Error -Message $_.Exception.Message }
            Finally { $command.Dispose() }
            $Cur= (Get-ChildItem -Path $Location).Length
        }
    }
    else { Write-Warning -Message "cannot compress memory object" }
    if ($PassThru) { Return $Connection }
    Write-Output -InputObject ([PSCustomObject] @{
        Path = [String] $Location
        Shrinked = [int]($Pre - $Cur)
    })
}