woodpecker/store/datastore/ddl/migrate.go

105 lines
2.5 KiB
Go

package ddl
import (
"database/sql"
"errors"
"github.com/drone/drone/store/datastore/ddl/mysql"
"github.com/drone/drone/store/datastore/ddl/postgres"
"github.com/drone/drone/store/datastore/ddl/sqlite"
)
// Supported database drivers
const (
DriverSqlite = "sqlite3"
DriverMysql = "mysql"
DriverPostgres = "postgres"
)
// Migrate performs the database migration. If the migration fails
// and error is returned.
func Migrate(driver string, db *sql.DB) error {
switch driver {
case DriverMysql:
if err := checkPriorMigration(db); err != nil {
return err
}
return mysql.Migrate(db)
case DriverPostgres:
return postgres.Migrate(db)
default:
return sqlite.Migrate(db)
}
}
// we need to check and see if there was a previous migration
// for drone 0.6 or prior and migrate to the new migration
// system. Attempting to migrate from 0.5 or below to 0.7 or
// above will result in an error.
//
// this can be removed once we get to 1.0 with the reasonable
// expectation that people are no longer using 0.5.
func checkPriorMigration(db *sql.DB) error {
var none int
if err := db.QueryRow(legacyMigrationsExist).Scan(&none); err != nil {
// if no legacy migrations exist, this is a fresh install
// and we can proceed as normal.
return nil
}
if err := db.QueryRow(legacyMigrationsCurrent).Scan(&none); err != nil {
// this indicates an attempted upgrade from 0.5 or lower to
// version 0.7 or higher and will fail.
return errors.New("Please upgrade to 0.6 before upgrading to 0.7+")
}
if _, err := db.Exec(createMigrationsTable); err != nil {
return err
}
if _, err := db.Exec(legacyMigrationsImport); err != nil {
return err
}
return nil
}
var legacyMigrationsExist = `
SELECT 1
FROM gorp_migrations
LIMIT 1
`
var legacyMigrationsCurrent = `
SELECT 1
FROM gorp_migrations
WHERE id = '16.sql'
LIMIT 1
`
var legacyMigrationsImport = `
INSERT IGNORE INTO migrations (name) VALUES
('create-table-users')
,('create-table-repos')
,('create-table-builds')
,('create-index-builds-repo')
,('create-index-builds-author')
,('create-table-procs')
,('create-index-procs-build')
,('create-table-logs')
,('create-table-files')
,('create-index-files-builds')
,('create-index-files-procs')
,('create-table-secrets')
,('create-index-secrets-repo')
,('create-table-registry')
,('create-index-registry-repo')
,('create-table-config')
,('create-table-tasks')
,('create-table-agents')
,('create-table-senders')
,('create-index-sender-repos')
`
var createMigrationsTable = `
CREATE TABLE IF NOT EXISTS migrations (
name VARCHAR(255)
,UNIQUE(name)
)
`