From 026696b87ac3db1cd2c06dcabe8a2d279a2e48ff Mon Sep 17 00:00:00 2001 From: zeripath Date: Mon, 5 Aug 2019 22:49:49 +0100 Subject: [PATCH] Fix dropTableColumns sqlite implementation (#7710) * Fix dropTableColumns sqlite implementation * use droptables and its index dropping support in v78 and v85 * golang-ci fixes * Add migration from gitea 1.3.3 for sqlite which reveals the droptables bug - thus showing this works --- .../gitea-v1.3.3.sqlite3.sql.gz | Bin 0 -> 6555 bytes models/migrations/migrations.go | 16 ++++- models/migrations/v78.go | 67 +++--------------- models/migrations/v85.go | 39 +--------- 4 files changed, 24 insertions(+), 98 deletions(-) create mode 100644 integrations/migration-test/gitea-v1.3.3.sqlite3.sql.gz diff --git a/integrations/migration-test/gitea-v1.3.3.sqlite3.sql.gz b/integrations/migration-test/gitea-v1.3.3.sqlite3.sql.gz new file mode 100644 index 0000000000000000000000000000000000000000..8375018d9fb37cc88398fff90393ca91cac3b908 GIT binary patch literal 6555 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 literal 0 HcmV?d00001 diff --git a/models/migrations/migrations.go b/models/migrations/migrations.go index 6459036e4a..bbd1bb734f 100644 --- a/models/migrations/migrations.go +++ b/models/migrations/migrations.go @@ -327,11 +327,25 @@ func dropTableColumns(sess *xorm.Session, tableName string, columnNames ...strin return err } tableSQL := string(res[0]["sql"]) + + // Separate out the column definitions tableSQL = tableSQL[strings.Index(tableSQL, "("):] + + // Remove the required columnNames for _, name := range columnNames { - tableSQL = regexp.MustCompile(regexp.QuoteMeta("`"+name+"`")+"[^`,)]*[,)]").ReplaceAllString(tableSQL, "") + tableSQL = regexp.MustCompile(regexp.QuoteMeta("`"+name+"`")+"[^`,)]*?[,)]").ReplaceAllString(tableSQL, "") } + // Ensure the query is ended properly + tableSQL = strings.TrimSpace(tableSQL) + if tableSQL[len(tableSQL)-1] != ')' { + if tableSQL[len(tableSQL)-1] == ',' { + tableSQL = tableSQL[:len(tableSQL)-1] + } + tableSQL += ")" + } + + // Find all the columns in the table columns := regexp.MustCompile("`([^`]*)`").FindAllString(tableSQL, -1) tableSQL = fmt.Sprintf("CREATE TABLE `new_%s_new` ", tableName) + tableSQL diff --git a/models/migrations/v78.go b/models/migrations/v78.go index 511a4f57fa..8082996b6f 100644 --- a/models/migrations/v78.go +++ b/models/migrations/v78.go @@ -5,13 +5,7 @@ package migrations import ( - "fmt" - - "code.gitea.io/gitea/models" - "code.gitea.io/gitea/modules/log" - "github.com/go-xorm/xorm" - "xorm.io/core" ) func renameRepoIsBareToIsEmpty(x *xorm.Engine) error { @@ -21,73 +15,28 @@ func renameRepoIsBareToIsEmpty(x *xorm.Engine) error { IsEmpty bool `xorm:"INDEX"` } - // First remove the index sess := x.NewSession() defer sess.Close() if err := sess.Begin(); err != nil { return err } - var err error - if models.DbCfg.Type == core.POSTGRES || models.DbCfg.Type == core.SQLITE { - _, err = sess.Exec("DROP INDEX IF EXISTS IDX_repository_is_bare") - } else if models.DbCfg.Type == core.MSSQL { - _, err = sess.Exec(`DECLARE @ConstraintName VARCHAR(256) - DECLARE @SQL NVARCHAR(256) - SELECT @ConstraintName = obj.name FROM sys.columns col LEFT OUTER JOIN sys.objects obj ON obj.object_id = col.default_object_id AND obj.type = 'D' WHERE col.object_id = OBJECT_ID('repository') AND obj.name IS NOT NULL AND col.name = 'is_bare' - SET @SQL = N'ALTER TABLE [repository] DROP CONSTRAINT [' + @ConstraintName + N']' - EXEC sp_executesql @SQL`) - if err != nil { - return err - } - } else if models.DbCfg.Type == core.MYSQL { - indexes, err := sess.QueryString(`SHOW INDEX FROM repository WHERE KEY_NAME = 'IDX_repository_is_bare'`) - if err != nil { - return err - } - - if len(indexes) >= 1 { - _, err = sess.Exec("DROP INDEX IDX_repository_is_bare ON repository") - if err != nil { - return fmt.Errorf("Drop index failed: %v", err) - } - } - } else { - _, err = sess.Exec("DROP INDEX IDX_repository_is_bare ON repository") - } - - if err != nil { - return fmt.Errorf("Drop index failed: %v", err) - } - - if err = sess.Commit(); err != nil { - return err - } - - if err := sess.Begin(); err != nil { - return err - } - if err := sess.Sync2(new(Repository)); err != nil { return err } if _, err := sess.Exec("UPDATE repository SET is_empty = is_bare;"); err != nil { return err } - - if models.DbCfg.Type != core.SQLITE { - _, err = sess.Exec("ALTER TABLE repository DROP COLUMN is_bare") - if err != nil { - return fmt.Errorf("Drop column failed: %v", err) - } - } - - if err = sess.Commit(); err != nil { + if err := sess.Commit(); err != nil { return err } - if models.DbCfg.Type == core.SQLITE { - log.Warn("TABLE repository's COLUMN is_bare should be DROP but sqlite is not supported, you could manually do that.") + if err := sess.Begin(); err != nil { + return err } - return nil + if err := dropTableColumns(sess, "repository", "is_bare"); err != nil { + return err + } + + return sess.Commit() } diff --git a/models/migrations/v85.go b/models/migrations/v85.go index b8d0ee5443..157c06d7ba 100644 --- a/models/migrations/v85.go +++ b/models/migrations/v85.go @@ -8,9 +8,7 @@ import ( "fmt" "github.com/go-xorm/xorm" - "xorm.io/core" - "code.gitea.io/gitea/models" "code.gitea.io/gitea/modules/generate" "code.gitea.io/gitea/modules/log" "code.gitea.io/gitea/modules/util" @@ -37,41 +35,6 @@ func hashAppToken(x *xorm.Engine) error { // First remove the index sess := x.NewSession() defer sess.Close() - if err := sess.Begin(); err != nil { - return err - } - - var err error - if models.DbCfg.Type == core.POSTGRES || models.DbCfg.Type == core.SQLITE { - _, err = sess.Exec("DROP INDEX IF EXISTS UQE_access_token_sha1") - } else if models.DbCfg.Type == core.MSSQL { - _, err = sess.Exec(`DECLARE @ConstraintName VARCHAR(256) - DECLARE @SQL NVARCHAR(256) - SELECT @ConstraintName = obj.name FROM sys.columns col LEFT OUTER JOIN sys.objects obj ON obj.object_id = col.default_object_id AND obj.type = 'D' WHERE col.object_id = OBJECT_ID('access_token') AND obj.name IS NOT NULL AND col.name = 'sha1' - SET @SQL = N'ALTER TABLE [access_token] DROP CONSTRAINT [' + @ConstraintName + N']' - EXEC sp_executesql @SQL`) - } else if models.DbCfg.Type == core.MYSQL { - indexes, err := sess.QueryString(`SHOW INDEX FROM access_token WHERE KEY_NAME = 'UQE_access_token_sha1'`) - if err != nil { - return err - } - - if len(indexes) >= 1 { - _, err = sess.Exec("DROP INDEX UQE_access_token_sha1 ON access_token") - if err != nil { - return err - } - } - } else { - _, err = sess.Exec("DROP INDEX UQE_access_token_sha1 ON access_token") - } - if err != nil { - return fmt.Errorf("Drop index failed: %v", err) - } - - if err = sess.Commit(); err != nil { - return err - } if err := sess.Begin(); err != nil { return err @@ -81,7 +44,7 @@ func hashAppToken(x *xorm.Engine) error { return fmt.Errorf("Sync2: %v", err) } - if err = sess.Commit(); err != nil { + if err := sess.Commit(); err != nil { return err }