Skip to content

Commit 5e55185

Browse files
committed
#774 Code completed
1 parent 894de33 commit 5e55185

File tree

20 files changed

+247
-194
lines changed

20 files changed

+247
-194
lines changed

EntityFramework.Reverse.POCO.Generator/EF.Reverse.POCO.v3.ttinclude

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3436,10 +3436,10 @@
34363436
sp.WriteStoredProcReturnType(_filter),
34373437
sp.WriteStoredProcReturnModelName(filter),
34383438
sp.WriteStoredProcFunctionName(filter),
3439-
sp.WriteStoredProcFunctionParams(false, true),
34403439
sp.WriteStoredProcFunctionParams(false, false),
3441-
sp.WriteStoredProcFunctionParams(true, true),
3440+
sp.WriteStoredProcFunctionParams(false, true),
34423441
sp.WriteStoredProcFunctionParams(true, false),
3442+
sp.WriteStoredProcFunctionParams(true, true),
34433443
sp.StoredProcHasOutParams() || sp.ReturnModels.Count == 0,
34443444
sp.WriteStoredProcFunctionOverloadCall(),
34453445
sp.WriteStoredProcFunctionSetSqlParameters(false),
@@ -6547,10 +6547,10 @@
65476547
public string ReturnType { get; } // sp.WriteStoredProcReturnType()
65486548
public string ReturnModelName { get; } // sp.WriteStoredProcReturnModelName()
65496549
public string FunctionName { get; } // sp.WriteStoredProcFunctionName()
6550-
public string WriteStoredProcFunctionParamsFalseTrue { get; } // WriteStoredProcFunctionParams(false, true)
65516550
public string WriteStoredProcFunctionParamsFalseFalse { get; } // WriteStoredProcFunctionParams(false, false)
6552-
public string WriteStoredProcFunctionParamsTrueTrue { get; } // WriteStoredProcFunctionParams(true, true)
6551+
public string WriteStoredProcFunctionParamsFalseTrue { get; } // WriteStoredProcFunctionParams(false, true)
65536552
public string WriteStoredProcFunctionParamsTrueFalse { get; } // WriteStoredProcFunctionParams(true, false)
6553+
public string WriteStoredProcFunctionParamsTrueTrue { get; } // WriteStoredProcFunctionParams(true, true)
65546554
public bool AsyncFunctionCannotBeCreated { get; } // sp.StoredProcHasOutParams() || sp.ReturnModels.Count == 0
65556555
public string WriteStoredProcFunctionOverloadCall { get; } // sp.WriteStoredProcFunctionOverloadCall()
65566556
public string WriteStoredProcFunctionSetSqlParametersFalse { get; } // WriteStoredProcFunctionSetSqlParameters(false)
@@ -6575,10 +6575,10 @@
65756575
string returnType,
65766576
string returnModelName,
65776577
string functionName,
6578-
string writeStoredProcFunctionParamsFalseTrue,
65796578
string writeStoredProcFunctionParamsFalseFalse,
6580-
string writeStoredProcFunctionParamsTrueTrue,
6579+
string writeStoredProcFunctionParamsFalseTrue,
65816580
string writeStoredProcFunctionParamsTrueFalse,
6581+
string writeStoredProcFunctionParamsTrueTrue,
65826582
bool asyncFunctionCannotBeCreated,
65836583
string writeStoredProcFunctionOverloadCall,
65846584
string writeStoredProcFunctionSetSqlParametersFalse,
@@ -6600,10 +6600,10 @@
66006600
ReturnType = returnType;
66016601
ReturnModelName = returnModelName;
66026602
FunctionName = functionName;
6603-
WriteStoredProcFunctionParamsFalseTrue = writeStoredProcFunctionParamsFalseTrue;
66046603
WriteStoredProcFunctionParamsFalseFalse = writeStoredProcFunctionParamsFalseFalse;
6605-
WriteStoredProcFunctionParamsTrueTrue = writeStoredProcFunctionParamsTrueTrue;
6604+
WriteStoredProcFunctionParamsFalseTrue = writeStoredProcFunctionParamsFalseTrue;
66066605
WriteStoredProcFunctionParamsTrueFalse = writeStoredProcFunctionParamsTrueFalse;
6606+
WriteStoredProcFunctionParamsTrueTrue = writeStoredProcFunctionParamsTrueTrue;
66076607
AsyncFunctionCannotBeCreated = asyncFunctionCannotBeCreated;
66086608
WriteStoredProcFunctionOverloadCall = writeStoredProcFunctionOverloadCall;
66096609
WriteStoredProcFunctionSetSqlParametersFalse = writeStoredProcFunctionSetSqlParametersFalse;
@@ -16028,10 +16028,11 @@ SELECT SERVERPROPERTY('Edition') AS Edition,
1602816028

1602916029
public string WriteStoredProcFunctionParams(bool includeProcResult, bool forInterface)
1603016030
{
16031+
var willIncludeProcResult = includeProcResult && ReturnModels.Count > 0 && ReturnModels.First().Count > 0;
1603116032
var sb = new StringBuilder(255);
1603216033
var data = Parameters.Where(x => x.Mode != StoredProcedureParameterMode.Out).OrderBy(x => x.Ordinal).ToList();
1603316034

16034-
var minNullableParameter = WhichTailEndParametersCanBeNullable(data, includeProcResult, forInterface);
16035+
var minNullableParameter = WhichTailEndParametersCanBeNullable(data, willIncludeProcResult, forInterface);
1603516036
if (minNullableParameter == 0)
1603616037
minNullableParameter = 9999;
1603716038

@@ -16050,12 +16051,10 @@ SELECT SERVERPROPERTY('Edition') AS Edition,
1605016051
(notNullable || forInterface || !isInParam || count < minNullableParameter) ? string.Empty : " = null");
1605116052
}
1605216053

16053-
if (includeProcResult && ReturnModels.Count > 0 && ReturnModels.First().Count > 0)
16054-
{
16054+
if (willIncludeProcResult)
1605516055
sb.Append("out int procResult, ");
16056-
}
1605716056

16058-
if(sb.Length > 2)
16057+
if(willIncludeProcResult || sb.Length > 2)
1605916058
sb.Length -= 2;
1606016059

1606116060
return sb.ToString();
@@ -16071,9 +16070,12 @@ SELECT SERVERPROPERTY('Edition') AS Edition,
1607116070
var parameterNumber = dataCount;
1607216071
foreach (var parameter in data.OrderByDescending(x => x.Ordinal))
1607316072
{
16074-
if (parameter.Mode == StoredProcedureParameterMode.InOut)
16073+
if (parameter.Mode == StoredProcedureParameterMode.InOut ||
16074+
Column.StoredProcedureNotNullable.Contains(parameter.PropertyType.ToLower()))
16075+
{
1607516076
return parameterNumber == dataCount ? 0 : parameterNumber + 1;
16076-
16077+
}
16078+
1607716079
--parameterNumber;
1607816080
}
1607916081

Generator.Tests.Unit/StoredProcedureTests.cs

Lines changed: 69 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,7 @@ public void Init()
2222
DbName = "name",
2323
NameHumanCase = "some_sp",
2424
IsStoredProcedure = true,
25-
ReturnModels = new List<List<DataColumn>>
26-
{
27-
new List<DataColumn> { new DataColumn { AllowDBNull = true } }
28-
},
25+
ReturnModels = new List<List<DataColumn>>(),
2926
Parameters = new List<StoredProcedureParameter>
3027
{
3128
new StoredProcedureParameter
@@ -86,12 +83,20 @@ public void ColumnNameForXmlOrJsonReturnType(string exampleServerGenerated, stri
8683
Assert.AreEqual($"public string {expected} {{ get; set; }}", result);
8784
}
8885

89-
[TestCase(false, false, "DateTime? A, out DateTime? B, DateTime? C = null, DateTime? D = null")]
90-
[TestCase(false, true, "DateTime? A, out DateTime? B, DateTime? C, DateTime? D")]
91-
[TestCase(true, false, "DateTime? A, out DateTime? B, DateTime? C, DateTime? D, out int procResult")]
92-
[TestCase(true, true, "DateTime? A, out DateTime? B, DateTime? C, DateTime? D, out int procResult")]
93-
public void WriteStoredProcFunctionParams_HasTailNullable(bool includeProcResult, bool forInterface, string expected)
86+
[TestCase(false, false, false, "DateTime? A, out DateTime? B, DateTime? C = null, DateTime? D = null")]
87+
[TestCase(false, true, false, "DateTime? A, out DateTime? B, DateTime? C, DateTime? D")]
88+
[TestCase(true, false, false, "DateTime? A, out DateTime? B, DateTime? C = null, DateTime? D = null")]
89+
[TestCase(true, true, false, "DateTime? A, out DateTime? B, DateTime? C, DateTime? D")]
90+
[TestCase(false, false, true, "DateTime? A, out DateTime? B, DateTime? C = null, DateTime? D = null")]
91+
[TestCase(false, true, true, "DateTime? A, out DateTime? B, DateTime? C, DateTime? D")]
92+
[TestCase(true, false, true, "DateTime? A, out DateTime? B, DateTime? C, DateTime? D, out int procResult")]
93+
[TestCase(true, true, true, "DateTime? A, out DateTime? B, DateTime? C, DateTime? D, out int procResult")]
94+
public void WriteStoredProcFunctionParams_HasTailNullable(bool includeProcResult, bool forInterface, bool hasReturnModel, string expected)
9495
{
96+
// Arrange
97+
if (hasReturnModel)
98+
_sut.ReturnModels = new List<List<DataColumn>> { new List<DataColumn> { new DataColumn("test")} };
99+
95100
// Act
96101
var result = _sut.WriteStoredProcFunctionParams(includeProcResult, forInterface);
97102

@@ -100,14 +105,21 @@ public void WriteStoredProcFunctionParams_HasTailNullable(bool includeProcResult
100105
Assert.AreEqual(expected, result);
101106
}
102107

103-
[TestCase(false, false, "DateTime? A, out DateTime? B, DateTime? C, out DateTime? D")]
104-
[TestCase(false, true, "DateTime? A, out DateTime? B, DateTime? C, out DateTime? D")]
105-
[TestCase(true, false, "DateTime? A, out DateTime? B, DateTime? C, out DateTime? D, out int procResult")]
106-
[TestCase(true, true, "DateTime? A, out DateTime? B, DateTime? C, out DateTime? D, out int procResult")]
107-
public void WriteStoredProcFunctionParams_NoTailNullable(bool includeProcResult, bool forInterface, string expected)
108+
[TestCase(false, false, false, "DateTime? A, out DateTime? B, DateTime? C, out DateTime? D")]
109+
[TestCase(false, true, false, "DateTime? A, out DateTime? B, DateTime? C, out DateTime? D")]
110+
[TestCase(true, false, false, "DateTime? A, out DateTime? B, DateTime? C, out DateTime? D")]
111+
[TestCase(true, true, false, "DateTime? A, out DateTime? B, DateTime? C, out DateTime? D")]
112+
[TestCase(false, false, true, "DateTime? A, out DateTime? B, DateTime? C, out DateTime? D")]
113+
[TestCase(false, true, true, "DateTime? A, out DateTime? B, DateTime? C, out DateTime? D")]
114+
[TestCase(true, false, true, "DateTime? A, out DateTime? B, DateTime? C, out DateTime? D, out int procResult")]
115+
[TestCase(true, true, true, "DateTime? A, out DateTime? B, DateTime? C, out DateTime? D, out int procResult")]
116+
public void WriteStoredProcFunctionParams_NoTailNullable(bool includeProcResult, bool forInterface, bool hasReturnModel, string expected)
108117
{
109118
// Arrange - Set last to be an 'out' parameter.
110119
_sut.Parameters.Single(x => x.NameHumanCase == "D").Mode = StoredProcedureParameterMode.InOut;
120+
121+
if (hasReturnModel)
122+
_sut.ReturnModels = new List<List<DataColumn>> { new List<DataColumn> { new DataColumn("test")} };
111123

112124
// Act
113125
var result = _sut.WriteStoredProcFunctionParams(includeProcResult, forInterface);
@@ -234,14 +246,51 @@ public void ThisHasMixedOutParameters()
234246
};
235247

236248
// Act
237-
var resultString = _sut.WriteStoredProcFunctionParams(false, false);
238-
var resultTail = _sut.WhichTailEndParametersCanBeNullable(GetParams(), false, false);
249+
var resultStringFf = _sut.WriteStoredProcFunctionParams(false, false);
250+
var resultStringTf = _sut.WriteStoredProcFunctionParams(true, false); // End up being false due to having no ReturnModels
251+
252+
// Assert
253+
Assert.IsNotNull(resultStringFf);
254+
Assert.IsNotNull(resultStringTf);
255+
Assert.AreEqual(resultStringFf, resultStringTf);
256+
Assert.AreEqual("DateTime? foo, out int? firstOutParam, DateTime? bar, out int? secondOutParam, DateTime? baz = null", resultStringTf);
257+
}
258+
259+
[Test]
260+
public void ParameterWithNotNullableType()
261+
{
262+
// Arrange
263+
_sut.Parameters = new List<StoredProcedureParameter>
264+
{
265+
new StoredProcedureParameter
266+
{
267+
Mode = StoredProcedureParameterMode.In,
268+
NameHumanCase = "a",
269+
PropertyType = "int",
270+
Ordinal = 1
271+
},
272+
new StoredProcedureParameter
273+
{
274+
Mode = StoredProcedureParameterMode.In,
275+
NameHumanCase = "type",
276+
PropertyType = "DataTable",
277+
Ordinal = 3
278+
},
279+
new StoredProcedureParameter
280+
{
281+
Mode = StoredProcedureParameterMode.In,
282+
NameHumanCase = "b",
283+
PropertyType = "int",
284+
Ordinal = 5
285+
}
286+
};
287+
288+
// Act
289+
var result = _sut.WriteStoredProcFunctionParams(false, false);
239290

240291
// Assert
241-
Assert.IsNotNull(resultString);
242-
Assert.IsNotNull(resultTail);
243-
Assert.AreEqual(5, resultTail);
244-
Assert.AreEqual("DateTime? foo, out int? firstOutParam, DateTime? bar, out int? secondOutParam, DateTime? baz = null", resultString);
292+
Assert.IsNotNull(result);
293+
Assert.AreEqual("int? a, DataTable type, int? b = null", result);
245294
}
246295

247296
private List<StoredProcedureParameter> GetParams()

Generator/Generators/CodeGenerator.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,10 +54,10 @@ public CodeGenerator(Generator generator, IDbContextFilter filter)
5454
sp.WriteStoredProcReturnType(_filter),
5555
sp.WriteStoredProcReturnModelName(filter),
5656
sp.WriteStoredProcFunctionName(filter),
57-
sp.WriteStoredProcFunctionParams(false, true),
5857
sp.WriteStoredProcFunctionParams(false, false),
59-
sp.WriteStoredProcFunctionParams(true, true),
58+
sp.WriteStoredProcFunctionParams(false, true),
6059
sp.WriteStoredProcFunctionParams(true, false),
60+
sp.WriteStoredProcFunctionParams(true, true),
6161
sp.StoredProcHasOutParams() || sp.ReturnModels.Count == 0,
6262
sp.WriteStoredProcFunctionOverloadCall(),
6363
sp.WriteStoredProcFunctionSetSqlParameters(false),

Generator/Generators/StoredProcTemplateData.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,10 @@ public class StoredProcTemplateData
1010
public string ReturnType { get; } // sp.WriteStoredProcReturnType()
1111
public string ReturnModelName { get; } // sp.WriteStoredProcReturnModelName()
1212
public string FunctionName { get; } // sp.WriteStoredProcFunctionName()
13-
public string WriteStoredProcFunctionParamsFalseTrue { get; } // WriteStoredProcFunctionParams(false, true)
1413
public string WriteStoredProcFunctionParamsFalseFalse { get; } // WriteStoredProcFunctionParams(false, false)
15-
public string WriteStoredProcFunctionParamsTrueTrue { get; } // WriteStoredProcFunctionParams(true, true)
14+
public string WriteStoredProcFunctionParamsFalseTrue { get; } // WriteStoredProcFunctionParams(false, true)
1615
public string WriteStoredProcFunctionParamsTrueFalse { get; } // WriteStoredProcFunctionParams(true, false)
16+
public string WriteStoredProcFunctionParamsTrueTrue { get; } // WriteStoredProcFunctionParams(true, true)
1717
public bool AsyncFunctionCannotBeCreated { get; } // sp.StoredProcHasOutParams() || sp.ReturnModels.Count == 0
1818
public string WriteStoredProcFunctionOverloadCall { get; } // sp.WriteStoredProcFunctionOverloadCall()
1919
public string WriteStoredProcFunctionSetSqlParametersFalse { get; } // WriteStoredProcFunctionSetSqlParameters(false)
@@ -38,10 +38,10 @@ public StoredProcTemplateData(
3838
string returnType,
3939
string returnModelName,
4040
string functionName,
41-
string writeStoredProcFunctionParamsFalseTrue,
4241
string writeStoredProcFunctionParamsFalseFalse,
43-
string writeStoredProcFunctionParamsTrueTrue,
42+
string writeStoredProcFunctionParamsFalseTrue,
4443
string writeStoredProcFunctionParamsTrueFalse,
44+
string writeStoredProcFunctionParamsTrueTrue,
4545
bool asyncFunctionCannotBeCreated,
4646
string writeStoredProcFunctionOverloadCall,
4747
string writeStoredProcFunctionSetSqlParametersFalse,
@@ -63,10 +63,10 @@ public StoredProcTemplateData(
6363
ReturnType = returnType;
6464
ReturnModelName = returnModelName;
6565
FunctionName = functionName;
66-
WriteStoredProcFunctionParamsFalseTrue = writeStoredProcFunctionParamsFalseTrue;
6766
WriteStoredProcFunctionParamsFalseFalse = writeStoredProcFunctionParamsFalseFalse;
68-
WriteStoredProcFunctionParamsTrueTrue = writeStoredProcFunctionParamsTrueTrue;
67+
WriteStoredProcFunctionParamsFalseTrue = writeStoredProcFunctionParamsFalseTrue;
6968
WriteStoredProcFunctionParamsTrueFalse = writeStoredProcFunctionParamsTrueFalse;
69+
WriteStoredProcFunctionParamsTrueTrue = writeStoredProcFunctionParamsTrueTrue;
7070
AsyncFunctionCannotBeCreated = asyncFunctionCannotBeCreated;
7171
WriteStoredProcFunctionOverloadCall = writeStoredProcFunctionOverloadCall;
7272
WriteStoredProcFunctionSetSqlParametersFalse = writeStoredProcFunctionSetSqlParametersFalse;

Generator/StoredProcedure.cs

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -54,10 +54,11 @@ public bool StoredProcHasOutParams()
5454

5555
public string WriteStoredProcFunctionParams(bool includeProcResult, bool forInterface)
5656
{
57+
var willIncludeProcResult = includeProcResult && ReturnModels.Count > 0 && ReturnModels.First().Count > 0;
5758
var sb = new StringBuilder(255);
5859
var data = Parameters.Where(x => x.Mode != StoredProcedureParameterMode.Out).OrderBy(x => x.Ordinal).ToList();
5960

60-
var minNullableParameter = WhichTailEndParametersCanBeNullable(data, includeProcResult, forInterface);
61+
var minNullableParameter = WhichTailEndParametersCanBeNullable(data, willIncludeProcResult, forInterface);
6162
if (minNullableParameter == 0)
6263
minNullableParameter = 9999;
6364

@@ -76,12 +77,10 @@ public string WriteStoredProcFunctionParams(bool includeProcResult, bool forInte
7677
(notNullable || forInterface || !isInParam || count < minNullableParameter) ? string.Empty : " = null");
7778
}
7879

79-
if (includeProcResult && ReturnModels.Count > 0 && ReturnModels.First().Count > 0)
80-
{
80+
if (willIncludeProcResult)
8181
sb.Append("out int procResult, ");
82-
}
8382

84-
if(sb.Length > 2)
83+
if(willIncludeProcResult || sb.Length > 2)
8584
sb.Length -= 2;
8685

8786
return sb.ToString();
@@ -97,9 +96,12 @@ public int WhichTailEndParametersCanBeNullable(List<StoredProcedureParameter> da
9796
var parameterNumber = dataCount;
9897
foreach (var parameter in data.OrderByDescending(x => x.Ordinal))
9998
{
100-
if (parameter.Mode == StoredProcedureParameterMode.InOut)
99+
if (parameter.Mode == StoredProcedureParameterMode.InOut ||
100+
Column.StoredProcedureNotNullable.Contains(parameter.PropertyType.ToLower()))
101+
{
101102
return parameterNumber == dataCount ? 0 : parameterNumber + 1;
102-
103+
}
104+
103105
--parameterNumber;
104106
}
105107

0 commit comments

Comments
 (0)