fix(channelserver): handle silently swallowed DB scan and exec errors

Several handlers discarded errors from rows.Scan() and db.Exec(),
masking data corruption or connection issues. Scan failures in diva
schedule, event quests, and trend weapons are now logged or returned.
InitializeWarehouse now surfaces its insert error to the caller.
This commit is contained in:
Houmgaor
2026-02-21 13:49:25 +01:00
parent 9da467e00f
commit 3b044fb987
6 changed files with 18 additions and 7 deletions

View File

@@ -84,7 +84,9 @@ func handleMsgMhfGetUdSchedule(s *Session, p mhfpacket.MHFPacket) {
} else {
defer func() { _ = rows.Close() }()
for rows.Next() {
_ = rows.Scan(&id, &start)
if err := rows.Scan(&id, &start); err != nil {
s.logger.Error("Failed to scan diva schedule row", zap.Error(err))
}
}
}

View File

@@ -330,7 +330,9 @@ func handleMsgMhfAcquireTitle(s *Session, p mhfpacket.MHFPacket) {
func handleMsgMhfResetTitle(s *Session, p mhfpacket.MHFPacket) {}
func initializeWarehouse(s *Session) {
s.server.houseRepo.InitializeWarehouse(s.charID)
if err := s.server.houseRepo.InitializeWarehouse(s.charID); err != nil {
s.logger.Error("Failed to initialize warehouse", zap.Error(err), zap.Uint32("charID", s.charID))
}
}
func handleMsgMhfOperateWarehouse(s *Session, p mhfpacket.MHFPacket) {

View File

@@ -529,7 +529,7 @@ func TestOperateWarehouse_Op0_GetBoxNames(t *testing.T) {
_, _, session, charID := setupHouseTest(t)
// Initialize warehouse and rename a box
session.server.houseRepo.InitializeWarehouse(charID)
_ = session.server.houseRepo.InitializeWarehouse(charID)
_ = session.server.houseRepo.RenameWarehouseBox(charID, 0, 0, "MyItems")
pkt := &mhfpacket.MsgMhfOperateWarehouse{

View File

@@ -261,7 +261,10 @@ func handleMsgMhfGetTrendWeapon(s *Session, p mhfpacket.MHFPacket) {
j := 0
for rows.Next() {
trendWeapons[i][j].WeaponType = i
_ = rows.Scan(&trendWeapons[i][j].WeaponID)
if err := rows.Scan(&trendWeapons[i][j].WeaponID); err != nil {
s.logger.Error("Failed to scan trend weapon", zap.Error(err))
break
}
j++
}
}

View File

@@ -269,7 +269,9 @@ func makeEventQuest(s *Session, rows *sql.Rows) ([]byte, error) {
var questId, activeDuration, inactiveDuration, flags int
var maxPlayers, questType uint8
var startTime time.Time
_ = rows.Scan(&id, &maxPlayers, &questType, &questId, &mark, &flags, &startTime, &activeDuration, &inactiveDuration)
if err := rows.Scan(&id, &maxPlayers, &questType, &questId, &mark, &flags, &startTime, &activeDuration, &inactiveDuration); err != nil {
return nil, fmt.Errorf("failed to scan event quest row: %w", err)
}
data := loadQuestFile(s, questId)
if data == nil {

View File

@@ -97,12 +97,14 @@ func (r *HouseRepository) UpdateMission(charID uint32, data []byte) error {
// Warehouse methods
// InitializeWarehouse ensures a warehouse row exists for the character.
func (r *HouseRepository) InitializeWarehouse(charID uint32) {
func (r *HouseRepository) InitializeWarehouse(charID uint32) error {
var t int
err := r.db.QueryRow(`SELECT character_id FROM warehouse WHERE character_id=$1`, charID).Scan(&t)
if err != nil {
_, _ = r.db.Exec(`INSERT INTO warehouse (character_id) VALUES ($1)`, charID)
_, err = r.db.Exec(`INSERT INTO warehouse (character_id) VALUES ($1)`, charID)
return err
}
return nil
}
const warehouseNamesSQL = `