GetSpecifiedColumnValuesAndClose get columns' values whose name is equal to columnName
(rows *sql.Rows, columnName ...string)
| 812 | |
| 813 | // GetSpecifiedColumnValuesAndClose get columns' values whose name is equal to columnName |
| 814 | func GetSpecifiedColumnValuesAndClose(rows *sql.Rows, columnName ...string) ([][]string, error) { |
| 815 | if rows == nil { |
| 816 | return [][]string{}, nil |
| 817 | } |
| 818 | defer rows.Close() |
| 819 | var strs [][]string |
| 820 | columns, err := rows.Columns() |
| 821 | if err != nil { |
| 822 | return strs, errors.Trace(err) |
| 823 | } |
| 824 | addr := make([]any, len(columns)) |
| 825 | oneRow := make([]sql.NullString, len(columns)) |
| 826 | fieldIndexMp := make(map[int]int) |
| 827 | for i, col := range columns { |
| 828 | addr[i] = &oneRow[i] |
| 829 | for j, name := range columnName { |
| 830 | if strings.EqualFold(col, name) { |
| 831 | fieldIndexMp[i] = j |
| 832 | } |
| 833 | } |
| 834 | } |
| 835 | if len(fieldIndexMp) == 0 { |
| 836 | return strs, nil |
| 837 | } |
| 838 | for rows.Next() { |
| 839 | err := rows.Scan(addr...) |
| 840 | if err != nil { |
| 841 | return strs, errors.Trace(err) |
| 842 | } |
| 843 | written := false |
| 844 | tmpStr := make([]string, len(columnName)) |
| 845 | for colPos, namePos := range fieldIndexMp { |
| 846 | if oneRow[colPos].Valid { |
| 847 | written = true |
| 848 | tmpStr[namePos] = oneRow[colPos].String |
| 849 | } |
| 850 | } |
| 851 | if written { |
| 852 | strs = append(strs, tmpStr) |
| 853 | } |
| 854 | } |
| 855 | return strs, errors.Trace(rows.Err()) |
| 856 | } |
| 857 | |
| 858 | // GetPdAddrs gets PD address from TiDB |
| 859 | func GetPdAddrs(tctx *tcontext.Context, db *sql.DB) ([]string, error) { |