@@ -22,7 +22,9 @@ public string Build()
2222 stringBuilder . Append ( $@ "using System;
2323using System.Collections.ObjectModel;
2424using System.Data;
25+ using System.Data.Common;
2526using System.Threading;
27+ using System.Threading.Tasks;
2628using Foundation.Assertions;
2729using Foundation.Data;
2830using Foundation.Data.SqlClient;
@@ -57,9 +59,15 @@ private string GetHandlerClass()
5759 stringBuilder . Append ( " }\r \n \r \n " ) ;
5860 stringBuilder . Append ( GetHandleQueryMethod ( ) . Indent ( 1 ) ) ;
5961 stringBuilder . Append ( "\r \n \r \n " ) ;
60- stringBuilder . Append ( GetCreateParametersMethod ( ) . Indent ( 1 ) ) ;
62+ stringBuilder . Append ( GetHandleQueryAsyncMethod ( ) . Indent ( 1 ) ) ;
6163 stringBuilder . Append ( "\r \n \r \n " ) ;
62- stringBuilder . Append ( GetHandleRequestMethod ( ) . Indent ( 1 ) ) ;
64+ stringBuilder . Append ( GetToExecuteReaderRequestMethod ( ) . Indent ( 1 ) ) ;
65+ stringBuilder . Append ( "\r \n \r \n " ) ;
66+ stringBuilder . Append ( GetToParametersMethod ( ) . Indent ( 1 ) ) ;
67+ stringBuilder . Append ( "\r \n \r \n " ) ;
68+ stringBuilder . Append ( GetExecuteReaderMethod ( ) . Indent ( 1 ) ) ;
69+ stringBuilder . Append ( "\r \n \r \n " ) ;
70+ stringBuilder . Append ( GetExecuteReaderAsyncMethod ( ) . Indent ( 1 ) ) ;
6371 stringBuilder . Append ( "\r \n \r \n " ) ;
6472
6573 var sequence = new Sequence ( ) ;
@@ -82,24 +90,44 @@ private string GetHandlerClass()
8290 private string GetHandleQueryMethod ( )
8391 {
8492 var stringBuilder = new StringBuilder ( ) ;
85-
8693 stringBuilder . Append ( $@ "public { _query . Name } QueryResult Handle({ _query . Name } Query query)
8794{{
8895 Assert.IsNotNull(query);
89- var parameters = CreateParameters(query);
96+ var request = ToExecuteReaderRequest(query, CancellationToken.None);
97+ return ExecuteReader(request);
98+ }}" ) ;
99+ return stringBuilder . ToString ( ) ;
100+ }
101+
102+ private string GetHandleQueryAsyncMethod ( )
103+ {
104+ var stringBuilder = new StringBuilder ( ) ;
105+ stringBuilder . Append ( $@ "public Task<{ _query . Name } QueryResult> HandleAsync({ _query . Name } Query query, CancellationToken cancellationToken)
106+ {{
107+ Assert.IsNotNull(query);
108+ var request = ToExecuteReaderRequest(query, cancellationToken);
109+ return ExecuteReaderAsync(request);
110+ }}" ) ;
111+ return stringBuilder . ToString ( ) ;
112+ }
113+
114+ private string GetToExecuteReaderRequestMethod ( )
115+ {
116+ var stringBuilder = new StringBuilder ( ) ;
117+ stringBuilder . Append ( $@ "private ExecuteReaderRequest ToExecuteReaderRequest({ _query . Name } Query query, CancellationToken cancellationToken)
118+ {{
119+ var parameters = ToParameters(query);
90120 const int commandTimeout = 0;
91121 var createCommandRequest = new CreateCommandRequest(CommandText, parameters, CommandType.Text, commandTimeout, _transaction);
92- var executeReaderRequest = new ExecuteReaderRequest(createCommandRequest, CommandBehavior.Default, CancellationToken.None);
93- return Handle(executeReaderRequest);
122+ return new ExecuteReaderRequest(createCommandRequest, CommandBehavior.Default, cancellationToken);
94123}}" ) ;
95-
96124 return stringBuilder . ToString ( ) ;
97125 }
98126
99- private string GetCreateParametersMethod ( )
127+ private string GetToParametersMethod ( )
100128 {
101129 var stringBuilder = new StringBuilder ( ) ;
102- stringBuilder . Append ( $ "private static ReadOnlyCollection<object> CreateParameters ({ _query . Name } Query query)\r \n ") ;
130+ stringBuilder . Append ( $ "private static ReadOnlyCollection<object> ToParameters ({ _query . Name } Query query)\r \n ") ;
103131 stringBuilder . Append ( "{\r \n " ) ;
104132 stringBuilder . Append ( " var parameters = new SqlParameterCollectionBuilder();\r \n " ) ;
105133
@@ -115,11 +143,10 @@ private string GetCreateParametersMethod()
115143 return stringBuilder . ToString ( ) ;
116144 }
117145
118- private string GetHandleRequestMethod ( )
146+ private string GetExecuteReaderMethod ( )
119147 {
120148 var stringBuilder = new StringBuilder ( ) ;
121-
122- stringBuilder . Append ( $@ "private { _query . Name } QueryResult Handle(ExecuteReaderRequest request)
149+ stringBuilder . Append ( $@ "private { _query . Name } QueryResult ExecuteReader(ExecuteReaderRequest request)
123150{{
124151 { _query . Name } QueryResult result = null;
125152 var executor = _connection.CreateCommandExecutor();
@@ -158,6 +185,40 @@ private string GetHandleRequestMethod()
158185 return stringBuilder . ToString ( ) ;
159186 }
160187
188+ private string GetExecuteReaderAsyncMethod ( )
189+ {
190+ var stringBuilder = new StringBuilder ( ) ;
191+ stringBuilder . Append ( $@ "private async Task<{ _query . Name } QueryResult> ExecuteReaderAsync(ExecuteReaderRequest request)
192+ {{
193+ { _query . Name } QueryResult result = null;
194+ var connection = (DbConnection) _connection;
195+ var executor = connection.CreateCommandAsyncExecutor();
196+ await executor.ExecuteReaderAsync(request, async dataReader =>
197+ {{
198+ { GetExecuteReaderAsyncMethodFragment ( ) . Indent ( 2 ) }
199+ }});
200+
201+ return result;
202+ }}" ) ;
203+ return stringBuilder . ToString ( ) ;
204+ }
205+
206+ private string GetExecuteReaderAsyncMethodFragment ( )
207+ {
208+ var stringBuilder = new StringBuilder ( ) ;
209+ var sequence = new Sequence ( ) ;
210+ foreach ( var result in _query . Results )
211+ {
212+ var next = sequence . Next ( ) == 0 ? null : "Next" ;
213+ stringBuilder . Append ( $ "var { ToLower ( result . Name ) } = (await dataReader.Read{ next } ResultAsync(Read{ result . Name } , request.CancellationToken)).AsReadOnly();\r \n ") ;
214+ }
215+
216+ stringBuilder . Append ( $ "result = new { _query . Name } QueryResult({ GetResultVariableNames ( ) } );") ;
217+ return stringBuilder . ToString ( ) ;
218+ }
219+
220+ private string GetResultVariableNames ( ) => string . Join ( ", " , _query . Results . Select ( i => ToLower ( i . Name ) ) ) ;
221+
161222 private string GetRecordClasses ( )
162223 {
163224 var stringBuilder = new StringBuilder ( ) ;
0 commit comments