From d7886c09db692980423eb03fb55eb5f823ca4b0f Mon Sep 17 00:00:00 2001 From: fogelito Date: Sun, 15 Feb 2026 12:58:28 +0200 Subject: [PATCH 1/5] text type --- src/Migration/Resources/Database/Column.php | 4 + .../Resources/Database/Columns/LongText.php | 97 +++++++++++++++++++ .../Resources/Database/Columns/MediumText.php | 97 +++++++++++++++++++ .../Database/Columns/RegularText.php | 97 +++++++++++++++++++ src/Migration/Sources/Appwrite.php | 41 ++++++++ 5 files changed, 336 insertions(+) create mode 100644 src/Migration/Resources/Database/Columns/LongText.php create mode 100644 src/Migration/Resources/Database/Columns/MediumText.php create mode 100644 src/Migration/Resources/Database/Columns/RegularText.php diff --git a/src/Migration/Resources/Database/Column.php b/src/Migration/Resources/Database/Column.php index e064a40..94c29f2 100644 --- a/src/Migration/Resources/Database/Column.php +++ b/src/Migration/Resources/Database/Column.php @@ -8,6 +8,10 @@ abstract class Column extends Resource { public const TYPE_STRING = 'string'; + public const TYPE_TEXT = 'text'; + public const TYPE_MEDIUMTEXT = 'mediumtext'; + public const TYPE_LONGTEXT = 'longtext'; + public const TYPE_INTEGER = 'integer'; public const TYPE_FLOAT = 'double'; public const TYPE_BOOLEAN = 'boolean'; diff --git a/src/Migration/Resources/Database/Columns/LongText.php b/src/Migration/Resources/Database/Columns/LongText.php new file mode 100644 index 0000000..a54bd2d --- /dev/null +++ b/src/Migration/Resources/Database/Columns/LongText.php @@ -0,0 +1,97 @@ + + * }, + * table?: array{ + * database: array{ + * id: string, + * name: string, + * }, + * name: string, + * id: string, + * rowSecurity: bool, + * permissions: ?array + * }, + * required: bool, + * default: ?string, + * array: bool, + * size: int, + * format: string, + * createdAt: string, + * updatedAt: string, + * } $array + * @return self + */ + public static function fromArray(array $array): self + { + return new self( + $array['key'], + Table::fromArray($array['table'] ?? $array['collection']), + required: $array['required'], + default: $array['default'] ?? null, + array: $array['array'], + size: $array['size'], + format: $array['format'], + createdAt: $array['createdAt'] ?? '', + updatedAt: $array['updatedAt'] ?? '', + ); + } + + public function getType(): string + { + return Column::TYPE_LONGTEXT; + } + + public function getSize(): int + { + return $this->size; + } + + public function getFormat(): string + { + return $this->format; + } +} diff --git a/src/Migration/Resources/Database/Columns/MediumText.php b/src/Migration/Resources/Database/Columns/MediumText.php new file mode 100644 index 0000000..c7fb80f --- /dev/null +++ b/src/Migration/Resources/Database/Columns/MediumText.php @@ -0,0 +1,97 @@ + + * }, + * table?: array{ + * database: array{ + * id: string, + * name: string, + * }, + * name: string, + * id: string, + * rowSecurity: bool, + * permissions: ?array + * }, + * required: bool, + * default: ?string, + * array: bool, + * size: int, + * format: string, + * createdAt: string, + * updatedAt: string, + * } $array + * @return self + */ + public static function fromArray(array $array): self + { + return new self( + $array['key'], + Table::fromArray($array['table'] ?? $array['collection']), + required: $array['required'], + default: $array['default'] ?? null, + array: $array['array'], + size: $array['size'], + format: $array['format'], + createdAt: $array['createdAt'] ?? '', + updatedAt: $array['updatedAt'] ?? '', + ); + } + + public function getType(): string + { + return Column::TYPE_STRING; + } + + public function getSize(): int + { + return $this->size; + } + + public function getFormat(): string + { + return $this->format; + } +} diff --git a/src/Migration/Resources/Database/Columns/RegularText.php b/src/Migration/Resources/Database/Columns/RegularText.php new file mode 100644 index 0000000..71b1f5f --- /dev/null +++ b/src/Migration/Resources/Database/Columns/RegularText.php @@ -0,0 +1,97 @@ + + * }, + * table?: array{ + * database: array{ + * id: string, + * name: string, + * }, + * name: string, + * id: string, + * rowSecurity: bool, + * permissions: ?array + * }, + * required: bool, + * default: ?string, + * array: bool, + * size: int, + * format: string, + * createdAt: string, + * updatedAt: string, + * } $array + * @return self + */ + public static function fromArray(array $array): self + { + return new self( + $array['key'], + Table::fromArray($array['table'] ?? $array['collection']), + required: $array['required'], + default: $array['default'] ?? null, + array: $array['array'], + size: $array['size'], + format: $array['format'], + createdAt: $array['createdAt'] ?? '', + updatedAt: $array['updatedAt'] ?? '', + ); + } + + public function getType(): string + { + return Column::TYPE_TEXT; + } + + public function getSize(): int + { + return $this->size; + } + + public function getFormat(): string + { + return $this->format; + } +} diff --git a/src/Migration/Sources/Appwrite.php b/src/Migration/Sources/Appwrite.php index d07688a..6d24bb1 100644 --- a/src/Migration/Sources/Appwrite.php +++ b/src/Migration/Sources/Appwrite.php @@ -28,8 +28,10 @@ use Utopia\Migration\Resources\Database\Columns\Integer; use Utopia\Migration\Resources\Database\Columns\IP; use Utopia\Migration\Resources\Database\Columns\Line; +use Utopia\Migration\Resources\Database\Columns\MediumText; use Utopia\Migration\Resources\Database\Columns\Point; use Utopia\Migration\Resources\Database\Columns\Polygon; +use Utopia\Migration\Resources\Database\Columns\RegularText; use Utopia\Migration\Resources\Database\Columns\Relationship; use Utopia\Migration\Resources\Database\Columns\Text; use Utopia\Migration\Resources\Database\Columns\URL; @@ -1090,6 +1092,45 @@ private function exportColumns(int $batchSize): void updatedAt: $column['$updatedAt'] ?? '', ); break; + + case Column::TYPE_TEXT: + $col = new RegularText( + $column['key'], + $table, + required: $column['required'], + default: $column['default'], + array: $column['array'], + size: $column['size'] ?? 65535, + createdAt: $column['$createdAt'] ?? '', + updatedAt: $column['$updatedAt'] ?? '', + ); + break; + + case Column::TYPE_MEDIUMTEXT: + $col = new MediumText( + $column['key'], + $table, + required: $column['required'], + default: $column['default'], + array: $column['array'], + size: $column['size'] ?? 16777215, + createdAt: $column['$createdAt'] ?? '', + updatedAt: $column['$updatedAt'] ?? '', + ); + break; + + case Column::TYPE_LONGTEXT: + $col = new MediumText( + $column['key'], + $table, + required: $column['required'], + default: $column['default'], + array: $column['array'], + size: $column['size'] ?? 2147483647, + createdAt: $column['$createdAt'] ?? '', + updatedAt: $column['$updatedAt'] ?? '', + ); + break; } if (!isset($col)) { From f9e2c7b17e101a82f01795460d64e7f26a574993 Mon Sep 17 00:00:00 2001 From: fogelito Date: Sun, 15 Feb 2026 13:02:56 +0200 Subject: [PATCH 2/5] destination --- src/Migration/Destinations/Appwrite.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/Migration/Destinations/Appwrite.php b/src/Migration/Destinations/Appwrite.php index e5a13f7..823739f 100644 --- a/src/Migration/Destinations/Appwrite.php +++ b/src/Migration/Destinations/Appwrite.php @@ -470,6 +470,9 @@ protected function createColumn(Column $resource): bool Column::TYPE_POINT => UtopiaDatabase::VAR_POINT, Column::TYPE_LINE => UtopiaDatabase::VAR_LINESTRING, Column::TYPE_POLYGON => UtopiaDatabase::VAR_POLYGON, + Column::TYPE_TEXT => UtopiaDatabase::VAR_TEXT, + Column::TYPE_MEDIUMTEXT => UtopiaDatabase::VAR_MEDIUMTEXT, + Column::TYPE_LONGTEXT => UtopiaDatabase::VAR_LONGTEXT, default => throw new \Exception('Invalid resource type '.$resource->getType()), }; From 481539d4fcf998f8d5f1ed3871c42318058c4b40 Mon Sep 17 00:00:00 2001 From: fogelito Date: Sun, 15 Feb 2026 13:19:13 +0200 Subject: [PATCH 3/5] typo --- src/Migration/Resources/Database/Columns/LongText.php | 2 +- src/Migration/Resources/Database/Columns/MediumText.php | 4 ++-- src/Migration/Resources/Database/Columns/RegularText.php | 2 +- src/Migration/Sources/Appwrite.php | 3 ++- 4 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/Migration/Resources/Database/Columns/LongText.php b/src/Migration/Resources/Database/Columns/LongText.php index a54bd2d..7f6230c 100644 --- a/src/Migration/Resources/Database/Columns/LongText.php +++ b/src/Migration/Resources/Database/Columns/LongText.php @@ -14,7 +14,7 @@ public function __construct( bool $required = false, ?string $default = null, bool $array = false, - int $size = Database::LENGTH_KEY, + int $size = 2147483647, string $format = '', string $createdAt = '', string $updatedAt = '' diff --git a/src/Migration/Resources/Database/Columns/MediumText.php b/src/Migration/Resources/Database/Columns/MediumText.php index c7fb80f..35acc31 100644 --- a/src/Migration/Resources/Database/Columns/MediumText.php +++ b/src/Migration/Resources/Database/Columns/MediumText.php @@ -14,7 +14,7 @@ public function __construct( bool $required = false, ?string $default = null, bool $array = false, - int $size = Database::LENGTH_KEY, + int $size = 16777215, string $format = '', string $createdAt = '', string $updatedAt = '' @@ -82,7 +82,7 @@ public static function fromArray(array $array): self public function getType(): string { - return Column::TYPE_STRING; + return Column::TYPE_MEDIUMTEXT; } public function getSize(): int diff --git a/src/Migration/Resources/Database/Columns/RegularText.php b/src/Migration/Resources/Database/Columns/RegularText.php index 71b1f5f..9ae55b1 100644 --- a/src/Migration/Resources/Database/Columns/RegularText.php +++ b/src/Migration/Resources/Database/Columns/RegularText.php @@ -14,7 +14,7 @@ public function __construct( bool $required = false, ?string $default = null, bool $array = false, - int $size = Database::LENGTH_KEY, + int $size = 65535, string $format = '', string $createdAt = '', string $updatedAt = '' diff --git a/src/Migration/Sources/Appwrite.php b/src/Migration/Sources/Appwrite.php index 6d24bb1..c8624fb 100644 --- a/src/Migration/Sources/Appwrite.php +++ b/src/Migration/Sources/Appwrite.php @@ -28,6 +28,7 @@ use Utopia\Migration\Resources\Database\Columns\Integer; use Utopia\Migration\Resources\Database\Columns\IP; use Utopia\Migration\Resources\Database\Columns\Line; +use Utopia\Migration\Resources\Database\Columns\LongText; use Utopia\Migration\Resources\Database\Columns\MediumText; use Utopia\Migration\Resources\Database\Columns\Point; use Utopia\Migration\Resources\Database\Columns\Polygon; @@ -1120,7 +1121,7 @@ private function exportColumns(int $batchSize): void break; case Column::TYPE_LONGTEXT: - $col = new MediumText( + $col = new LongText( $column['key'], $table, required: $column['required'], From bf3074ef3bb39916b077d75b9b9f28630f05f98d Mon Sep 17 00:00:00 2001 From: fogelito Date: Sun, 15 Feb 2026 13:51:21 +0200 Subject: [PATCH 4/5] formatting --- tests/Migration/E2E/Sources/NHostTest.php | 3 ++- tests/Migration/E2E/Sources/SupabaseTest.php | 3 ++- tests/Migration/Unit/General/CSVTest.php | 15 ++++++++++----- tests/Migration/Unit/General/TransferTest.php | 6 ++++-- 4 files changed, 18 insertions(+), 9 deletions(-) diff --git a/tests/Migration/E2E/Sources/NHostTest.php b/tests/Migration/E2E/Sources/NHostTest.php index ca4d9f3..d269ad0 100644 --- a/tests/Migration/E2E/Sources/NHostTest.php +++ b/tests/Migration/E2E/Sources/NHostTest.php @@ -109,7 +109,8 @@ public function testRunTransfer($state) { $this->transfer->run( $this->source->getSupportedResources(), - function () {} + function () { + } ); $this->assertCount(0, $this->transfer->getReport('error')); diff --git a/tests/Migration/E2E/Sources/SupabaseTest.php b/tests/Migration/E2E/Sources/SupabaseTest.php index 2ce0397..c41f063 100644 --- a/tests/Migration/E2E/Sources/SupabaseTest.php +++ b/tests/Migration/E2E/Sources/SupabaseTest.php @@ -89,7 +89,8 @@ public function testRunTransfer($state) { $this->transfer->run( $this->source->getSupportedResources(), - function () {} + function () { + } ); $this->assertCount(0, $this->transfer->getReport('error')); diff --git a/tests/Migration/Unit/General/CSVTest.php b/tests/Migration/Unit/General/CSVTest.php index 530a596..e4fd3ec 100644 --- a/tests/Migration/Unit/General/CSVTest.php +++ b/tests/Migration/Unit/General/CSVTest.php @@ -169,7 +169,8 @@ public function testCSVExportWithSpecialCharacters() 'mixed_field' => 'Text with "quotes", commas, and\nnewlines' ]); - $csvDestination->testableImport([$row], function ($resources) {}); + $csvDestination->testableImport([$row], function ($resources) { + }); $csvDestination->shutdown(); $csvFile = $csvDestination->getLocalRoot() . '/test_db_test_table_id.csv'; @@ -215,7 +216,8 @@ public function testCSVExportWithArrays() 'nested' => [['id' => 1], ['id' => 2]] ]); - $csvDestination->testableImport([$row], function ($resources) {}); + $csvDestination->testableImport([$row], function ($resources) { + }); $csvDestination->shutdown(); $csvFile = $csvDestination->getLocalRoot() . '/test_db_test_table_id.csv'; @@ -262,7 +264,8 @@ public function testCSVExportWithNullValues() 'false_bool' => false ]); - $csvDestination->testableImport([$row], function ($resources) {}); + $csvDestination->testableImport([$row], function ($resources) { + }); $csvDestination->shutdown(); $csvFile = $csvDestination->getLocalRoot() . '/test_db_test_table_id.csv'; @@ -309,7 +312,8 @@ public function testCSVExportWithAllowedAttributes() 'secret' => 'should_not_appear' ]); - $csvDestination->testableImport([$row], function ($resources) {}); + $csvDestination->testableImport([$row], function ($resources) { + }); $csvDestination->shutdown(); $csvFile = $csvDestination->getLocalRoot() . '/test_db_test_table_id.csv'; @@ -365,7 +369,8 @@ public function testCSVExportImportCompatibility() $row = new Row('compat_row', $table, $originalData); $row->setPermissions(['read("user:123")']); - $csvDestination->testableImport([$row], function ($resources) {}); + $csvDestination->testableImport([$row], function ($resources) { + }); $csvDestination->shutdown(); // Verify the exported CSV can be parsed by PHP's built-in CSV functions diff --git a/tests/Migration/Unit/General/TransferTest.php b/tests/Migration/Unit/General/TransferTest.php index 9a14439..bf21f84 100644 --- a/tests/Migration/Unit/General/TransferTest.php +++ b/tests/Migration/Unit/General/TransferTest.php @@ -36,7 +36,8 @@ public function testRootResourceId(): void * Make sure we can't create a transfer with multiple root resources when supplying a rootResourceId */ try { - $this->transfer->run([Resource::TYPE_USER, Resource::TYPE_DATABASE], function () {}, 'rootResourceId'); + $this->transfer->run([Resource::TYPE_USER, Resource::TYPE_DATABASE], function () { + }, 'rootResourceId'); $this->fail('Multiple root resources should not be allowed'); } catch (\Exception $e) { $this->assertSame('Resource type must be set when resource ID is set.', $e->getMessage()); @@ -50,7 +51,8 @@ public function testRootResourceId(): void */ $this->transfer->run( [Resource::TYPE_DATABASE], - function () {}, + function () { + }, 'test', Resource::TYPE_DATABASE ); From 6d92c14ffe289fdb7a5f7a0e1729bc2ed75a8573 Mon Sep 17 00:00:00 2001 From: fogelito Date: Sun, 15 Feb 2026 16:25:53 +0200 Subject: [PATCH 5/5] varchar --- src/Migration/Destinations/Appwrite.php | 1 + src/Migration/Resources/Database/Column.php | 1 + .../Resources/Database/Columns/Varchar.php | 97 +++++++++++++++++++ src/Migration/Sources/Appwrite.php | 14 +++ 4 files changed, 113 insertions(+) create mode 100644 src/Migration/Resources/Database/Columns/Varchar.php diff --git a/src/Migration/Destinations/Appwrite.php b/src/Migration/Destinations/Appwrite.php index 823739f..6b730a1 100644 --- a/src/Migration/Destinations/Appwrite.php +++ b/src/Migration/Destinations/Appwrite.php @@ -471,6 +471,7 @@ protected function createColumn(Column $resource): bool Column::TYPE_LINE => UtopiaDatabase::VAR_LINESTRING, Column::TYPE_POLYGON => UtopiaDatabase::VAR_POLYGON, Column::TYPE_TEXT => UtopiaDatabase::VAR_TEXT, + Column::TYPE_VARCHAR => UtopiaDatabase::VAR_VARCHAR, Column::TYPE_MEDIUMTEXT => UtopiaDatabase::VAR_MEDIUMTEXT, Column::TYPE_LONGTEXT => UtopiaDatabase::VAR_LONGTEXT, default => throw new \Exception('Invalid resource type '.$resource->getType()), diff --git a/src/Migration/Resources/Database/Column.php b/src/Migration/Resources/Database/Column.php index 94c29f2..c1b82e8 100644 --- a/src/Migration/Resources/Database/Column.php +++ b/src/Migration/Resources/Database/Column.php @@ -9,6 +9,7 @@ abstract class Column extends Resource { public const TYPE_STRING = 'string'; public const TYPE_TEXT = 'text'; + public const TYPE_VARCHAR = 'varchar'; public const TYPE_MEDIUMTEXT = 'mediumtext'; public const TYPE_LONGTEXT = 'longtext'; diff --git a/src/Migration/Resources/Database/Columns/Varchar.php b/src/Migration/Resources/Database/Columns/Varchar.php new file mode 100644 index 0000000..9df3a4b --- /dev/null +++ b/src/Migration/Resources/Database/Columns/Varchar.php @@ -0,0 +1,97 @@ + + * }, + * table?: array{ + * database: array{ + * id: string, + * name: string, + * }, + * name: string, + * id: string, + * rowSecurity: bool, + * permissions: ?array + * }, + * required: bool, + * default: ?string, + * array: bool, + * size: int, + * format: string, + * createdAt: string, + * updatedAt: string, + * } $array + * @return self + */ + public static function fromArray(array $array): self + { + return new self( + $array['key'], + Table::fromArray($array['table'] ?? $array['collection']), + required: $array['required'], + default: $array['default'] ?? null, + array: $array['array'], + size: $array['size'], + format: $array['format'], + createdAt: $array['createdAt'] ?? '', + updatedAt: $array['updatedAt'] ?? '', + ); + } + + public function getType(): string + { + return Column::TYPE_VARCHAR; + } + + public function getSize(): int + { + return $this->size; + } + + public function getFormat(): string + { + return $this->format; + } +} diff --git a/src/Migration/Sources/Appwrite.php b/src/Migration/Sources/Appwrite.php index c8624fb..c99b667 100644 --- a/src/Migration/Sources/Appwrite.php +++ b/src/Migration/Sources/Appwrite.php @@ -36,6 +36,7 @@ use Utopia\Migration\Resources\Database\Columns\Relationship; use Utopia\Migration\Resources\Database\Columns\Text; use Utopia\Migration\Resources\Database\Columns\URL; +use Utopia\Migration\Resources\Database\Columns\Varchar; use Utopia\Migration\Resources\Database\Database; use Utopia\Migration\Resources\Database\Index; use Utopia\Migration\Resources\Database\Row; @@ -1094,6 +1095,19 @@ private function exportColumns(int $batchSize): void ); break; + case Column::TYPE_VARCHAR: + $col = new Varchar( + $column['key'], + $table, + required: $column['required'], + default: $column['default'], + array: $column['array'], + size: $column['size'] ?? 255, + createdAt: $column['$createdAt'] ?? '', + updatedAt: $column['$updatedAt'] ?? '', + ); + break; + case Column::TYPE_TEXT: $col = new RegularText( $column['key'],