# encoding: ascii
# api: powershell
# title: 
# description: test post sqldom, parser
# version: 0.1
# type: function
# license: CC0
# x-poshcode-id: 6359
# x-archived: 2016-05-28T02:32:19
#
#
# 
# returns available parsers 
# 
function parsers {
	param( $versions );
	
	# choose 'LoadFrom' or 'LoadWithPartialName'
	#$sqldom = [System.Reflection.Assembly]::LoadFrom("C:\Program Files\Microsoft SQL Server\110\SDK\Assemblies\Microsoft.SqlServer.TransactSql.ScriptDom.dll");
	$sqldom = [System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.TransactSql.ScriptDom");
	if (-not $sqldom) {
		write-host "[ERR ] Please install the SQLDOM.MSI from the SQL 2012 Feature Pack web page http://www.microsoft.com/en-us/download/details.aspx?id=35580" -foregroundcolor red
		exit;
	}
	
	# select avilable parser
	$create_flgs = [ordered] @{};
	if ($versions -eq $null) {
		if ([bool] ($sqldom.gettypes() | where-object {$_.name -eq "TSql80Parser" } )) { $create_flgs.add("SQLServer2000", $true); }
		if ([bool] ($sqldom.gettypes() | where-object {$_.name -eq "TSql90Parser" } )) { $create_flgs.add("SQLServer2005", $true); }
		if ([bool] ($sqldom.gettypes() | where-object {$_.name -eq "TSql100Parser"} )) { $create_flgs.add("SQLServer2008", $true); }
		if ([bool] ($sqldom.gettypes() | where-object {$_.name -eq "TSql110Parser"} )) { $create_flgs.add("SQLServer2012", $true); }
		if ([bool] ($sqldom.gettypes() | where-object {$_.name -eq "TSql120Parser"} )) { $create_flgs.add("SQLServer2014", $true); }
	} else {
		# or select own
		foreach ($version in $versions) {
			if ( (("SQLServer2000Sql80").contains($version) ) -and (-not $create_flgs.contains("SQLServer2000")) ) { $create_flgs.add("SQLServer2000", $true); }
			if ( (("SQLServer2005Sql90").contains($version) ) -and (-not $create_flgs.contains("SQLServer2005")) ) { $create_flgs.add("SQLServer2005", $true); }
			if ( (("SQLServer2008Sql100").contains($version)) -and (-not $create_flgs.contains("SQLServer2008")) ) { $create_flgs.add("SQLServer2008", $true); }
			if ( (("SQLServer2012Sql110").contains($version)) -and (-not $create_flgs.contains("SQLServer2012")) ) { $create_flgs.add("SQLServer2012", $true); }
			if ( (("SQLServer2014Sql120").contains($version)) -and (-not $create_flgs.contains("SQLServer2014")) ) { $create_flgs.add("SQLServer2014", $true); }
		}
	}

	# create objects
	$parsers = [ordered] @{};
	foreach ($version in $create_flgs.keys) {
		if ($create_flgs[$version]) {
			switch($version) {
				"SQLServer2000" { $parsers.add($version, $(new-object Microsoft.SqlServer.TransactSql.ScriptDom.TSql80Parser($false)));  } 
				"SQLServer2005" { $parsers.add($version, $(new-object Microsoft.SqlServer.TransactSql.ScriptDom.TSql90Parser($false)));  } 
				"SQLServer2008" { $parsers.add($version, $(new-object Microsoft.SqlServer.TransactSql.ScriptDom.TSql100Parser($false))); } 
				"SQLServer2012" { $parsers.add($version, $(new-object Microsoft.SqlServer.TransactSql.ScriptDom.TSql110Parser($false))); } 
				"SQLServer2014" { $parsers.add($version, $(new-object Microsoft.SqlServer.TransactSql.ScriptDom.TSql120Parser($false))); } 
			}
		}
	}
	
	# returns hashtable, @{ SQLServer2000 => TSql80Parser-object, ... }
	return $parsers
}

function parser {
	param( $version );
	$parsers = parsers($version);
	foreach ($parser in $parsers.keys) { 
		#do nothing -> overwrite $parser
	}
	return $parsers[$parser];
}


Export-ModuleMember -Function parsers
Export-ModuleMember -Function parser
