Skip to content

Commit 466e680

Browse files
authored
Merge pull request #13 from keboola/CT-807-php8
Update SNFLK and Synapse drivers use PHP8.1
2 parents 107bff8 + 3895386 commit 466e680

10 files changed

Lines changed: 173 additions & 27 deletions

File tree

Dockerfile

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,16 @@ ARG AWS_ACCESS_KEY_ID
44
RUN /usr/bin/aws s3 cp s3://keboola-drivers/teradata/tdodbc1710-17.10.00.08-1.x86_64.deb /tmp/teradata/tdodbc.deb
55
RUN /usr/bin/aws s3 cp s3://keboola-drivers/exasol/EXASOL_ODBC-7.1.10.tar.gz /tmp/exasol/odbc.tar.gz
66

7-
FROM php:7.4-cli-buster
7+
FROM php:8.1-cli-buster
88

99
ARG COMPOSER_FLAGS="--prefer-dist --no-interaction"
1010
ARG DEBIAN_FRONTEND=noninteractive
1111
ENV COMPOSER_ALLOW_SUPERUSER 1
1212
ENV COMPOSER_PROCESS_TIMEOUT 3600
1313

14-
ARG SQLSRV_VERSION=5.9.0
15-
ARG SNOWFLAKE_ODBC_VERSION=2.21.1
16-
ARG SNOWFLAKE_GPG_KEY=EC218558EABB25A1
14+
ARG SQLSRV_VERSION=5.10.1
15+
ARG SNOWFLAKE_ODBC_VERSION=2.25.6
16+
ARG SNOWFLAKE_GPG_KEY=630D9F3CAB551AF3
1717

1818
WORKDIR /code/
1919

Dockerfile.74

Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
FROM quay.io/keboola/aws-cli
2+
ARG AWS_SECRET_ACCESS_KEY
3+
ARG AWS_ACCESS_KEY_ID
4+
RUN /usr/bin/aws s3 cp s3://keboola-drivers/teradata/tdodbc1710-17.10.00.08-1.x86_64.deb /tmp/teradata/tdodbc.deb
5+
RUN /usr/bin/aws s3 cp s3://keboola-drivers/exasol/EXASOL_ODBC-7.1.10.tar.gz /tmp/exasol/odbc.tar.gz
6+
7+
FROM php:7.4-cli-buster
8+
9+
ARG COMPOSER_FLAGS="--prefer-dist --no-interaction"
10+
ARG DEBIAN_FRONTEND=noninteractive
11+
ENV COMPOSER_ALLOW_SUPERUSER 1
12+
ENV COMPOSER_PROCESS_TIMEOUT 3600
13+
14+
ARG SQLSRV_VERSION=5.10.1
15+
ARG SNOWFLAKE_ODBC_VERSION=2.25.6
16+
ARG SNOWFLAKE_GPG_KEY=630D9F3CAB551AF3
17+
18+
WORKDIR /code/
19+
20+
COPY docker/php-prod.ini /usr/local/etc/php/php.ini
21+
COPY docker/composer-install.sh /tmp/composer-install.sh
22+
23+
RUN apt-get update -q \
24+
&& apt-get install gnupg -y --no-install-recommends \
25+
&& curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add - \
26+
&& curl https://packages.microsoft.com/config/debian/10/prod.list > /etc/apt/sources.list.d/mssql-release.list \
27+
&& apt-get update -q \
28+
&& ACCEPT_EULA=Y apt-get install -y --no-install-recommends\
29+
git \
30+
locales \
31+
unzip \
32+
unixodbc \
33+
unixodbc-dev \
34+
libpq-dev \
35+
gpg \
36+
debsig-verify \
37+
dirmngr \
38+
gpg-agent \
39+
msodbcsql17 \
40+
libonig-dev \
41+
libxml2-dev \
42+
&& rm -r /var/lib/apt/lists/* \
43+
&& sed -i 's/^# *\(en_US.UTF-8\)/\1/' /etc/locale.gen \
44+
&& locale-gen \
45+
&& chmod +x /tmp/composer-install.sh \
46+
&& /tmp/composer-install.sh
47+
48+
ENV LANGUAGE=en_US.UTF-8
49+
ENV LANG=en_US.UTF-8
50+
ENV LC_ALL=en_US.UTF-8
51+
52+
# Snowflake ODBC
53+
# https://github.com/docker-library/php/issues/103#issuecomment-353674490
54+
RUN set -ex; \
55+
docker-php-source extract; \
56+
{ \
57+
echo '# https://github.com/docker-library/php/issues/103#issuecomment-353674490'; \
58+
echo 'AC_DEFUN([PHP_ALWAYS_SHARED],[])dnl'; \
59+
echo; \
60+
cat /usr/src/php/ext/odbc/config.m4; \
61+
} > temp.m4; \
62+
mv temp.m4 /usr/src/php/ext/odbc/config.m4; \
63+
docker-php-ext-configure odbc --with-unixODBC=shared,/usr; \
64+
docker-php-ext-install odbc; \
65+
docker-php-source delete
66+
67+
68+
69+
#Synapse ODBC
70+
RUN set -ex; \
71+
pecl install sqlsrv-$SQLSRV_VERSION pdo_sqlsrv-$SQLSRV_VERSION; \
72+
docker-php-ext-enable sqlsrv pdo_sqlsrv; \
73+
docker-php-source delete
74+
75+
## Snowflake
76+
COPY ./docker/snowflake/generic.pol /etc/debsig/policies/$SNOWFLAKE_GPG_KEY/generic.pol
77+
COPY ./docker/snowflake/simba.snowflake.ini /usr/lib/snowflake/odbc/lib/simba.snowflake.ini
78+
79+
RUN mkdir -p ~/.gnupg \
80+
&& chmod 700 ~/.gnupg \
81+
&& echo "disable-ipv6" >> ~/.gnupg/dirmngr.conf \
82+
&& mkdir -p /usr/share/debsig/keyrings/$SNOWFLAKE_GPG_KEY \
83+
&& gpg --keyserver hkp://keyserver.ubuntu.com --recv-keys $SNOWFLAKE_GPG_KEY \
84+
&& gpg --export $SNOWFLAKE_GPG_KEY > /usr/share/debsig/keyrings/$SNOWFLAKE_GPG_KEY/debsig.gpg \
85+
&& curl https://sfc-repo.snowflakecomputing.com/odbc/linux/$SNOWFLAKE_ODBC_VERSION/snowflake-odbc-$SNOWFLAKE_ODBC_VERSION.x86_64.deb --output /tmp/snowflake-odbc.deb \
86+
&& debsig-verify /tmp/snowflake-odbc.deb \
87+
&& gpg --batch --delete-key --yes $SNOWFLAKE_GPG_KEY \
88+
&& dpkg -i /tmp/snowflake-odbc.deb
89+
90+
# Teradata
91+
COPY --from=0 /tmp/teradata/tdodbc.deb /tmp/teradata/tdodbc.deb
92+
COPY docker/teradata/odbc.ini /tmp/teradata/odbc_td.ini
93+
COPY docker/teradata/odbcinst.ini /tmp/teradata/odbcinst_td.ini
94+
95+
RUN dpkg -i /tmp/teradata/tdodbc.deb \
96+
&& cat /tmp/teradata/odbc_td.ini >> /etc/odbc.ini \
97+
&& cat /tmp/teradata/odbcinst_td.ini >> /etc/odbcinst.ini \
98+
&& rm -r /tmp/teradata \
99+
&& docker-php-ext-configure pdo_odbc --with-pdo-odbc=unixODBC,/usr \
100+
&& docker-php-ext-install pdo_odbc \
101+
&& docker-php-source delete
102+
103+
ENV ODBCHOME = /opt/teradata/client/ODBC_64/
104+
ENV ODBCINI = /opt/teradata/client/ODBC_64/odbc.ini
105+
ENV ODBCINST = /opt/teradata/client/ODBC_64/odbcinst.ini
106+
ENV LD_LIBRARY_PATH = /opt/teradata/client/ODBC_64/lib
107+
108+
#Exasol
109+
COPY --from=0 /tmp/exasol/odbc.tar.gz /tmp/exasol/odbc.tar.gz
110+
RUN set -ex; \
111+
mkdir -p /tmp/exasol/odbc /opt/exasol ;\
112+
tar -xzf /tmp/exasol/odbc.tar.gz -C /tmp/exasol/odbc --strip-components 1; \
113+
cp /tmp/exasol/odbc/lib/linux/x86_64/libexaodbc-uo2214lv2.so /opt/exasol/;\
114+
echo "\n[exasol]\nDriver=/opt/exasol/libexaodbc-uo2214lv2.so\n" >> /etc/odbcinst.ini;\
115+
rm -rf /tmp/exasol;
116+
117+
## Composer - deps always cached unless changed
118+
# First copy only composer files
119+
COPY composer.* /code/
120+
# Download dependencies, but don't run scripts or init autoloaders as the app is missing
121+
RUN composer install $COMPOSER_FLAGS --no-scripts --no-autoloader
122+
# copy rest of the app
123+
COPY . /code/
124+
# run normal composer - all deps are cached already
125+
RUN composer install $COMPOSER_FLAGS
126+
127+
CMD ["php", "/code/src/run.php"]

docker-compose.yml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,5 +45,13 @@ services:
4545
privileged: true
4646
volumes:
4747
- exa-volume:/exa
48+
production74:
49+
<<: *prod
50+
build:
51+
context: .
52+
dockerfile: Dockerfile.74
53+
args:
54+
- AWS_ACCESS_KEY_ID
55+
- AWS_SECRET_ACCESS_KEY
4856
volumes:
4957
exa-volume:

docker/snowflake/generic.pol

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
<?xml version="1.0"?>
22
<!DOCTYPE Policy SYSTEM "http://www.debian.org/debsig/1.0/policy.dtd">
33
<Policy xmlns="https://www.debian.org/debsig/1.0/">
4-
<Origin Name="Snowflake Computing" id="EC218558EABB25A1" Description="Snowflake ODBC Driver DEB package"/>
4+
<Origin Name="Snowflake Computing" id="630D9F3CAB551AF3" Description="Snowflake ODBC Driver DEB package"/>
55
<Selection>
6-
<Required Type="origin" File="debsig.gpg" id="EC218558EABB25A1"/>
6+
<Required Type="origin" File="debsig.gpg" id="630D9F3CAB551AF3"/>
77
</Selection>
88
<Verification MinOptional="0">
9-
<Required Type="origin" File="debsig.gpg" id="EC218558EABB25A1"/>
9+
<Required Type="origin" File="debsig.gpg" id="630D9F3CAB551AF3"/>
1010
</Verification>
1111
</Policy>

phpcs.xml

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,23 @@
11
<?xml version="1.0"?>
22
<ruleset name="Project">
33
<rule ref="vendor/keboola/coding-standard/src/ruleset.xml"/>
4+
<rule ref="SlevomatCodingStandard.TypeHints.ParameterTypeHint">
5+
<properties>
6+
<property name="enableUnionTypeHint" type="bool" value="false" />
7+
<property name="enableIntersectionTypeHint" type="bool" value="false" />
8+
<property name="enableStandaloneNullTrueFalseTypeHints" type="bool" value="false" />
9+
</properties>
10+
</rule>
11+
<rule ref="SlevomatCodingStandard.TypeHints.ReturnTypeHint.MissingNativeTypeHint">
12+
<exclude name="SlevomatCodingStandard.TypeHints.ReturnTypeHint.MissingNativeTypeHint.MissingTraversableReturnTypeHintSpecification"/>
13+
<properties>
14+
<property name="enableStaticTypeHint" type="bool" value="false" />
15+
<property name="enableMixedTypeHint" type="bool" value="false" />
16+
<property name="enableUnionTypeHint" type="bool" value="false" />
17+
<property name="enableIntersectionTypeHint" type="bool" value="false" />
18+
<property name="enableNeverTypeHint" type="bool" value="false" />
19+
<property name="enableStandaloneNullTrueFalseTypeHints" type="bool" value="false" />
20+
</properties>
21+
</rule>
22+
423
</ruleset>

tests/Functional/Synapse/Auth/SynapseGrantQueryBuilderTest.php

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
use Keboola\TableBackendUtils\Auth\Grant\Synapse\Permission;
1111
use Keboola\TableBackendUtils\Auth\Grant\Synapse\RevokeOptions;
1212
use Keboola\TableBackendUtils\Auth\SynapseGrantQueryBuilder;
13+
use Keboola\TableBackendUtils\Escaping\SynapseQuote;
1314

1415
class SynapseGrantQueryBuilderTest extends BaseAuthTestCase
1516
{
@@ -80,20 +81,20 @@ protected function setUp(): void
8081

8182
$this->connection->executeStatement(sprintf(
8283
'CREATE ROLE %s',
83-
$this->platform->quoteSingleIdentifier($this->currentLogin . '_ROLE')
84+
SynapseQuote::quoteSingleIdentifier($this->currentLogin . '_ROLE')
8485
));
8586

8687
assert($this->currentLogin !== null);
8788
$this->connection->executeStatement(sprintf(
8889
'CREATE SCHEMA %s AUTHORIZATION %s',
89-
$this->platform->quoteSingleIdentifier(self::TEST_SCHEMA),
90-
$this->platform->quoteSingleIdentifier($this->currentLogin)
90+
SynapseQuote::quoteSingleIdentifier(self::TEST_SCHEMA),
91+
SynapseQuote::quoteSingleIdentifier($this->currentLogin)
9192
));
9293

9394
$this->connection->executeStatement(sprintf(
9495
'CREATE TABLE %s.%s ([col1] nvarchar(4000) NOT NULL DEFAULT \'\')',
95-
$this->platform->quoteSingleIdentifier(self::TEST_SCHEMA),
96-
$this->platform->quoteSingleIdentifier(self::TEST_TABLE)
96+
SynapseQuote::quoteSingleIdentifier(self::TEST_SCHEMA),
97+
SynapseQuote::quoteSingleIdentifier(self::TEST_TABLE)
9798
));
9899
}
99100

tests/Functional/Synapse/Database/SynapseDatabaseReflectionTest.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
namespace Tests\Keboola\TableBackendUtils\Functional\Synapse\Database;
66

77
use Keboola\TableBackendUtils\Database\SynapseDatabaseReflection;
8+
use Keboola\TableBackendUtils\Escaping\SynapseQuote;
89
use Tests\Keboola\TableBackendUtils\Functional\Synapse\Auth\BaseAuthTestCase;
910

1011
class SynapseDatabaseReflectionTest extends BaseAuthTestCase
@@ -24,7 +25,7 @@ public function testGetRolesNames(): void
2425

2526
$this->connection->executeStatement(sprintf(
2627
'CREATE ROLE %s',
27-
$this->platform->quoteSingleIdentifier($this->currentLogin . '_ROLE')
28+
SynapseQuote::quoteSingleIdentifier($this->currentLogin . '_ROLE')
2829
));
2930
$ref = new SynapseDatabaseReflection($this->connection);
3031
$names = $ref->getRolesNames(self::LOGIN_PREFIX . '%');

tests/Functional/Synapse/SynapseBaseCase.php

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,6 @@
66

77
use Doctrine\DBAL\Connection;
88
use Doctrine\DBAL\DriverManager;
9-
use Doctrine\DBAL\Platforms\AbstractPlatform;
10-
use Doctrine\DBAL\Platforms\SQLServer2012Platform;
119
use Keboola\TableBackendUtils\Connection\Synapse\SynapseDriver;
1210
use Keboola\TableBackendUtils\Schema\SynapseSchemaQueryBuilder;
1311
use Keboola\TableBackendUtils\Schema\SynapseSchemaReflection;
@@ -20,9 +18,6 @@ class SynapseBaseCase extends TestCase
2018

2119
protected Connection $connection;
2220

23-
/** @var SQLServer2012Platform|AbstractPlatform */
24-
protected $platform;
25-
2621
protected SynapseSchemaQueryBuilder $schemaQb;
2722

2823
protected SynapseTableQueryBuilder $tableQb;
@@ -64,7 +59,6 @@ protected function setUp(): void
6459
{
6560
parent::setUp();
6661
$this->connection = $this->getSynapseConnection();
67-
$this->platform = $this->connection->getDatabasePlatform();
6862
$this->schemaQb = new SynapseSchemaQueryBuilder();
6963
$this->tableQb = new SynapseTableQueryBuilder();
7064
}

tests/Functional/Teradata/TeradataBaseCase.php

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,14 +23,10 @@ class TeradataBaseCase extends TestCase
2323

2424
protected Connection $connection;
2525

26-
/** @var TeradataPlatform|AbstractPlatform */
27-
protected $platform;
28-
2926
protected function setUp(): void
3027
{
3128
parent::setUp();
3229
$this->connection = $this->getTeradataConnection();
33-
$this->platform = $this->connection->getDatabasePlatform();
3430
}
3531

3632
protected function initTable(

tests/Unit/Column/ColumnCollectionTest.php

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,9 @@ public function testGetIterator(): void
2727

2828
/**
2929
* @dataProvider tooMuchColumnsProviderWithLimits
30-
* @param SynapseColumn|TeradataColumn $definitionClass
30+
* @param class-string<SynapseColumn|TeradataColumn> $definitionClass
3131
*/
32-
public function testTooMuchColumns($definitionClass, int $limit): void
32+
public function testTooMuchColumns(string $definitionClass, int $limit): void
3333
{
3434
$cols = [];
3535
for ($i = 0; $i < $limit + 2; $i++) {
@@ -43,9 +43,9 @@ public function testTooMuchColumns($definitionClass, int $limit): void
4343

4444
/**
4545
* @dataProvider tooMuchColumnsProviderWithNoLimits
46-
* @param SnowflakeColumn|ExasolColumn $definitionClass
46+
* @param class-string<SnowflakeColumn|ExasolColumn> $definitionClass
4747
*/
48-
public function testNoColumnsLimit($definitionClass, int $limit): void
48+
public function testNoColumnsLimit(string $definitionClass, int $limit): void
4949
{
5050
$cols = [];
5151
for ($i = 0; $i < $limit + 2; $i++) {

0 commit comments

Comments
 (0)