From 5ca923555a149d534493ee969198bef0876a18b5 Mon Sep 17 00:00:00 2001 From: 6543 <6543@obermui.de> Date: Mon, 18 Jan 2021 18:33:57 +0100 Subject: [PATCH 01/12] Fix mig 141 --- models/migrations/v141.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/models/migrations/v141.go b/models/migrations/v141.go index b5824ecd48db2..ab05698b8cb5d 100644 --- a/models/migrations/v141.go +++ b/models/migrations/v141.go @@ -12,7 +12,7 @@ import ( func addKeepActivityPrivateUserColumn(x *xorm.Engine) error { type User struct { - KeepActivityPrivate bool + KeepActivityPrivate bool `xorm:"NOT NULL DEFAULT false"` } if err := x.Sync2(new(User)); err != nil { From 4e2b63dd4c4d7063fcad47592d9be4c9dc03a84d Mon Sep 17 00:00:00 2001 From: 6543 <6543@obermui.de> Date: Mon, 18 Jan 2021 18:54:06 +0100 Subject: [PATCH 02/12] Add Migration to fix it --- models/migrations/migrations.go | 2 + models/migrations/v167.go | 94 +++++++++++++++++++++++++++++++++ 2 files changed, 96 insertions(+) create mode 100644 models/migrations/v167.go diff --git a/models/migrations/migrations.go b/models/migrations/migrations.go index f62bba2a71906..a458b10e99672 100644 --- a/models/migrations/migrations.go +++ b/models/migrations/migrations.go @@ -279,6 +279,8 @@ var migrations = []Migration{ NewMigration("Convert hook task type from char(16) to varchar(16) and trim the column", convertHookTaskTypeToVarcharAndTrim), // v166 -> v167 NewMigration("Where Password is Valid with Empty String delete it", recalculateUserEmptyPWD), + // v167 -> v168 + NewMigration("Recreate user table to fix default values", recreateUserTableToFixDefaultValues), } // GetCurrentDBVersion returns the current db version diff --git a/models/migrations/v167.go b/models/migrations/v167.go new file mode 100644 index 0000000000000..eaa64200dde21 --- /dev/null +++ b/models/migrations/v167.go @@ -0,0 +1,94 @@ +// 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/xorm" +) + +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 is the primary email address (to be used for communication) + 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 is an attribute that determines if a user + // is to change his/her password after registration. + 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"` + + // Remember visibility choice for convenience, true for private + LastRepoVisibility bool + // Maximum repository creation limit, -1 means use global default + MaxRepoCreation int `xorm:"NOT NULL DEFAULT -1"` + + // Permissions + IsActive bool `xorm:"INDEX"` // Activate primary email + IsAdmin bool + IsRestricted bool `xorm:"NOT NULL DEFAULT false"` + AllowGitHook bool + AllowImportLocal bool // Allow migrate repository by local path + 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.Sync2(new(User)); err != nil { + 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() +} From 2579a1649bcd8ddbbde0015b1fad123e0bfee633 Mon Sep 17 00:00:00 2001 From: 6543 <6543@obermui.de> Date: Mon, 18 Jan 2021 19:04:36 +0100 Subject: [PATCH 03/12] update null values to false first --- models/migrations/v167.go | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/models/migrations/v167.go b/models/migrations/v167.go index eaa64200dde21..f7d7893902616 100644 --- a/models/migrations/v167.go +++ b/models/migrations/v167.go @@ -5,6 +5,7 @@ package migrations import ( + "xorm.io/builder" "xorm.io/xorm" ) @@ -81,6 +82,12 @@ func recreateUserTableToFixDefaultValues(x *xorm.Engine) error { return err } + if _, err := x.Where(builder.Eq{"keep_activity_private": nil}). + Cols("keep_activity_private"). + Update(&User{KeepActivityPrivate: false}); err != nil { + return err + } + sess := x.NewSession() defer sess.Close() if err := sess.Begin(); err != nil { From f340581a9e2a99e4c532bb96fa58cccd2845df82 Mon Sep 17 00:00:00 2001 From: 6543 <6543@obermui.de> Date: Tue, 19 Jan 2021 14:07:50 +0100 Subject: [PATCH 04/12] Alter Table if posible --- models/migrations/v167.go | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/models/migrations/v167.go b/models/migrations/v167.go index f7d7893902616..64f57a3abfaf2 100644 --- a/models/migrations/v167.go +++ b/models/migrations/v167.go @@ -7,6 +7,7 @@ package migrations import ( "xorm.io/builder" "xorm.io/xorm" + "xorm.io/xorm/schemas" ) func recreateUserTableToFixDefaultValues(x *xorm.Engine) error { @@ -88,11 +89,25 @@ func recreateUserTableToFixDefaultValues(x *xorm.Engine) error { 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.MSSQL: + _, err := x.Exec("ALTER TABLE `user` MODIFY COLUMN keep_activity_private BIT DEFAULT 0 NOT NULL;") + return err + case schemas.POSTGRES: + _, err := x.Exec("ALTER TABLE `user` ALTER COLUMN keep_activity_private SET DEFAULT false NOT NULL;") + return err + } + + // handle SQLite sess := x.NewSession() defer sess.Close() if err := sess.Begin(); err != nil { return err } + if err := recreateTable(sess, new(User)); err != nil { return err } From d43a529bad6599e9155ea3606517e0e8246dc5ec Mon Sep 17 00:00:00 2001 From: 6543 <6543@obermui.de> Date: Tue, 19 Jan 2021 15:00:52 +0100 Subject: [PATCH 05/12] use dropTableColumns instead of recreateTable --- models/migrations/v167.go | 98 ++++++--------------------------------- 1 file changed, 13 insertions(+), 85 deletions(-) diff --git a/models/migrations/v167.go b/models/migrations/v167.go index 64f57a3abfaf2..8e4ec124016f1 100644 --- a/models/migrations/v167.go +++ b/models/migrations/v167.go @@ -7,109 +7,37 @@ 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 is the primary email address (to be used for communication) - 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 is an attribute that determines if a user - // is to change his/her password after registration. - 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"` - - // Remember visibility choice for convenience, true for private - LastRepoVisibility bool - // Maximum repository creation limit, -1 means use global default - MaxRepoCreation int `xorm:"NOT NULL DEFAULT -1"` - - // Permissions - IsActive bool `xorm:"INDEX"` // Activate primary email - IsAdmin bool - IsRestricted bool `xorm:"NOT NULL DEFAULT false"` - AllowGitHook bool - AllowImportLocal bool // Allow migrate repository by local path - 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"` + ID int64 `xorm:"pk autoincr"` + KeepActivityPrivate bool `xorm:"NOT NULL DEFAULT false"` } - if err := x.Sync2(new(User)); err != nil { + sess := x.NewSession() + defer sess.Close() + if err := sess.Begin(); err != nil { return err } - if _, err := x.Where(builder.Eq{"keep_activity_private": nil}). - Cols("keep_activity_private"). - Update(&User{KeepActivityPrivate: false}); err != nil { + var activityPrivateUsers []int64 + if err := sess.Select("id").Table("user").Where(builder.Eq{"keep_activity_private": true}).Find(&activityPrivateUsers); 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.MSSQL: - _, err := x.Exec("ALTER TABLE `user` MODIFY COLUMN keep_activity_private BIT DEFAULT 0 NOT NULL;") - return err - case schemas.POSTGRES: - _, err := x.Exec("ALTER TABLE `user` ALTER COLUMN keep_activity_private SET DEFAULT false NOT NULL;") + if err := dropTableColumns(sess, "user", "keep_activity_private"); err != nil { return err } - // handle SQLite - sess := x.NewSession() - defer sess.Close() - if err := sess.Begin(); err != nil { + if err := sess.Sync2(new(User)); err != nil { return err } - if err := recreateTable(sess, new(User)); err != nil { - return err + for _, uid := range activityPrivateUsers { + if _, err := sess.ID(uid).Cols("keep_activity_private").Update(&User{KeepActivityPrivate: true}); err != nil { + return err + } } return sess.Commit() From 76cbc6008e77725c0ffe5971201232186029daa6 Mon Sep 17 00:00:00 2001 From: 6543 <6543@obermui.de> Date: Tue, 19 Jan 2021 15:32:12 +0100 Subject: [PATCH 06/12] MySQL use Alter --- models/migrations/v167.go | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/models/migrations/v167.go b/models/migrations/v167.go index 8e4ec124016f1..5a134754b5e27 100644 --- a/models/migrations/v167.go +++ b/models/migrations/v167.go @@ -7,9 +7,16 @@ package migrations import ( "xorm.io/builder" "xorm.io/xorm" + "xorm.io/xorm/schemas" ) func recreateUserTableToFixDefaultValues(x *xorm.Engine) error { + 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 + } + type User struct { ID int64 `xorm:"pk autoincr"` KeepActivityPrivate bool `xorm:"NOT NULL DEFAULT false"` From d339e41fb97a5f9bf5467243c4d35c6e85641700 Mon Sep 17 00:00:00 2001 From: 6543 <6543@obermui.de> Date: Tue, 19 Jan 2021 15:39:32 +0100 Subject: [PATCH 07/12] Postgres use Alter --- models/migrations/v167.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/models/migrations/v167.go b/models/migrations/v167.go index 5a134754b5e27..28e2bc46b9003 100644 --- a/models/migrations/v167.go +++ b/models/migrations/v167.go @@ -15,6 +15,12 @@ func recreateUserTableToFixDefaultValues(x *xorm.Engine) error { 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 } type User struct { From a9c7a2364c630d602cb26e7fa24fcc6955b48bfd Mon Sep 17 00:00:00 2001 From: 6543 <6543@obermui.de> Date: Wed, 20 Jan 2021 18:32:20 +0100 Subject: [PATCH 08/12] Update models/migrations/v167.go --- models/migrations/v167.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/models/migrations/v167.go b/models/migrations/v167.go index 28e2bc46b9003..19104bd41c679 100644 --- a/models/migrations/v167.go +++ b/models/migrations/v167.go @@ -11,6 +11,12 @@ import ( ) func recreateUserTableToFixDefaultValues(x *xorm.Engine) error { + 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;") From b9524f3d874178995c9f91be54e732f85daf7cf5 Mon Sep 17 00:00:00 2001 From: 6543 <6543@obermui.de> Date: Wed, 20 Jan 2021 18:36:39 +0100 Subject: [PATCH 09/12] Apply suggestions from code review --- models/migrations/v167.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/models/migrations/v167.go b/models/migrations/v167.go index 19104bd41c679..05bca95b63a89 100644 --- a/models/migrations/v167.go +++ b/models/migrations/v167.go @@ -11,6 +11,11 @@ import ( ) func recreateUserTableToFixDefaultValues(x *xorm.Engine) error { + type User struct { + ID int64 `xorm:"pk autoincr"` + 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 { @@ -29,11 +34,6 @@ func recreateUserTableToFixDefaultValues(x *xorm.Engine) error { return err } - type User struct { - ID int64 `xorm:"pk autoincr"` - KeepActivityPrivate bool `xorm:"NOT NULL DEFAULT false"` - } - sess := x.NewSession() defer sess.Close() if err := sess.Begin(); err != nil { From 7ad2a2229d209420da864bfecdc251656c52fa6c Mon Sep 17 00:00:00 2001 From: 6543 <6543@obermui.de> Date: Fri, 22 Jan 2021 16:25:51 +0100 Subject: [PATCH 10/12] use 2x add col & 2x update & 2x drop col --- models/migrations/v167.go | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/models/migrations/v167.go b/models/migrations/v167.go index 05bca95b63a89..7f9b19712762a 100644 --- a/models/migrations/v167.go +++ b/models/migrations/v167.go @@ -14,6 +14,7 @@ func recreateUserTableToFixDefaultValues(x *xorm.Engine) error { type User struct { ID int64 `xorm:"pk autoincr"` KeepActivityPrivate bool `xorm:"NOT NULL DEFAULT false"` + TmpCol bool `xorm:"NOT NULL DEFAULT false"` } if _, err := x.Where(builder.IsNull{"keep_activity_private"}). @@ -40,8 +41,11 @@ func recreateUserTableToFixDefaultValues(x *xorm.Engine) error { return err } - var activityPrivateUsers []int64 - if err := sess.Select("id").Table("user").Where(builder.Eq{"keep_activity_private": true}).Find(&activityPrivateUsers); err != nil { + if err := sess.Sync2(new(User)); err != nil { + return err + } + + if _, err := sess.Exec("UPDATE `user` SET tmp_col=keep_activity_private;"); err != nil { return err } @@ -53,10 +57,12 @@ func recreateUserTableToFixDefaultValues(x *xorm.Engine) error { return err } - for _, uid := range activityPrivateUsers { - if _, err := sess.ID(uid).Cols("keep_activity_private").Update(&User{KeepActivityPrivate: true}); err != nil { - return err - } + if _, err := sess.Exec("UPDATE `user` SET keep_activity_private=tmp_col;"); err != nil { + return err + } + + if err := dropTableColumns(sess, "user", "tmp_col"); err != nil { + return err } return sess.Commit() From 6a7130c5c24173effe51c96bcb1f7291cc3bc00e Mon Sep 17 00:00:00 2001 From: 6543 <6543@obermui.de> Date: Sat, 23 Jan 2021 03:44:50 +0100 Subject: [PATCH 11/12] let sqlite be the only issue --- models/migrations/v167.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/models/migrations/v167.go b/models/migrations/v167.go index 7f9b19712762a..fbe332fe9f805 100644 --- a/models/migrations/v167.go +++ b/models/migrations/v167.go @@ -33,6 +33,12 @@ func recreateUserTableToFixDefaultValues(x *xorm.Engine) error { } _, err := x.Exec("ALTER TABLE `user` ALTER COLUMN keep_activity_private SET DEFAULT false;") return err + case schemas.MSSQL: + if _, err := x.Exec("ALTER TABLE `user` ADD DEFAULT 0 FOR keep_activity_private GO;"); err != nil { + return err + } + _, err := x.Exec("ALTER TABLE `user` ALTER COLUMN keep_activity_private bit NOT NULL GO;") + return err } sess := x.NewSession() From 008707657fdc139854e0109ba27777c9c3c5b24f Mon Sep 17 00:00:00 2001 From: 6543 <6543@obermui.de> Date: Sat, 23 Jan 2021 04:05:59 +0100 Subject: [PATCH 12/12] use recreate since it just WORKS --- models/migrations/v167.go | 91 ++++++++++++++++++++++++++------------- 1 file changed, 61 insertions(+), 30 deletions(-) diff --git a/models/migrations/v167.go b/models/migrations/v167.go index fbe332fe9f805..246b120d33939 100644 --- a/models/migrations/v167.go +++ b/models/migrations/v167.go @@ -12,9 +12,66 @@ import ( func recreateUserTableToFixDefaultValues(x *xorm.Engine) error { type User struct { - ID int64 `xorm:"pk autoincr"` - KeepActivityPrivate bool `xorm:"NOT NULL DEFAULT false"` - TmpCol bool `xorm:"NOT NULL DEFAULT false"` + 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"}). @@ -33,12 +90,6 @@ func recreateUserTableToFixDefaultValues(x *xorm.Engine) error { } _, err := x.Exec("ALTER TABLE `user` ALTER COLUMN keep_activity_private SET DEFAULT false;") return err - case schemas.MSSQL: - if _, err := x.Exec("ALTER TABLE `user` ADD DEFAULT 0 FOR keep_activity_private GO;"); err != nil { - return err - } - _, err := x.Exec("ALTER TABLE `user` ALTER COLUMN keep_activity_private bit NOT NULL GO;") - return err } sess := x.NewSession() @@ -47,27 +98,7 @@ func recreateUserTableToFixDefaultValues(x *xorm.Engine) error { return err } - if err := sess.Sync2(new(User)); err != nil { - return err - } - - if _, err := sess.Exec("UPDATE `user` SET tmp_col=keep_activity_private;"); err != nil { - return err - } - - if err := dropTableColumns(sess, "user", "keep_activity_private"); err != nil { - return err - } - - if err := sess.Sync2(new(User)); err != nil { - return err - } - - if _, err := sess.Exec("UPDATE `user` SET keep_activity_private=tmp_col;"); err != nil { - return err - } - - if err := dropTableColumns(sess, "user", "tmp_col"); err != nil { + if err := recreateTable(sess, new(User)); err != nil { return err }