New-SQLiteTable.ps1

Function New-SQLiteTable {
 <#
            .SYNOPSIS
            Create new SQLite table based on InputObject.
 
            .DESCRIPTION
            Create new SQLite table based on InputObject: <Object> or <DataTable>
 
            .INPUTS
            <Objects> or <DataTable>
 
            .OUTPUTS
            <none>
  
            .PARAMETER AllText
                Sets Column types to TEXT instead of original type (ADO.net truncates decimals this is a way to prevent this)
 
            .PARAMETER Unique
                Sets Column as Unique in database.
                 
            .EXAMPLE
            PS C:\> New-SQLiteTable -conn <SQLiteConnection> -InputObject <Object> -Name <TableName>
            Create Sqlite Table from InputObject with Name: <TableName>
             
            .EXAMPLE
            PS C:\> New-SQLiteTable -conn <SQLiteConnection> -InputObject <Object> -Name <TableName> -Unique <Unique column>
            Create Sqlite Table from InputObject with Name: <TableName> with Column <Unique column> as Unique.
             
            .EXAMPLE
            PS C:\> New-SQLiteTable -conn <SQLiteConnection> -InputObject <Object> -Name <TableName> -WhatIf
            Shows what Query would have been processed without really sending to database (Debug).
             
            .EXAMPLE
            PS C:\> $Object | New-SQLiteTable -conn <SQLiteConnection> -Name <TableName>
            Create Sqlite Table from Pipeline with Name: <TableName>
 
            .NOTES
 
            Author: Proxx
            Web: www.Proxx.nl
            Date: 10-06-2015
             
            .LINK
            http://www.proxx.nl/Wiki/New-SQLiteTable
#>


    Param(
        [Parameter(Mandatory=$False)][switch] $AllText,
        [Parameter(Mandatory=$True, ValueFromPipeline=$true)] $InputObject=$null,
        [Parameter(Mandatory=$True)] [String]$Name=$InputObject.TableName,
        [Parameter(Mandatory=$True)] [System.Data.SQLite.SQLiteConnection]$Connection=$null,
        [Parameter(Mandatory=$False)][Array] $Unique=$null,
        [Parameter(Mandatory=$False)][switch] $WhatIf,
        [Parameter(Mandatory=$False)][switch] $PassThru
    )
    
    
    Begin {
        $x = $false
        $Cols = New-Object -TypeName System.Text.StringBuilder 
        $dtExclude = @("RowError", "RowState", "Table",    "ItemArray", "HasErrors")
        $First = $true
       [Boolean] $Exists = $False
        if ((Read-SQLite -Connection $Connection -Query "select name from sqlite_master WHERE type = 'table' AND name = '$name'").Name) { [Boolean] $Exists = $true }

    }
    Process {
        ForEach($Object in $InputObject) {
            if (!($Exists)) 
            {
                if ($First)
                {
                    ForEach($Property in $Object.PSObject.Get_Properties()) {
                        if ($Object.GetType().Name -eq "DataRow") { if ($dtExclude -contains $Property.Name) { Continue }}
                        if ($x) { [Void]$Cols.Append(", ") }
                        [Void]$Cols.Append("``" + $Property.Name.ToString() + "`` ")
                        if ($AllText) { $Type = "TEXT " } Else { $Type = Convert-SQLiteType -Type $Property.TypeNameOfValue }
                        if ($Unique -contains $Property.Name.ToString()) { [Void]$Cols.Append($Type + " UNIQUE") } Else { [Void]$Cols.Append($Type) }
                        $x = $true
                    }
                    $Query = 'CREATE TABLE "{0}" ({1});'  -f $Name, $Cols.ToString()
                    if ($WhatIf) { Return $Query }
                    $Command = $Connection.CreateCommand()
                    $Command.CommandText = $Query
                    [Void]$Command.ExecuteNonQuery()
                    
                }
                $First = $false
            }
            if ($PassThru) { Write-Output -NoEnumerate -InputObject $Object }
        }
    }
}