github.com/supabase/cli@v1.168.1/internal/inspect/blocking/blocking.go (about) 1 package blocking 2 3 import ( 4 "context" 5 "fmt" 6 "regexp" 7 8 "github.com/go-errors/errors" 9 "github.com/jackc/pgconn" 10 "github.com/jackc/pgx/v4" 11 "github.com/spf13/afero" 12 "github.com/supabase/cli/internal/inspect" 13 "github.com/supabase/cli/internal/migration/list" 14 "github.com/supabase/cli/internal/utils" 15 "github.com/supabase/cli/internal/utils/pgxv5" 16 ) 17 18 type Result struct { 19 Blocked_pid int 20 Blocking_statement string 21 Blocking_duration string 22 Blocking_pid int 23 Blocked_statement string 24 Blocked_duration string 25 } 26 27 func Run(ctx context.Context, config pgconn.Config, fsys afero.Fs, options ...func(*pgx.ConnConfig)) error { 28 conn, err := utils.ConnectByConfig(ctx, config, options...) 29 if err != nil { 30 return err 31 } 32 rows, err := conn.Query(ctx, inspect.BLOCKING_QUERY) 33 if err != nil { 34 return errors.Errorf("failed to query rows: %w", err) 35 } 36 result, err := pgxv5.CollectRows[Result](rows) 37 if err != nil { 38 return err 39 } 40 41 table := "|blocked pid|blocking statement|blocking duration|blocking pid|blocked statement|blocked duration|\n|-|-|-|-|-|-|\n" 42 for _, r := range result { 43 // remove whitespace from query 44 re := regexp.MustCompile(`\s+|\r+|\n+|\t+|\v`) 45 blocking_statement := re.ReplaceAllString(r.Blocking_statement, " ") 46 blocked_statement := re.ReplaceAllString(r.Blocked_statement, " ") 47 48 // escape pipes in query 49 re = regexp.MustCompile(`\|`) 50 blocking_statement = re.ReplaceAllString(blocking_statement, `\|`) 51 blocked_statement = re.ReplaceAllString(blocked_statement, `\|`) 52 table += fmt.Sprintf("|`%d`|`%s`|`%s`|`%d`|%s|`%s`|\n", r.Blocked_pid, blocking_statement, r.Blocking_duration, r.Blocking_pid, blocked_statement, r.Blocked_duration) 53 } 54 return list.RenderTable(table) 55 }