| 327 | } |
| 328 | |
| 329 | func (s *Store) loadDeadline(ctx context.Context) (any, error) { |
| 330 | var raw string |
| 331 | err := s.db.QueryRowContext( |
| 332 | ctx, |
| 333 | `SELECT value FROM bot_state WHERE key = ?`, |
| 334 | deadlineStateKey, |
| 335 | ).Scan(&raw) |
| 336 | if err != nil { |
| 337 | if errors.Is(err, sql.ErrNoRows) { |
| 338 | return nil, nil |
| 339 | } |
| 340 | return nil, err |
| 341 | } |
| 342 | |
| 343 | var payload any |
| 344 | decoder := json.NewDecoder(strings.NewReader(raw)) |
| 345 | decoder.UseNumber() |
| 346 | if err := decoder.Decode(&payload); err != nil { |
| 347 | log.Printf("sqlite: failed to decode deadline payload: %v", err) |
| 348 | return nil, nil |
| 349 | } |
| 350 | |
| 351 | switch payload.(type) { |
| 352 | case nil, string, map[string]any: |
| 353 | return payload, nil |
| 354 | default: |
| 355 | log.Printf("sqlite: unexpected deadline payload type %T, resetting to empty state", payload) |
| 356 | return nil, nil |
| 357 | } |
| 358 | } |
| 359 | |
| 360 | func replaceRuntimeSnapshot(ctx context.Context, tx *sql.Tx, snapshot Snapshot) error { |
| 361 | for _, stmt := range []string{ |