11using Microsoft . CodeAnalysis . CSharp . Syntax ;
22using Plugin ;
3+ using System . Linq ;
34using static Microsoft . CodeAnalysis . CSharp . SyntaxFactory ;
45
56namespace SqlcGenCsharp . Drivers . Generators ;
@@ -21,42 +22,92 @@ public MemberDeclarationSyntax Generate(string queryTextConstant, string argInte
2122
2223 private string GetMethodBody ( string queryTextConstant , Query query )
2324 {
24- var ( establishConnection , connectionOpen ) = dbDriver . EstablishConnection ( query ) ;
2525 var sqlTextTransform = CommonGen . GetSqlTransformations ( query , queryTextConstant ) ;
26- connectionOpen = connectionOpen . AppendSemicolonUnlessEmpty ( ) ;
27- return dbDriver . Options . UseDapper ? GetAsDapper ( ) : GetAsDriver ( ) ;
28-
29- string GetAsDapper ( )
30- {
31- var dapperParamsSection = CommonGen . ConstructDapperParamsDict ( query . Params ) ;
32- var dapperArgs = dapperParamsSection == string . Empty
33- ? string . Empty
34- : $ ", { Variable . QueryParams . AsVarName ( ) } ";
35- return $$ """
36- using ({{ establishConnection }} )
37- {{{sqlTextTransform}}{{ dapperParamsSection }}
38- return await {{ Variable . Connection . AsVarName ( ) }} .QuerySingleAsync<{{ dbDriver . GetIdColumnType ( query ) }} >({{ queryTextConstant }} {{ dapperArgs }} );
39- }
40- """ ;
41- }
42-
43- string GetAsDriver ( )
44- {
45- var sqlTextVar = sqlTextTransform == string . Empty ? queryTextConstant : Variable . TransformedSql . AsVarName ( ) ;
46- var createSqlCommand = dbDriver . CreateSqlCommand ( sqlTextVar ) ;
47- var commandParameters = CommonGen . AddParametersToCommand ( query . Params ) ;
48- var returnLastId = ( ( IExecLastId ) dbDriver ) . GetLastIdStatement ( query ) . JoinByNewLine ( ) ;
49- return $$ """
50- using ({{ establishConnection }} )
51- {
52- {{ connectionOpen }} {{ sqlTextTransform }}
53- using ({{ createSqlCommand }} )
54- {
26+ var useDapper = dbDriver . Options . UseDapper ;
27+
28+ var dapperParams = useDapper ? CommonGen . ConstructDapperParamsDict ( query . Params ) : string . Empty ;
29+ var sqlVar = sqlTextTransform != string . Empty ? Variable . TransformedSql . AsVarName ( ) : queryTextConstant ;
30+ var transactionProperty = Variable . Transaction . AsPropertyName ( ) ;
31+
32+ var noTxBody = useDapper ? GetDapperNoTxBody ( sqlVar , query ) : GetDriverNoTxBody ( sqlVar , query ) ;
33+ var withTxBody = useDapper ? GetDapperWithTxBody ( sqlVar , query ) : GetDriverWithTxBody ( sqlVar , query ) ;
34+
35+ return $$ """
36+ {{ sqlTextTransform }}
37+ {{ dapperParams }}
38+ if (this.{{ transactionProperty }} == null)
39+ {
40+ {{ noTxBody }}
41+ }
42+ {{ withTxBody }}
43+ """ ;
44+ }
45+
46+ private string GetDapperNoTxBody ( string sqlVar , Query query )
47+ {
48+ var ( establishConnection , _) = dbDriver . EstablishConnection ( query ) ;
49+ var dapperArgs = query . Params . Any ( ) ? $ ", { Variable . QueryParams . AsVarName ( ) } " : string . Empty ;
50+ return $$ """
51+ using ({{ establishConnection }} )
52+ {
53+ return await {{ Variable . Connection . AsVarName ( ) }} .QuerySingleAsync<{{ dbDriver . GetIdColumnType ( query ) }} >({{ sqlVar }} {{ dapperArgs }} );
54+ }
55+ """ ;
56+ }
57+
58+ private string GetDapperWithTxBody ( string sqlVar , Query query )
59+ {
60+ var transactionProperty = Variable . Transaction . AsPropertyName ( ) ;
61+ var dapperArgs = query . Params . Any ( ) ? $ ", { Variable . QueryParams . AsVarName ( ) } " : string . Empty ;
62+ return $$ """
63+ if (this.{{ transactionProperty }} ?.Connection == null || this.{{ transactionProperty }} ?.Connection.State != System.Data.ConnectionState.Open)
64+ {
65+ throw new System.InvalidOperationException("Transaction is provided, but its connection is null.");
66+ }
67+
68+ return await this.{{ transactionProperty }} .Connection.QuerySingleAsync<{{ dbDriver . GetIdColumnType ( query ) }} >({{ sqlVar }} {{ dapperArgs }} , transaction: this.{{ transactionProperty }} );
69+ """ ;
70+ }
71+
72+ private string GetDriverNoTxBody ( string sqlVar , Query query )
73+ {
74+ var ( establishConnection , connectionOpen ) = dbDriver . EstablishConnection ( query ) ;
75+ var createSqlCommand = dbDriver . CreateSqlCommand ( sqlVar ) ;
76+ var commandParameters = CommonGen . AddParametersToCommand ( query . Params ) ;
77+ var returnLastId = ( ( IExecLastId ) dbDriver ) . GetLastIdStatement ( query ) . JoinByNewLine ( ) ;
78+ return $$ """
79+ using ({{ establishConnection }} )
80+ {
81+ {{ connectionOpen . AppendSemicolonUnlessEmpty ( ) }}
82+ using ({{ createSqlCommand }} )
83+ {
5584 {{ commandParameters }}
5685 {{ returnLastId }}
57- }
58- }
59- """ ;
60- }
86+ }
87+ }
88+ """ ;
89+ }
90+
91+ private string GetDriverWithTxBody ( string sqlVar , Query query )
92+ {
93+ var transactionProperty = Variable . Transaction . AsPropertyName ( ) ;
94+ var commandVar = Variable . Command . AsVarName ( ) ;
95+ var commandParameters = CommonGen . AddParametersToCommand ( query . Params ) ;
96+ var returnLastId = ( ( IExecLastId ) dbDriver ) . GetLastIdStatement ( query ) . JoinByNewLine ( ) ;
97+
98+ return $$ """
99+ if (this.{{ transactionProperty }} ?.Connection == null || this.{{ transactionProperty }} ?.Connection.State != System.Data.ConnectionState.Open)
100+ {
101+ throw new System.InvalidOperationException("Transaction is provided, but its connection is null.");
102+ }
103+
104+ using (var {{ commandVar }} = this.{{ transactionProperty }} .Connection.CreateCommand())
105+ {
106+ {{ commandVar }} .CommandText = {{ sqlVar }} ;
107+ {{ commandVar }} .Transaction = this.{{ transactionProperty }} ;
108+ {{ commandParameters }}
109+ {{ returnLastId }}
110+ }
111+ """ ;
61112 }
62113}
0 commit comments