@@ -9,9 +9,11 @@ defmodule RealtimeWeb.Dashboard.SqlInspector do
99 """
1010 use Phoenix.LiveDashboard.PageBuilder
1111
12+ require Logger
13+
1214 alias Realtime.Repo.Replica
1315
14- @ query_timeout 10_000
16+ @ query_timeout 30_000
1517 @ max_rows 1_000
1618
1719 @ sensitive_patterns ~w( password passwd secret token jwt key credential private salt hash)
@@ -52,6 +54,7 @@ defmodule RealtimeWeb.Dashboard.SqlInspector do
5254 ) }
5355
5456 { :error , msg } ->
57+ Logger . warning ( "SqlInspector query error: #{ msg } " )
5558 { :noreply , assign ( socket , error: msg , result: nil , sql: sql , display_rows: [ ] , row_count: 0 ) }
5659 end
5760 end
@@ -74,7 +77,7 @@ defmodule RealtimeWeb.Dashboard.SqlInspector do
7477 @ impl true
7578 def render ( assigns ) do
7679 ~H"""
77- < div style = "background: #ffffff; border: 1px solid #dee2e6; border-radius: 8px; box-shadow: 0 1px 3px rgba(0,0,0,0.05); padding: 20px; margin-bottom: 16px; " >
80+ < div style = "background: #ffffff; border: 1px solid #dee2e6; border-radius: 8px; box-shadow: 0 1px 3px rgba(0,0,0,0.05); padding: 20px; margin-bottom: 16px; min-width: 0; " >
7881 < h5 style = "margin: 0 0 4px 0; font-weight: 600; " > SQL Inspector</ h5 >
7982 < p style = "color: #6c757d; font-size: 0.85rem; margin-bottom: 16px; " >
8083 Read-only SELECT queries only. Sensitive column values are masked. Results capped at <%= @ max_rows %> rows.
@@ -161,15 +164,18 @@ defmodule RealtimeWeb.Dashboard.SqlInspector do
161164 limited_sql = "SELECT * FROM (#{ stripped } ) AS _q LIMIT #{ @ max_rows } "
162165 repo = Replica . replica ( )
163166
164- repo . transaction ( fn ->
165- Ecto.Adapters.SQL . query! ( repo , "SET TRANSACTION READ ONLY" , [ ] )
166-
167- case Ecto.Adapters.SQL . query ( repo , limited_sql , [ ] , timeout: @ query_timeout ) do
168- { :ok , result } -> repo . rollback ( { :ok , mask_sensitive_columns ( result ) } )
169- { :error , % { postgres: % { message: message } } } -> repo . rollback ( { :error , message } )
170- { :error , reason } -> repo . rollback ( { :error , inspect ( reason ) } )
171- end
172- end )
167+ repo . transaction (
168+ fn ->
169+ Ecto.Adapters.SQL . query! ( repo , "SET TRANSACTION READ ONLY" , [ ] )
170+
171+ case Ecto.Adapters.SQL . query ( repo , limited_sql , [ ] , timeout: @ query_timeout ) do
172+ { :ok , result } -> repo . rollback ( { :ok , mask_sensitive_columns ( result ) } )
173+ { :error , % { postgres: % { message: message } } } -> repo . rollback ( { :error , message } )
174+ { :error , reason } -> repo . rollback ( { :error , inspect ( reason ) } )
175+ end
176+ end ,
177+ timeout: @ query_timeout
178+ )
173179 |> case do
174180 { :error , { :ok , result } } -> { :ok , result }
175181 { :error , { :error , message } } -> { :error , message }
0 commit comments