diff --git a/lib/myxql/client.ex b/lib/myxql/client.ex index d24abd89..85c7235a 100644 --- a/lib/myxql/client.ex +++ b/lib/myxql/client.ex @@ -169,7 +169,7 @@ defmodule MyXQL.Client do timeout, state ) do - case decoder.(payload, rest, decoder_state) do + case decoder.(payload, "", decoder_state) do {:cont, decoder_state} -> recv_packets(rest, decoder, decoder_state, timeout, state) diff --git a/lib/myxql/connection.ex b/lib/myxql/connection.ex index e115bc87..917a4978 100644 --- a/lib/myxql/connection.ex +++ b/lib/myxql/connection.ex @@ -12,6 +12,7 @@ defmodule MyXQL.Connection do defstruct [ :sock, :connection_id, + :query, cursors: %{}, disconnect_on_error_codes: [], ping_timeout: 15_000, @@ -72,6 +73,10 @@ defmodule MyXQL.Connection do end @impl true + # def handle_prepare(query, opts, %{query: %Query{}} = state) do + # {:ok, query, state} + # end + def handle_prepare(query, opts, state) do query = if state.prepare == :unnamed, do: %{query | name: ""}, else: query diff --git a/mix.exs b/mix.exs index 5c032b29..ea4bf1e1 100644 --- a/mix.exs +++ b/mix.exs @@ -15,10 +15,14 @@ defmodule MyXQL.MixProject do source_url: @source_url, package: package(), docs: docs(), + elixirc_paths: elixirc_paths(Mix.env()), deps: deps() ] end + defp elixirc_paths(:test), do: ["lib", "test/support"] + defp elixirc_paths(_), do: ["lib"] + def application() do [ extra_applications: extra_applications(Mix.env()) @@ -51,7 +55,8 @@ defmodule MyXQL.MixProject do {:binpp, ">= 0.0.0", only: [:dev, :test]}, {:dialyxir, "~> 1.0-rc", only: :dev, runtime: false}, {:ex_doc, ">= 0.0.0", only: :dev, runtime: false}, - {:benchee, ">= 0.0.0", only: :dev, runtime: false} + {:benchee, ">= 0.0.0", only: :dev, runtime: false}, + {:mariaex, github: "wojtekmach/mariaex", branch: "wm-excludes", only: [:dev, :test]} ] end diff --git a/test/mariaex_test.exs b/test/mariaex_test.exs new file mode 100644 index 00000000..d9f65555 --- /dev/null +++ b/test/mariaex_test.exs @@ -0,0 +1 @@ +Support.MariaexTests.load_tests_if_enabled() diff --git a/test/support/mariaex_tests.ex b/test/support/mariaex_tests.ex new file mode 100644 index 00000000..983c529a --- /dev/null +++ b/test/support/mariaex_tests.ex @@ -0,0 +1,134 @@ +defmodule Support.MariaexTests do + def myxql_to_mariaex(%MyXQL.Query{} = query) do + map = query |> Map.from_struct() |> Map.drop([:cache, :statement_id]) + struct!(Mariaex.Query, map) + end + + def myxql_to_mariaex(%MyXQL.Result{} = result) do + map = result |> Map.from_struct() |> Map.drop([:num_warnings]) + struct!(Mariaex.Result, map) + end + + def myxql_to_mariaex(%MyXQL.Error{} = error) do + map = error |> Map.from_struct() |> Map.drop([:mysql, :statement]) + struct!(Mariaex.Error, map) + end + + def myxql_to_mariaex(tuple) when is_tuple(tuple), do: myxql_to_mariaex_tuple(tuple) + def myxql_to_mariaex(other), do: other + + defp myxql_to_mariaex_tuple(tuple) do + tuple + |> Tuple.to_list() + |> myxql_to_mariaex_list([]) + |> List.to_tuple() + end + + defp myxql_to_mariaex_list([head | tail], acc) do + myxql_to_mariaex_list(tail, [myxql_to_mariaex(head) | acc]) + end + + defp myxql_to_mariaex_list([], acc), do: Enum.reverse(acc) + + def mariaex_to_myxql(%Mariaex.Query{} = query) do + map = query |> Map.from_struct() |> Map.drop([:binary_as, :reserved?, :type]) + struct!(MyXQL.Query, map) + end + + def mariaex_to_myxql(other), do: other + + def mariaex_path() do + Mix.Project.deps_paths()[:mariaex] + end + + def enabled?() do + System.get_env("MARIAEX") == "true" + end + + def load_test_helper_if_enabled() do + if enabled?() do + Code.require_file(Path.join([mariaex_path(), "test", "test_helper.exs"])) + exclude = ExUnit.configuration()[:exclude] + + extra_exclude = [ + connection_opts: [datetime: :tuples], + bits: true, + include_table_name: true, + stream_text: true, + geometry: true, + coder: true + ] + + ExUnit.configure(exclude: exclude ++ extra_exclude) + end + end + + def load_tests_if_enabled() do + if enabled?() do + test_files = + [mariaex_path(), "test", "**/*_test.exs"] + |> Path.join() + |> Path.wildcard() + + for path <- test_files do + Code.require_file(path) + end + end + end +end + +defmodule Mariaex do + import Support.MariaexTests, only: [myxql_to_mariaex: 1, mariaex_to_myxql: 1] + + defdelegate start_link(options), to: MyXQL + + defdelegate transaction(conn, fun), to: MyXQL + + def query(conn, statement, params \\ [], opts \\ []) do + opts = Keyword.put_new(opts, :query_type, :binary_then_text) + + MyXQL.query(conn, statement, params, opts) + |> myxql_to_mariaex() + end + + def query!(conn, statement, params \\ [], opts \\ []) do + opts = Keyword.put_new(opts, :query_type, :binary_then_text) + + MyXQL.query!(conn, statement, params, opts) + |> myxql_to_mariaex() + end + + def prepare(conn, name, statement, opts \\ []) do + MyXQL.prepare(conn, name, statement, opts) + |> myxql_to_mariaex() + end + + def prepare!(conn, name, statement, opts \\ []) do + MyXQL.prepare!(conn, name, statement, opts) + |> myxql_to_mariaex() + end + + def prepare_execute(conn, name, statement, params \\ [], opts \\ []) do + MyXQL.prepare_execute(conn, name, statement, params, opts) + |> myxql_to_mariaex() + end + + def close(conn, query, opts \\ []) do + MyXQL.close(conn, mariaex_to_myxql(query), opts) + end + + def execute(conn, query, params \\ [], opts \\ []) do + MyXQL.execute(conn, mariaex_to_myxql(query), params, opts) + |> myxql_to_mariaex() + end + + def execute!(conn, query, params \\ [], opts \\ []) do + MyXQL.execute!(conn, mariaex_to_myxql(query), params, opts) + |> myxql_to_mariaex() + end + + def stream(conn, query, params \\ [], opts \\ []) do + MyXQL.stream(conn, mariaex_to_myxql(query), params, opts) + |> Stream.map(&myxql_to_mariaex/1) + end +end diff --git a/test/test_helper.exs b/test/test_helper.exs index 4d7c37cd..12e523be 100644 --- a/test/test_helper.exs +++ b/test/test_helper.exs @@ -233,4 +233,6 @@ defmodule TestHelper do end TestHelper.setup_server() -ExUnit.start(exclude: TestHelper.excludes()) +ExUnit.configure(exclude: TestHelper.excludes()) +Support.MariaexTests.load_test_helper_if_enabled() +ExUnit.start()