Skip to content

Commit

Permalink
added TypeConverter
Browse files Browse the repository at this point in the history
  • Loading branch information
dg committed Aug 19, 2024
1 parent da31e2f commit b03059f
Show file tree
Hide file tree
Showing 5 changed files with 55 additions and 38 deletions.
3 changes: 2 additions & 1 deletion src/Database/Drivers/Engines/MySQLEngine.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
use Nette;
use Nette\Database\Drivers\Connection;
use Nette\Database\Drivers\Engine;
use Nette\Database\TypeConverter;


/**
Expand Down Expand Up @@ -186,7 +187,7 @@ public function getColumnTypes(\PDOStatement $statement): array
$meta['native_type'] === 'NEWDECIMAL' && $meta['precision'] === 0 => Nette\Database\IStructure::FIELD_INTEGER,
$meta['native_type'] === 'TINY' && $meta['len'] === 1 && $this->convertBoolean => Nette\Database\IStructure::FIELD_BOOL,
$meta['native_type'] === 'TIME' => Nette\Database\IStructure::FIELD_TIME_INTERVAL,
default => Nette\Database\Helpers::detectType($meta['native_type']),
default => TypeConverter::detectType($meta['native_type']),
};
}
}
Expand Down
5 changes: 3 additions & 2 deletions src/Database/Drivers/Engines/SQLServerEngine.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
use Nette;
use Nette\Database\Drivers\Connection;
use Nette\Database\Drivers\Engine;
use Nette\Database\TypeConverter;


/**
Expand Down Expand Up @@ -227,9 +228,9 @@ public function getColumnTypes(\PDOStatement $statement): array
isset($meta['sqlsrv:decl_type'])
&& $meta['sqlsrv:decl_type'] !== 'timestamp'
) { // timestamp does not mean time in sqlsrv
$types[$meta['name']] = Nette\Database\Helpers::detectType($meta['sqlsrv:decl_type']);
$types[$meta['name']] = TypeConverter::detectType($meta['sqlsrv:decl_type']);
} elseif (isset($meta['native_type'])) {
$types[$meta['name']] = Nette\Database\Helpers::detectType($meta['native_type']);
$types[$meta['name']] = TypeConverter::detectType($meta['native_type']);
}
}

Expand Down
5 changes: 3 additions & 2 deletions src/Database/Drivers/Engines/SQLiteEngine.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
use Nette;
use Nette\Database\Drivers\Connection;
use Nette\Database\Drivers\Engine;
use Nette\Database\TypeConverter;


/**
Expand Down Expand Up @@ -236,9 +237,9 @@ public function getColumnTypes(\PDOStatement $statement): array
if (isset($meta['sqlite:decl_type'])) {
$types[$meta['name']] = $this->formatDateTime === 'U' && in_array($meta['sqlite:decl_type'], ['DATE', 'DATETIME'], strict: true)
? Nette\Database\IStructure::FIELD_UNIX_TIMESTAMP
: Nette\Database\Helpers::detectType($meta['sqlite:decl_type']);
: TypeConverter::detectType($meta['sqlite:decl_type']);
} elseif (isset($meta['native_type'])) {
$types[$meta['name']] = Nette\Database\Helpers::detectType($meta['native_type']);
$types[$meta['name']] = TypeConverter::detectType($meta['native_type']);
}
}

Expand Down
34 changes: 1 addition & 33 deletions src/Database/Helpers.php
Original file line number Diff line number Diff line change
Expand Up @@ -24,18 +24,6 @@ class Helpers
/** maximum SQL length */
public static int $maxLength = 100;

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


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

return $types;
}


/**
* Heuristic column type detection.
* @internal
*/
public static function detectType(string $type): string
{
static $cache;
if (!isset($cache[$type])) {
$cache[$type] = 'string';
foreach (self::$typePatterns as $s => $val) {
if (preg_match("#^($s)$#i", $type)) {
return $cache[$type] = $val;
}
}
}

return $cache[$type];
}


/** @internal */
public static function normalizeRow(
array $row,
Expand Down
46 changes: 46 additions & 0 deletions src/Database/TypeConverter.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
<?php

/**
* This file is part of the Nette Framework (https://nette.org)
* Copyright (c) 2004 David Grudl (https://davidgrudl.com)
*/

declare(strict_types=1);

namespace Nette\Database;


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


/**
* Heuristic column type detection.
* @return Type::*
*/
public static function detectType(string $type): string
{
static $cache;
if (!isset($cache[$type])) {
$cache[$type] = IStructure::FIELD_TEXT;
foreach (self::$typePatterns as $s => $val) {
if (preg_match("#^($s)$#i", $type)) {
return $cache[$type] = $val;
}
}
}

return $cache[$type];
}
}

0 comments on commit b03059f

Please sign in to comment.