diff --git a/cmd/gochan-migration/internal/common/sqlutil.go b/cmd/gochan-migration/internal/common/sqlutil.go index f7194b5a..acbd7a82 100644 --- a/cmd/gochan-migration/internal/common/sqlutil.go +++ b/cmd/gochan-migration/internal/common/sqlutil.go @@ -8,6 +8,7 @@ import ( "regexp" "strings" + "github.com/gochan-org/gochan/pkg/config" "github.com/gochan-org/gochan/pkg/gcsql" "github.com/gochan-org/gochan/pkg/gcutil" ) @@ -18,12 +19,14 @@ var ( // ColumnType returns a string representation of the column's data type. It does not return an error // if the column does not exist, instead returning an empty string. -func ColumnType(db *gcsql.GCDB, tx *sql.Tx, columnName string, tableName string, dbName string, dbType string) (string, error) { +func ColumnType(db *gcsql.GCDB, tx *sql.Tx, columnName string, tableName string, criticalCfg *config.SystemCriticalConfig) (string, error) { var query string var dataType string var err error var params []any - switch dbType { + tableName = strings.ReplaceAll(tableName, "DBPREFIX", criticalCfg.DBprefix) + dbName := criticalCfg.DBname + switch criticalCfg.DBtype { case "mysql": query = `SELECT DATA_TYPE FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = ? AND TABLE_NAME = ? AND COLUMN_NAME = ? LIMIT 1` diff --git a/cmd/gochan-migration/internal/gcupdate/gcupdate.go b/cmd/gochan-migration/internal/gcupdate/gcupdate.go index a2d40d35..fe9725b4 100644 --- a/cmd/gochan-migration/internal/gcupdate/gcupdate.go +++ b/cmd/gochan-migration/internal/gcupdate/gcupdate.go @@ -56,8 +56,6 @@ func (dbu *GCDatabaseUpdater) MigrateDB() (bool, error) { } criticalConfig := config.GetSystemCriticalConfig() - dbName := criticalConfig.DBname - dbType := criticalConfig.DBtype ctx := context.Background() tx, err := dbu.db.BeginTx(ctx, &sql.TxOptions{ Isolation: 0, @@ -70,11 +68,11 @@ func (dbu *GCDatabaseUpdater) MigrateDB() (bool, error) { switch criticalConfig.DBtype { case "mysql": - err = updateMysqlDB(dbu.db, tx, dbName, dbType) + err = updateMysqlDB(dbu.db, tx, &criticalConfig) case "postgres": - err = updatePostgresDB(dbu.db, tx, dbName, dbType) + err = updatePostgresDB(dbu.db, tx, &criticalConfig) case "sqlite3": - err = updateSqliteDB(dbu.db, tx, dbName, dbType) + err = updateSqliteDB(dbu.db, tx, &criticalConfig) } if err != nil { return false, err diff --git a/cmd/gochan-migration/internal/gcupdate/updatemysql.go b/cmd/gochan-migration/internal/gcupdate/updatemysql.go index 85557b5c..dde12baa 100644 --- a/cmd/gochan-migration/internal/gcupdate/updatemysql.go +++ b/cmd/gochan-migration/internal/gcupdate/updatemysql.go @@ -4,13 +4,15 @@ import ( "database/sql" "github.com/gochan-org/gochan/cmd/gochan-migration/internal/common" + "github.com/gochan-org/gochan/pkg/config" "github.com/gochan-org/gochan/pkg/gcsql" "github.com/gochan-org/gochan/pkg/gcutil" ) -func updateMysqlDB(db *gcsql.GCDB, tx *sql.Tx, dbName string, dbType string) error { +func updateMysqlDB(db *gcsql.GCDB, tx *sql.Tx, criticalCfg *config.SystemCriticalConfig) error { var numConstraints int var err error + dbName := criticalCfg.DBname query := `SELECT COUNT(*) FROM information_schema.TABLE_CONSTRAINTS WHERE CONSTRAINT_NAME = 'wordfilters_board_id_fk' AND TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'DBPREFIXwordfilters'` @@ -23,7 +25,7 @@ func updateMysqlDB(db *gcsql.GCDB, tx *sql.Tx, dbName string, dbType string) err } else { query = "" } - dataType, err := common.ColumnType(db, tx, "board_dirs", "DBPREFIXwordfilters", dbName, dbType) + dataType, err := common.ColumnType(db, tx, "board_dirs", "DBPREFIXwordfilters", criticalCfg) if err != nil { return err } @@ -62,11 +64,11 @@ func updateMysqlDB(db *gcsql.GCDB, tx *sql.Tx, dbName string, dbType string) err if err = rows.Close(); err != nil { return err } - dataType, err = common.ColumnType(db, tx, "ip", "DBPREFIXip_ban", dbName, dbType) + dataType, err = common.ColumnType(db, tx, "ip", "DBPREFIXip_ban", criticalCfg) if err != nil { return err } - if dataType == "" { + if dataType != "" { // add range_start and range_end columns query = `ALTER TABLE DBPREFIXip_ban ADD COLUMN IF NOT EXISTS range_start VARBINARY(16) NOT NULL, @@ -104,7 +106,7 @@ func updateMysqlDB(db *gcsql.GCDB, tx *sql.Tx, dbName string, dbType string) err } // Convert DBPREFIXposts.ip to from varchar to varbinary - dataType, err = common.ColumnType(db, tx, "ip", "DBPREFIXposts", dbName, dbType) + dataType, err = common.ColumnType(db, tx, "ip", "DBPREFIXposts", criticalCfg) if err != nil { return err } @@ -134,7 +136,7 @@ func updateMysqlDB(db *gcsql.GCDB, tx *sql.Tx, dbName string, dbType string) err } // Convert DBPREFIXreports.ip to from varchar to varbinary - dataType, err = common.ColumnType(db, tx, "ip", "DBPREFIXreports", dbName, dbType) + dataType, err = common.ColumnType(db, tx, "ip", "DBPREFIXreports", criticalCfg) if err != nil { return err } diff --git a/cmd/gochan-migration/internal/gcupdate/updatepostgres.go b/cmd/gochan-migration/internal/gcupdate/updatepostgres.go index 84fea85c..e5d2e8d5 100644 --- a/cmd/gochan-migration/internal/gcupdate/updatepostgres.go +++ b/cmd/gochan-migration/internal/gcupdate/updatepostgres.go @@ -4,10 +4,11 @@ import ( "database/sql" "github.com/gochan-org/gochan/cmd/gochan-migration/internal/common" + "github.com/gochan-org/gochan/pkg/config" "github.com/gochan-org/gochan/pkg/gcsql" ) -func updatePostgresDB(db *gcsql.GCDB, tx *sql.Tx, dbName string, dbType string) error { +func updatePostgresDB(db *gcsql.GCDB, tx *sql.Tx, criticalCfg *config.SystemCriticalConfig) error { query := `ALTER TABLE DBPREFIXwordfilters DROP CONSTRAINT IF EXISTS board_id_fk` _, err := db.ExecSQL(query) @@ -20,7 +21,7 @@ func updatePostgresDB(db *gcsql.GCDB, tx *sql.Tx, dbName string, dbType string) return err } - dataType, err := common.ColumnType(db, tx, "ip", "DBPREFIXposts", dbName, dbType) + dataType, err := common.ColumnType(db, tx, "ip", "DBPREFIXposts", criticalCfg) if err != nil { return err } @@ -50,7 +51,7 @@ func updatePostgresDB(db *gcsql.GCDB, tx *sql.Tx, dbName string, dbType string) } } - dataType, err = common.ColumnType(db, tx, "ip", "DBPREFIXip_ban", dbName, dbType) + dataType, err = common.ColumnType(db, tx, "ip", "DBPREFIXip_ban", criticalCfg) if err != nil { return err } diff --git a/cmd/gochan-migration/internal/gcupdate/updatesqlite3.go b/cmd/gochan-migration/internal/gcupdate/updatesqlite3.go index 3aede603..59fb5262 100644 --- a/cmd/gochan-migration/internal/gcupdate/updatesqlite3.go +++ b/cmd/gochan-migration/internal/gcupdate/updatesqlite3.go @@ -4,15 +4,16 @@ import ( "database/sql" "github.com/gochan-org/gochan/cmd/gochan-migration/internal/common" + "github.com/gochan-org/gochan/pkg/config" "github.com/gochan-org/gochan/pkg/gcsql" ) -func updateSqliteDB(db *gcsql.GCDB, tx *sql.Tx, dbName string, dbType string) error { +func updateSqliteDB(db *gcsql.GCDB, tx *sql.Tx, criticalCfg *config.SystemCriticalConfig) error { _, err := db.ExecSQL(`PRAGMA foreign_keys = ON`) if err != nil { return err } - dataType, err := common.ColumnType(db, tx, "DBPREFIXwordfilters", "board_dirs", dbName, dbType) + dataType, err := common.ColumnType(db, tx, "DBPREFIXwordfilters", "board_dirs", criticalCfg) if err != nil { return err } diff --git a/devtools/get_pre2021.sh b/devtools/get_pre2021.sh index 6a66345c..3a0997e7 100755 --- a/devtools/get_pre2021.sh +++ b/devtools/get_pre2021.sh @@ -3,6 +3,8 @@ # Shell script that downloads a pre-migration gochan release for testing gochan-migration # This should only be used in a development environment +set -euo pipefail + TESTING_VERSION="v2.12.0" RELEASE_DIR="gochan-${TESTING_VERSION}_linux" RELEASE_GZ="$RELEASE_DIR.tar.gz" diff --git a/devtools/get_previous_version.sh b/devtools/get_previous_version.sh index 87364fba..75aac63e 100755 --- a/devtools/get_previous_version.sh +++ b/devtools/get_previous_version.sh @@ -3,6 +3,8 @@ # Shell script that downloads a previous gochan release for testing gochan-migration -updatedb # This should only be used in a development environment +set -euo pipefail + TESTING_VERSION="v3.7.0" RELEASE_DIR="gochan-${TESTING_VERSION}_linux" RELEASE_GZ="$RELEASE_DIR.tar.gz" @@ -21,14 +23,18 @@ echo "Extracting $RELEASE_GZ" tar -xf gochan-${TESTING_VERSION}_linux.tar.gz cd $RELEASE_DIR -cp examples/configs/gochan.example.json gochan.json +cp sample-configs/gochan.example.json gochan.json echo "Modifying $PWD/gochan.json for testing migration" sed -i gochan.json \ -e 's/"Port": .*/"Port": 9000,/' \ -e 's/"UseFastCGI": false/"UseFastCGI": true/' \ -e "s/\"DBtype\": .*/\"DBtype\": \""$DBTYPE"\",/" \ -e 's/"DBpassword": ""/"DBpassword": "gochan"/' \ + -e 's/"LogDir": .*/"LogDir": "log"/' \ + -e 's/"TemplateDir": .*/"TemplateDir": "templates"/' \ + -e 's/"DocumentRoot": .*/"DocumentRoot": "html"/' \ -e 's/"DBname": "gochan"/"DBname": "gochan_37"/' \ + -e 's/"DBprefix": .*/"DBprefix": ""/' \ -e 's/"SiteName": "Gochan"/"SiteName": "Gochan Migration Test"/' \ -e 's/"SiteSlogan": ""/"SiteSlogan": "Gochan instance used for testing gochan-migrate -updatedb"/' \ -e 's/"DebugMode": false/"DebugMode": true/' \ @@ -56,4 +62,5 @@ else exit 1 fi +mkdir -p log sudo ./gochan \ No newline at end of file diff --git a/pkg/gcsql/provisioning.go b/pkg/gcsql/provisioning.go index da9b507e..99671678 100644 --- a/pkg/gcsql/provisioning.go +++ b/pkg/gcsql/provisioning.go @@ -105,10 +105,7 @@ func CheckAndInitializeDatabase(dbType string) error { default: err = ErrInvalidDBVersion } - if err != nil { - return err - } - return nil + return err } func buildNewDatabase(dbType string) error {