Compare commits
3
Commits
v0.0.6
...
00d959e661
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
00d959e661 | ||
|
|
fa50fa3343 | ||
|
|
6b7ba3bc47 |
No files matched your search
@@ -110,6 +110,7 @@ jobs:
|
|||||||
test -n "$VERSION" || { echo "::error::could not resolve a Shopware version for ${CONSTRAINT}"; exit 1; }
|
test -n "$VERSION" || { echo "::error::could not resolve a Shopware version for ${CONSTRAINT}"; exit 1; }
|
||||||
echo "Shopware ${VERSION} (constraint ${CONSTRAINT})"
|
echo "Shopware ${VERSION} (constraint ${CONSTRAINT})"
|
||||||
echo "version=${VERSION}" >> "$GITHUB_OUTPUT"
|
echo "version=${VERSION}" >> "$GITHUB_OUTPUT"
|
||||||
|
echo "constraint=${CONSTRAINT}" >> "$GITHUB_OUTPUT"
|
||||||
# Project (vendor/, phpunit, config) and the installed database as a SQL dump. Neither depends on the plugin.
|
# Project (vendor/, phpunit, config) and the installed database as a SQL dump. Neither depends on the plugin.
|
||||||
- name: Restore Shopware project and database
|
- name: Restore Shopware project and database
|
||||||
id: shopware
|
id: shopware
|
||||||
@@ -125,8 +126,13 @@ jobs:
|
|||||||
if: steps.shopware.outputs.cache-hit != 'true'
|
if: steps.shopware.outputs.cache-hit != 'true'
|
||||||
run: |
|
run: |
|
||||||
set -e
|
set -e
|
||||||
composer create-project "shopware/production:${{ steps.sw.outputs.version }}" shopware --no-interaction --no-scripts
|
# shopware/production pins one exact core version and is not tagged for every core patch
|
||||||
composer require --dev phpunit/phpunit:^10 --no-interaction --no-scripts -d shopware
|
# (e.g. core 6.6.10.31, template only up to 6.6.10.30): take the newest template inside the
|
||||||
|
# constraint, then require the resolved core version on top of it.
|
||||||
|
composer create-project "shopware/production:${{ steps.sw.outputs.constraint }}" shopware --no-interaction --no-scripts --no-install
|
||||||
|
composer require "shopware/core:${{ steps.sw.outputs.version }}" --no-update -d shopware
|
||||||
|
composer require --dev phpunit/phpunit:^10 --no-update -d shopware
|
||||||
|
composer update -W --no-interaction --no-scripts -d shopware
|
||||||
- name: Ensure the MariaDB client
|
- name: Ensure the MariaDB client
|
||||||
run: |
|
run: |
|
||||||
command -v mariadb-dump >/dev/null || command -v mysqldump >/dev/null && exit 0
|
command -v mariadb-dump >/dev/null || command -v mysqldump >/dev/null && exit 0
|
||||||
|
|||||||
@@ -7,6 +7,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|||||||
|
|
||||||
## [Unreleased]
|
## [Unreleased]
|
||||||
|
|
||||||
|
## [0.0.7] - 2026-11-02
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Creating a dump failed on MariaDB when only MySQL 8's `mysqldump` was installed (`Unknown table 'COLUMN_STATISTICS'`); it now passes `--column-statistics=0` in that case.
|
||||||
|
|
||||||
## [0.0.6] - 2026-10-04
|
## [0.0.6] - 2026-10-04
|
||||||
|
|
||||||
### Changed
|
### Changed
|
||||||
|
|||||||
+1
-1
@@ -3,7 +3,7 @@
|
|||||||
"description": "Export database dumps for Shopware 6 environments.",
|
"description": "Export database dumps for Shopware 6 environments.",
|
||||||
"type": "shopware-platform-plugin",
|
"type": "shopware-platform-plugin",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"version": "0.0.6",
|
"version": "0.0.7",
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"shopware",
|
"shopware",
|
||||||
"shopware6",
|
"shopware6",
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ use AeonDumpManager\Service\Exception\DumpBinaryNotFoundException;
|
|||||||
use Doctrine\DBAL\Connection;
|
use Doctrine\DBAL\Connection;
|
||||||
use Shopware\Core\System\SystemConfig\SystemConfigService;
|
use Shopware\Core\System\SystemConfig\SystemConfigService;
|
||||||
use Symfony\Component\Process\ExecutableFinder;
|
use Symfony\Component\Process\ExecutableFinder;
|
||||||
|
use Symfony\Component\Process\Process;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Picks mariadb-dump/mysqldump depending on what the configured DB connection
|
* Picks mariadb-dump/mysqldump depending on what the configured DB connection
|
||||||
@@ -38,6 +39,19 @@ class DumpBinaryLocator
|
|||||||
throw DumpBinaryNotFoundException::create($binaryNames);
|
throw DumpBinaryNotFoundException::create($binaryNames);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return list<string> client-specific flags for the located binary
|
||||||
|
*/
|
||||||
|
public function extraArguments(string $binary): array
|
||||||
|
{
|
||||||
|
$version = new Process([$binary, '--version']);
|
||||||
|
$version->run();
|
||||||
|
|
||||||
|
return MySqlVariant::needsColumnStatisticsOff($version->getOutput(), $this->isMariaDb())
|
||||||
|
? ['--column-statistics=0']
|
||||||
|
: [];
|
||||||
|
}
|
||||||
|
|
||||||
private function isMariaDb(): bool
|
private function isMariaDb(): bool
|
||||||
{
|
{
|
||||||
// Connection::getServerVersion() is private in the DBAL version this
|
// Connection::getServerVersion() is private in the DBAL version this
|
||||||
|
|||||||
@@ -173,6 +173,7 @@ class DumpService
|
|||||||
$binary,
|
$binary,
|
||||||
'--single-transaction',
|
'--single-transaction',
|
||||||
'--quick',
|
'--quick',
|
||||||
|
...$this->dumpBinaryLocator->extraArguments($binary),
|
||||||
'-h', (string) ($params['host'] ?? '127.0.0.1'),
|
'-h', (string) ($params['host'] ?? '127.0.0.1'),
|
||||||
'-P', (string) ($params['port'] ?? 3306),
|
'-P', (string) ($params['port'] ?? 3306),
|
||||||
'-u', (string) ($params['user'] ?? 'root'),
|
'-u', (string) ($params['user'] ?? 'root'),
|
||||||
|
|||||||
@@ -14,4 +14,18 @@ class MySqlVariant
|
|||||||
{
|
{
|
||||||
return stripos($serverVersion, 'mariadb') !== false;
|
return stripos($serverVersion, 'mariadb') !== false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MySQL 8+ mysqldump queries information_schema.COLUMN_STATISTICS, which
|
||||||
|
* MariaDB lacks (error 1109); --column-statistics=0 skips it. MariaDB's own
|
||||||
|
* client (version string contains "MariaDB") and MySQL < 8 don't know the flag.
|
||||||
|
*/
|
||||||
|
public static function needsColumnStatisticsOff(string $clientVersion, bool $serverIsMariaDb): bool
|
||||||
|
{
|
||||||
|
return $serverIsMariaDb
|
||||||
|
&& !self::isMariaDb($clientVersion)
|
||||||
|
// MySQL < 8 prints "Ver 10.13 Distrib 5.7.x": the Distrib number is the real version.
|
||||||
|
&& (preg_match('/Distrib (\d+)\./', $clientVersion, $m) === 1 || preg_match('/\bVer (\d+)\./', $clientVersion, $m) === 1)
|
||||||
|
&& (int) $m[1] >= 8;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -21,4 +21,20 @@ class MySqlVariantTest extends TestCase
|
|||||||
yield 'mariadb without legacy prefix' => ['10.11.2-MariaDB', true];
|
yield 'mariadb without legacy prefix' => ['10.11.2-MariaDB', true];
|
||||||
yield 'mariadb lowercase' => ['10.11.2-mariadb', true];
|
yield 'mariadb lowercase' => ['10.11.2-mariadb', true];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[DataProvider('columnStatisticsProvider')]
|
||||||
|
public function testNeedsColumnStatisticsOff(string $clientVersion, bool $serverIsMariaDb, bool $expected): void
|
||||||
|
{
|
||||||
|
self::assertSame($expected, MySqlVariant::needsColumnStatisticsOff($clientVersion, $serverIsMariaDb));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function columnStatisticsProvider(): iterable
|
||||||
|
{
|
||||||
|
$mysql8 = 'mysqldump Ver 8.0.46-0ubuntu0.24.04.4 for Linux on x86_64 ((Ubuntu))';
|
||||||
|
yield 'mysql 8 client, mariadb server' => [$mysql8, true, true];
|
||||||
|
yield 'mysql 8 client, mysql server' => [$mysql8, false, false];
|
||||||
|
yield 'mysql 5.7 client, mariadb server' => ['mysqldump Ver 10.13 Distrib 5.7.44, for Linux (x86_64)', true, false];
|
||||||
|
yield 'mariadb client, mariadb server' => ['mariadb-dump from 11.4.2-MariaDB, client 10.19 for debian-linux-gnu (x86_64)', true, false];
|
||||||
|
yield 'mariadb legacy mysqldump name' => ['mysqldump Ver 10.19 Distrib 10.11.6-MariaDB, for debian-linux-gnu (x86_64)', true, false];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Reference in new issue
Block a user