getRoutines gets all routines of a database.
(db *sql.DB, dbName string)
| 488 | |
| 489 | // getRoutines gets all routines of a database. |
| 490 | func getRoutines(db *sql.DB, dbName string) ([]*routineSchema, error) { |
| 491 | var routines []*routineSchema |
| 492 | for _, routineType := range []string{"FUNCTION", "PROCEDURE"} { |
| 493 | if err := func() error { |
| 494 | query := fmt.Sprintf("SHOW %s STATUS WHERE Db = '%s';", routineType, dbName) |
| 495 | rows, err := db.Query(query) |
| 496 | if err != nil { |
| 497 | return errors.Wrapf(err, "failed query %q", query) |
| 498 | } |
| 499 | defer rows.Close() |
| 500 | |
| 501 | cols, err := rows.Columns() |
| 502 | if err != nil { |
| 503 | return err |
| 504 | } |
| 505 | var values []any |
| 506 | for i := 0; i < len(cols); i++ { |
| 507 | values = append(values, new(any)) |
| 508 | } |
| 509 | for rows.Next() { |
| 510 | var r routineSchema |
| 511 | if err := rows.Scan(values...); err != nil { |
| 512 | return err |
| 513 | } |
| 514 | r.name = fmt.Sprintf("%s", *values[1].(*any)) |
| 515 | r.routineType = fmt.Sprintf("%s", *values[2].(*any)) |
| 516 | |
| 517 | routines = append(routines, &r) |
| 518 | } |
| 519 | return rows.Err() |
| 520 | }(); err != nil { |
| 521 | return nil, err |
| 522 | } |
| 523 | } |
| 524 | |
| 525 | for _, r := range routines { |
| 526 | stmt, err := getRoutineStmt(db, dbName, r.name, r.routineType) |
| 527 | if err != nil { |
| 528 | return nil, errors.Wrapf(err, "failed to call getRoutineStmt(%q, %q, %q)", dbName, r.name, r.routineType) |
| 529 | } |
| 530 | r.statement = stmt |
| 531 | } |
| 532 | return routines, nil |
| 533 | } |
| 534 | |
| 535 | // getRoutineStmt gets the create statement of a routine. |
| 536 | func getRoutineStmt(db *sql.DB, dbName, routineName, routineType string) (string, error) { |