Fix migration v141 (#14387)
* Fix mig 141 * Add Migration to fix it * update null values to false first * Alter Table if posible * use dropTableColumns instead of recreateTable * MySQL use Alter * Postgres use Alter * Update models/migrations/v167.go * Apply suggestions from code review * use 2x add col & 2x update & 2x drop col * let sqlite be the only issue * use recreate since it just WORKS
This commit is contained in:
		
							parent
							
								
									3599d44399
								
							
						
					
					
						commit
						2ebe609d65
					
				
					 3 changed files with 109 additions and 1 deletions
				
			
		|  | @ -281,6 +281,8 @@ var migrations = []Migration{ | ||||||
| 	NewMigration("Where Password is Valid with Empty String delete it", recalculateUserEmptyPWD), | 	NewMigration("Where Password is Valid with Empty String delete it", recalculateUserEmptyPWD), | ||||||
| 	// v167 -> v168
 | 	// v167 -> v168
 | ||||||
| 	NewMigration("Add user redirect", addUserRedirect), | 	NewMigration("Add user redirect", addUserRedirect), | ||||||
|  | 	// v168 -> v169
 | ||||||
|  | 	NewMigration("Recreate user table to fix default values", recreateUserTableToFixDefaultValues), | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // GetCurrentDBVersion returns the current db version
 | // GetCurrentDBVersion returns the current db version
 | ||||||
|  |  | ||||||
|  | @ -12,7 +12,7 @@ import ( | ||||||
| 
 | 
 | ||||||
| func addKeepActivityPrivateUserColumn(x *xorm.Engine) error { | func addKeepActivityPrivateUserColumn(x *xorm.Engine) error { | ||||||
| 	type User struct { | 	type User struct { | ||||||
| 		KeepActivityPrivate bool | 		KeepActivityPrivate bool `xorm:"NOT NULL DEFAULT false"` | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if err := x.Sync2(new(User)); err != nil { | 	if err := x.Sync2(new(User)); err != nil { | ||||||
|  |  | ||||||
							
								
								
									
										106
									
								
								models/migrations/v168.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										106
									
								
								models/migrations/v168.go
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,106 @@ | ||||||
|  | // Copyright 2021 The Gitea Authors. All rights reserved.
 | ||||||
|  | // Use of this source code is governed by a MIT-style
 | ||||||
|  | // license that can be found in the LICENSE file.
 | ||||||
|  | 
 | ||||||
|  | package migrations | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"xorm.io/builder" | ||||||
|  | 	"xorm.io/xorm" | ||||||
|  | 	"xorm.io/xorm/schemas" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | func recreateUserTableToFixDefaultValues(x *xorm.Engine) error { | ||||||
|  | 	type User struct { | ||||||
|  | 		ID                           int64  `xorm:"pk autoincr"` | ||||||
|  | 		LowerName                    string `xorm:"UNIQUE NOT NULL"` | ||||||
|  | 		Name                         string `xorm:"UNIQUE NOT NULL"` | ||||||
|  | 		FullName                     string | ||||||
|  | 		Email                        string `xorm:"NOT NULL"` | ||||||
|  | 		KeepEmailPrivate             bool | ||||||
|  | 		EmailNotificationsPreference string `xorm:"VARCHAR(20) NOT NULL DEFAULT 'enabled'"` | ||||||
|  | 		Passwd                       string `xorm:"NOT NULL"` | ||||||
|  | 		PasswdHashAlgo               string `xorm:"NOT NULL DEFAULT 'argon2'"` | ||||||
|  | 
 | ||||||
|  | 		MustChangePassword bool `xorm:"NOT NULL DEFAULT false"` | ||||||
|  | 
 | ||||||
|  | 		LoginType   int | ||||||
|  | 		LoginSource int64 `xorm:"NOT NULL DEFAULT 0"` | ||||||
|  | 		LoginName   string | ||||||
|  | 		Type        int | ||||||
|  | 		Location    string | ||||||
|  | 		Website     string | ||||||
|  | 		Rands       string `xorm:"VARCHAR(10)"` | ||||||
|  | 		Salt        string `xorm:"VARCHAR(10)"` | ||||||
|  | 		Language    string `xorm:"VARCHAR(5)"` | ||||||
|  | 		Description string | ||||||
|  | 
 | ||||||
|  | 		CreatedUnix   int64 `xorm:"INDEX created"` | ||||||
|  | 		UpdatedUnix   int64 `xorm:"INDEX updated"` | ||||||
|  | 		LastLoginUnix int64 `xorm:"INDEX"` | ||||||
|  | 
 | ||||||
|  | 		LastRepoVisibility bool | ||||||
|  | 		MaxRepoCreation    int `xorm:"NOT NULL DEFAULT -1"` | ||||||
|  | 
 | ||||||
|  | 		// Permissions
 | ||||||
|  | 		IsActive                bool `xorm:"INDEX"` | ||||||
|  | 		IsAdmin                 bool | ||||||
|  | 		IsRestricted            bool `xorm:"NOT NULL DEFAULT false"` | ||||||
|  | 		AllowGitHook            bool | ||||||
|  | 		AllowImportLocal        bool | ||||||
|  | 		AllowCreateOrganization bool `xorm:"DEFAULT true"` | ||||||
|  | 		ProhibitLogin           bool `xorm:"NOT NULL DEFAULT false"` | ||||||
|  | 
 | ||||||
|  | 		// Avatar
 | ||||||
|  | 		Avatar          string `xorm:"VARCHAR(2048) NOT NULL"` | ||||||
|  | 		AvatarEmail     string `xorm:"NOT NULL"` | ||||||
|  | 		UseCustomAvatar bool | ||||||
|  | 
 | ||||||
|  | 		// Counters
 | ||||||
|  | 		NumFollowers int | ||||||
|  | 		NumFollowing int `xorm:"NOT NULL DEFAULT 0"` | ||||||
|  | 		NumStars     int | ||||||
|  | 		NumRepos     int | ||||||
|  | 
 | ||||||
|  | 		// For organization
 | ||||||
|  | 		NumTeams                  int | ||||||
|  | 		NumMembers                int | ||||||
|  | 		Visibility                int  `xorm:"NOT NULL DEFAULT 0"` | ||||||
|  | 		RepoAdminChangeTeamAccess bool `xorm:"NOT NULL DEFAULT false"` | ||||||
|  | 
 | ||||||
|  | 		// Preferences
 | ||||||
|  | 		DiffViewStyle       string `xorm:"NOT NULL DEFAULT ''"` | ||||||
|  | 		Theme               string `xorm:"NOT NULL DEFAULT ''"` | ||||||
|  | 		KeepActivityPrivate bool   `xorm:"NOT NULL DEFAULT false"` | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if _, err := x.Where(builder.IsNull{"keep_activity_private"}). | ||||||
|  | 		Cols("keep_activity_private"). | ||||||
|  | 		Update(User{KeepActivityPrivate: false}); err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	switch x.Dialect().URI().DBType { | ||||||
|  | 	case schemas.MYSQL: | ||||||
|  | 		_, err := x.Exec("ALTER TABLE `user` MODIFY COLUMN keep_activity_private tinyint(1) DEFAULT 0 NOT NULL;") | ||||||
|  | 		return err | ||||||
|  | 	case schemas.POSTGRES: | ||||||
|  | 		if _, err := x.Exec("ALTER TABLE `user` ALTER COLUMN keep_activity_private SET NOT NULL;"); err != nil { | ||||||
|  | 			return err | ||||||
|  | 		} | ||||||
|  | 		_, err := x.Exec("ALTER TABLE `user` ALTER COLUMN keep_activity_private SET DEFAULT false;") | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	sess := x.NewSession() | ||||||
|  | 	defer sess.Close() | ||||||
|  | 	if err := sess.Begin(); err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if err := recreateTable(sess, new(User)); err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return sess.Commit() | ||||||
|  | } | ||||||
		Loading…
	
		Reference in a new issue