Skip to content

Commit fd3ac1c

Browse files
committed
added TypeConverter
1 parent 53fe338 commit fd3ac1c

5 files changed

Lines changed: 55 additions & 38 deletions

File tree

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

1617

1718
/**
@@ -186,7 +187,7 @@ public function getColumnTypes(\PDOStatement $statement): array
186187
$meta['native_type'] === 'NEWDECIMAL' && $meta['precision'] === 0 => Nette\Database\IStructure::FIELD_INTEGER,
187188
$meta['native_type'] === 'TINY' && $meta['len'] === 1 && $this->convertBoolean => Nette\Database\IStructure::FIELD_BOOL,
188189
$meta['native_type'] === 'TIME' => Nette\Database\IStructure::FIELD_TIME_INTERVAL,
189-
default => Nette\Database\Helpers::detectType($meta['native_type']),
190+
default => TypeConverter::detectType($meta['native_type']),
190191
};
191192
}
192193
}

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

1617

1718
/**
@@ -227,9 +228,9 @@ public function getColumnTypes(\PDOStatement $statement): array
227228
isset($meta['sqlsrv:decl_type'])
228229
&& $meta['sqlsrv:decl_type'] !== 'timestamp'
229230
) { // timestamp does not mean time in sqlsrv
230-
$types[$meta['name']] = Nette\Database\Helpers::detectType($meta['sqlsrv:decl_type']);
231+
$types[$meta['name']] = TypeConverter::detectType($meta['sqlsrv:decl_type']);
231232
} elseif (isset($meta['native_type'])) {
232-
$types[$meta['name']] = Nette\Database\Helpers::detectType($meta['native_type']);
233+
$types[$meta['name']] = TypeConverter::detectType($meta['native_type']);
233234
}
234235
}
235236

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

1617

1718
/**
@@ -236,9 +237,9 @@ public function getColumnTypes(\PDOStatement $statement): array
236237
if (isset($meta['sqlite:decl_type'])) {
237238
$types[$meta['name']] = $this->formatDateTime === 'U' && in_array($meta['sqlite:decl_type'], ['DATE', 'DATETIME'], strict: true)
238239
? Nette\Database\IStructure::FIELD_UNIX_TIMESTAMP
239-
: Nette\Database\Helpers::detectType($meta['sqlite:decl_type']);
240+
: TypeConverter::detectType($meta['sqlite:decl_type']);
240241
} elseif (isset($meta['native_type'])) {
241-
$types[$meta['name']] = Nette\Database\Helpers::detectType($meta['native_type']);
242+
$types[$meta['name']] = TypeConverter::detectType($meta['native_type']);
242243
}
243244
}
244245

src/Database/Helpers.php

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

27-
public static array $typePatterns = [
28-
'^_' => IStructure::FIELD_TEXT, // PostgreSQL arrays
29-
'(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,
30-
'(NEW)?DEC(IMAL)?(\(.*)?|NUMERIC|(SMALL)?MONEY|CURRENCY|NUMBER' => IStructure::FIELD_DECIMAL,
31-
'REAL|DOUBLE( PRECISION)?|FLOAT\d*' => IStructure::FIELD_FLOAT,
32-
'BOOL(EAN)?' => IStructure::FIELD_BOOL,
33-
'TIME' => IStructure::FIELD_TIME,
34-
'DATE' => IStructure::FIELD_DATE,
35-
'(SMALL)?DATETIME(OFFSET)?\d*|TIME(STAMP.*)?' => IStructure::FIELD_DATETIME,
36-
'BYTEA|(TINY|MEDIUM|LONG|)BLOB|(LONG )?(VAR)?BINARY|IMAGE' => IStructure::FIELD_BINARY,
37-
];
38-
3927

4028
/**
4129
* Displays complete result set as HTML table for debug purposes.
@@ -173,34 +161,14 @@ public static function detectTypes(\PDOStatement $statement): array
173161
for ($col = 0; $col < $count; $col++) {
174162
$meta = $statement->getColumnMeta($col);
175163
if (isset($meta['native_type'])) {
176-
$types[$meta['name']] = self::detectType($meta['native_type']);
164+
$types[$meta['name']] = TypeConverter::detectType($meta['native_type']);
177165
}
178166
}
179167

180168
return $types;
181169
}
182170

183171

184-
/**
185-
* Heuristic column type detection.
186-
* @internal
187-
*/
188-
public static function detectType(string $type): string
189-
{
190-
static $cache;
191-
if (!isset($cache[$type])) {
192-
$cache[$type] = 'string';
193-
foreach (self::$typePatterns as $s => $val) {
194-
if (preg_match("#^($s)$#i", $type)) {
195-
return $cache[$type] = $val;
196-
}
197-
}
198-
}
199-
200-
return $cache[$type];
201-
}
202-
203-
204172
/** @internal */
205173
public static function normalizeRow(
206174
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)