11package postgresconn
22
33import (
4+ "fmt"
5+ "io/ioutil"
6+ "path/filepath"
47 "strings"
58
69 "github.com/jmoiron/sqlx"
@@ -19,6 +22,8 @@ type PostgresService interface {
1922 BuildFunction (function string ) (string , error )
2023 ShowFunctionContent (function string ) (string , error )
2124 ShowProcedureContent (procedure string ) (string , error )
25+ ExplainAnalysis (query string ) (string , error )
26+ ExplainAnalysisFromFile (filename string ) (string , error )
2227}
2328
2429type postgresServiceImpl struct {
@@ -151,3 +156,33 @@ func (p *postgresServiceImpl) ShowProcedureContent(procedure string) (string, er
151156 }
152157 return procedureContent , nil
153158}
159+
160+ func (p * postgresServiceImpl ) ExplainAnalysis (query string ) (string , error ) {
161+ rows , err := p .dbConn .Query (fmt .Sprintf ("EXPLAIN ANALYZE %v" , query ))
162+ if err != nil {
163+ return "" , err
164+ }
165+ defer rows .Close ()
166+ var explain strings.Builder
167+ for rows .Next () {
168+ var line string
169+ if err = rows .Scan (& line ); err != nil {
170+ return "" , err
171+ }
172+ explain .WriteString (line )
173+ explain .WriteString ("\n " )
174+ }
175+ if err = rows .Err (); err != nil {
176+ return "" , err
177+ }
178+ return explain .String (), nil
179+ }
180+
181+ func (p * postgresServiceImpl ) ExplainAnalysisFromFile (filename string ) (string , error ) {
182+ bytes , err := ioutil .ReadFile (filepath .Clean (filename ))
183+ if err != nil {
184+ return "" , err
185+ }
186+ query := string (bytes )
187+ return p .ExplainAnalysis (query )
188+ }
0 commit comments