defmodule NewRelic.Telemetry.Ecto.Metadata do @moduledoc false @postgrex_select ~r/FROM "(?\w+)"/ @postgrex_insert ~r/INSERT INTO "(?
\w+)"/ @postgrex_update ~r/UPDATE "(?
\w+)"/ @postgrex_delete ~r/FROM "(?
\w+)"/ @postgrex_create_table ~r/CREATE TABLE( IF NOT EXISTS)? "(?
\w+)"/ def parse(%{ query: query, result: {_ok_or_error, %{__struct__: struct}} }) when struct in [Postgrex.Result, Postgrex.Error] do {operation, table} = case query do "SELECT" <> _ -> {"select", capture(@postgrex_select, query, "table")} "INSERT" <> _ -> {"insert", capture(@postgrex_insert, query, "table")} "UPDATE" <> _ -> {"update", capture(@postgrex_update, query, "table")} "DELETE" <> _ -> {"delete", capture(@postgrex_delete, query, "table")} "CREATE TABLE" <> _ -> {"create", capture(@postgrex_create_table, query, "table")} "begin" -> {"begin", "other"} "commit" -> {"commit", "other"} "rollback" -> {"rollback", "other"} _ -> {"other", "other"} end {"Postgres", table, operation} end @myxql_select ~r/FROM `(?
\w+)`/ @myxql_insert ~r/INSERT INTO `(?
\w+)`/ @myxql_update ~r/UPDATE `(?
\w+)`/ @myxql_delete ~r/FROM `(?
\w+)`/ @myxql_create_table ~r/CREATE TABLE( IF NOT EXISTS)? `(?
\w+)`/ def parse(%{ query: query, result: {_ok_or_error, %{__struct__: struct}} }) when struct in [MyXQL.Result, MyXQL.Error] do {operation, table} = case query do "SELECT" <> _ -> {"select", capture(@myxql_select, query, "table")} "INSERT" <> _ -> {"insert", capture(@myxql_insert, query, "table")} "UPDATE" <> _ -> {"update", capture(@myxql_update, query, "table")} "DELETE" <> _ -> {"delete", capture(@myxql_delete, query, "table")} "CREATE TABLE" <> _ -> {"create", capture(@myxql_create_table, query, "table")} "begin" -> {"begin", "other"} "commit" -> {"commit", "other"} "rollback" -> {"rollback", "other"} _ -> {"other", "other"} end {"MySQL", table, operation} end def parse(%{result: {:ok, %{__struct__: Postgrex.Cursor}}}), do: :ignore def parse(%{result: {:ok, %{__struct__: MyXQL.Cursor}}}), do: :ignore def parse(%{result: {:ok, nil}}), do: :ignore def parse(%{result: {:error, _}}), do: :ignore def capture(regex, query, match) do Regex.named_captures(regex, query)[match] end end