From 899be1a9e2c65f5119654b984db31921fb823c1f Mon Sep 17 00:00:00 2001 From: biast12 Date: Wed, 15 Apr 2026 20:53:49 +0200 Subject: [PATCH 1/2] Rename DisableSome and balance panel enablement Renamed PanelTable.DisableSome to ForceDisableSome and clarified SQL formatting. The function now enforces the freeLimit by disabling excess panels (newest first) and, if there are too few enabled panels, re-enabling previously force-disabled panels (oldest first). Uses pgtype.Int4Array to pass ID arrays to UPDATE queries and adds clearer comments to explain behavior. --- panels.go | 39 ++++++++++++++++++++++++++++++++++----- 1 file changed, 34 insertions(+), 5 deletions(-) diff --git a/panels.go b/panels.go index 66ed213..1cf8701 100644 --- a/panels.go +++ b/panels.go @@ -832,7 +832,7 @@ WHERE "guild_id" = $1; return } -func (p *PanelTable) DisableSome(ctx context.Context, guildId uint64, freeLimit int) error { +func (p *PanelTable) ForceDisableSome(ctx context.Context, guildId uint64, freeLimit int) error { txOpts := pgx.TxOptions{ IsoLevel: pgx.Serializable, AccessMode: pgx.ReadWrite, @@ -846,15 +846,15 @@ func (p *PanelTable) DisableSome(ctx context.Context, guildId uint64, freeLimit var panelCount int { - query := `SELECT COUNT(*) FROM panels WHERE guild_id = $1 and "force_disabled" = false;` + query := `SELECT COUNT(*) FROM panels WHERE guild_id = $1 AND "force_disabled" = false;` if err := tx.QueryRow(ctx, query, guildId).Scan(&panelCount); err != nil { return err } } if panelCount > freeLimit { - // Find panels to disable - query := `SELECT "panel_id" FROM panels WHERE guild_id = $1 and "force_disabled" = false ORDER BY "panel_id" DESC LIMIT $2;` + // Too many enabled: disable the excess, newest first. + query := `SELECT "panel_id" FROM panels WHERE guild_id = $1 AND "force_disabled" = false ORDER BY "panel_id" DESC LIMIT $2;` rows, err := tx.Query(ctx, query, guildId, panelCount-freeLimit) if err != nil { return err @@ -870,7 +870,6 @@ func (p *PanelTable) DisableSome(ctx context.Context, guildId uint64, freeLimit toDisable = append(toDisable, panelId) } - // Disable panels if len(toDisable) > 0 { query := `UPDATE panels SET "force_disabled" = true WHERE "panel_id" = ANY($1) AND "guild_id" = $2;` @@ -879,6 +878,36 @@ func (p *PanelTable) DisableSome(ctx context.Context, guildId uint64, freeLimit return err } + if _, err := tx.Exec(ctx, query, idArray, guildId); err != nil { + return err + } + } + } else if panelCount < freeLimit { + // Too few enabled: re-enable force-disabled panels to fill the vacancy, oldest first. + query := `SELECT "panel_id" FROM panels WHERE guild_id = $1 AND "force_disabled" = true ORDER BY "panel_id" ASC LIMIT $2;` + rows, err := tx.Query(ctx, query, guildId, freeLimit-panelCount) + if err != nil { + return err + } + + var toEnable []int + for rows.Next() { + var panelId int + if err := rows.Scan(&panelId); err != nil { + return err + } + + toEnable = append(toEnable, panelId) + } + + if len(toEnable) > 0 { + query := `UPDATE panels SET "force_disabled" = false WHERE "panel_id" = ANY($1) AND "guild_id" = $2;` + + idArray := &pgtype.Int4Array{} + if err := idArray.Set(toEnable); err != nil { + return err + } + if _, err := tx.Exec(ctx, query, idArray, guildId); err != nil { return err } From 96be001d8c0dfd6eee1684a485c43a5ffbba75d9 Mon Sep 17 00:00:00 2001 From: biast12 Date: Wed, 15 Apr 2026 21:49:16 +0200 Subject: [PATCH 2/2] Use UPDATE subqueries to toggle force_disabled Simplify panel enable/disable logic by using single UPDATE statements with subqueries instead of selecting IDs, building arrays, and issuing separate updates. Adds a deferred tx.Rollback(ctx) and consolidates the COUNT query. The changes preserve ordering (disable newest first with DESC, re-enable oldest first with ASC) and reduce round-trips / avoid pgtype.Int4Array handling. --- panels.go | 78 +++++++++++++++---------------------------------------- 1 file changed, 21 insertions(+), 57 deletions(-) diff --git a/panels.go b/panels.go index 1cf8701..39f4928 100644 --- a/panels.go +++ b/panels.go @@ -843,75 +843,39 @@ func (p *PanelTable) ForceDisableSome(ctx context.Context, guildId uint64, freeL if err != nil { return err } + defer tx.Rollback(ctx) var panelCount int - { - query := `SELECT COUNT(*) FROM panels WHERE guild_id = $1 AND "force_disabled" = false;` - if err := tx.QueryRow(ctx, query, guildId).Scan(&panelCount); err != nil { - return err - } + if err := tx.QueryRow(ctx, `SELECT COUNT(*) FROM panels WHERE "guild_id" = $1 AND "force_disabled" = false;`, guildId).Scan(&panelCount); err != nil { + return err } if panelCount > freeLimit { // Too many enabled: disable the excess, newest first. - query := `SELECT "panel_id" FROM panels WHERE guild_id = $1 AND "force_disabled" = false ORDER BY "panel_id" DESC LIMIT $2;` - rows, err := tx.Query(ctx, query, guildId, panelCount-freeLimit) - if err != nil { + query := ` +UPDATE panels SET "force_disabled" = true +WHERE "guild_id" = $1 +AND "panel_id" IN ( + SELECT "panel_id" FROM panels + WHERE "guild_id" = $1 AND "force_disabled" = false + ORDER BY "panel_id" DESC LIMIT $2 +);` + if _, err := tx.Exec(ctx, query, guildId, panelCount-freeLimit); err != nil { return err } - - var toDisable []int - for rows.Next() { - var panelId int - if err := rows.Scan(&panelId); err != nil { - return err - } - - toDisable = append(toDisable, panelId) - } - - if len(toDisable) > 0 { - query := `UPDATE panels SET "force_disabled" = true WHERE "panel_id" = ANY($1) AND "guild_id" = $2;` - - idArray := &pgtype.Int4Array{} - if err := idArray.Set(toDisable); err != nil { - return err - } - - if _, err := tx.Exec(ctx, query, idArray, guildId); err != nil { - return err - } - } } else if panelCount < freeLimit { // Too few enabled: re-enable force-disabled panels to fill the vacancy, oldest first. - query := `SELECT "panel_id" FROM panels WHERE guild_id = $1 AND "force_disabled" = true ORDER BY "panel_id" ASC LIMIT $2;` - rows, err := tx.Query(ctx, query, guildId, freeLimit-panelCount) - if err != nil { + query := ` +UPDATE panels SET "force_disabled" = false +WHERE "guild_id" = $1 +AND "panel_id" IN ( + SELECT "panel_id" FROM panels + WHERE "guild_id" = $1 AND "force_disabled" = true + ORDER BY "panel_id" ASC LIMIT $2 +);` + if _, err := tx.Exec(ctx, query, guildId, freeLimit-panelCount); err != nil { return err } - - var toEnable []int - for rows.Next() { - var panelId int - if err := rows.Scan(&panelId); err != nil { - return err - } - - toEnable = append(toEnable, panelId) - } - - if len(toEnable) > 0 { - query := `UPDATE panels SET "force_disabled" = false WHERE "panel_id" = ANY($1) AND "guild_id" = $2;` - - idArray := &pgtype.Int4Array{} - if err := idArray.Set(toEnable); err != nil { - return err - } - - if _, err := tx.Exec(ctx, query, idArray, guildId); err != nil { - return err - } - } } return tx.Commit(ctx)