mirror of
https://github.com/archtechx/tenancy.git
synced 2025-12-13 21:54:03 +00:00
* queue.yml: remove TENANCY_VERSION env var from test.sh * add DisallowSqliteAttach feature * Fix code style (php-cs-fixer) * ci: add cd to each step * ci: simpler solution to race conditions, proper os/arch matrix * ci: fix runs-on matrix * ci: fix workflow on windows, fix makefile * Auto-build: Update extensions [skip ci] * Auto-build: Update extensions [skip ci] * ci: try fixing retry logic, make makefile use cl on Windows * ci: use the current branch for rebase * ci: try calling vcvars64 * ci: misc minor fixes * ci: try fixing c compiler on windows * ci: misc minor fixes * ci: add debug steps * ci: try to fix windows build * ci: try using clang on windows * ci: windows fixes, makefile fix * Auto-build: Update extensions [skip ci] * ci: dont produce .exp .lib on Windows * ci: try forcing shell: bash on commit step * ci: try to get linux cross-compilation working * ci: reformulate condition * ci: fix syntax error * ci: correct debian image name * Auto-build: Update extensions [skip ci] * ci: try to set up macOS cross-compilation * ci: add ARCH variable to makefile, override it during cross-compilation * Auto-build: Update extensions [skip ci] * ci: X64 -> x64 * ci: only trigger extensions.yml on pushes to extensions/ * fix tests on x64 * ci: try using bash for pushing on windows; ignore phpstan error * fix test failing in ci but passing locally * bump php version in composer.json, trigger extensions.yml build * remove comment * noattach: more explicit return values, avoid potential non-bool return values * makefile: use -Os on Windows * ci: use make -B * ci: try triggering extensions build on extensions.yml file changes * Auto-build: Update extensions [skip ci] * Auto-build: Update extensions [skip ci] * ci: remove windows linker flag, use a whitelist for git add * Auto-build: Update extensions [skip ci] * Auto-build: Update extensions [skip ci] * Auto-build: Update extensions [skip ci] * fix path in feature class, minor refactor * Fix code style (php-cs-fixer) --------- Co-authored-by: PHP CS Fixer <phpcsfixer@example.com> Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
72 lines
2.2 KiB
PHP
72 lines
2.2 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace Stancl\Tenancy\Features;
|
|
|
|
use Exception;
|
|
use Illuminate\Database\Connectors\ConnectionFactory;
|
|
use Illuminate\Database\SQLiteConnection;
|
|
use Illuminate\Support\Facades\DB;
|
|
use PDO;
|
|
use Stancl\Tenancy\Contracts\Feature;
|
|
use Stancl\Tenancy\Tenancy;
|
|
|
|
class DisallowSqliteAttach implements Feature
|
|
{
|
|
protected static bool|null $loadExtensionSupported = null;
|
|
public static string|false|null $extensionPath = null;
|
|
|
|
public function bootstrap(Tenancy $tenancy): void
|
|
{
|
|
// Handle any already resolved connections
|
|
foreach (DB::getConnections() as $connection) {
|
|
if ($connection instanceof SQLiteConnection) {
|
|
if (! $this->loadExtension($connection->getPdo())) {
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
|
|
// Apply the change to all sqlite connections resolved in the future
|
|
DB::extend('sqlite', function ($config, $name) {
|
|
$conn = app(ConnectionFactory::class)->make($config, $name);
|
|
$this->loadExtension($conn->getPdo());
|
|
|
|
return $conn;
|
|
});
|
|
}
|
|
|
|
protected function loadExtension(PDO $pdo): bool
|
|
{
|
|
if (static::$loadExtensionSupported === null) {
|
|
static::$loadExtensionSupported = method_exists($pdo, 'loadExtension');
|
|
}
|
|
|
|
if (static::$loadExtensionSupported === false) {
|
|
return false;
|
|
}
|
|
if (static::$extensionPath === false) {
|
|
return false;
|
|
}
|
|
|
|
$suffix = match (PHP_OS_FAMILY) {
|
|
'Linux' => 'so',
|
|
'Windows' => 'dll',
|
|
'Darwin' => 'dylib',
|
|
default => throw new Exception("The DisallowSqliteAttach feature doesn't support your operating system: " . PHP_OS_FAMILY),
|
|
};
|
|
|
|
$arch = php_uname('m');
|
|
$arm = $arch === 'aarch64' || $arch === 'arm64';
|
|
|
|
static::$extensionPath ??= realpath(base_path('vendor/stancl/tenancy/extensions/lib/' . ($arm ? 'arm/' : '') . 'noattach.' . $suffix));
|
|
if (static::$extensionPath === false) {
|
|
return false;
|
|
}
|
|
|
|
$pdo->loadExtension(static::$extensionPath); // @phpstan-ignore method.notFound
|
|
|
|
return true;
|
|
}
|
|
}
|