Files
DorkNet/DorkNet.Server/Migrations/20260516205306_MakeRoomDataBlobBytesNullable.cs
Alexa d471b418b9 Import march-2020-03-10 from private repo (scrubbed 2026-05-27)
Targets Rec Room 2020.03.10 client (also serves 2020.03.06).

Re-import after adding:
- DorkNet.ClientMod/dorknet-clientmod.json.template — config schema
  the launcher's manifest-driven patcher renders into UserData/.
- tools/build-patcher-zip.ps1 — produces dorknet-clientpatch-{key}.zip
  for v1-march-* Release uploads.
- .github/workflows/release.yml — on tag push publishes both
  dorknet-server-march_2020_03_10-win-x64.zip and
  dorknet-clientpatch-march_2020_03_10.zip as Release assets.

Same scrub rules as december; tools/build-patcher-zip.ps1 added to
the maintainer-side allow-list so it survives.
2026-05-27 01:06:12 +03:00

51 lines
2.0 KiB
C#

using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace DorkNet.Server.Migrations
{
/// <inheritdoc />
public partial class MakeRoomDataBlobBytesNullable : Migration
{
// CRITICAL: this migration must NOT drop or recreate the Bytes
// column. The column physically exists on every prod DB and
// holds the legacy bytes that haven't been backfilled to S3
// yet. A DropColumn here would obliterate every pre-cutover
// room save. We only flip NOT NULL -> NULL so new inserts
// (which leave the property null because writers go S3-only
// now) don't crash on the constraint. Run the
// /api/admin/v1/storage/backfill admin endpoint to copy the
// bytes from this column into S3 row-by-row; a follow-up
// migration drops the column once every row has been moved.
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.AlterColumn<byte[]>(
name: "Bytes",
table: "RoomDataBlobs",
type: "BLOB",
nullable: true,
oldClrType: typeof(byte[]),
oldType: "BLOB");
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
// Re-tighten to NOT NULL. Any rows that became NULL during
// the backfill won't pass this constraint — caller's
// responsibility to repopulate or delete those rows
// before rolling back. Defaulting to empty BLOB keeps
// the constraint satisfiable.
migrationBuilder.AlterColumn<byte[]>(
name: "Bytes",
table: "RoomDataBlobs",
type: "BLOB",
nullable: false,
defaultValue: new byte[0],
oldClrType: typeof(byte[]),
oldType: "BLOB",
oldNullable: true);
}
}
}