Public/Compare-SqliteDBVersion.ps1

function Compare-SqliteDBVersion {
  [CmdletBinding()]
  [OutputType([object])]
  param(
    [Parameter(Mandatory = $true, Position = 0)]
    [SqliteDBConfig]
    $DatabaseConfig,

    [Parameter()]
    [string]
    $ExpectedVersion = $DatabaseConfig.version
  )

  $result = [ordered]@{
    CurrentVersion  = $null
    ExpectedVersion = $ExpectedVersion
    IsDeployed      = $false
    direction       = '!='
    Reasons         = @()
    PSTypeName      = 'Clihelper.Sqlite.DBVersionComparisonResult'
  }

  if (!$DatabaseConfig.databaseExists()) {
    $result.Reasons += 'Database does not exist.'
    return [PSCustomObject]$result
  }

  $connection = [SqliteHelper]::NewConnection($DatabaseConfig.ConnectionString)
  try {
    $metadata = Get-SqliteDBMetadata -SqliteConnection $connection -MetadataKey 'version'
  } finally {
    [SqliteHelper]::CloseConnection($connection)
  }

  if ($null -eq $metadata -or [string]::IsNullOrWhiteSpace($metadata['version'])) {
    $result.Reasons += 'Database version is not set in metadata.'
    return [PSCustomObject]$result
  }

  $current = [string]$metadata['version']
  $result.CurrentVersion = $current
  $result.IsDeployed = $true

  if ([string]::IsNullOrWhiteSpace($ExpectedVersion)) {
    $result.ExpectedVersion = $null
    $result.direction = '>'
    $result.Reasons += 'Expected version is not set.'
    return [PSCustomObject]$result
  }

  if ($current -eq $ExpectedVersion) {
    $result.direction = '=='
    $result.Reasons += ('Database version matches expected version: {0}' -f $ExpectedVersion)
    return [PSCustomObject]$result
  }

  try {
    $currentVersion = [version]($current -replace '-.*', '')
    $expected = [version]($ExpectedVersion -replace '-.*', '')

    if ($currentVersion -lt $expected) {
      $result.direction = '<'
    } elseif ($currentVersion -gt $expected) {
      $result.direction = '>'
    }
  } catch {
    $result.direction = '!='
    $result.Reasons += 'Non-standard version format detected; using string inequality.'
  }

  $result.Reasons += ('Database version comparison: {0} {1} {2}' -f $current, $result.direction, $ExpectedVersion)
  return [PSCustomObject]$result
}