-
-
Notifications
You must be signed in to change notification settings - Fork 168
/
Copy pathVersion.php
133 lines (110 loc) · 3.61 KB
/
Version.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
<?php
declare(strict_types=1);
namespace Bolt\Doctrine;
use Bolt\Common\Str;
use Doctrine\DBAL\Connection;
use Doctrine\DBAL\Driver\PDOConnection;
use Doctrine\DBAL\Platforms\MariaDb1027Platform;
use Doctrine\DBAL\Platforms\MySQL57Platform;
use Doctrine\DBAL\Platforms\PostgreSQL92Platform;
use Doctrine\DBAL\Platforms\SqlitePlatform;
class Version
{
/** @var Connection */
private $connection;
/** @var string */
private $tablePrefix;
public function __construct(Connection $connection, string $tablePrefix = 'bolt')
{
$this->connection = $connection;
$this->tablePrefix = Str::ensureEndsWith($tablePrefix, '_');
}
public function getPlatform(): array
{
/** @var PDOConnection $wrapped */
$wrapped = $this->connection->getWrappedConnection();
[$client_version] = explode(' - ', $wrapped->getAttribute(\PDO::ATTR_CLIENT_VERSION));
try {
$status = $wrapped->getAttribute(\PDO::ATTR_CONNECTION_STATUS);
} catch (\PDOException $e) {
$status = '';
}
return [
'client_version' => $client_version,
'driver_name' => $wrapped->getAttribute(\PDO::ATTR_DRIVER_NAME),
'connection_status' => $status,
'server_version' => $wrapped->getAttribute(\PDO::ATTR_SERVER_VERSION),
];
}
public function tableContentExists(): bool
{
try {
$query = $this->connection->createQueryBuilder();
$query
->select('1')
->from($this->tablePrefix . 'content');
$query->execute();
} catch (\Throwable $e) {
return false;
}
return true;
}
public function hasJson(): bool
{
$platform = $this->connection->getDatabasePlatform();
if ($platform instanceof SqlitePlatform) {
return $this->hasSQLiteJSONSupport();
}
// MySQL80Platform is implicitly included with MySQL57Platform
if ($platform instanceof MySQL57Platform || $platform instanceof MariaDb1027Platform) {
return true;
}
// PostgreSQL supports JSON from v9.2 and above, later versions are implicitly included
if ($platform instanceof PostgreSQL92Platform) {
return true;
}
return false;
}
public function hasCast(): bool
{
try {
$query = $this->connection->createQueryBuilder();
$query
->select('CAST(1.1 AS int)');
$query->execute();
} catch (\Throwable $e) {
return false;
}
return true;
}
public function hasJsonSearch(): bool
{
try {
$query = $this->connection->createQueryBuilder();
$query
->select('JSON_SEARCH("{}", "one", "")');
$query->execute();
} catch (\Throwable $e) {
return false;
}
return true;
}
/**
* If we're using SQLite, this method tests for JSON support
*
* This query should return `["succes"]` or throw an error if JSON is unsupported.
* `SELECT JSON_EXTRACT('{"jsonfunctionalitytest":["succes"]}', '$.jsonfunctionalitytest') as value;`
*/
private function hasSQLiteJSONSupport(): bool
{
try {
$query = $this->connection->createQueryBuilder();
$query
->select('JSON_EXTRACT(\'{"jsonfunctionalitytest":["succes"]}\', \'$.jsonfunctionalitytest\') as value');
$query->execute();
} catch (\Throwable $e) {
return false;
}
return true;
}
}