PageRenderTime 26ms CodeModel.GetById 12ms RepoModel.GetById 0ms app.codeStats 0ms

/trunk/Source/nHydrate.Generator.SQLInstaller/ProjectItemGenerators/Functions/FunctionsTemplate.cs

#
C# | 211 lines | 153 code | 21 blank | 37 comment | 20 complexity | 7e8239cba080846c195f22c1d922e44d MD5 | raw file
Possible License(s): JSON, CC-BY-SA-3.0
  1. #region Copyright (c) 2006-2012 nHydrate.org, All Rights Reserved
  2. //--------------------------------------------------------------------- *
  3. // NHYDRATE.ORG *
  4. // Copyright (c) 2006-2012 All Rights reserved *
  5. // *
  6. // *
  7. //This file and its contents are protected by United States and *
  8. //International copyright laws. Unauthorized reproduction and/or *
  9. //distribution of all or any portion of the code contained herein *
  10. //is strictly prohibited and will result in severe civil and criminal *
  11. //penalties. Any violations of this copyright will be prosecuted *
  12. //to the fullest extent possible under law. *
  13. // *
  14. //THE SOURCE CODE CONTAINED HEREIN AND IN RELATED FILES IS PROVIDED *
  15. //TO THE REGISTERED DEVELOPER FOR THE PURPOSES OF EDUCATION AND *
  16. //TROUBLESHOOTING. UNDER NO CIRCUMSTANCES MAY ANY PORTION OF THE SOURCE *
  17. //CODE BE DISTRIBUTED, DISCLOSED OR OTHERWISE MADE AVAILABLE TO ANY *
  18. //THIRD PARTY WITHOUT THE EXPRESS WRITTEN CONSENT OF THE NHYDRATE GROUP *
  19. // *
  20. //UNDER NO CIRCUMSTANCES MAY THE SOURCE CODE BE USED IN WHOLE OR IN *
  21. //PART, AS THE BASIS FOR CREATING A PRODUCT THAT PROVIDES THE SAME, OR *
  22. //SUBSTANTIALLY THE SAME, FUNCTIONALITY AS THIS PRODUCT *
  23. // *
  24. //THE REGISTERED DEVELOPER ACKNOWLEDGES THAT THIS SOURCE CODE *
  25. //CONTAINS VALUABLE AND PROPRIETARY TRADE SECRETS OF NHYDRATE, *
  26. //THE REGISTERED DEVELOPER AGREES TO EXPEND EVERY EFFORT TO *
  27. //INSURE ITS CONFIDENTIALITY. *
  28. // *
  29. //THE END USER LICENSE AGREEMENT (EULA) ACCOMPANYING THE PRODUCT *
  30. //PERMITS THE REGISTERED DEVELOPER TO REDISTRIBUTE THE PRODUCT IN *
  31. //EXECUTABLE FORM ONLY IN SUPPORT OF APPLICATIONS WRITTEN USING *
  32. //THE PRODUCT. IT DOES NOT PROVIDE ANY RIGHTS REGARDING THE *
  33. //SOURCE CODE CONTAINED HEREIN. *
  34. // *
  35. //THIS COPYRIGHT NOTICE MAY NOT BE REMOVED FROM THIS FILE. *
  36. //--------------------------------------------------------------------- *
  37. #endregion
  38. using System;
  39. using System.Linq;
  40. using System.Collections.Generic;
  41. using System.Text;
  42. using nHydrate.Generator.Models;
  43. using nHydrate.Generator.ProjectItemGenerators;
  44. using nHydrate.Generator.Common;
  45. namespace nHydrate.Generator.SQLInstaller.ProjectItemGenerators.Functions
  46. {
  47. class FunctionsTemplate : BaseDbScriptTemplate
  48. {
  49. private StringBuilder sb = new StringBuilder();
  50. #region Constructors
  51. public FunctionsTemplate(ModelRoot model)
  52. {
  53. _model = model;
  54. }
  55. #endregion
  56. #region BaseClassTemplate overrides
  57. public override string FileContent
  58. {
  59. get
  60. {
  61. this.GenerateContent();
  62. return sb.ToString();
  63. }
  64. }
  65. public override string FileName
  66. {
  67. get { return "Functions.sql"; }
  68. }
  69. #endregion
  70. #region GenerateContent
  71. private void GenerateContent()
  72. {
  73. if (_model.Database.AllowZeroTouch) return;
  74. try
  75. {
  76. this.AppendFullTemplate();
  77. }
  78. catch (Exception ex)
  79. {
  80. throw;
  81. }
  82. }
  83. #endregion
  84. #region string methods
  85. protected string BuildSelectList(Function function)
  86. {
  87. var output = new StringBuilder();
  88. int ii = 0;
  89. foreach (var column in function.GeneratedColumns)
  90. {
  91. ii++;
  92. output.Append(column.DatabaseName.ToLower());
  93. if (ii != function.GeneratedColumns.Count())
  94. {
  95. output.Append("," + Environment.NewLine + "\t");
  96. }
  97. }
  98. return output.ToString();
  99. }
  100. protected string BuildParameterList(Function function)
  101. {
  102. var output = new StringBuilder();
  103. var parameterList = function.GetParameters().Where(x => x.Generated && x.SortOrder > 0).OrderBy(x => x.SortOrder).ToList();
  104. parameterList.AddRange(function.GetParameters().Where(x => x.Generated && x.SortOrder == 0).OrderBy(x => x.Name).ToList());
  105. int ii = 0;
  106. foreach (var parameter in parameterList)
  107. {
  108. ii++;
  109. output.Append("\t@" + ValidationHelper.MakeDatabaseScriptIdentifier(parameter.DatabaseName) + " " +
  110. parameter.DatabaseType.ToLower() +
  111. (parameter.GetPredefinedSize() == -1 ? "(" + parameter.GetLengthString() + ") " : string.Empty) + (parameter.IsOutputParameter ? " out " : " = null"));
  112. if (ii != parameterList.Count)
  113. output.Append(",");
  114. output.AppendLine();
  115. }
  116. return output.ToString();
  117. }
  118. #endregion
  119. public void AppendFullTemplate()
  120. {
  121. try
  122. {
  123. sb.AppendLine("--DO NOT MODIFY THIS FILE. IT IS ALWAYS OVERWRITTEN ON GENERATION.");
  124. sb.AppendLine("--Model Version " + _model.Version);
  125. sb.AppendLine();
  126. sb.AppendLine("--This SQL is generated for functions");
  127. sb.AppendLine();
  128. nHydrate.Generator.GenerationHelper.AppendCopyrightInSQL(sb, _model);
  129. foreach (var function in _model.Database.Functions.Where(x => x.Generated).OrderBy(x => x.DatabaseName))
  130. {
  131. sb.AppendLine("if exists (select * from dbo.sysobjects where id = object_id(N'[" + function.GetSQLSchema() + "].[" + function.PascalName + "]') and [xtype] IN ('FN', 'IF', 'TF'))");
  132. sb.AppendLine(" drop function [" + function.GetSQLSchema() + "].[" + function.PascalName + "]");
  133. sb.AppendLine("GO");
  134. sb.AppendLine();
  135. sb.AppendLine("SET QUOTED_IDENTIFIER ON ");
  136. sb.AppendLine("GO");
  137. sb.AppendLine("SET ANSI_NULLS ON");
  138. sb.AppendLine("GO");
  139. sb.AppendLine();
  140. sb.AppendLine("CREATE FUNCTION [" + function.GetSQLSchema() + "].[" + function.PascalName + "]");
  141. sb.AppendLine("(");
  142. if (function.Parameters.Count > 0)
  143. sb.Append(this.BuildParameterList(function));
  144. sb.AppendLine(")");
  145. sb.Append("RETURNS ");
  146. if (function.IsTable && string.IsNullOrEmpty(function.ReturnVariable))
  147. {
  148. //There is NOT a returned table defined. This is a straight select
  149. sb.AppendLine("TABLE");
  150. }
  151. else if (function.IsTable && !string.IsNullOrEmpty(function.ReturnVariable))
  152. {
  153. //There is a returned table defined
  154. sb.Append("@" + function.ReturnVariable + " TABLE (");
  155. var columnList = function.GetColumns().Where(x => x.Generated).ToList();
  156. foreach (var column in columnList)
  157. {
  158. sb.Append(column.DatabaseName + " " + column.DatabaseType);
  159. if (columnList.IndexOf(column) < columnList.Count - 1) sb.Append(", ");
  160. }
  161. sb.AppendLine(")");
  162. }
  163. else
  164. {
  165. var column = function.Columns.First().Object as FunctionColumn;
  166. sb.AppendLine(column.DatabaseType.ToLower());
  167. }
  168. sb.AppendLine("AS");
  169. sb.AppendLine();
  170. sb.Append(function.SQL);
  171. sb.AppendLine();
  172. sb.AppendLine("GO");
  173. sb.AppendLine();
  174. if (!string.IsNullOrEmpty(_model.Database.GrantExecUser))
  175. if (!string.IsNullOrEmpty(_model.Database.GrantExecUser))
  176. {
  177. if (function.IsTable) sb.AppendFormat("GRANT SELECT ON [" + function.GetSQLSchema() + "].[{0}] TO [{1}]", function.PascalName, _model.Database.GrantExecUser).AppendLine();
  178. else sb.AppendFormat("GRANT EXECUTE ON [" + function.GetSQLSchema() + "].[{0}] TO [{1}]", function.PascalName, _model.Database.GrantExecUser).AppendLine();
  179. sb.AppendLine("GO");
  180. sb.AppendLine();
  181. }
  182. }
  183. }
  184. catch (Exception ex)
  185. {
  186. throw;
  187. }
  188. }
  189. }
  190. }