1
0
Fork 0
mirror of https://github.com/Eggbertx/gochan.git synced 2025-08-17 10:56:24 -07:00

Fix prefix not being applied in DB update

This commit is contained in:
Eggbertx 2024-01-09 21:45:39 -08:00
parent 912fad3473
commit 9352f0b611
8 changed files with 34 additions and 23 deletions

View file

@ -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`

View file

@ -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

View file

@ -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
}

View file

@ -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
}

View file

@ -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
}

View file

@ -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"

View file

@ -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

View file

@ -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 {