#region Copyright © 2001-2003 Jean-Claude Manoli [jc@manoli.net]
/*
 * Based on code submitted by Mitsugi Ogawa.
 * 
 * This software is provided 'as-is', without any express or implied warranty.
 * In no event will the author(s) be held liable for any damages arising from
 * the use of this software.
 * 
 * Permission is granted to anyone to use this software for any purpose,
 * including commercial applications, and to alter it and redistribute it
 * freely, subject to the following restrictions:
 * 
 *   1. The origin of this software must not be misrepresented; you must not
 *      claim that you wrote the original software. If you use this software
 *      in a product, an acknowledgment in the product documentation would be
 *      appreciated but is not required.
 * 
 *   2. Altered source versions must be plainly marked as such, and must not
 *      be misrepresented as being the original software.
 * 
 *   3. This notice may not be removed or altered from any source distribution.
 */ 
#endregion

using System;
using System.IO;
using System.Text;
using System.Text.RegularExpressions;

namespace Manoli.Utils.CSharpFormat
{
	/// <summary>
	/// Generates color-coded T-SQL source code.
	/// </summary>
	public class TsqlFormat : CodeFormat
	{
		/// <summary>
		/// Regular expression string to match single line 
		/// comments (--). 
		/// </summary>
		protected override string CommentRegEx
		{
			get
			{
				return @"(?:--\s).*?(?=\r|\n)";
			}
		}

		/// <summary>
		/// Regular expression string to match string literals. 
		/// </summary>
		protected override string StringRegEx
		{
			get
			{
				return @"''|'.*?'";
			}
		}

		/// <summary>
		/// Returns <b>false</b>, since T-SQL is not case sensitive.
		/// </summary>
		public override bool CaseSensitive
		{
			get { return false; }
		}


		/// <summary>
		/// The list of T-SQL keywords.
		/// </summary>
		protected override string Keywords
		{
			get
			{
				return "absolute action ada add admin after aggregate "
					+ "alias all allocate alter and any are array as asc "
					+ "assertion at authorization avg backup before begin "
					+ "between binary bit bit_length blob boolean both breadth "
					+ "break browse bulk by call cascade cascaded case cast "
					+ "catalog char char_length character character_length "
					+ "check checkpoint class clob close clustered coalesce "
					+ "collate collation column commit completion compute "
					+ "connect connection constraint constraints constructor "
					+ "contains containstable continue convert corresponding "
					+ "count create cross cube current current_date current_path "
					+ "current_role current_time current_timestamp current_user "
					+ "cursor cycle data database date day dbcc deallocate dec "
					+ "decimal declare default deferrable deferred delete deny "
					+ "depth deref desc describe descriptor destroy destructor "
					+ "deterministic diagnostics dictionary disconnect disk "
					+ "distinct distributed domain double drop dummy dump "
					+ "dynamic each else end end-exec equals errlvl escape "
					+ "every except exception exec execute exists exit external "
					+ "extract false fetch file fillfactor first float for "
					+ "foreign fortran found free freetext freetexttable from "
					+ "full function general get global go goto grant group "
					+ "grouping having holdlock host hour identity identity_insert "
					+ "identitycol if ignore immediate in include index indicator "
					+ "initialize initially inner inout input insensitive insert "
					+ "int integer intersect interval into is isolation iterate "
					+ "join key kill language large last lateral leading left "
					+ "less level like limit lineno load local localtime localtimestamp "
					+ "locator lower map match max min minute modifies modify "
					+ "module month names national natural nchar nclob new next "
					+ "no nocheck nonclustered none not null nullif numeric object "
					+ "octet_length of off offsets old on only open opendatasource "
					+ "openquery openrowset openxml operation option or order "
					+ "ordinality out outer output over overlaps pad parameter "
					+ "parameters partial pascal path percent plan position "
					+ "postfix precision prefix preorder prepare preserve "
					+ "primary print prior privileges proc procedure "
					+ "public raiserror read reads readtext real reconfigure "
					+ "recursive ref references referencing relative replication "
					+ "restore restrict result return returns revoke right role "
					+ "rollback rollup routine row rowcount rowguidcol rows rule "
					+ "save savepoint schema scope scroll search second section "
					+ "select sequence session session_user set sets setuser "
					+ "shutdown size smallint some space specific specifictype "
					+ "sql sqlca sqlcode sqlerror sqlexception sqlstate sqlwarning "
					+ "start state statement static statistics structure substring "
					+ "sum system_user table temporary terminate textsize than then "
					+ "time timestamp timezone_hour timezone_minute to top trailing "
					+ "tran transaction translate translation treat trigger trim "
					+ "true truncate tsequal under union unique unknown unnest "
					+ "update updatetext upper usage use user using value values "
					+ "varchar variable varying view waitfor when whenever where "
					+ "while with without work write writetext year zone";
			}
		}

		/// <summary>
		/// Use the pre-processor color to mark keywords that start with @@.
		/// </summary>
		protected override string Preprocessors
		{
			get 
			{ 
				return @"@@CONNECTIONS @@CPU_BUSY @@CURSOR_ROWS @@DATEFIRST "
					+ "@@DBTS @@ERROR @@FETCH_STATUS @@IDENTITY @@IDLE "
					+ "@@IO_BUSY @@LANGID @@LANGUAGE @@LOCK_TIMEOUT "
					+ "@@MAX_CONNECTIONS @@MAX_PRECISION @@NESTLEVEL @@OPTIONS "
					+ "@@PACK_RECEIVED @@PACK_SENT @@PACKET_ERRORS @@PROCID "
					+ "@@REMSERVER @@ROWCOUNT @@SERVERNAME @@SERVICENAME @@SPID "
					+ "@@TEXTSIZE @@TIMETICKS @@TOTAL_ERRORS @@TOTAL_READ "
					+ "@@TOTAL_WRITE @@TRANCOUNT @@VERSION";
			}
		}
	}
}
