Files
zeekayandHanzo Dev 72d038cb61 A 0.1.x database opens with its documents, and a DSN path is refused by name
0.1.x kept each document as one row of docs(doc_id, state), every message it
received concatenated. The frame store never read that table, so the first
start of a later image on a 0.1.x volume served every document empty.

NewSQLite now moves docs into doc and frame, in one transaction, and drops
it. A state that splits into whole y-websocket messages keeps its content
messages (sync step 2 and update) as frames, in order: what Append stores for
the same messages. A state that does not split is kept whole as one frame,
which is what 0.1.x replayed. Migrated frames follow any the document already
has. Each row is deleted before its frames are written, so they reuse its
pages; if they still outgrow COLLAB_STORE_BYTES, the transaction rolls back,
docs is left as it was, and startup fails with "migrate 0.1 docs".

pkg/frame holds the y-websocket framing: Content, which the room already used
to decide what to store, and Split, which the migration uses.

COLLAB_SQLITE_PATH is a file path; the store sets its own pragmas. 0.1.1 took
a driver DSN there, and a DSN given to this store became "file:file:..." and
failed as "unable to open database file: out of memory (14)". A "file:" URI
or a path with a query is now refused before anything opens, naming it.

Tests seed a database with 0.1.x's own DDL and upsert: its Yjs update and
step 2 come back as frames, a non-Yjs state comes back whole, a document with
frames keeps them first, a migration larger than half the cap fits, one that
cannot fit leaves docs byte for byte, and reopening migrates nothing twice.

Co-authored-by: Hanzo Dev <[email protected]>
2026-09-23 16:22:09 -07:00
..