Skip to content

Commit f40b57b

Browse files
committed
Merge close and prepare statement packets in unnamed mode
This removes one roundtrip to the database.
1 parent 2c1a2a8 commit f40b57b

File tree

2 files changed

+38
-15
lines changed

2 files changed

+38
-15
lines changed

lib/myxql/client.ex

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,16 @@ defmodule MyXQL.Client do
114114
end
115115
end
116116

117+
def com_stmt_close_prepare(client, statement, close_statement_id) do
118+
with :ok <-
119+
send_com(client, [
120+
{:com_stmt_close, close_statement_id},
121+
{:com_stmt_prepare, statement}
122+
]) do
123+
recv_packets(client, &decode_com_stmt_prepare_response/3, :initial)
124+
end
125+
end
126+
117127
def com_stmt_execute(client, statement_id, params, cursor_type) do
118128
with :ok <- send_com(client, {:com_stmt_execute, statement_id, params, cursor_type}) do
119129
recv_packets(client, &decode_com_stmt_execute_response/3, :initial)
@@ -142,6 +152,19 @@ defmodule MyXQL.Client do
142152
:ok
143153
end
144154

155+
def send_com(client, coms) when is_list(coms) do
156+
sequence_num = 0
157+
158+
payload =
159+
Enum.reduce(
160+
coms,
161+
[],
162+
&[&2 | encode_packet(encode_com(&1), sequence_num, @default_max_packet_size)]
163+
)
164+
165+
send_data(client, payload)
166+
end
167+
145168
def send_com(client, com) do
146169
payload = encode_com(com)
147170
send_packet(client, payload, 0)

lib/myxql/connection.ex

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -77,8 +77,6 @@ defmodule MyXQL.Connection do
7777
if cached_query = queries_get(state, query) do
7878
{:ok, cached_query, %{state | last_query: cached_query}}
7979
else
80-
state = maybe_close(query, state)
81-
8280
case prepare(query, state) do
8381
{:ok, query, state} ->
8482
{:ok, query, state}
@@ -99,8 +97,6 @@ defmodule MyXQL.Connection do
9997

10098
@impl true
10199
def handle_execute(%Query{} = query, params, _opts, state) do
102-
state = maybe_close(query, state)
103-
104100
with {:ok, query, state} <- maybe_reprepare(query, state),
105101
result =
106102
Client.com_stmt_execute(
@@ -464,8 +460,8 @@ defmodule MyXQL.Connection do
464460
defp cache_key(%MyXQL.Query{cache: :reference, ref: ref}), do: ref
465461
defp cache_key(%MyXQL.Query{cache: :statement, statement: statement}), do: statement
466462

467-
defp prepare(%Query{ref: ref, statement: statement} = query, state) when is_reference(ref) do
468-
case Client.com_stmt_prepare(state.client, statement) do
463+
defp prepare(%Query{ref: ref} = query, state) when is_reference(ref) do
464+
case prepare_maybe_close(query, state) do
469465
{:ok, com_stmt_prepare_ok(statement_id: statement_id, num_params: num_params)} ->
470466
query = %{query | num_params: num_params, statement_id: statement_id}
471467
queries_put(state, query)
@@ -476,6 +472,19 @@ defmodule MyXQL.Connection do
476472
end
477473
end
478474

475+
def prepare_maybe_close(
476+
%{ref: newref} = query,
477+
%{prepare: :unnamed, last_query: %{ref: oldref} = last_query} = state
478+
)
479+
when last_query != nil and oldref != newref do
480+
queries_delete(state, state.last_query)
481+
Client.com_stmt_close_prepare(state.client, query.statement, last_query.statement_id)
482+
end
483+
484+
def prepare_maybe_close(query, state) do
485+
Client.com_stmt_prepare(state.client, query.statement)
486+
end
487+
479488
defp maybe_reprepare(%{ref: ref}, %{last_query: %{ref: ref}} = state) do
480489
{:ok, state.last_query, state}
481490
end
@@ -494,15 +503,6 @@ defmodule MyXQL.Connection do
494503
end
495504
end
496505

497-
defp maybe_close(%{ref: ref}, %{last_query: %{ref: ref}} = state), do: state
498-
499-
defp maybe_close(_query, %{prepare: :unnamed, last_query: last_query} = state)
500-
when last_query != nil do
501-
close(last_query, state)
502-
end
503-
504-
defp maybe_close(_query, state), do: state
505-
506506
defp close(query, state) do
507507
:ok = Client.com_stmt_close(state.client, query.statement_id)
508508
queries_delete(state, query)

0 commit comments

Comments
 (0)