1818
1919import java .util .ArrayList ;
2020import java .util .Arrays ;
21+ import java .util .HashMap ;
2122import java .util .List ;
23+ import java .util .Map ;
2224import org .mariadb .r2dbc .api .MariadbStatement ;
2325import org .mariadb .r2dbc .client .Client ;
2426import org .mariadb .r2dbc .client .DecoderState ;
@@ -40,8 +42,8 @@ final class MariadbServerParameterizedQueryStatement implements MariadbStatement
4042 private final Client client ;
4143 private final String sql ;
4244 private final MariadbConnectionConfiguration configuration ;
43- private List < Parameter <?>> parameters ;
44- private List <List < Parameter <?>>> batchingParameters ;
45+ private Map < Integer , Parameter <?>> parameters ;
46+ private List <Map < Integer , Parameter <?>>> batchingParameters ;
4547 private String [] generatedColumns ;
4648 private ServerPrepareResult prepareResult ;
4749
@@ -50,7 +52,7 @@ final class MariadbServerParameterizedQueryStatement implements MariadbStatement
5052 this .client = client ;
5153 this .configuration = configuration ;
5254 this .sql = Assert .requireNonNull (sql , "sql must not be null" );
53- this .parameters = new ArrayList <>();
55+ this .parameters = new HashMap <>();
5456 this .prepareResult = client .getPrepareCache ().get (sql );
5557 }
5658
@@ -72,7 +74,7 @@ public MariadbServerParameterizedQueryStatement add() {
7274 }
7375 if (batchingParameters == null ) batchingParameters = new ArrayList <>();
7476 batchingParameters .add (parameters );
75- parameters = new ArrayList <>(prepareResult . getNumParams () );
77+ parameters = new HashMap <>();
7678 return this ;
7779 }
7880
@@ -96,7 +98,8 @@ public MariadbServerParameterizedQueryStatement bind(int index, @Nullable Object
9698
9799 for (Codec <?> codec : Codecs .LIST ) {
98100 if (codec .canEncode (value )) {
99- parameters .add (index , (Parameter <?>) new Parameter (codec , value ));
101+
102+ parameters .put (index , (Parameter <?>) new Parameter (codec , value ));
100103 return this ;
101104 }
102105 }
@@ -121,7 +124,7 @@ public MariadbServerParameterizedQueryStatement bindNull(int index, @Nullable Cl
121124 prepareResult .getNumParams () - 1 , index ));
122125 }
123126
124- parameters .add (index , Parameter .NULL_PARAMETER );
127+ parameters .put (index , Parameter .NULL_PARAMETER );
125128 return this ;
126129 }
127130
@@ -157,41 +160,39 @@ public Flux<org.mariadb.r2dbc.api.MariadbResult> execute() {
157160 sendPrepare ().block ();
158161 }
159162 }
163+ Flux <ServerMessage > fluxMsg =
164+ this .client .sendCommand (
165+ new ExecutePacket (prepareResult .getStatementId (), this .batchingParameters .get (0 )));
166+ int index = 1 ;
167+ while (index < this .batchingParameters .size ()) {
168+ fluxMsg =
169+ fluxMsg .concatWith (
170+ this .client .sendCommand (
171+ new ExecutePacket (
172+ prepareResult .getStatementId (), this .batchingParameters .get (index ++))));
173+ }
174+ fluxMsg =
175+ fluxMsg .concatWith (
176+ Flux .create (
177+ sink -> {
178+ prepareResult .decrementUse (client );
179+ sink .complete ();
180+ }));
160181
161- Flux <Flux <ServerMessage >> fluxMsg =
162- Flux .create (
163- sink -> {
164- for (List <Parameter <?>> parameters : this .batchingParameters ) {
165- Flux <ServerMessage > in =
166- this .client .sendCommand (
167- new ExecutePacket (
168- prepareResult != null ? prepareResult .getStatementId () : -1 ,
169- parameters ));
170- sink .next (in );
171- in .subscribe ();
172- }
173- sink .complete ();
174- });
175-
176- Flux <org .mariadb .r2dbc .api .MariadbResult > f =
177- fluxMsg
178- .flatMap (Flux ::from )
179- .windowUntil (it -> it .resultSetEnd ())
180- .map (
181- dataRow ->
182- new MariadbResult (
183- true ,
184- dataRow ,
185- ExceptionFactory .INSTANCE ,
186- null ,
187- client .getVersion ().isMariaDBServer ()
188- && client .getVersion ().versionGreaterOrEqual (10 , 5 , 1 )));
189- return f .concatWith (
190- Flux .create (
191- sink -> {
192- prepareResult .decrementUse (client );
193- sink .complete ();
194- }));
182+ this .batchingParameters .clear ();
183+ this .parameters = new HashMap <>();
184+
185+ return fluxMsg
186+ .windowUntil (it -> it .resultSetEnd ())
187+ .map (
188+ dataRow ->
189+ new MariadbResult (
190+ false ,
191+ dataRow ,
192+ ExceptionFactory .INSTANCE ,
193+ null ,
194+ client .getVersion ().isMariaDBServer ()
195+ && client .getVersion ().versionGreaterOrEqual (10 , 5 , 1 )));
195196 }
196197 }
197198
@@ -216,7 +217,7 @@ public MariadbServerParameterizedQueryStatement returnGeneratedValues(String...
216217 }
217218
218219 private Flux <org .mariadb .r2dbc .api .MariadbResult > execute (
219- String sql , List < Parameter <?>> parameters , String [] generatedColumns ) {
220+ String sql , Map < Integer , Parameter <?>> parameters , String [] generatedColumns ) {
220221 ExceptionFactory factory = ExceptionFactory .withSql (sql );
221222
222223 if (prepareResult == null && client .getPrepareCache () != null ) {
@@ -270,7 +271,7 @@ private Flux<org.mariadb.r2dbc.api.MariadbResult> execute(
270271 }
271272
272273 private Flux <org .mariadb .r2dbc .api .MariadbResult > sendPrepareAndExecute (
273- ExceptionFactory factory , List < Parameter <?>> parameters , String [] generatedColumns ) {
274+ ExceptionFactory factory , Map < Integer , Parameter <?>> parameters , String [] generatedColumns ) {
274275 return this .client
275276 .sendCommand (new PreparePacket (sql ), new ExecutePacket (-1 , parameters ))
276277 .windowUntil (it -> it .resultSetEnd ())
@@ -311,7 +312,7 @@ private Mono<ServerPrepareResult> sendPrepare() {
311312 };
312313
313314 private Flux <org .mariadb .r2dbc .api .MariadbResult > sendExecuteCmd (
314- ExceptionFactory factory , List < Parameter <?>> parameters , String [] generatedColumns ) {
315+ ExceptionFactory factory , Map < Integer , Parameter <?>> parameters , String [] generatedColumns ) {
315316 return this .client
316317 .sendCommand (
317318 new ExecutePacket (
0 commit comments