Skip to content

Commit 1de6d06

Browse files
committed
added TypeConverter
1 parent 5db18b6 commit 1de6d06

File tree

5 files changed

+55
-38
lines changed

5 files changed

+55
-38
lines changed

src/Database/Drivers/Engines/MySQLEngine.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
use Nette;
1313
use Nette\Database\Drivers\Connection;
1414
use Nette\Database\Drivers\Engine;
15+
use Nette\Database\TypeConverter;
1516
use function array_change_key_case, array_values, in_array, str_replace, strtoupper;
1617

1718

@@ -196,7 +197,7 @@ public function getColumnTypes(\PDOStatement $statement): array
196197
$meta['native_type'] === 'NEWDECIMAL' && $meta['precision'] === 0 => Nette\Database\IStructure::FIELD_INTEGER,
197198
$meta['native_type'] === 'TINY' && $meta['len'] === 1 && $this->convertBoolean => Nette\Database\IStructure::FIELD_BOOL,
198199
$meta['native_type'] === 'TIME' => Nette\Database\IStructure::FIELD_TIME_INTERVAL,
199-
default => Nette\Database\Helpers::detectType($meta['native_type']),
200+
default => TypeConverter::detectType($meta['native_type']),
200201
};
201202
}
202203
}

src/Database/Drivers/Engines/SQLServerEngine.php

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
use Nette;
1313
use Nette\Database\Drivers\Connection;
1414
use Nette\Database\Drivers\Engine;
15+
use Nette\Database\TypeConverter;
1516
use function array_values, str_replace;
1617

1718

@@ -238,9 +239,9 @@ public function getColumnTypes(\PDOStatement $statement): array
238239
isset($meta['sqlsrv:decl_type'])
239240
&& $meta['sqlsrv:decl_type'] !== 'timestamp'
240241
) { // timestamp does not mean time in sqlsrv
241-
$types[$meta['name']] = Nette\Database\Helpers::detectType($meta['sqlsrv:decl_type']);
242+
$types[$meta['name']] = TypeConverter::detectType($meta['sqlsrv:decl_type']);
242243
} elseif (isset($meta['native_type'])) {
243-
$types[$meta['name']] = Nette\Database\Helpers::detectType($meta['native_type']);
244+
$types[$meta['name']] = TypeConverter::detectType($meta['native_type']);
244245
}
245246
}
246247

src/Database/Drivers/Engines/SQLiteEngine.php

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
use Nette;
1313
use Nette\Database\Drivers\Connection;
1414
use Nette\Database\Drivers\Engine;
15+
use Nette\Database\TypeConverter;
1516
use function array_values, in_array, preg_match, str_contains, strtoupper, strtr;
1617

1718

@@ -238,9 +239,9 @@ public function getColumnTypes(\PDOStatement $statement): array
238239
if (isset($meta['sqlite:decl_type'])) {
239240
$types[$meta['name']] = $this->formatDateTime === 'U' && in_array($meta['sqlite:decl_type'], ['DATE', 'DATETIME'], strict: true)
240241
? Nette\Database\IStructure::FIELD_UNIX_TIMESTAMP
241-
: Nette\Database\Helpers::detectType($meta['sqlite:decl_type']);
242+
: TypeConverter::detectType($meta['sqlite:decl_type']);
242243
} elseif (isset($meta['native_type'])) {
243-
$types[$meta['name']] = Nette\Database\Helpers::detectType($meta['native_type']);
244+
$types[$meta['name']] = TypeConverter::detectType($meta['native_type']);
244245
}
245246
}
246247

src/Database/Helpers.php

Lines changed: 1 addition & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -26,18 +26,6 @@ class Helpers
2626
/** maximum SQL length */
2727
public static int $maxLength = 100;
2828

29-
public static array $typePatterns = [
30-
'^_' => IStructure::FIELD_TEXT, // PostgreSQL arrays
31-
'(TINY|SMALL|SHORT|MEDIUM|BIG|LONG)(INT)?|INT(EGER|\d+| IDENTITY| UNSIGNED)?|(SMALL|BIG|)SERIAL\d*|COUNTER|YEAR|BYTE|LONGLONG|UNSIGNED BIG INT' => IStructure::FIELD_INTEGER,
32-
'(NEW)?DEC(IMAL)?(\(.*)?|NUMERIC|(SMALL)?MONEY|CURRENCY|NUMBER' => IStructure::FIELD_DECIMAL,
33-
'REAL|DOUBLE( PRECISION)?|FLOAT\d*' => IStructure::FIELD_FLOAT,
34-
'BOOL(EAN)?' => IStructure::FIELD_BOOL,
35-
'TIME' => IStructure::FIELD_TIME,
36-
'DATE' => IStructure::FIELD_DATE,
37-
'(SMALL)?DATETIME(OFFSET)?\d*|TIME(STAMP.*)?' => IStructure::FIELD_DATETIME,
38-
'BYTEA|(TINY|MEDIUM|LONG|)BLOB|(LONG )?(VAR)?BINARY|IMAGE' => IStructure::FIELD_BINARY,
39-
];
40-
4129

4230
/**
4331
* Displays result set as HTML table.
@@ -176,34 +164,14 @@ public static function detectTypes(\PDOStatement $statement): array
176164
for ($col = 0; $col < $count; $col++) {
177165
$meta = $statement->getColumnMeta($col);
178166
if (isset($meta['native_type'])) {
179-
$types[$meta['name']] = self::detectType($meta['native_type']);
167+
$types[$meta['name']] = TypeConverter::detectType($meta['native_type']);
180168
}
181169
}
182170

183171
return $types;
184172
}
185173

186174

187-
/**
188-
* Detects column type from native type.
189-
* @internal
190-
*/
191-
public static function detectType(string $type): string
192-
{
193-
static $cache;
194-
if (!isset($cache[$type])) {
195-
$cache[$type] = 'string';
196-
foreach (self::$typePatterns as $s => $val) {
197-
if (preg_match("#^($s)$#i", $type)) {
198-
return $cache[$type] = $val;
199-
}
200-
}
201-
}
202-
203-
return $cache[$type];
204-
}
205-
206-
207175
/** @internal */
208176
public static function normalizeRow(
209177
array $row,

src/Database/TypeConverter.php

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
<?php
2+
3+
/**
4+
* This file is part of the Nette Framework (https://nette.org)
5+
* Copyright (c) 2004 David Grudl (https://davidgrudl.com)
6+
*/
7+
8+
declare(strict_types=1);
9+
10+
namespace Nette\Database;
11+
12+
13+
final class TypeConverter
14+
{
15+
public static array $typePatterns = [
16+
'^_' => IStructure::FIELD_TEXT, // PostgreSQL arrays
17+
'(TINY|SMALL|SHORT|MEDIUM|BIG|LONG)(INT)?|INT(EGER|\d+| IDENTITY| UNSIGNED)?|(SMALL|BIG|)SERIAL\d*|COUNTER|YEAR|BYTE|LONGLONG|UNSIGNED BIG INT' => IStructure::FIELD_INTEGER,
18+
'(NEW)?DEC(IMAL)?(\(.*)?|NUMERIC|(SMALL)?MONEY|CURRENCY|NUMBER' => IStructure::FIELD_DECIMAL,
19+
'REAL|DOUBLE( PRECISION)?|FLOAT\d*' => IStructure::FIELD_FLOAT,
20+
'BOOL(EAN)?' => IStructure::FIELD_BOOL,
21+
'TIME' => IStructure::FIELD_TIME,
22+
'DATE' => IStructure::FIELD_DATE,
23+
'(SMALL)?DATETIME(OFFSET)?\d*|TIME(STAMP.*)?' => IStructure::FIELD_DATETIME,
24+
'BYTEA|(TINY|MEDIUM|LONG|)BLOB|(LONG )?(VAR)?BINARY|IMAGE' => IStructure::FIELD_BINARY,
25+
];
26+
27+
28+
/**
29+
* Heuristic column type detection.
30+
* @return Type::*
31+
*/
32+
public static function detectType(string $type): string
33+
{
34+
static $cache;
35+
if (!isset($cache[$type])) {
36+
$cache[$type] = IStructure::FIELD_TEXT;
37+
foreach (self::$typePatterns as $s => $val) {
38+
if (preg_match("#^($s)$#i", $type)) {
39+
return $cache[$type] = $val;
40+
}
41+
}
42+
}
43+
44+
return $cache[$type];
45+
}
46+
}

0 commit comments

Comments
 (0)