public static void CompileExpression(IFunctionBuilder functionBuilder, IFunctionData data, string parameterName, string expressionName) { var propertyValue = data.Properties[parameterName].Value; var expressionString = (propertyValue is string) ? propertyValue as string : string.Empty; SqlStringHandler stringHandler = SqlStringHandler.GetSqlStringHandler(expressionString); var parameterValues = new string[stringHandler.Expressions.Count]; for (int i = 0; i < parameterValues.Length; i++) { parameterValues[i] = functionBuilder.GetParamName(expressionName + i) + ".ToString()"; } if (parameterValues.Length > 0) { functionBuilder.AddCode(string.Format(@"{0} = Twenty57.Linx.Components.Database.Mongo.MongoStringHandler.GetExecutableQuery( {0}, {1}, new [] {{ {2} }});" , functionBuilder.GetParamName(parameterName), CSharpUtilities.ArrayAsString(stringHandler.Expressions.Select(x => x.MatchText)), parameterValues.Aggregate((a, b) => a + ",\n" + b) )); } }
/// <summary> /// Create the template output /// </summary> public virtual string TransformText() { this.Write("\r\n"); this.Write("\r\nvar OutputNames = "); #line 23 "D:\Hg\Linx5 Components\Database\Code\Database\ExecuteSQL\ExecuteSQL_Gen.tt" this.Write(this.ToStringHelper.ToStringWithCulture(CSharpUtilities.ArrayAsString(ResultTypeFields.Select(x => x.Name)))); #line default #line hidden this.Write(";\r\nvar ColumnNames = "); #line 24 "D:\Hg\Linx5 Components\Database\Code\Database\ExecuteSQL\ExecuteSQL_Gen.tt" this.Write(this.ToStringHelper.ToStringWithCulture(CSharpUtilities.ArrayAsString(ResultTypeFields.Select(x => x.ColumnName)))); #line default #line hidden this.Write(";\r\nvar SqlIdentifiers = "); #line 25 "D:\Hg\Linx5 Components\Database\Code\Database\ExecuteSQL\ExecuteSQL_Gen.tt" this.Write(this.ToStringHelper.ToStringWithCulture(SqlIdentifiers)); #line default #line hidden this.Write(";\r\nvar SqlValues = "); #line 26 "D:\Hg\Linx5 Components\Database\Code\Database\ExecuteSQL\ExecuteSQL_Gen.tt" this.Write(this.ToStringHelper.ToStringWithCulture(SqlValues)); #line default #line hidden this.Write(";\r\n\r\nvar executeSqlX = new Twenty57.Linx.Components.Database.ExecuteSQL.ExecuteSQ" + "LX(\r\n"); #line 29 "D:\Hg\Linx5 Components\Database\Code\Database\ExecuteSQL\ExecuteSQL_Gen.tt" if (UseTransaction) { #line default #line hidden #line 30 "D:\Hg\Linx5 Components\Database\Code\Database\ExecuteSQL\ExecuteSQL_Gen.tt" this.Write(this.ToStringHelper.ToStringWithCulture(TransactionProperty)); #line default #line hidden this.Write(".GetConnectionType(), "); #line 30 "D:\Hg\Linx5 Components\Database\Code\Database\ExecuteSQL\ExecuteSQL_Gen.tt" this.Write(this.ToStringHelper.ToStringWithCulture(TransactionProperty)); #line default #line hidden this.Write(".GetDbTransaction(), \r\n"); #line 31 "D:\Hg\Linx5 Components\Database\Code\Database\ExecuteSQL\ExecuteSQL_Gen.tt" } else { #line default #line hidden #line 32 "D:\Hg\Linx5 Components\Database\Code\Database\ExecuteSQL\ExecuteSQL_Gen.tt" this.Write(this.ToStringHelper.ToStringWithCulture(CSharpUtilities.EnumAsString(ConnectionType))); #line default #line hidden this.Write(", "); #line 32 "D:\Hg\Linx5 Components\Database\Code\Database\ExecuteSQL\ExecuteSQL_Gen.tt" this.Write(this.ToStringHelper.ToStringWithCulture(ConnectionStringProperty)); #line default #line hidden this.Write(", \r\n"); #line 33 "D:\Hg\Linx5 Components\Database\Code\Database\ExecuteSQL\ExecuteSQL_Gen.tt" } #line default #line hidden #line 34 "D:\Hg\Linx5 Components\Database\Code\Database\ExecuteSQL\ExecuteSQL_Gen.tt" this.Write(this.ToStringHelper.ToStringWithCulture(Timeout)); #line default #line hidden this.Write(", OutputNames, ColumnNames, "); #line 34 "D:\Hg\Linx5 Components\Database\Code\Database\ExecuteSQL\ExecuteSQL_Gen.tt" this.Write(this.ToStringHelper.ToStringWithCulture(Sql)); #line default #line hidden this.Write(", SqlIdentifiers, SqlValues);\r\nexecuteSqlX.LogEvent += message => "); #line 35 "D:\Hg\Linx5 Components\Database\Code\Database\ExecuteSQL\ExecuteSQL_Gen.tt" this.Write(this.ToStringHelper.ToStringWithCulture(FunctionContextProperty)); #line default #line hidden this.Write(".Log(message);\r\n\r\n"); #line 37 "D:\Hg\Linx5 Components\Database\Code\Database\ExecuteSQL\ExecuteSQL_Gen.tt" if (RowType != null) { #line default #line hidden this.Write("\r\nvar rowBuilder = new System.Func<"); #line 39 "D:\Hg\Linx5 Components\Database\Code\Database\ExecuteSQL\ExecuteSQL_Gen.tt" this.Write(this.ToStringHelper.ToStringWithCulture(RowTypeName)); #line default #line hidden this.Write(">(() => {\r\n\t"); #line 40 "D:\Hg\Linx5 Components\Database\Code\Database\ExecuteSQL\ExecuteSQL_Gen.tt" var rowFields = ResultTypeFields.Where(f => !string.IsNullOrEmpty(f.Name)); var logFormatString = "Retrieved "; int index = 0; foreach (var nextField in rowFields) { logFormatString += string.Format("{0} = {{{1}}}, ", nextField.ColumnName, index++); } #line default #line hidden this.Write("\t"); #line 46 "D:\Hg\Linx5 Components\Database\Code\Database\ExecuteSQL\ExecuteSQL_Gen.tt" this.Write(this.ToStringHelper.ToStringWithCulture(FunctionContextProperty)); #line default #line hidden this.Write(".Log(System.String.Format("); #line 46 "D:\Hg\Linx5 Components\Database\Code\Database\ExecuteSQL\ExecuteSQL_Gen.tt" this.Write(this.ToStringHelper.ToStringWithCulture(CSharpUtilities.ToVerbatimString(logFormatString.TrimEnd(',', ' ')))); #line default #line hidden this.Write("\r\n\t"); #line 47 "D:\Hg\Linx5 Components\Database\Code\Database\ExecuteSQL\ExecuteSQL_Gen.tt" foreach (var nextField in rowFields) { #line default #line hidden this.Write("\t\t, Twenty57.Linx.Components.Database.Common.LogHelpers.GetDisplayString(executeS" + "qlX.Reader["); #line 48 "D:\Hg\Linx5 Components\Database\Code\Database\ExecuteSQL\ExecuteSQL_Gen.tt" this.Write(this.ToStringHelper.ToStringWithCulture(CSharpUtilities.ToVerbatimString(nextField.ColumnName))); #line default #line hidden this.Write("])\r\n\t"); #line 49 "D:\Hg\Linx5 Components\Database\Code\Database\ExecuteSQL\ExecuteSQL_Gen.tt" } #line default #line hidden this.Write("\t));\r\n\r\n\treturn new "); #line 52 "D:\Hg\Linx5 Components\Database\Code\Database\ExecuteSQL\ExecuteSQL_Gen.tt" this.Write(this.ToStringHelper.ToStringWithCulture(RowTypeName)); #line default #line hidden this.Write("\r\n\t{\r\n\t\t"); #line 54 "D:\Hg\Linx5 Components\Database\Code\Database\ExecuteSQL\ExecuteSQL_Gen.tt" foreach (var nextField in rowFields) { #line default #line hidden this.Write("\t\t\t"); #line 55 "D:\Hg\Linx5 Components\Database\Code\Database\ExecuteSQL\ExecuteSQL_Gen.tt" this.Write(this.ToStringHelper.ToStringWithCulture(GetParamName(nextField.Name))); #line default #line hidden this.Write(" = Twenty57.Linx.Components.Database.ExecuteSQL.DatabaseHelpers.CheckDbValue<"); #line 55 "D:\Hg\Linx5 Components\Database\Code\Database\ExecuteSQL\ExecuteSQL_Gen.tt" this.Write(this.ToStringHelper.ToStringWithCulture(Twenty57.Linx.Components.Database.Common.TypeHelpers.GetCodeStringForType(nextField.TypeReference))); #line default #line hidden this.Write(">(executeSqlX.Reader["); #line 55 "D:\Hg\Linx5 Components\Database\Code\Database\ExecuteSQL\ExecuteSQL_Gen.tt" this.Write(this.ToStringHelper.ToStringWithCulture(CSharpUtilities.ToVerbatimString(nextField.ColumnName))); #line default #line hidden this.Write("]), \r\n\t\t"); #line 56 "D:\Hg\Linx5 Components\Database\Code\Database\ExecuteSQL\ExecuteSQL_Gen.tt" } #line default #line hidden this.Write("\t};\r\n});\r\n\r\n"); #line 60 "D:\Hg\Linx5 Components\Database\Code\Database\ExecuteSQL\ExecuteSQL_Gen.tt" if (ReturnMode == ExecuteSQLShared.ReturnModeType.ListOfRows) { #line default #line hidden this.Write("try\r\n{\r\n\texecuteSqlX.OpenReader();\r\n\r\n\tvar table = new List<"); #line 65 "D:\Hg\Linx5 Components\Database\Code\Database\ExecuteSQL\ExecuteSQL_Gen.tt" this.Write(this.ToStringHelper.ToStringWithCulture(RowTypeName)); #line default #line hidden this.Write(">();\r\n\twhile (executeSqlX.Reader.Read())\r\n\t\ttable.Add(rowBuilder());\r\n\treturn tab" + "le;\r\n}\r\nfinally\r\n{\r\n\texecuteSqlX.Dispose();\r\n}\r\n"); #line 74 "D:\Hg\Linx5 Components\Database\Code\Database\ExecuteSQL\ExecuteSQL_Gen.tt" } else if ((ReturnMode == ExecuteSQLShared.ReturnModeType.FirstRow) || (ReturnMode == ExecuteSQLShared.ReturnModeType.FirstRowElseEmptyRow)) { #line default #line hidden this.Write("try\r\n{\r\n\texecuteSqlX.OpenReader();\r\n\r\n\t"); #line 79 "D:\Hg\Linx5 Components\Database\Code\Database\ExecuteSQL\ExecuteSQL_Gen.tt" this.Write(this.ToStringHelper.ToStringWithCulture(RowTypeName)); #line default #line hidden this.Write(" row;\r\n\tif (executeSqlX.Reader.Read())\r\n\t\trow = rowBuilder();\r\n\telse\r\n\t{\r\n\t\t"); #line 84 "D:\Hg\Linx5 Components\Database\Code\Database\ExecuteSQL\ExecuteSQL_Gen.tt" if (ReturnMode == ExecuteSQLShared.ReturnModeType.FirstRow) { #line default #line hidden this.Write("\t\tthrow new Exception(\"No rows returned by query.\");\r\n\t\t"); #line 86 "D:\Hg\Linx5 Components\Database\Code\Database\ExecuteSQL\ExecuteSQL_Gen.tt" } else { #line default #line hidden this.Write("\t\trow = new "); #line 87 "D:\Hg\Linx5 Components\Database\Code\Database\ExecuteSQL\ExecuteSQL_Gen.tt" this.Write(this.ToStringHelper.ToStringWithCulture(RowTypeName)); #line default #line hidden this.Write("();\r\n\t\t"); #line 88 "D:\Hg\Linx5 Components\Database\Code\Database\ExecuteSQL\ExecuteSQL_Gen.tt" } #line default #line hidden this.Write("\t}\r\n\r\n\treturn row;\r\n}\r\nfinally\r\n{\r\n\texecuteSqlX.Dispose();\r\n}\r\n"); #line 97 "D:\Hg\Linx5 Components\Database\Code\Database\ExecuteSQL\ExecuteSQL_Gen.tt" } else { #line default #line hidden this.Write("executeSqlX.OpenReader();\r\n"); #line 99 "D:\Hg\Linx5 Components\Database\Code\Database\ExecuteSQL\ExecuteSQL_Gen.tt" this.Write(this.ToStringHelper.ToStringWithCulture(ExecutionPathOutputName)); #line default #line hidden this.Write(" = \r\nexecuteSqlX.Rows<Twenty57.Linx.Plugin.Common.CodeGeneration.NextResult>(read" + "er => {\r\n\tvar row = rowBuilder();\r\n\treturn new Twenty57.Linx.Plugin.Common.CodeG" + "eneration.NextResult(\""); #line 102 "D:\Hg\Linx5 Components\Database\Code\Database\ExecuteSQL\ExecuteSQL_Gen.tt" this.Write(this.ToStringHelper.ToStringWithCulture(ExecutionPathName)); #line default #line hidden this.Write("\", row);\r\n});\r\n"); #line 104 "D:\Hg\Linx5 Components\Database\Code\Database\ExecuteSQL\ExecuteSQL_Gen.tt" } #line default #line hidden #line 105 "D:\Hg\Linx5 Components\Database\Code\Database\ExecuteSQL\ExecuteSQL_Gen.tt" } else { #line default #line hidden this.Write("try\r\n{\r\n\texecuteSqlX.OpenReader();\r\n}\r\nfinally\r\n{\r\n\texecuteSqlX.Dispose();\r\n}\r\n"); #line 114 "D:\Hg\Linx5 Components\Database\Code\Database\ExecuteSQL\ExecuteSQL_Gen.tt" } #line default #line hidden return(this.GenerationEnvironment.ToString()); }
public override void GenerateCode(IFunctionBuilder functionBuilder) { ExecuteSQL_Gen generator = new ExecuteSQL_Gen(); generator.Session = new Dictionary <string, object>(); generator.Session.Add("FunctionContextProperty", functionBuilder.ContextParamName); generator.Session.Add("GetParamName", new Func <string, string>(functionBuilder.GetParamName)); // Function properties generator.Session.Add("Timeout", FunctionData.Properties[ExecuteSQLShared.TimeoutPropertyName].GetValue <int>()); ConnectionTypeSelection connectionType = FunctionData.Properties[DbShared.ConnectionTypePropertyName].GetValue <ConnectionTypeSelection>(); bool useTransaction = connectionType == ConnectionTypeSelection.UseTransaction; generator.Session.Add("UseTransaction", useTransaction); if (useTransaction) { generator.Session.Add("TransactionProperty", functionBuilder.GetParamName(DbShared.TransactionPropertyName)); } else { generator.Session.Add("ConnectionType", connectionType.ToConnectionType()); generator.Session.Add("ConnectionStringProperty", functionBuilder.GetParamName(DbShared.ConnectionStringPropertyName)); } generator.Session.Add("Sql", functionBuilder.GetParamName(ExecuteSQLShared.SqlStatementPropertyName)); ExecuteSQLShared.ReturnModeType returnMode = FunctionData.Properties[ExecuteSQLShared.ReturnOptionsPropertyName].GetValue <ExecuteSQLShared.ReturnModeType>(); generator.Session.Add("ReturnMode", returnMode); // SQL placeholders SqlStringHandler sqlStringHandler = SqlStringHandler.GetSqlStringHandler(StaticSqlStatementValue); generator.Session.Add("SqlIdentifiers", CSharpUtilities.ArrayAsString(sqlStringHandler.Expressions.Select(ex => SqlStringHandler.CreateSqlExpression(ex.ExpressionText)))); int parameterIndex = 0; generator.Session.Add("SqlValues", "new object[] { " + string.Join(", ", sqlStringHandler.Expressions.Select(ex => functionBuilder.GetParamName(ExecuteSQLShared.SqlValuePropertyPrefix + (++parameterIndex)))) + " }"); // Output columns var resultType = FunctionData.Properties[ExecuteSQLShared.ResultTypePropertyName].GetValue <ResultType>(); generator.Session.Add("ResultTypeFields", resultType.Fields); ITypeReference rowTypeReference = null; if (resultType.Fields.Count != 0) { switch (returnMode) { case ExecuteSQLShared.ReturnModeType.RowByRow: rowTypeReference = FunctionData.ExecutionPaths[ExecuteSQLShared.ExecutionPathName].Output; break; case ExecuteSQLShared.ReturnModeType.ListOfRows: rowTypeReference = FunctionData.Output.GetEnumerableContentType(); break; case ExecuteSQLShared.ReturnModeType.FirstRow: case ExecuteSQLShared.ReturnModeType.FirstRowElseEmptyRow: rowTypeReference = FunctionData.Output; break; } } generator.Session.Add("RowTypeName", rowTypeReference == null ? null : functionBuilder.GetTypeName(rowTypeReference)); generator.Session.Add("RowType", rowTypeReference); generator.Session.Add("ExecutionPathName", ExecuteSQLShared.ExecutionPathName); generator.Session.Add("ExecutionPathOutputName", functionBuilder.ExecutionPathOutParamName); generator.Initialize(); functionBuilder.AddCode(generator.TransformText()); functionBuilder.AddAssemblyReference(typeof(ExecuteSQL)); functionBuilder.AddAssemblyReference(typeof(System.Data.IDataReader)); }