diff --git a/pkg/dbwait/dbwait.go b/pkg/dbwait/dbwait.go index 0fac45a..3253bb1 100644 --- a/pkg/dbwait/dbwait.go +++ b/pkg/dbwait/dbwait.go @@ -6,6 +6,7 @@ import ( "fmt" "net/url" "os" + "strings" "time" ) @@ -44,16 +45,35 @@ LOOP: switch databaseURL.Scheme { case "oracle": - _, err := sqlDB.QueryContext(queryCtx, "SELECT 1 FROM dual") + row := sqlDB.QueryRowContext(queryCtx, "SELECT INSTANCE_NAME, STATUS, DATABASE_STATUS FROM V$INSTANCE WHERE INSTANCE_NAME=$1", databaseURL.Path) + + var instaceName string + var instanceStatus string + var databaseStatus string + + err := row.Scan(instaceName, instanceStatus, databaseStatus) if err != nil { fmt.Fprintf(os.Stderr, "%s: %s\n", time.Now().String(), err.Error()) ticker.Reset(period) continue LOOP } + + if strings.ToUpper(instanceStatus) != "OPEN" { + fmt.Fprintf(os.Stderr, "%s: Instance status is not open: %s\n", time.Now().String(), instanceStatus) + ticker.Reset(period) + continue LOOP + } + + if strings.ToUpper(databaseStatus) != "OPEN" { + fmt.Fprintf(os.Stderr, "%s: Database status is not active: %s\n", time.Now().String(), databaseStatus) + ticker.Reset(period) + continue LOOP + } + return nil case "postgres": - _, err := sqlDB.QueryContext(queryCtx, "SELECT 1 AS ROW") - if err != nil { + row := sqlDB.QueryRowContext(queryCtx, "SELECT 1 AS ROW") + if row.Err() != nil { fmt.Fprintf(os.Stderr, "%s: %s\n", time.Now().String(), err.Error()) ticker.Reset(period) continue LOOP