#lang racket/base (require db racket/file racket/path racket/string "config.rkt" "todo.rkt") (provide current-schema-version database-schema-version migrate-database!) (define current-schema-version 3) (define schema-1-statements (list #<2! db config) (query-exec db "ALTER TABLE attachments ADD COLUMN IF NOT EXISTS mime_type TEXT") (query-exec db "ALTER TABLE attachments ADD COLUMN IF NOT EXISTS content BYTEA") (define rows (query-rows db #< 2 cannot migrate attachment ~a: missing file ~a" stored-name (path->string path))) (define bytes (file->bytes path)) (query-exec db "UPDATE attachments SET content = $1, mime_type = $2, size = $3 WHERE id = $4" bytes (legacy-mime-type stored-name) (bytes-length bytes) attachment-id))) (query-exec db "UPDATE attachments SET mime_type = 'application/octet-stream' WHERE mime_type IS NULL") (query-exec db "ALTER TABLE attachments ALTER COLUMN mime_type SET NOT NULL") (query-exec db "ALTER TABLE attachments ALTER COLUMN content SET NOT NULL") (record-schema-version! db 2)) (define (replace-page-todos! db page-id markdown) (query-exec db "DELETE FROM todo_items WHERE page_id = $1" page-id) (for ((item (in-list (extract-todos markdown)))) (query-exec db #<3! db) (query-exec db #<2! db config)) (define after-attachments (database-schema-version db)) (when (= after-attachments 2) (migrate-2->3! db)) (define resulting-version (database-schema-version db)) (when (> resulting-version current-schema-version) (error 'migrate-database! "database schema ~a is newer than this racket-wiki supports (~a)" resulting-version current-schema-version)) resulting-version)))