fix: unsilence all error returns from SQL Exec, Bot API calls, and migrations
This commit is contained in:
@@ -77,7 +77,9 @@ func NewStore(path string) (*Store, error) {
|
||||
if err := db.Ping(); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
db.Exec("PRAGMA journal_mode=WAL")
|
||||
if _, err := db.Exec("PRAGMA journal_mode=WAL"); err != nil {
|
||||
slog.Warn("failed to set WAL mode", "error", err)
|
||||
}
|
||||
if err := runMigrations(db); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -96,7 +98,10 @@ func (s *Store) DB() *sql.DB {
|
||||
|
||||
func hasTable(db *sql.DB, name string) bool {
|
||||
var exists int
|
||||
db.QueryRow("SELECT COUNT(1) FROM sqlite_master WHERE type='table' AND name=?", name).Scan(&exists)
|
||||
if err := db.QueryRow("SELECT COUNT(1) FROM sqlite_master WHERE type='table' AND name=?", name).Scan(&exists); err != nil {
|
||||
slog.Warn("hasTable query failed", "table", name, "error", err)
|
||||
return false
|
||||
}
|
||||
return exists > 0
|
||||
}
|
||||
|
||||
@@ -139,15 +144,21 @@ func runMigrations(db *sql.DB) error {
|
||||
func hasCol(db *sql.DB, table, column string) bool {
|
||||
rows, err := db.Query("PRAGMA table_info(" + table + ")")
|
||||
if err != nil {
|
||||
slog.Warn("hasCol query failed", "table", table, "error", err)
|
||||
return false
|
||||
}
|
||||
defer rows.Close()
|
||||
defer func() {
|
||||
if err := rows.Close(); err != nil {
|
||||
slog.Warn("hasCol rows.Close failed", "table", table, "error", err)
|
||||
}
|
||||
}()
|
||||
for rows.Next() {
|
||||
var cid int
|
||||
var name, ctype string
|
||||
var notnull, pk int
|
||||
var dflt sql.NullString
|
||||
if err := rows.Scan(&cid, &name, &ctype, ¬null, &dflt, &pk); err != nil {
|
||||
slog.Warn("hasCol scan failed", "table", table, "error", err)
|
||||
return false
|
||||
}
|
||||
if name == column {
|
||||
@@ -165,7 +176,9 @@ func migrateFromOldSchemaData(db *sql.DB) error {
|
||||
|
||||
for _, t := range []string{"days_off_old", "settings_old", "events_old"} {
|
||||
if hasTable(db, t) {
|
||||
db.Exec("DROP TABLE IF EXISTS " + t)
|
||||
if _, err := db.Exec("DROP TABLE IF EXISTS " + t); err != nil {
|
||||
slog.Warn("failed to drop old table", "table", t, "error", err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -179,20 +192,27 @@ func migrateUsers(db *sql.DB) {
|
||||
}
|
||||
rows, err := db.Query("SELECT DISTINCT chat_id FROM events_old")
|
||||
if err != nil {
|
||||
slog.Warn("migration: no events table to migrate users from")
|
||||
slog.Warn("migration: failed to query events_old for users", "error", err)
|
||||
return
|
||||
}
|
||||
defer rows.Close()
|
||||
defer func() {
|
||||
if err := rows.Close(); err != nil {
|
||||
slog.Warn("migration: rows.Close failed in migrateUsers", "error", err)
|
||||
}
|
||||
}()
|
||||
|
||||
for rows.Next() {
|
||||
var chatID int64
|
||||
if err := rows.Scan(&chatID); err != nil {
|
||||
slog.Warn("migration: scan failed in migrateUsers", "error", err)
|
||||
continue
|
||||
}
|
||||
db.Exec(
|
||||
if _, err := db.Exec(
|
||||
"INSERT OR IGNORE INTO users (chat_id, timezone) VALUES (?, 'Asia/Tehran')",
|
||||
chatID,
|
||||
)
|
||||
); err != nil {
|
||||
slog.Warn("migration: failed to insert user", "chat_id", chatID, "error", err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -202,25 +222,34 @@ func migrateDaysOff(db *sql.DB) {
|
||||
}
|
||||
rows, err := db.Query("SELECT chat_id, date, reason FROM days_off_old")
|
||||
if err != nil {
|
||||
slog.Warn("migration: failed to query days_off_old", "error", err)
|
||||
return
|
||||
}
|
||||
defer rows.Close()
|
||||
defer func() {
|
||||
if err := rows.Close(); err != nil {
|
||||
slog.Warn("migration: rows.Close failed in migrateDaysOff", "error", err)
|
||||
}
|
||||
}()
|
||||
|
||||
for rows.Next() {
|
||||
var chatID int64
|
||||
var date, reason string
|
||||
if err := rows.Scan(&chatID, &date, &reason); err != nil {
|
||||
slog.Warn("migration: scan failed in migrateDaysOff", "error", err)
|
||||
continue
|
||||
}
|
||||
var userID int64
|
||||
err := db.QueryRow("SELECT id FROM users WHERE chat_id=?", chatID).Scan(&userID)
|
||||
if err != nil {
|
||||
slog.Warn("migration: user not found for days_off", "chat_id", chatID, "error", err)
|
||||
continue
|
||||
}
|
||||
db.Exec(
|
||||
if _, err := db.Exec(
|
||||
"INSERT INTO days (user_id, date, is_day_off, day_off_reason) VALUES (?, ?, 1, ?) ON CONFLICT(user_id, date) DO UPDATE SET is_day_off=1, day_off_reason=excluded.day_off_reason",
|
||||
userID, date, reason,
|
||||
)
|
||||
); err != nil {
|
||||
slog.Warn("migration: failed to insert day_off", "user_id", userID, "date", date, "error", err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -230,34 +259,49 @@ func migrateEvents(db *sql.DB) {
|
||||
}
|
||||
rows, err := db.Query("SELECT chat_id, event_type, occurred_at, note, created_at FROM events_old ORDER BY occurred_at ASC")
|
||||
if err != nil {
|
||||
slog.Warn("migration: failed to query events_old", "error", err)
|
||||
return
|
||||
}
|
||||
defer rows.Close()
|
||||
defer func() {
|
||||
if err := rows.Close(); err != nil {
|
||||
slog.Warn("migration: rows.Close failed in migrateEvents", "error", err)
|
||||
}
|
||||
}()
|
||||
|
||||
for rows.Next() {
|
||||
var chatID int64
|
||||
var eventType, note string
|
||||
var occurredAt, createdAt int64
|
||||
if err := rows.Scan(&chatID, &eventType, &occurredAt, ¬e, &createdAt); err != nil {
|
||||
slog.Warn("migration: scan failed in migrateEvents", "error", err)
|
||||
continue
|
||||
}
|
||||
|
||||
var userID int64
|
||||
err := db.QueryRow("SELECT id FROM users WHERE chat_id=?", chatID).Scan(&userID)
|
||||
if err != nil {
|
||||
slog.Warn("migration: user not found for event", "chat_id", chatID, "error", err)
|
||||
continue
|
||||
}
|
||||
|
||||
date := time.Unix(occurredAt, 0).UTC().Format("2006-01-02")
|
||||
db.Exec("INSERT OR IGNORE INTO days (user_id, date) VALUES (?, ?)", userID, date)
|
||||
if _, err := db.Exec("INSERT OR IGNORE INTO days (user_id, date) VALUES (?, ?)", userID, date); err != nil {
|
||||
slog.Warn("migration: failed to insert day", "user_id", userID, "date", date, "error", err)
|
||||
continue
|
||||
}
|
||||
|
||||
var dayID int64
|
||||
db.QueryRow("SELECT id FROM days WHERE user_id=? AND date=?", userID, date).Scan(&dayID)
|
||||
if err := db.QueryRow("SELECT id FROM days WHERE user_id=? AND date=?", userID, date).Scan(&dayID); err != nil {
|
||||
slog.Warn("migration: day not found after insert", "user_id", userID, "date", date, "error", err)
|
||||
continue
|
||||
}
|
||||
|
||||
db.Exec(
|
||||
if _, err := db.Exec(
|
||||
"INSERT INTO events (user_id, day_id, event_type, occurred_at, note, created_at) VALUES (?, ?, ?, ?, ?, ?)",
|
||||
userID, dayID, eventType, occurredAt, note, createdAt,
|
||||
)
|
||||
); err != nil {
|
||||
slog.Warn("migration: failed to insert event", "user_id", userID, "error", err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -267,27 +311,36 @@ func migrateSettings(db *sql.DB) {
|
||||
}
|
||||
rows, err := db.Query("SELECT chat_id, key, value FROM settings_old")
|
||||
if err != nil {
|
||||
slog.Warn("migration: failed to query settings_old", "error", err)
|
||||
return
|
||||
}
|
||||
defer rows.Close()
|
||||
defer func() {
|
||||
if err := rows.Close(); err != nil {
|
||||
slog.Warn("migration: rows.Close failed in migrateSettings", "error", err)
|
||||
}
|
||||
}()
|
||||
|
||||
for rows.Next() {
|
||||
var chatID int64
|
||||
var key, value string
|
||||
if err := rows.Scan(&chatID, &key, &value); err != nil {
|
||||
slog.Warn("migration: scan failed in migrateSettings", "error", err)
|
||||
continue
|
||||
}
|
||||
if key == "remote_flag" {
|
||||
var userID int64
|
||||
err := db.QueryRow("SELECT id FROM users WHERE chat_id=?", chatID).Scan(&userID)
|
||||
if err != nil {
|
||||
slog.Warn("migration: user not found for setting", "chat_id", chatID, "error", err)
|
||||
continue
|
||||
}
|
||||
wt := int64(1)
|
||||
if value == "remote" {
|
||||
wt = 2
|
||||
}
|
||||
db.Exec("UPDATE days SET current_work_type_id=? WHERE user_id=? AND date=?", wt, userID, time.Now().UTC().Format("2006-01-02"))
|
||||
if _, err := db.Exec("UPDATE days SET current_work_type_id=? WHERE user_id=? AND date=?", wt, userID, time.Now().UTC().Format("2006-01-02")); err != nil {
|
||||
slog.Warn("migration: failed to update work type", "user_id", userID, "error", err)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -527,7 +580,11 @@ func (s *Store) GetLastEvent(userID int64) (*Event, error) {
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
defer row.Close()
|
||||
defer func() {
|
||||
if err := row.Close(); err != nil {
|
||||
slog.Warn("GetLastEvent: row.Close failed", "error", err)
|
||||
}
|
||||
}()
|
||||
if !row.Next() {
|
||||
return nil, sql.ErrNoRows
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user