package migrations import ( "context" "github.com/uptrace/bun" "github.com/uptrace/bun/dialect" ) //nolint:lll func init() { migrations.MustRegister(func(ctx context.Context, db *bun.DB) error { var err error //nolint:exhaustive switch db.Dialect().Name() { case dialect.PG: // hash_record_extended is Postgres specific // https://dba.stackexchange.com/questions/299098/why-doesnt-my-unique-constraint-trigger/299107#299107 _, err = db.ExecContext( ctx, `create unique index concurrently if not exists tribe_changes_hash_key on tribe_changes (hash_record_extended( ROW (player_id, new_tribe_id, old_tribe_id, server_key, date_trunc('hours'::text, (created_at AT TIME ZONE 'UTC'::text))), 0::bigint));`, ) case dialect.SQLite: _, err = db.ExecContext( ctx, `create unique index if not exists tribe_changes_hash_key on tribe_changes (server_key, coalesce(player_id, 0), coalesce(new_tribe_id, 0), coalesce(old_tribe_id, 0), strftime('%Y-%m-%d-%H', created_at));`, ) } return err }, func(ctx context.Context, db *bun.DB) error { _, err := db.NewDropIndex().IfExists().Index("tribe_changes_hash_key").Concurrently().Exec(ctx) return err }) }