functions/public/Initialize-PSWorkItemDatabase.ps1

Function Initialize-PSWorkItemDatabase {
    [cmdletbinding(SupportsShouldProcess)]
    [OutputType("None","PSWorkItemDatabase")]
    Param(
        [Parameter(
            Position = 0,
            HelpMessage = "The path to the PSWorkItem SQLite database file. It should end in .db")]
        [ValidatePattern("\.db$")]
        [ValidateScript(
            {
                $parent = Split-Path -Path $_ -Parent
                Test-Path $parent
            },
            ErrorMessage = "Failed to validate the parent path."
        )]
        [String]$Path = $PSWorkItemPath,
        [Switch]$PassThru,
        [Parameter(HelpMessage = "Force overwriting an existing file.")]
        [Switch]$Force
    )
    Begin {
        StartTimer
        $PSDefaultParameterValues["_verbose:block"] = "Begin"
        _verbose -message $strings.Starting
        _verbose -message ($strings.PSVersion -f $PSVersionTable.PSVersion)
        if ($MyInvocation.CommandOrigin -eq 'Runspace') {
            #Hide this metadata when the command is called from another command
            _verbose -message ($strings.PSVersion -f $PSVersionTable.PSVersion)
            _verbose -message ($strings.UsingHost -f $host.Name)
            _verbose -message ($strings.UsingOS -f $PSVersionTable.OS)
            _verbose -message ($strings.UsingModule -f $ModuleVersion)
            _verbose ($strings.DetectedCulture -f (Get-Culture))
        }
    } #begin

    Process {
        $PSDefaultParameterValues["_verbose:block"] = "Process"
        _verbose -message ($strings.InitializingDB -f $Path)
        Try {
            #using -f to accommodate culture with date times
            $comment = "PSWorkItem database created {0}." -f (Get-Date)
            $db = New-MySQLiteDB -Path $Path -PassThru -force:$Force -comment $comment -ErrorAction stop
        }
        Catch {
            Throw $_
        }
        if ($db) {
            _verbose -message $strings.AddTables
            $props = [ordered]@{
                taskid       = "text"
                taskcreated  = "text"
                taskmodified = "text"
                name         = "text"
                description  = "text"
                duedate      = "text"
                category     = "text"
                progress     = "integer"
                completed    = "integer"
                id           = "integer"
            }

            _verbose -message $strings.AddTasks
            New-MySQLiteDBTable -Path $Path -TableName tasks -ColumnProperties $props -Force:$Force

            _verbose -message $strings.AddArchive
            New-MySQLiteDBTable -Path $Path -TableName archive -ColumnProperties $props -force:$Force

            _verbose -message $strings.AddCategories
            $props = [ordered]@{
                category = "text"
                description = "text"
            }
            New-MySQLiteDBTable -Path $Path -TableName categories -ColumnProperties $props -force:$force
            _verbose -message ($strings.AddDefaultCategories -f $($script:PSWorkItemDefaultCategories -join ','))
            #give the database a chance to close
            Start-Sleep -milliseconds 500
            Add-PSWorkItemCategory -Path $Path -Category $script:PSWorkItemDefaultCategories -Force
            if ($PassThru) {
                Get-mySQLiteTable -Path $Path -Detail
            }
        }
    } #process

    End {
        $PSDefaultParameterValues["_verbose:block"] = "End"
        $PSDefaultParameterValues["_verbose:Command"] = $MyInvocation.MyCommand
        _verbose -message $strings.Ending
        _verbose -message ($strings.RunTime -f (StopTimer))
    } #end
}