diff --git a/examples/result-set-data-types.php b/examples/result-set-data-types.php index fdb83f86..32915507 100644 --- a/examples/result-set-data-types.php +++ b/examples/result-set-data-types.php @@ -27,9 +27,9 @@ // using manual hints $res = $dibi->query('SELECT * FROM [customers]'); -$res->setType('customer_id', Type::INTEGER) - ->setType('added', Type::DATETIME) - ->setFormat(Type::DATETIME, 'Y-m-d H:i:s'); +$res->setType('customer_id', Type::Integer) + ->setType('added', Type::DateTime) + ->setFormat(Type::DateTime, 'Y-m-d H:i:s'); Tracy\Dumper::dump($res->fetch()); diff --git a/readme.md b/readme.md index ceeef536..9dd3d2be 100644 --- a/readme.md +++ b/readme.md @@ -608,7 +608,7 @@ $database->query("UPDATE [:blog:items] SET [text]='Hello World'"); Dibi automatically detects the types of query columns and converts fields them to native PHP types. We can also specify the type manually. You can find the possible types in the `Dibi\Type` class. ```php -$result->setType('id', Dibi\Type::INTEGER); // id will be integer +$result->setType('id', Dibi\Type::Integer); // id will be integer $row = $result->fetch(); is_int($row->id) // true diff --git a/src/Dibi/Connection.php b/src/Dibi/Connection.php index 409220b9..916d0956 100644 --- a/src/Dibi/Connection.php +++ b/src/Dibi/Connection.php @@ -74,10 +74,10 @@ public function __construct(array $config, ?string $name = null) $this->config = $config; $this->formats = [ - Type::DATE => $this->config['result']['formatDate'], - Type::DATETIME => $this->config['result']['formatDateTime'], + Type::Date => $this->config['result']['formatDate'], + Type::DateTime => $this->config['result']['formatDateTime'], Type::JSON => $this->config['result']['formatJson'] ?? 'array', - Type::TIME_INTERVAL => $this->config['result']['formatTimeInterval'] ?? null, + Type::TimeInterval => $this->config['result']['formatTimeInterval'] ?? null, ]; // profiler diff --git a/src/Dibi/Drivers/FirebirdDriver.php b/src/Dibi/Drivers/FirebirdDriver.php index dcd545f5..cef0b98b 100644 --- a/src/Dibi/Drivers/FirebirdDriver.php +++ b/src/Dibi/Drivers/FirebirdDriver.php @@ -26,7 +26,10 @@ */ class FirebirdDriver implements Dibi\Driver { - public const ERROR_EXCEPTION_THROWN = -836; + public const ErrorExceptionThrown = -836; + + /** @deprecated use FirebirdDriver::ErrorExceptionThrown */ + public const ERROR_EXCEPTION_THROWN = self::ErrorExceptionThrown; /** @var resource */ private $connection; diff --git a/src/Dibi/Drivers/MySqliDriver.php b/src/Dibi/Drivers/MySqliDriver.php index f0bd33be..41e7c606 100644 --- a/src/Dibi/Drivers/MySqliDriver.php +++ b/src/Dibi/Drivers/MySqliDriver.php @@ -32,9 +32,18 @@ */ class MySqliDriver implements Dibi\Driver { - public const ERROR_ACCESS_DENIED = 1045; - public const ERROR_DUPLICATE_ENTRY = 1062; - public const ERROR_DATA_TRUNCATED = 1265; + public const ErrorAccessDenied = 1045; + public const ErrorDuplicateEntry = 1062; + public const ErrorDataTruncated = 1265; + + /** @deprecated use MySqliDriver::ErrorAccessDenied */ + public const ERROR_ACCESS_DENIED = self::ErrorAccessDenied; + + /** @deprecated use MySqliDriver::ErrorDuplicateEntry */ + public const ERROR_DUPLICATE_ENTRY = self::ErrorDuplicateEntry; + + /** @deprecated use MySqliDriver::ErrorDataTruncated */ + public const ERROR_DATA_TRUNCATED = self::ErrorDataTruncated; private \mysqli $connection; private bool $buffered = false; diff --git a/src/Dibi/Drivers/MySqliResult.php b/src/Dibi/Drivers/MySqliResult.php index acdf6496..4469ef0c 100644 --- a/src/Dibi/Drivers/MySqliResult.php +++ b/src/Dibi/Drivers/MySqliResult.php @@ -103,7 +103,7 @@ public function getResultColumns(): array 'table' => $row['orgtable'], 'fullname' => $row['table'] ? $row['table'] . '.' . $row['name'] : $row['name'], 'nativetype' => $types[$row['type']] ?? $row['type'], - 'type' => $row['type'] === MYSQLI_TYPE_TIME ? Dibi\Type::TIME_INTERVAL : null, + 'type' => $row['type'] === MYSQLI_TYPE_TIME ? Dibi\Type::TimeInterval : null, 'vendor' => $row, ]; } diff --git a/src/Dibi/Drivers/OracleResult.php b/src/Dibi/Drivers/OracleResult.php index 258b0777..b1590546 100644 --- a/src/Dibi/Drivers/OracleResult.php +++ b/src/Dibi/Drivers/OracleResult.php @@ -80,7 +80,7 @@ public function getResultColumns(): array 'name' => oci_field_name($this->resultSet, $i), 'table' => null, 'fullname' => oci_field_name($this->resultSet, $i), - 'type' => $type === 'LONG' ? Dibi\Type::TEXT : null, + 'type' => $type === 'LONG' ? Dibi\Type::Text : null, 'nativetype' => $type === 'NUMBER' && oci_field_scale($this->resultSet, $i) === 0 ? 'INTEGER' : $type, ]; } diff --git a/src/Dibi/Drivers/PdoResult.php b/src/Dibi/Drivers/PdoResult.php index eb24b6fa..d0e22371 100644 --- a/src/Dibi/Drivers/PdoResult.php +++ b/src/Dibi/Drivers/PdoResult.php @@ -90,7 +90,7 @@ public function getResultColumns(): array 'name' => $row['name'], 'table' => $row['table'], 'nativetype' => $row['native_type'], - 'type' => $row['native_type'] === 'TIME' && $this->driverName === 'mysql' ? Dibi\Type::TIME_INTERVAL : null, + 'type' => $row['native_type'] === 'TIME' && $this->driverName === 'mysql' ? Dibi\Type::TimeInterval : null, 'fullname' => $row['table'] ? $row['table'] . '.' . $row['name'] : $row['name'], 'vendor' => $row, ]; diff --git a/src/Dibi/Fluent.php b/src/Dibi/Fluent.php index 7edb45ab..011ba5e2 100644 --- a/src/Dibi/Fluent.php +++ b/src/Dibi/Fluent.php @@ -45,7 +45,13 @@ */ class Fluent implements IDataSource { - public const REMOVE = false; + public const + AffectedRows = 'a', + Identifier = 'n', + Remove = false; + + /** @deprecated use Fluent::Remove */ + public const REMOVE = self::Remove; public static array $masks = [ 'SELECT' => ['SELECT', 'DISTINCT', 'FROM', 'WHERE', 'GROUP BY', @@ -140,7 +146,7 @@ public function __call(string $clause, array $args): static $this->cursor = &$this->clauses[$clause]; // TODO: really delete? - if ($args === [self::REMOVE]) { + if ($args === [self::Remove]) { $this->cursor = null; return $this; } @@ -156,7 +162,7 @@ public function __call(string $clause, array $args): static } } else { // append to currect flow - if ($args === [self::REMOVE]) { + if ($args === [self::Remove]) { return $this; } @@ -279,15 +285,15 @@ public function setupResult(string $method): static /** * Generates and executes SQL query. * Returns result set or number of affected rows - * @return ($return is \dibi::IDENTIFIER|\dibi::AFFECTED_ROWS ? int : Result) + * @return ($return is self::Identifier|self::AffectedRows ? int : Result) * @throws Exception */ public function execute(?string $return = null): Result|int|null { $res = $this->query($this->_export()); return match ($return) { - \dibi::IDENTIFIER => $this->connection->getInsertId(), - \dibi::AFFECTED_ROWS => $this->connection->getAffectedRows(), + self::Identifier => $this->connection->getInsertId(), + self::AffectedRows => $this->connection->getAffectedRows(), default => $res, }; } diff --git a/src/Dibi/Helpers.php b/src/Dibi/Helpers.php index acfaff13..82bed671 100644 --- a/src/Dibi/Helpers.php +++ b/src/Dibi/Helpers.php @@ -159,12 +159,12 @@ public static function getSuggestion(array $items, string $value): ?string public static function escape(Driver $driver, $value, string $type): string { $types = [ - Type::TEXT => 'text', - Type::BINARY => 'binary', - Type::BOOL => 'bool', - Type::DATE => 'date', - Type::DATETIME => 'datetime', - \dibi::IDENTIFIER => 'identifier', + Type::Text => 'text', + Type::Binary => 'binary', + Type::Bool => 'bool', + Type::Date => 'date', + Type::DateTime => 'datetime', + Fluent::Identifier => 'identifier', ]; if (isset($types[$type])) { return $driver->{'escape' . $types[$type]}($value); @@ -181,16 +181,16 @@ public static function escape(Driver $driver, $value, string $type): string public static function detectType(string $type): ?string { $patterns = [ - '^_' => Type::TEXT, // PostgreSQL arrays - 'RANGE$' => Type::TEXT, // PostgreSQL range types - 'BYTEA|BLOB|BIN' => Type::BINARY, - 'TEXT|CHAR|POINT|INTERVAL|STRING' => Type::TEXT, - 'YEAR|BYTE|COUNTER|SERIAL|INT|LONG|SHORT|^TINY$' => Type::INTEGER, - 'CURRENCY|REAL|MONEY|FLOAT|DOUBLE|DECIMAL|NUMERIC|NUMBER' => Type::FLOAT, - '^TIME$' => Type::TIME, - 'TIME' => Type::DATETIME, // DATETIME, TIMESTAMP - 'DATE' => Type::DATE, - 'BOOL' => Type::BOOL, + '^_' => Type::Text, // PostgreSQL arrays + 'RANGE$' => Type::Text, // PostgreSQL range types + 'BYTEA|BLOB|BIN' => Type::Binary, + 'TEXT|CHAR|POINT|INTERVAL|STRING' => Type::Text, + 'YEAR|BYTE|COUNTER|SERIAL|INT|LONG|SHORT|^TINY$' => Type::Integer, + 'CURRENCY|REAL|MONEY|FLOAT|DOUBLE|DECIMAL|NUMERIC|NUMBER' => Type::Float, + '^TIME$' => Type::Time, + 'TIME' => Type::DateTime, // DATETIME, TIMESTAMP + 'DATE' => Type::Date, + 'BOOL' => Type::Bool, 'JSON' => Type::JSON, ]; diff --git a/src/Dibi/Result.php b/src/Dibi/Result.php index 328f05fc..7204f9e1 100644 --- a/src/Dibi/Result.php +++ b/src/Dibi/Result.php @@ -457,15 +457,15 @@ private function normalize(array &$row): void if ($type === null || $format === 'native') { $row[$key] = $value; - } elseif ($type === Type::TEXT) { + } elseif ($type === Type::Text) { $row[$key] = (string) $value; - } elseif ($type === Type::INTEGER) { + } elseif ($type === Type::Integer) { $row[$key] = is_float($tmp = $value * 1) ? (is_string($value) ? $value : (int) $value) : $tmp; - } elseif ($type === Type::FLOAT) { + } elseif ($type === Type::Float) { $value = ltrim((string) $value, '0'); $p = strpos($value, '.'); $e = strpos($value, 'e'); @@ -483,23 +483,23 @@ private function normalize(array &$row): void ? $float : $value; - } elseif ($type === Type::BOOL) { + } elseif ($type === Type::Bool) { $row[$key] = ((bool) $value) && $value !== 'f' && $value !== 'F'; - } elseif ($type === Type::DATETIME || $type === Type::DATE || $type === Type::TIME) { + } elseif ($type === Type::DateTime || $type === Type::Date || $type === Type::Time) { if ($value && !str_starts_with((string) $value, '0000-00')) { // '', null, false, '0000-00-00', ... $value = new DateTime($value); $row[$key] = $format ? $value->format($format) : $value; } else { $row[$key] = null; } - } elseif ($type === Type::TIME_INTERVAL) { + } elseif ($type === Type::TimeInterval) { preg_match('#^(-?)(\d+)\D(\d+)\D(\d+)\z#', $value, $m); $value = new \DateInterval("PT$m[2]H$m[3]M$m[4]S"); $value->invert = (int) (bool) $m[1]; $row[$key] = $format ? $value->format($format) : $value; - } elseif ($type === Type::BINARY) { + } elseif ($type === Type::Binary) { $row[$key] = is_string($value) ? $this->getResultDriver()->unescapeBinary($value) : $value; diff --git a/src/Dibi/Type.php b/src/Dibi/Type.php index f7a8b4ea..21693dd9 100644 --- a/src/Dibi/Type.php +++ b/src/Dibi/Type.php @@ -16,16 +16,43 @@ class Type { public const - TEXT = 's', // as 'string' - BINARY = 'bin', + Text = 's', // as 'string' + Binary = 'bin', JSON = 'json', - BOOL = 'b', - INTEGER = 'i', - FLOAT = 'f', - DATE = 'd', - DATETIME = 'dt', - TIME = 't', - TIME_INTERVAL = 'ti'; + Bool = 'b', + Integer = 'i', + Float = 'f', + Date = 'd', + DateTime = 'dt', + Time = 't', + TimeInterval = 'ti'; + + /** @deprecated use Type::Text */ + public const TEXT = self::Text; + + /** @deprecated use Type::Binary */ + public const BINARY = self::Binary; + + /** @deprecated use Type::Bool */ + public const BOOL = self::Bool; + + /** @deprecated use Type::Integer */ + public const INTEGER = self::Integer; + + /** @deprecated use Type::Float */ + public const FLOAT = self::Float; + + /** @deprecated use Type::Date */ + public const DATE = self::Date; + + /** @deprecated use Type::DateTime */ + public const DATETIME = self::DateTime; + + /** @deprecated use Type::Time */ + public const TIME = self::Time; + + /** @deprecated use Type::TimeInterval */ + public const TIME_INTERVAL = self::TimeInterval; final public function __construct() diff --git a/src/Dibi/dibi.php b/src/Dibi/dibi.php index 28486ae6..f7d0476c 100644 --- a/src/Dibi/dibi.php +++ b/src/Dibi/dibi.php @@ -37,12 +37,16 @@ */ class dibi { - public const - AFFECTED_ROWS = 'a', - IDENTIFIER = 'n'; + public const Version = '5.0.1'; + + /** @deprecated use dibi::Version */ + public const VERSION = self::Version; + + /** @deprecated use Dibi\Fluent::AffectedRows */ + public const AFFECTED_ROWS = Dibi\Fluent::AffectedRows; - /** version */ - public const VERSION = '5.0.1'; + /** @deprecated use Dibi\Fluent::Identifier */ + public const IDENTIFIER = Dibi\Fluent::Identifier; /** sorting order */ public const diff --git a/tests/dibi/Fluent.select.phpt b/tests/dibi/Fluent.select.phpt index 09a645fc..9eb5fe80 100644 --- a/tests/dibi/Fluent.select.phpt +++ b/tests/dibi/Fluent.select.phpt @@ -74,7 +74,7 @@ Assert::same( (string) $fluent, ); -$fluent->orderBy(Dibi\Fluent::REMOVE); +$fluent->orderBy(Dibi\Fluent::Remove); Assert::same( reformat('SELECT * , [a] , [b] AS [bAlias] , [c], [d], [e] , [d] FROM [anotherTable] AS [anotherAlias] INNER JOIN [table3] ON table.col = table3.col WHERE col > 10 OR col < 5 AND active = 1 AND [col] IN (1, 2, 3)'), diff --git a/tests/dibi/Result.normalize.phpt b/tests/dibi/Result.normalize.phpt index cd848465..b5e60368 100644 --- a/tests/dibi/Result.normalize.phpt +++ b/tests/dibi/Result.normalize.phpt @@ -27,8 +27,8 @@ class MockResult extends Dibi\Result test('', function () { $result = new MockResult; - $result->setType('col', Type::TEXT); - $result->setFormat(Type::TEXT, 'native'); + $result->setType('col', Type::Text); + $result->setFormat(Type::Text, 'native'); Assert::same(['col' => null], $result->test(['col' => null])); Assert::same(['col' => true], $result->test(['col' => true])); @@ -38,7 +38,7 @@ test('', function () { test('', function () { $result = new MockResult; - $result->setType('col', Type::BOOL); + $result->setType('col', Type::Bool); Assert::same(['col' => null], $result->test(['col' => null])); Assert::same(['col' => true], $result->test(['col' => true])); @@ -60,7 +60,7 @@ test('', function () { test('', function () { $result = new MockResult; - $result->setType('col', Type::TEXT); + $result->setType('col', Type::Text); Assert::same(['col' => null], $result->test(['col' => null])); Assert::same(['col' => '1'], $result->test(['col' => true])); @@ -76,7 +76,7 @@ test('', function () { test('', function () { $result = new MockResult; - $result->setType('col', Type::FLOAT); + $result->setType('col', Type::Float); Assert::same(['col' => null], $result->test(['col' => null])); Assert::same(['col' => 1.0], $result->test(['col' => true])); @@ -153,7 +153,7 @@ test('', function () { test('', function () { $result = new MockResult; - $result->setType('col', Type::INTEGER); + $result->setType('col', Type::Integer); Assert::same(['col' => null], $result->test(['col' => null])); Assert::same(['col' => 1], $result->test(['col' => true])); @@ -187,7 +187,7 @@ test('', function () { test('', function () { $result = new MockResult; - $result->setType('col', Type::DATETIME); + $result->setType('col', Type::DateTime); Assert::same(['col' => null], $result->test(['col' => null])); Assert::exception( @@ -206,8 +206,8 @@ test('', function () { test('', function () { $result = new MockResult; - $result->setType('col', Type::DATETIME); - $result->setFormat(Type::DATETIME, 'Y-m-d H:i:s'); + $result->setType('col', Type::DateTime); + $result->setFormat(Type::DateTime, 'Y-m-d H:i:s'); Assert::same(['col' => null], $result->test(['col' => null])); Assert::exception( @@ -226,7 +226,7 @@ test('', function () { test('', function () { $result = new MockResult; - $result->setType('col', Type::DATE); + $result->setType('col', Type::Date); Assert::same(['col' => null], $result->test(['col' => null])); Assert::exception( @@ -243,7 +243,7 @@ test('', function () { test('', function () { $result = new MockResult; - $result->setType('col', Type::TIME); + $result->setType('col', Type::Time); Assert::same(['col' => null], $result->test(['col' => null])); Assert::exception( diff --git a/tests/dibi/Result.types.phpt b/tests/dibi/Result.types.phpt index 5a25f53a..1338e243 100644 --- a/tests/dibi/Result.types.phpt +++ b/tests/dibi/Result.types.phpt @@ -12,7 +12,7 @@ $conn->loadFile(__DIR__ . "/data/$config[system].sql"); $res = $conn->query('SELECT * FROM [customers]'); // auto-converts this column to integer -$res->setType('customer_id', Dibi\Type::DATETIME); +$res->setType('customer_id', Dibi\Type::DateTime); Assert::equal(new Dibi\Row([ 'customer_id' => new Dibi\DateTime('1970-01-01 01:00:01'),