Skip to content

Commit e4e4354

Browse files
committed
Laravel 11 Support
1 parent e06094f commit e4e4354

7 files changed

+305
-65
lines changed

src/DumpSchema.php

Lines changed: 72 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@
55
use Faker\Factory;
66
use Doctrine\DBAL\Schema\Table;
77
use BeyondCode\LaravelMaskedDumper\TableDefinitions\TableDefinition;
8-
use Illuminate\Support\Facades\DB;
8+
use Doctrine\DBAL\Types\Types;
9+
use Illuminate\Support\Facades\Schema;
910

1011
class DumpSchema
1112
{
@@ -48,11 +49,19 @@ public function allTables()
4849
}
4950

5051
/**
51-
* @return \Illuminate\Database\ConnectionInterface
52+
* @return \Illuminate\Database\Schema\Builder
53+
*/
54+
public function getBuilder()
55+
{
56+
return Schema::connection($this->connectionName);
57+
}
58+
59+
/**
60+
* @return \Illuminate\Database\Connection
5261
*/
5362
public function getConnection()
5463
{
55-
return DB::connection($this->connectionName);
64+
return Schema::connection($this->connectionName)->getConnection();
5665
}
5766

5867
protected function getTable(string $tableName)
@@ -82,9 +91,68 @@ protected function loadAvailableTables()
8291
return;
8392
}
8493

85-
$this->availableTables = $this->getConnection()->getDoctrineSchemaManager()->listTables();
94+
$this->availableTables = $this->createDoctrineTables($this->getBuilder()->getTables());
8695
}
8796

97+
protected function createDoctrineTables(array $tables): array
98+
{
99+
$doctrineTables = [];
100+
101+
foreach ($tables as $table) {
102+
$columns = $this->getBuilder()->getColumns($table['name']);
103+
104+
$table = new Table($table['name']);
105+
106+
foreach ($columns as $column) {
107+
$type = $this->mapType($column['type_name']);
108+
$table->addColumn(
109+
$column['name'],
110+
$type
111+
);
112+
}
113+
114+
$doctrineTables[] = $table;
115+
}
116+
117+
return $doctrineTables;
118+
}
119+
120+
protected function mapType(string $typeName): string
121+
{
122+
switch ($typeName) {
123+
case 'char':
124+
case 'varchar':
125+
return Types::STRING;
126+
case 'int':
127+
case 'integer':
128+
return Types::INTEGER;
129+
case 'text':
130+
case 'longtext':
131+
case 'mediumtext':
132+
return Types::TEXT;
133+
case 'date':
134+
return Types::DATE_MUTABLE;
135+
case 'datetime':
136+
case 'timestamp':
137+
return Types::DATETIME_MUTABLE;
138+
case 'bigint':
139+
case 'mediumint':
140+
return Types::BIGINT;
141+
case 'tinyint':
142+
case 'smallint':
143+
return Types::SMALLINT;
144+
case 'binary':
145+
return Types::BINARY;
146+
case 'json':
147+
return Types::JSON;
148+
case 'decimal':
149+
return Types::DECIMAL;
150+
default:
151+
return Types::TEXT;
152+
}
153+
}
154+
155+
88156
public function load()
89157
{
90158
$this->loadAvailableTables();

src/LaravelMaskedDump.php

Lines changed: 30 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,13 @@
66
use Doctrine\DBAL\Schema\Schema;
77
use Illuminate\Console\OutputStyle;
88
use BeyondCode\LaravelMaskedDumper\TableDefinitions\TableDefinition;
9+
use Doctrine\DBAL\Platforms\MariaDBPlatform;
10+
use Doctrine\DBAL\Platforms\MySQLPlatform;
11+
use Doctrine\DBAL\Platforms\PostgreSQLPlatform;
12+
use Doctrine\DBAL\Platforms\SqlitePlatform;
13+
use Doctrine\DBAL\Platforms\SQLServerPlatform;
14+
use Illuminate\Database\Connection as DatabaseConnection;
15+
use Doctrine\DBAL\Platforms\AbstractPlatform;
916

1017
class LaravelMaskedDump
1118
{
@@ -15,10 +22,14 @@ class LaravelMaskedDump
1522
/** @var OutputStyle */
1623
protected $output;
1724

25+
/** @var AbstractPlatform */
26+
protected $platform;
27+
1828
public function __construct(DumpSchema $definition, OutputStyle $output)
1929
{
2030
$this->definition = $definition;
2131
$this->output = $output;
32+
$this->platform = $this->getPlatform($this->definition->getConnection());
2233
}
2334

2435
public function dump()
@@ -49,10 +60,7 @@ public function dump()
4960

5061
protected function transformResultForInsert($row, TableDefinition $table)
5162
{
52-
/** @var Connection $connection */
53-
$connection = $this->definition->getConnection()->getDoctrineConnection();
54-
55-
return collect($row)->map(function ($value, $column) use ($connection, $table) {
63+
return collect($row)->map(function ($value, $column) use ($table) {
5664
if ($columnDefinition = $table->findColumn($column)) {
5765
$value = $columnDefinition->modifyValue($value);
5866
}
@@ -64,17 +72,31 @@ protected function transformResultForInsert($row, TableDefinition $table)
6472
return '""';
6573
}
6674

67-
return $connection->quote($value);
75+
return $this->platform->quoteStringLiteral($value);
6876
})->toArray();
6977
}
7078

7179
protected function dumpSchema(TableDefinition $table)
7280
{
73-
$platform = $this->definition->getConnection()->getDoctrineSchemaManager()->getDatabasePlatform();
74-
7581
$schema = new Schema([$table->getDoctrineTable()]);
7682

77-
return implode(";", $schema->toSql($platform)) . ";" . PHP_EOL;
83+
return implode(";", $schema->toSql($this->platform)) . ";" . PHP_EOL;
84+
}
85+
86+
protected function getPlatform(DatabaseConnection $connection)
87+
{
88+
switch ($connection->getDriverName()) {
89+
case 'mysql':
90+
return new MySQLPlatform;
91+
case 'mariadb':
92+
return new MariaDBPlatform;
93+
case 'pgsql':
94+
return new PostgreSQLPlatform;
95+
case 'sqlite':
96+
return new SqlitePlatform;
97+
default:
98+
throw new \RuntimeException("Unsupported platform: {$connection->getDriverName()}");
99+
}
78100
}
79101

80102
protected function lockTable(string $tableName)

tests/__snapshots__/DumperTest__it_can_dump_all_tables_without_modifications__1.txt

Lines changed: 41 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,56 @@
1+
DROP TABLE IF EXISTS `cache`;
2+
CREATE TABLE cache ("key" VARCHAR(255) NOT NULL, value CLOB NOT NULL, expiration INTEGER NOT NULL);
3+
LOCK TABLES `cache` WRITE;
4+
ALTER TABLE `cache` DISABLE KEYS;
5+
ALTER TABLE `cache` ENABLE KEYS;
6+
UNLOCK TABLES;
7+
DROP TABLE IF EXISTS `cache_locks`;
8+
CREATE TABLE cache_locks ("key" VARCHAR(255) NOT NULL, owner VARCHAR(255) NOT NULL, expiration INTEGER NOT NULL);
9+
LOCK TABLES `cache_locks` WRITE;
10+
ALTER TABLE `cache_locks` DISABLE KEYS;
11+
ALTER TABLE `cache_locks` ENABLE KEYS;
12+
UNLOCK TABLES;
113
DROP TABLE IF EXISTS `failed_jobs`;
2-
CREATE TABLE failed_jobs (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, uuid VARCHAR(255) NOT NULL COLLATE "BINARY", connection CLOB NOT NULL COLLATE "BINARY", queue CLOB NOT NULL COLLATE "BINARY", payload CLOB NOT NULL COLLATE "BINARY", exception CLOB NOT NULL COLLATE "BINARY", failed_at DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL);CREATE UNIQUE INDEX failed_jobs_uuid_unique ON failed_jobs (uuid);
14+
CREATE TABLE failed_jobs (id INTEGER NOT NULL, uuid VARCHAR(255) NOT NULL, connection CLOB NOT NULL, queue CLOB NOT NULL, payload CLOB NOT NULL, exception CLOB NOT NULL, failed_at DATETIME NOT NULL);
315
LOCK TABLES `failed_jobs` WRITE;
416
ALTER TABLE `failed_jobs` DISABLE KEYS;
517
ALTER TABLE `failed_jobs` ENABLE KEYS;
618
UNLOCK TABLES;
19+
DROP TABLE IF EXISTS `job_batches`;
20+
CREATE TABLE job_batches (id VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, total_jobs INTEGER NOT NULL, pending_jobs INTEGER NOT NULL, failed_jobs INTEGER NOT NULL, failed_job_ids CLOB NOT NULL, options CLOB NOT NULL, cancelled_at INTEGER NOT NULL, created_at INTEGER NOT NULL, finished_at INTEGER NOT NULL);
21+
LOCK TABLES `job_batches` WRITE;
22+
ALTER TABLE `job_batches` DISABLE KEYS;
23+
ALTER TABLE `job_batches` ENABLE KEYS;
24+
UNLOCK TABLES;
25+
DROP TABLE IF EXISTS `jobs`;
26+
CREATE TABLE jobs (id INTEGER NOT NULL, queue VARCHAR(255) NOT NULL, payload CLOB NOT NULL, attempts INTEGER NOT NULL, reserved_at INTEGER NOT NULL, available_at INTEGER NOT NULL, created_at INTEGER NOT NULL);
27+
LOCK TABLES `jobs` WRITE;
28+
ALTER TABLE `jobs` DISABLE KEYS;
29+
ALTER TABLE `jobs` ENABLE KEYS;
30+
UNLOCK TABLES;
731
DROP TABLE IF EXISTS `migrations`;
8-
CREATE TABLE migrations (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, migration VARCHAR(255) NOT NULL COLLATE "BINARY", batch INTEGER NOT NULL);
32+
CREATE TABLE migrations (id INTEGER NOT NULL, migration VARCHAR(255) NOT NULL, batch INTEGER NOT NULL);
933
LOCK TABLES `migrations` WRITE;
1034
ALTER TABLE `migrations` DISABLE KEYS;
11-
INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES ('1', '2014_10_12_000000_testbench_create_users_table', '1');
12-
INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES ('2', '2014_10_12_100000_testbench_create_password_resets_table', '1');
13-
INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES ('3', '2019_08_19_000000_testbench_create_failed_jobs_table', '1');
35+
INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES ('1', '0001_01_01_000000_testbench_create_users_table', '1');
36+
INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES ('2', '0001_01_01_000001_testbench_create_cache_table', '1');
37+
INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES ('3', '0001_01_01_000002_testbench_create_jobs_table', '1');
1438
ALTER TABLE `migrations` ENABLE KEYS;
1539
UNLOCK TABLES;
16-
DROP TABLE IF EXISTS `password_resets`;
17-
CREATE TABLE password_resets (email VARCHAR(255) NOT NULL COLLATE "BINARY", token VARCHAR(255) NOT NULL COLLATE "BINARY", created_at DATETIME DEFAULT NULL);CREATE INDEX password_resets_email_index ON password_resets (email);
18-
LOCK TABLES `password_resets` WRITE;
19-
ALTER TABLE `password_resets` DISABLE KEYS;
20-
ALTER TABLE `password_resets` ENABLE KEYS;
40+
DROP TABLE IF EXISTS `password_reset_tokens`;
41+
CREATE TABLE password_reset_tokens (email VARCHAR(255) NOT NULL, token VARCHAR(255) NOT NULL, created_at DATETIME NOT NULL);
42+
LOCK TABLES `password_reset_tokens` WRITE;
43+
ALTER TABLE `password_reset_tokens` DISABLE KEYS;
44+
ALTER TABLE `password_reset_tokens` ENABLE KEYS;
45+
UNLOCK TABLES;
46+
DROP TABLE IF EXISTS `sessions`;
47+
CREATE TABLE sessions (id VARCHAR(255) NOT NULL, user_id INTEGER NOT NULL, ip_address VARCHAR(255) NOT NULL, user_agent CLOB NOT NULL, payload CLOB NOT NULL, last_activity INTEGER NOT NULL);
48+
LOCK TABLES `sessions` WRITE;
49+
ALTER TABLE `sessions` DISABLE KEYS;
50+
ALTER TABLE `sessions` ENABLE KEYS;
2151
UNLOCK TABLES;
2252
DROP TABLE IF EXISTS `users`;
23-
CREATE TABLE users (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, name VARCHAR(255) NOT NULL COLLATE "BINARY", email VARCHAR(255) NOT NULL COLLATE "BINARY", email_verified_at DATETIME DEFAULT NULL, password VARCHAR(255) NOT NULL COLLATE "BINARY", remember_token VARCHAR(255) DEFAULT NULL COLLATE "BINARY", created_at DATETIME DEFAULT NULL, updated_at DATETIME DEFAULT NULL);CREATE UNIQUE INDEX users_email_unique ON users (email);
53+
CREATE TABLE users (id INTEGER NOT NULL, name VARCHAR(255) NOT NULL, email VARCHAR(255) NOT NULL, email_verified_at DATETIME NOT NULL, password VARCHAR(255) NOT NULL, remember_token VARCHAR(255) NOT NULL, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL);
2454
LOCK TABLES `users` WRITE;
2555
ALTER TABLE `users` DISABLE KEYS;
2656
INSERT INTO `users` (`id`, `name`, `email`, `email_verified_at`, `password`, `remember_token`, `created_at`, `updated_at`) VALUES ('1', 'Marcel', '[email protected]', NULL, 'test', NULL, '2021-01-01 00:00:00', '2021-01-01 00:00:00');
Lines changed: 38 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,46 @@
1+
DROP TABLE IF EXISTS `cache`;
2+
CREATE TABLE cache ("key" VARCHAR(255) NOT NULL, value CLOB NOT NULL, expiration INTEGER NOT NULL);
3+
LOCK TABLES `cache` WRITE;
4+
ALTER TABLE `cache` DISABLE KEYS;
5+
ALTER TABLE `cache` ENABLE KEYS;
6+
UNLOCK TABLES;
7+
DROP TABLE IF EXISTS `cache_locks`;
8+
CREATE TABLE cache_locks ("key" VARCHAR(255) NOT NULL, owner VARCHAR(255) NOT NULL, expiration INTEGER NOT NULL);
9+
LOCK TABLES `cache_locks` WRITE;
10+
ALTER TABLE `cache_locks` DISABLE KEYS;
11+
ALTER TABLE `cache_locks` ENABLE KEYS;
12+
UNLOCK TABLES;
113
DROP TABLE IF EXISTS `failed_jobs`;
2-
CREATE TABLE failed_jobs (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, uuid VARCHAR(255) NOT NULL COLLATE "BINARY", connection CLOB NOT NULL COLLATE "BINARY", queue CLOB NOT NULL COLLATE "BINARY", payload CLOB NOT NULL COLLATE "BINARY", exception CLOB NOT NULL COLLATE "BINARY", failed_at DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL);CREATE UNIQUE INDEX failed_jobs_uuid_unique ON failed_jobs (uuid);
14+
CREATE TABLE failed_jobs (id INTEGER NOT NULL, uuid VARCHAR(255) NOT NULL, connection CLOB NOT NULL, queue CLOB NOT NULL, payload CLOB NOT NULL, exception CLOB NOT NULL, failed_at DATETIME NOT NULL);
315
LOCK TABLES `failed_jobs` WRITE;
416
ALTER TABLE `failed_jobs` DISABLE KEYS;
517
ALTER TABLE `failed_jobs` ENABLE KEYS;
618
UNLOCK TABLES;
19+
DROP TABLE IF EXISTS `job_batches`;
20+
CREATE TABLE job_batches (id VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, total_jobs INTEGER NOT NULL, pending_jobs INTEGER NOT NULL, failed_jobs INTEGER NOT NULL, failed_job_ids CLOB NOT NULL, options CLOB NOT NULL, cancelled_at INTEGER NOT NULL, created_at INTEGER NOT NULL, finished_at INTEGER NOT NULL);
21+
LOCK TABLES `job_batches` WRITE;
22+
ALTER TABLE `job_batches` DISABLE KEYS;
23+
ALTER TABLE `job_batches` ENABLE KEYS;
24+
UNLOCK TABLES;
25+
DROP TABLE IF EXISTS `jobs`;
26+
CREATE TABLE jobs (id INTEGER NOT NULL, queue VARCHAR(255) NOT NULL, payload CLOB NOT NULL, attempts INTEGER NOT NULL, reserved_at INTEGER NOT NULL, available_at INTEGER NOT NULL, created_at INTEGER NOT NULL);
27+
LOCK TABLES `jobs` WRITE;
28+
ALTER TABLE `jobs` DISABLE KEYS;
29+
ALTER TABLE `jobs` ENABLE KEYS;
30+
UNLOCK TABLES;
731
DROP TABLE IF EXISTS `migrations`;
8-
CREATE TABLE migrations (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, migration VARCHAR(255) NOT NULL COLLATE "BINARY", batch INTEGER NOT NULL);
9-
DROP TABLE IF EXISTS `password_resets`;
10-
CREATE TABLE password_resets (email VARCHAR(255) NOT NULL COLLATE "BINARY", token VARCHAR(255) NOT NULL COLLATE "BINARY", created_at DATETIME DEFAULT NULL);CREATE INDEX password_resets_email_index ON password_resets (email);
11-
LOCK TABLES `password_resets` WRITE;
12-
ALTER TABLE `password_resets` DISABLE KEYS;
13-
ALTER TABLE `password_resets` ENABLE KEYS;
32+
CREATE TABLE migrations (id INTEGER NOT NULL, migration VARCHAR(255) NOT NULL, batch INTEGER NOT NULL);
33+
DROP TABLE IF EXISTS `password_reset_tokens`;
34+
CREATE TABLE password_reset_tokens (email VARCHAR(255) NOT NULL, token VARCHAR(255) NOT NULL, created_at DATETIME NOT NULL);
35+
LOCK TABLES `password_reset_tokens` WRITE;
36+
ALTER TABLE `password_reset_tokens` DISABLE KEYS;
37+
ALTER TABLE `password_reset_tokens` ENABLE KEYS;
38+
UNLOCK TABLES;
39+
DROP TABLE IF EXISTS `sessions`;
40+
CREATE TABLE sessions (id VARCHAR(255) NOT NULL, user_id INTEGER NOT NULL, ip_address VARCHAR(255) NOT NULL, user_agent CLOB NOT NULL, payload CLOB NOT NULL, last_activity INTEGER NOT NULL);
41+
LOCK TABLES `sessions` WRITE;
42+
ALTER TABLE `sessions` DISABLE KEYS;
43+
ALTER TABLE `sessions` ENABLE KEYS;
1444
UNLOCK TABLES;
1545
DROP TABLE IF EXISTS `users`;
16-
CREATE TABLE users (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, name VARCHAR(255) NOT NULL COLLATE "BINARY", email VARCHAR(255) NOT NULL COLLATE "BINARY", email_verified_at DATETIME DEFAULT NULL, password VARCHAR(255) NOT NULL COLLATE "BINARY", remember_token VARCHAR(255) DEFAULT NULL COLLATE "BINARY", created_at DATETIME DEFAULT NULL, updated_at DATETIME DEFAULT NULL);CREATE UNIQUE INDEX users_email_unique ON users (email);
46+
CREATE TABLE users (id INTEGER NOT NULL, name VARCHAR(255) NOT NULL, email VARCHAR(255) NOT NULL, email_verified_at DATETIME NOT NULL, password VARCHAR(255) NOT NULL, remember_token VARCHAR(255) NOT NULL, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL);

0 commit comments

Comments
 (0)