func (driver *Driver) Migrate(f *file.File) error { tx, err := driver.db.Begin() if err != nil { return err } if f.Direction == direction.Up { if _, err := tx.Exec(fmt.Sprintf("INSERT INTO %s (version) VALUES ($1)", TABLE_NAME), f.Version); err != nil { if err := tx.Rollback(); err != nil { return err } return err } } else if f.Direction == direction.Down { if _, err := tx.Exec(fmt.Sprintf("DELETE FROM %s WHERE version=$1", TABLE_NAME), f.Version); err != nil { if err := tx.Rollback(); err != nil { return err } return err } } byteContent, err := f.Content() if err != nil { return err } content := string(byteContent) err = nil if strings.Contains(content, "tag:no_transaction") { _, err = driver.db.Exec(content) } else { _, err = tx.Exec(content) } if err != nil { pqErr := err.(*pq.Error) offset, err := strconv.Atoi(pqErr.Position) if err == nil && offset >= 0 { lineNo, columnNo := file.LineColumnFromOffset(byteContent, offset-1) errorPart := file.LinesBeforeAndAfter(byteContent, lineNo, 5, 5, true) return errors.New(fmt.Sprintf("%s %v: %s in line %v, column %v:\n\n%s", pqErr.Severity, pqErr.Code, pqErr.Message, lineNo, columnNo, string(errorPart))) } else { return errors.New(fmt.Sprintf("%s %v: %s", pqErr.Severity, pqErr.Code, pqErr.Message)) } if err := tx.Rollback(); err != nil { return err } } if err := tx.Commit(); err != nil { return err } return nil }
func (driver *Driver) Migrate(f *file.File) error { tx, err := driver.db.Begin() if err != nil { return err } if f.Direction == direction.Up { if _, err := tx.Exec(fmt.Sprintf("INSERT INTO %s (version) VALUES (?)", TABLE_NAME), f.Version); err != nil { if err := tx.Rollback(); err != nil { return err } return err } } else if f.Direction == direction.Down { if _, err := tx.Exec(fmt.Sprintf("DELETE FROM %s WHERE version=?", TABLE_NAME), f.Version); err != nil { if err := tx.Rollback(); err != nil { return err } return err } } content, err := f.Content() if err != nil { return err } if _, err := tx.Exec(string(content)); err != nil { if sqliteErr, isErr := err.(sqlite3.Error); isErr { // The sqlite3 library only provides error codes, not position information. Output what we do know return errors.New(fmt.Sprintf("SQLite Error (%s); Extended (%s)\nError: %s", sqliteErr.Code.Error(), sqliteErr.ExtendedCode.Error(), sqliteErr.Error())) } else { return errors.New(fmt.Sprintf("An error occurred: %s", err.Error())) } if err := tx.Rollback(); err != nil { return err } } if err := tx.Commit(); err != nil { return err } return nil }
func (driver *Driver) Migrate(f *file.File) error { content, err := f.Content() if err != nil { return err } for _, query := range strings.Split(string(content), ";") { query = strings.TrimSpace(query) if len(query) == 0 { continue } if err := driver.session.Query(query).Exec(); err != nil { return err } } if err := driver.version(f.Direction); err != nil { return err } return nil }