diff options
Diffstat (limited to 'query_selector.go')
| -rw-r--r-- | query_selector.go | 81 | 
1 files changed, 81 insertions, 0 deletions
| diff --git a/query_selector.go b/query_selector.go new file mode 100644 index 0000000..5f47667 --- /dev/null +++ b/query_selector.go @@ -0,0 +1,81 @@ +package main + +import ( +	"fmt" +	"log" +	"strconv" + +	"github.com/rivo/tview" + +	"bnbl.io/pgqt/postgres" +) + +type querySelector struct { +	*tview.Table +	db    *postgres.DB +	stmts []*postgres.PgStatStatement +} + +func newQuerySelector(db *postgres.DB) *querySelector { +	v := tview.NewTable() +	v.SetTitle("Queries") +	v.SetBorder(true) +	v.SetSelectable(true, false) + +	qs := &querySelector{ +		Table: v, +		db:    db, +	} + +	return qs +} + +func (q *querySelector) SelectSchema(schema string) bool { +	q.Clear() + +	stmts, err := q.db.GetPgStatStatements(schema) +	if err != nil { +		log.Printf("could not select schema: %v", err) +		cell := tview.NewTableCell(fmt.Sprintf("could not find queries: %v", err)) +		cell.SetSelectable(false) +		q.SetCell(0, 0, cell) +		return false +	} + +	q.stmts = stmts +	q.SetFixed(1, 0) + +	newHeaderCell := func(t string) *tview.TableCell { +		cell := tview.NewTableCell(t) +		cell.SetSelectable(false) +		return cell +	} + +	q.SetCell(0, 0, newHeaderCell("User ID")) +	q.SetCell(0, 1, newHeaderCell("Query")) +	q.SetCell(0, 2, newHeaderCell("Calls")) +	q.SetCell(0, 3, newHeaderCell("Total Time")) + +	newTableCell := func(t string) *tview.TableCell { +		cell := tview.NewTableCell(t) +		return cell +	} + +	for idx, stmt := range q.stmts { +		q.SetCell(idx+1, 0, newTableCell(strconv.Itoa(stmt.UserID))) +		q.SetCell(idx+1, 1, newTableCell(stmt.Query)) +		q.SetCell(idx+1, 2, newTableCell(strconv.Itoa(stmt.Calls))) +		q.SetCell(idx+1, 3, newTableCell(strconv.Itoa(int(stmt.TotalTime)))) +	} + +	return true +} + +func (q *querySelector) Analyze() ([]*postgres.Explain, error) { +	row, _ := q.GetSelection() +	if len(q.stmts) < row { +		return nil, fmt.Errorf("no queries to analyze") +	} +	stmt := q.stmts[row-1] +	return q.db.Analyze(stmt.Query) +} | 
