mirror of
https://github.com/archtechx/tenancy.git
synced 2025-12-12 12:24:04 +00:00
[4.x] Added support for Microsoft Sql Server (#715)
* added support for microsoft sql server database * added support for microsoft sql server database * trigger ci * revert change * trigger ci * Try installing pdo_sqlsrv * different approach for installing sqlsrv via pecl * add dependencies * add gnupg2 * Update Dockerfile * try skipping msodbcsql17 * Update Dockerfile * add dependency back * update before installing * try to add mssql * mssql host * TENANCY_TEST_MSSQL_HOST env var * add env vars for mssql * add sqlsrv vars to TestCase * rename vars to SQLSRV [skip ci] * MSSQL -> SQLSRV Co-authored-by: Samuel Štancl <samuel@archte.ch> Co-authored-by: Samuel Štancl <samuel.stancl@gmail.com>
This commit is contained in:
parent
72c41ea993
commit
cc6d4fe0dd
6 changed files with 90 additions and 6 deletions
21
Dockerfile
21
Dockerfile
|
|
@ -1,7 +1,7 @@
|
||||||
ARG PHP_VERSION=7.4
|
ARG PHP_VERSION=7.4
|
||||||
ARG PHP_TARGET=php:${PHP_VERSION}-cli
|
ARG PHP_TARGET=php:${PHP_VERSION}-cli
|
||||||
|
|
||||||
FROM ${PHP_TARGET}
|
FROM --platform=linux/amd64 ${PHP_TARGET}
|
||||||
|
|
||||||
ARG COMPOSER_TARGET=2.0.3
|
ARG COMPOSER_TARGET=2.0.3
|
||||||
|
|
||||||
|
|
@ -22,10 +22,16 @@ ENV LANG=en_GB.UTF-8
|
||||||
# Dockerfile _and pin the versions_! Eg:
|
# Dockerfile _and pin the versions_! Eg:
|
||||||
# RUN pecl install memcached-2.2.0 && docker-php-ext-enable memcached
|
# RUN pecl install memcached-2.2.0 && docker-php-ext-enable memcached
|
||||||
|
|
||||||
# install some OS packages we need
|
|
||||||
RUN apt-get update
|
RUN apt-get update \
|
||||||
RUN apt-get install -y --no-install-recommends libfreetype6-dev libjpeg62-turbo-dev libpng-dev libgmp-dev libldap2-dev netcat curl mariadb-client sqlite3 libsqlite3-dev libpq-dev libzip-dev unzip vim-tiny gosu git
|
&& apt-get install -y gnupg2 \
|
||||||
# install php extensions
|
&& curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add - \
|
||||||
|
&& curl https://packages.microsoft.com/config/debian/11/prod.list > /etc/apt/sources.list.d/mssql-release.list \
|
||||||
|
&& apt-get update \
|
||||||
|
&& ACCEPT_EULA=Y apt-get install -y unixodbc-dev msodbcsql17
|
||||||
|
|
||||||
|
RUN apt-get install -y --no-install-recommends locales apt-transport-https libfreetype6-dev libjpeg62-turbo-dev libpng-dev libgmp-dev libldap2-dev netcat curl mariadb-client sqlite3 libsqlite3-dev libpq-dev libzip-dev unzip vim-tiny gosu git
|
||||||
|
|
||||||
RUN docker-php-ext-configure pgsql -with-pgsql=/usr/local/pgsql \
|
RUN docker-php-ext-configure pgsql -with-pgsql=/usr/local/pgsql \
|
||||||
# && if [ "${PHP_VERSION}" = "7.4" ]; then docker-php-ext-configure gd --with-freetype --with-jpeg; else docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/; fi \
|
# && if [ "${PHP_VERSION}" = "7.4" ]; then docker-php-ext-configure gd --with-freetype --with-jpeg; else docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/; fi \
|
||||||
&& docker-php-ext-install -j$(nproc) gd pdo pdo_mysql pdo_pgsql pdo_sqlite pgsql zip gmp bcmath pcntl ldap sysvmsg exif \
|
&& docker-php-ext-install -j$(nproc) gd pdo pdo_mysql pdo_pgsql pdo_sqlite pgsql zip gmp bcmath pcntl ldap sysvmsg exif \
|
||||||
|
|
@ -35,7 +41,10 @@ RUN docker-php-ext-configure pgsql -with-pgsql=/usr/local/pgsql \
|
||||||
# install the pcov extention
|
# install the pcov extention
|
||||||
&& pecl install pcov \
|
&& pecl install pcov \
|
||||||
&& docker-php-ext-enable pcov \
|
&& docker-php-ext-enable pcov \
|
||||||
&& echo "pcov.enabled = 1" > /usr/local/etc/php/conf.d/pcov.ini
|
&& echo "pcov.enabled = 1" > /usr/local/etc/php/conf.d/pcov.ini \
|
||||||
|
# install sqlsrv
|
||||||
|
&& pecl install sqlsrv pdo_sqlsrv \
|
||||||
|
&& docker-php-ext-enable sqlsrv pdo_sqlsrv
|
||||||
# clear the apt cache
|
# clear the apt cache
|
||||||
RUN rm -rf /var/lib/apt/lists/* \
|
RUN rm -rf /var/lib/apt/lists/* \
|
||||||
&& rm -rf /var/lib/apt/lists/* \
|
&& rm -rf /var/lib/apt/lists/* \
|
||||||
|
|
|
||||||
|
|
@ -61,6 +61,7 @@ return [
|
||||||
'sqlite' => Stancl\Tenancy\TenantDatabaseManagers\SQLiteDatabaseManager::class,
|
'sqlite' => Stancl\Tenancy\TenantDatabaseManagers\SQLiteDatabaseManager::class,
|
||||||
'mysql' => Stancl\Tenancy\TenantDatabaseManagers\MySQLDatabaseManager::class,
|
'mysql' => Stancl\Tenancy\TenantDatabaseManagers\MySQLDatabaseManager::class,
|
||||||
'pgsql' => Stancl\Tenancy\TenantDatabaseManagers\PostgreSQLDatabaseManager::class,
|
'pgsql' => Stancl\Tenancy\TenantDatabaseManagers\PostgreSQLDatabaseManager::class,
|
||||||
|
'sqlsrv' => Stancl\Tenancy\TenantDatabaseManagers\MicrosoftSQLDatabaseManager::class,
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Use this database manager for MySQL to have a DB user created for each tenant database.
|
* Use this database manager for MySQL to have a DB user created for each tenant database.
|
||||||
|
|
|
||||||
|
|
@ -22,6 +22,9 @@ services:
|
||||||
TENANCY_TEST_REDIS_HOST: redis
|
TENANCY_TEST_REDIS_HOST: redis
|
||||||
TENANCY_TEST_MYSQL_HOST: mysql
|
TENANCY_TEST_MYSQL_HOST: mysql
|
||||||
TENANCY_TEST_PGSQL_HOST: postgres
|
TENANCY_TEST_PGSQL_HOST: postgres
|
||||||
|
TENANCY_TEST_SQLSRV_HOST: mssql
|
||||||
|
TENANCY_TEST_SQLSRV_USERNAME: sa
|
||||||
|
TENANCY_TEST_SQLSRV_PASSWORD: P@ssword
|
||||||
stdin_open: true
|
stdin_open: true
|
||||||
tty: true
|
tty: true
|
||||||
mysql:
|
mysql:
|
||||||
|
|
@ -64,3 +67,11 @@ services:
|
||||||
interval: 1s
|
interval: 1s
|
||||||
timeout: 3s
|
timeout: 3s
|
||||||
retries: 30
|
retries: 30
|
||||||
|
mssql:
|
||||||
|
image: mcr.microsoft.com/mssql/server:2019-latest
|
||||||
|
ports:
|
||||||
|
- 1433:1433
|
||||||
|
environment:
|
||||||
|
- ACCEPT_EULA=Y
|
||||||
|
- SA_PASSWORD=P@ssword # todo reuse values from env above
|
||||||
|
# todo missing health check
|
||||||
|
|
|
||||||
57
src/TenantDatabaseManagers/MicrosoftSQLDatabaseManager.php
Normal file
57
src/TenantDatabaseManagers/MicrosoftSQLDatabaseManager.php
Normal file
|
|
@ -0,0 +1,57 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Stancl\Tenancy\TenantDatabaseManagers;
|
||||||
|
|
||||||
|
use Illuminate\Database\Connection;
|
||||||
|
use Illuminate\Support\Facades\DB;
|
||||||
|
use Stancl\Tenancy\Contracts\TenantDatabaseManager;
|
||||||
|
use Stancl\Tenancy\Contracts\TenantWithDatabase;
|
||||||
|
use Stancl\Tenancy\Exceptions\NoConnectionSetException;
|
||||||
|
|
||||||
|
class MicrosoftSQLDatabaseManager implements TenantDatabaseManager
|
||||||
|
{
|
||||||
|
/** @var string */
|
||||||
|
protected $connection;
|
||||||
|
|
||||||
|
protected function database(): Connection
|
||||||
|
{
|
||||||
|
if ($this->connection === null) {
|
||||||
|
throw new NoConnectionSetException(static::class);
|
||||||
|
}
|
||||||
|
|
||||||
|
return DB::connection($this->connection);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setConnection(string $connection): void
|
||||||
|
{
|
||||||
|
$this->connection = $connection;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function createDatabase(TenantWithDatabase $tenant): bool
|
||||||
|
{
|
||||||
|
$database = $tenant->database()->getName();
|
||||||
|
$charset = $this->database()->getConfig('charset');
|
||||||
|
$collation = $this->database()->getConfig('collation');
|
||||||
|
|
||||||
|
return $this->database()->statement("CREATE DATABASE [{$database}]");
|
||||||
|
}
|
||||||
|
|
||||||
|
public function deleteDatabase(TenantWithDatabase $tenant): bool
|
||||||
|
{
|
||||||
|
return $this->database()->statement("DROP DATABASE [{$tenant->database()->getName()}]");
|
||||||
|
}
|
||||||
|
|
||||||
|
public function databaseExists(string $name): bool
|
||||||
|
{
|
||||||
|
return (bool) $this->database()->select("SELECT name FROM master.sys.databases WHERE name = '$name'");
|
||||||
|
}
|
||||||
|
|
||||||
|
public function makeConnectionConfig(array $baseConfig, string $databaseName): array
|
||||||
|
{
|
||||||
|
$baseConfig['database'] = $databaseName;
|
||||||
|
|
||||||
|
return $baseConfig;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -19,6 +19,7 @@ use Stancl\Tenancy\Exceptions\TenantDatabaseAlreadyExistsException;
|
||||||
use Stancl\Tenancy\Jobs\CreateDatabase;
|
use Stancl\Tenancy\Jobs\CreateDatabase;
|
||||||
use Stancl\Tenancy\Listeners\BootstrapTenancy;
|
use Stancl\Tenancy\Listeners\BootstrapTenancy;
|
||||||
use Stancl\Tenancy\Listeners\RevertToCentralContext;
|
use Stancl\Tenancy\Listeners\RevertToCentralContext;
|
||||||
|
use Stancl\Tenancy\TenantDatabaseManagers\MicrosoftSQLDatabaseManager;
|
||||||
use Stancl\Tenancy\TenantDatabaseManagers\MySQLDatabaseManager;
|
use Stancl\Tenancy\TenantDatabaseManagers\MySQLDatabaseManager;
|
||||||
use Stancl\Tenancy\TenantDatabaseManagers\PermissionControlledMySQLDatabaseManager;
|
use Stancl\Tenancy\TenantDatabaseManagers\PermissionControlledMySQLDatabaseManager;
|
||||||
use Stancl\Tenancy\TenantDatabaseManagers\PostgreSQLDatabaseManager;
|
use Stancl\Tenancy\TenantDatabaseManagers\PostgreSQLDatabaseManager;
|
||||||
|
|
@ -103,6 +104,7 @@ class TenantDatabaseManagerTest extends TestCase
|
||||||
['sqlite', SQLiteDatabaseManager::class],
|
['sqlite', SQLiteDatabaseManager::class],
|
||||||
['pgsql', PostgreSQLDatabaseManager::class],
|
['pgsql', PostgreSQLDatabaseManager::class],
|
||||||
['pgsql', PostgreSQLSchemaManager::class],
|
['pgsql', PostgreSQLSchemaManager::class],
|
||||||
|
['sqlsrv', MicrosoftSQLDatabaseManager::class]
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -81,6 +81,10 @@ abstract class TestCase extends \Orchestra\Testbench\TestCase
|
||||||
],
|
],
|
||||||
'database.connections.sqlite.database' => ':memory:',
|
'database.connections.sqlite.database' => ':memory:',
|
||||||
'database.connections.mysql.host' => env('TENANCY_TEST_MYSQL_HOST', '127.0.0.1'),
|
'database.connections.mysql.host' => env('TENANCY_TEST_MYSQL_HOST', '127.0.0.1'),
|
||||||
|
'database.connections.sqlsrv.username' => env('TENANCY_TEST_SQLSRV_USERNAME', 'sa'),
|
||||||
|
'database.connections.sqlsrv.password' => env('TENANCY_TEST_SQLSRV_PASSWORD', 'P@ssword'),
|
||||||
|
'database.connections.sqlsrv.host' => env('TENANCY_TEST_SQLSRV_HOST', '127.0.0.1'),
|
||||||
|
'database.connections.sqlsrv.database' => null,
|
||||||
'database.connections.pgsql.host' => env('TENANCY_TEST_PGSQL_HOST', '127.0.0.1'),
|
'database.connections.pgsql.host' => env('TENANCY_TEST_PGSQL_HOST', '127.0.0.1'),
|
||||||
'tenancy.filesystem.disks' => [
|
'tenancy.filesystem.disks' => [
|
||||||
'local',
|
'local',
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue