@@ -13,7 +13,7 @@ defmodule MyXQL.Connection do
13
13
prepare: :named ,
14
14
queries: nil ,
15
15
transaction_status: :idle ,
16
- last_ref : nil
16
+ last_query : nil
17
17
]
18
18
19
19
@ impl true
@@ -29,7 +29,7 @@ defmodule MyXQL.Connection do
29
29
prepare: prepare ,
30
30
disconnect_on_error_codes: Keyword . fetch! ( opts , :disconnect_on_error_codes ) ,
31
31
ping_timeout: ping_timeout ,
32
- queries: queries_new ( )
32
+ queries: queries_new ( prepare )
33
33
}
34
34
35
35
{ :ok , state }
@@ -64,7 +64,8 @@ defmodule MyXQL.Connection do
64
64
query = rename_query ( state , query )
65
65
66
66
if cached_query = queries_get ( state , query ) do
67
- { :ok , cached_query , % { state | last_ref: cached_query . ref } }
67
+ % { ref: ref , statement_id: statement_id } = cached_query
68
+ { :ok , cached_query , % { state | last_query: { ref , statement_id } } }
68
69
else
69
70
case prepare ( query , state ) do
70
71
{ :ok , _ , _ } = ok ->
@@ -469,14 +470,21 @@ defmodule MyXQL.Connection do
469
470
ref = make_ref ( )
470
471
query = % { query | num_params: num_params , statement_id: statement_id , ref: ref }
471
472
queries_put ( state , query )
472
- { :ok , query , % { state | last_ref: ref } }
473
+ { :ok , query , % { state | last_query: { ref , statement_id } } }
473
474
474
475
result ->
475
476
result ( result , query , state )
476
477
end
477
478
end
478
479
479
- defp maybe_reprepare ( % { ref: ref } = query , % { last_ref: ref } = state ) , do: { :ok , query , state }
480
+ defp maybe_reprepare ( % { ref: ref } = query , % { last_query: { ref , _statement_id } } = state ) do
481
+ { :ok , query , state }
482
+ end
483
+
484
+ defp maybe_reprepare ( query , % { queries: nil , last_query: { _ref , statement_id } } = state ) do
485
+ Client . com_stmt_close ( state . client , statement_id )
486
+ prepare ( query , state )
487
+ end
480
488
481
489
defp maybe_reprepare ( query , state ) do
482
490
if query_member? ( state , query ) do
@@ -490,12 +498,16 @@ defmodule MyXQL.Connection do
490
498
% { state | cursors: Map . delete ( state . cursors , cursor . ref ) }
491
499
end
492
500
493
- # Close unnamed queries after executing them
501
+ # When prepare is :named, close unnamed queries after executing them.
502
+ # When prepare is :unnamed, queries will be closed the next time a
503
+ # query is prepared or a different query is executed. This allows us
504
+ # to re-execute the same unnamed query without preparing it again.
505
+ defp maybe_close ( _query , % { queries: nil } = state ) , do: { :ok , state }
494
506
defp maybe_close ( % { name: "" } = query , state ) , do: close ( query , state )
495
507
defp maybe_close ( _query , state ) , do: { :ok , state }
496
508
497
- defp close ( % { ref: ref } = query , % { last_ref: ref } = state ) do
498
- close ( query , % { state | last_ref : nil } )
509
+ defp close ( % { ref: ref } = query , % { last_query: { ref , _statement_id } } = state ) do
510
+ close ( query , % { state | last_query : nil } )
499
511
end
500
512
501
513
defp close ( query , state ) do
@@ -516,7 +528,8 @@ defmodule MyXQL.Connection do
516
528
517
529
## Cache query handling
518
530
519
- defp queries_new ( ) , do: :ets . new ( __MODULE__ , [ :set , :public ] )
531
+ defp queries_new ( :unnamed ) , do: nil
532
+ defp queries_new ( _ ) , do: :ets . new ( __MODULE__ , [ :set , :public ] )
520
533
521
534
defp queries_put ( % { queries: nil } , _ ) , do: :ok
522
535
defp queries_put ( _state , % { name: "" } ) , do: :ok
@@ -570,7 +583,11 @@ defmodule MyXQL.Connection do
570
583
end
571
584
end
572
585
573
- defp queries_get ( % { queries: nil } , _ ) , do: nil
586
+ defp queries_get ( % { queries: nil , last_query: { _ref , statement_id } } = state , _query ) do
587
+ Client . com_stmt_close ( state . client , statement_id )
588
+ nil
589
+ end
590
+
574
591
defp queries_get ( _state , % { name: "" } ) , do: nil
575
592
576
593
defp queries_get ( state , % { cache: :reference , name: name } ) do
0 commit comments