/// <summary> /// Creates a SprocMethod object that doesn't require to be tested against to have automatically generated code. /// </summary> /// <param name="section">The sproc section that defines the sproc configuration.</param> /// <returns>A SprocMethod object with the required information for automatic code generation.</returns> public SprocMethod ReadSectionAndGenerateSprocMethodWithoutTestParams(SprocSection section) { GlobalProgress.NotifyProgress( new GlobalProgressNotification() { Text = section.Name, Color = ConsoleColor.Cyan } ); SprocMethod method = new SprocMethod(); method.SprocName = section.Name; method.MethodName = section.Method; method.Comments = section.Comments; if (section.Return == null) { method.ReturnType = SprocMethod.ReturnTypes.IntWithRecordsAffected; } else { method.ReturnType = SprocMethod.ReturnTypes.ScalarValue; method.Return = SqlParameterResolver.GetTypeFromSqlServerFriendlyType(section.Return).ClrType; } return(method); }
/// <summary> /// Creates a SprocMethod object that requires to be tested against to define the results. /// </summary> /// <param name="section">The sproc section that defines the sproc configuration.</param> /// <returns>A SprocMethod object with the required information for automatic code generation.</returns> public SprocMethod ReadSectionAndGenerateSprocMethodUsingTestParams(SprocSection section) { GlobalProgress.NotifyProgress( new GlobalProgressNotification() { Text = $"{section.Name} (testing...)", Color = ConsoleColor.Cyan } ); SprocMethod method = new SprocMethod(); method.MethodName = section.Method; method.SprocName = section.Name; method.Comments = section.Comments; /* Creates a new connection to test the sproc. */ using (SqlConnection connection = new SqlConnection()) { connection.ConnectionString = Configuration.ConnectionString; connection.Open(); using (SqlCommand command = connection.CreateCommand()) { command.CommandType = System.Data.CommandType.StoredProcedure; command.CommandText = section.Name; foreach (var param in section.TestParams) { var sqlParamMapping = SqlParameterResolver.Resolve(param.Name, param.Value); command.Parameters.Add(sqlParamMapping.Parameter); } GlobalProgress.NotifyProgress($"Testing sproc '{section.Name}' with {command.Parameters.Count} parameter(s) ..."); /* Tests the sproc. */ using (SqlDataReader reader = command.ExecuteReader()) { if (reader.FieldCount > 1) { for (int i = 0; i < reader.FieldCount; i++) { SprocResultProperty sprocProperty = new SprocResultProperty(); sprocProperty.ClrType = reader.GetFieldType(i); sprocProperty.PropertyName = reader.GetName(i); method.ResultProperties.Add(sprocProperty); method.ReturnType = SprocMethod.ReturnTypes.IEnumerableOf; } GlobalProgress.NotifyProgress($"'{section.Name}' returned multiple columns, generating result class."); } if (reader.FieldCount == 1) { GlobalProgress.NotifyProgress($"'{section.Name}' returned one column, generating method as scalar."); method.Return = reader.GetFieldType(0); method.ReturnType = SprocMethod.ReturnTypes.ScalarValue; } if (reader.FieldCount == 0) { GlobalProgress.NotifyProgress($"'{section.Name}' didn't return any columns, returning System.Int32."); method.ReturnType = SprocMethod.ReturnTypes.IntWithRecordsAffected; } } } } return(method); }
/// <summary> /// Creates a context section from a valid JObject containing a context section. /// </summary> /// <param name="jsonObject">A valid context JObject object.</param> /// <returns>Returns an object containing the data set in the dataflip.json file for a context.</returns> public static ContextSection FromJson(JObject jsonObject) { ContextSection result = new ContextSection(); try { string connectionString = jsonObject["connectionString"]?.Value <string>(); string nspace = jsonObject["namespace"]?.Value <string>(); string name = jsonObject["name"]?.Value <string>(); string output = jsonObject["output"]?.Value <string>(); string typeScriptTypings = jsonObject["typeScript"]?["output"]?.Value <string>(); bool? useCamelCasing = jsonObject["typeScript"]?["useCamelCasing"]?.Value <bool>(); string angularHtmlBindings = jsonObject["angular"]?["htmlBindings"]?.Value <string>(); if (connectionString == null) { throw new DataflipToolException("The '/contexts[]/connectionString' element in dataflip.json is required."); } if (nspace == null) { throw new DataflipToolException("The '/contexts[]/namespace' element in dataflip.json is required."); } if (name == null) { throw new DataflipToolException("The '/contexts[]/name' element in dataflip.json is required."); } if (output == null) { throw new DataflipToolException("The '/contexts[]/output' element in dataflip.json is required."); } if (useCamelCasing == null) { useCamelCasing = true; } result.ConnectionString = connectionString; result.Namespace = nspace; result.Name = name; result.Output = output; result.TypeScriptTypings = typeScriptTypings; result.TypeScriptUseCamelCasing = useCamelCasing.Value; result.AngularHtmlBindings = angularHtmlBindings; } catch (Exception ex) { throw new DataflipToolException("There was a problem parsing the configuration for at least one context, error details: " + ex.Message); } if (jsonObject["sprocs"] == null) { throw new DataflipToolException("The context does not contain a 'sprocs' element. The 'sprocs' element is required."); } foreach (var sproc in jsonObject["sprocs"].AsJEnumerable()) { SprocSection sprocSection = new SprocSection(result) { Name = sproc["name"].Value <string>(), Return = sproc["return"]?.Value <string>(), Method = sproc["method"]?.Value <string>(), Comments = sproc["comments"]?.Value <string>() }; if (sprocSection.Name == null) { throw new DataflipToolException("'contexts[]/sprocs[n]/name' section in dataflip.json is required."); } if (sprocSection.Method == null) { sprocSection.Method = sprocSection.Name; } result.Sprocs.Add(sprocSection); if (sproc["testParams"] != null) { foreach (var testParam in sproc["testParams"].AsJEnumerable()) { var property = ((Newtonsoft.Json.Linq.JProperty)testParam.First); if (property == null || property.Name == null || property.Value == null) { throw new DataflipToolException("There was a problem parsing the entry in 'testParams'."); } string paramName = property.Name; string paramValue = property.Value.ToString(); sprocSection.TestParams.Add(new TestParamSection() { Name = paramName, Value = paramValue } ); } } } return(result); }