migrateMessagesToSessionItems migrates data from the messages JSON column to the session_items table
(ctx context.Context, db *sql.DB)
| 405 | |
| 406 | // migrateMessagesToSessionItems migrates data from the messages JSON column to the session_items table |
| 407 | func migrateMessagesToSessionItems(ctx context.Context, db *sql.DB) error { |
| 408 | slog.InfoContext(ctx, "Starting migration of messages to session_items") |
| 409 | |
| 410 | // Get all sessions that have messages but no items yet |
| 411 | rows, err := db.QueryContext(ctx, ` |
| 412 | SELECT s.id, s.messages |
| 413 | FROM sessions s |
| 414 | WHERE s.messages IS NOT NULL |
| 415 | AND s.messages != '' |
| 416 | AND s.messages != '[]' |
| 417 | AND NOT EXISTS (SELECT 1 FROM session_items si WHERE si.session_id = s.id) |
| 418 | `) |
| 419 | if err != nil { |
| 420 | return fmt.Errorf("querying sessions: %w", err) |
| 421 | } |
| 422 | defer rows.Close() |
| 423 | |
| 424 | var sessionsToMigrate []struct { |
| 425 | id string |
| 426 | messages string |
| 427 | } |
| 428 | |
| 429 | for rows.Next() { |
| 430 | var id, messages string |
| 431 | if err := rows.Scan(&id, &messages); err != nil { |
| 432 | return fmt.Errorf("scanning session: %w", err) |
| 433 | } |
| 434 | sessionsToMigrate = append(sessionsToMigrate, struct { |
| 435 | id string |
| 436 | messages string |
| 437 | }{id, messages}) |
| 438 | } |
| 439 | if err := rows.Err(); err != nil { |
| 440 | return fmt.Errorf("iterating sessions: %w", err) |
| 441 | } |
| 442 | |
| 443 | slog.InfoContext(ctx, "Found sessions to migrate", "count", len(sessionsToMigrate)) |
| 444 | |
| 445 | // Migrate each session |
| 446 | for _, sess := range sessionsToMigrate { |
| 447 | if err := migrateSessionMessages(ctx, db, sess.id, sess.messages, ""); err != nil { |
| 448 | slog.WarnContext(ctx, "Failed to migrate session, skipping", "session_id", sess.id, "error", err) |
| 449 | continue |
| 450 | } |
| 451 | } |
| 452 | |
| 453 | slog.InfoContext(ctx, "Completed migration of messages to session_items") |
| 454 | return nil |
| 455 | } |
| 456 | |
| 457 | // migrateSessionMessages migrates a single session's messages to session_items |
| 458 | func migrateSessionMessages(ctx context.Context, db *sql.DB, sessionID, messagesJSON, parentID string) error { |
nothing calls this directly
no test coverage detected