postgres: Make `ensureVersionTable` atomic

Fixes https://github.com/golang-migrate/migrate/issues/55
This commit is contained in:
Tomás Senart 2019-01-11 22:34:40 +01:00
parent ce7a2234ee
commit 519dae2639
No known key found for this signature in database
GPG Key ID: 424ABFF08108D421
1 changed files with 11 additions and 12 deletions

View File

@ -332,20 +332,19 @@ func (p *Postgres) Drop() error {
return nil
}
func (p *Postgres) ensureVersionTable() error {
// check if migration table exists
var count int
query := `SELECT COUNT(1) FROM information_schema.tables WHERE table_name = $1 AND table_schema = (SELECT current_schema()) LIMIT 1`
if err := p.conn.QueryRowContext(context.Background(), query, p.config.MigrationsTable).Scan(&count); err != nil {
return &database.Error{OrigErr: err, Query: []byte(query)}
}
if count == 1 {
return nil
func (p *Postgres) ensureVersionTable() (err error) {
if err = p.Lock(); err != nil {
return err
}
// if not, create the empty migration table
query = `CREATE TABLE "` + p.config.MigrationsTable + `" (version bigint not null primary key, dirty boolean not null)`
if _, err := p.conn.ExecContext(context.Background(), query); err != nil {
defer func() {
if e := p.Unlock(); err == nil {
err = e
}
}()
query := `CREATE TABLE IF NOT EXISTS "` + p.config.MigrationsTable + `" (version bigint not null primary key, dirty boolean not null)`
if _, err = p.conn.ExecContext(context.Background(), query); err != nil {
return &database.Error{OrigErr: err, Query: []byte(query)}
}
return nil