getViews gets all views of a database.
(txn *sql.Tx, schemaName string, columnMap map[db.TableKey][]*storepb.ColumnMetadata, triggerMap map[db.TableKey][]*storepb.TriggerMetadata)
| 950 | |
| 951 | // getViews gets all views of a database. |
| 952 | func getViews(txn *sql.Tx, schemaName string, columnMap map[db.TableKey][]*storepb.ColumnMetadata, triggerMap map[db.TableKey][]*storepb.TriggerMetadata) (map[string][]*storepb.ViewMetadata, error) { |
| 953 | viewMap := make(map[string][]*storepb.ViewMetadata) |
| 954 | |
| 955 | // Get view comments |
| 956 | viewCommentMap, err := getViewComments(txn, schemaName) |
| 957 | if err != nil { |
| 958 | return nil, errors.Wrapf(err, "failed to get view comments") |
| 959 | } |
| 960 | |
| 961 | query := fmt.Sprintf(` |
| 962 | SELECT OWNER, VIEW_NAME, TEXT |
| 963 | FROM sys.all_views |
| 964 | WHERE OWNER = '%s' |
| 965 | ORDER BY view_name |
| 966 | `, schemaName) |
| 967 | |
| 968 | slog.Debug("running get view query") |
| 969 | rows, err := txn.Query(query) |
| 970 | if err != nil { |
| 971 | return nil, util.FormatErrorWithQuery(err, query) |
| 972 | } |
| 973 | defer rows.Close() |
| 974 | for rows.Next() { |
| 975 | view := &storepb.ViewMetadata{} |
| 976 | var schemaName string |
| 977 | if err := rows.Scan(&schemaName, &view.Name, &view.Definition); err != nil { |
| 978 | return nil, err |
| 979 | } |
| 980 | // Oracle may include a trailing C-string null terminator via the go-ora driver. |
| 981 | view.Definition = strings.TrimRight(view.Definition, "\x00") |
| 982 | key := db.TableKey{Schema: schemaName, Table: view.Name} |
| 983 | view.Columns = columnMap[key] |
| 984 | view.Triggers = triggerMap[key] |
| 985 | if comment, ok := viewCommentMap[key]; ok { |
| 986 | view.Comment = comment |
| 987 | } |
| 988 | |
| 989 | viewMap[schemaName] = append(viewMap[schemaName], view) |
| 990 | } |
| 991 | if err := rows.Err(); err != nil { |
| 992 | return nil, util.FormatErrorWithQuery(err, query) |
| 993 | } |
| 994 | if err := rows.Close(); err != nil { |
| 995 | return nil, errors.Wrapf(err, "failed to close rows") |
| 996 | } |
| 997 | |
| 998 | // Fetch all view dependencies in a single query to avoid N+1 problem |
| 999 | viewDependenciesMap, err := getAllViewDependencies(txn, schemaName) |
| 1000 | if err != nil { |
| 1001 | return nil, errors.Wrapf(err, "failed to get view dependencies") |
| 1002 | } |
| 1003 | |
| 1004 | // Populate view dependencies from the map |
| 1005 | for schemaName, list := range viewMap { |
| 1006 | for _, view := range list { |
| 1007 | key := db.TableKey{Schema: schemaName, Table: view.Name} |
| 1008 | if dependencies, ok := viewDependenciesMap[key]; ok { |
| 1009 | view.DependencyColumns = dependencies |
no test coverage detected