fix(entity): Fix mapping of old/sub-types to actually supported database types

Signed-off-by: Joas Schilling <coding@schilljs.com>
pull/48837/head
Joas Schilling 12 months ago
parent 582af10e0b
commit 54c3aa3f99
No known key found for this signature in database
GPG Key ID: F72FA5B49FFA96B0
  1. 22
      lib/public/AppFramework/Db/Entity.php
  2. 44
      tests/lib/AppFramework/Db/EntityTest.php

@ -112,6 +112,15 @@ abstract class Entity {
}
switch ($type) {
case Types::BIGINT:
case Types::SMALLINT:
settype($args[0], Types::INTEGER);
break;
case Types::BINARY:
case Types::DECIMAL:
case Types::TEXT:
settype($args[0], Types::STRING);
break;
case Types::TIME:
case Types::DATE:
case Types::DATETIME:
@ -260,9 +269,22 @@ abstract class Entity {
*
* @param string $fieldName the name of the attribute
* @param \OCP\DB\Types::* $type the type which will be used to match a cast
* @since 31.0.0 Parameter $type is now restricted to {@see \OCP\DB\Types} constants. The formerly accidentally supported types 'int'|'bool'|'double' are mapped to Types::INTEGER|Types::BOOLEAN|Types::FLOAT accordingly.
* @since 7.0.0
*/
protected function addType(string $fieldName, string $type): void {
/** @psalm-suppress TypeDoesNotContainType */
if (in_array($type, ['bool', 'double', 'int', 'array', 'object'], true)) {
// Mapping legacy strings to the actual types
$type = match ($type) {
'int' => Types::INTEGER,
'bool' => Types::BOOLEAN,
'double' => Types::FLOAT,
'array',
'object' => Types::STRING,
};
}
$this->_fieldTypes[$fieldName] = $type;
}

@ -39,20 +39,31 @@ class TestEntity extends Entity {
protected $name;
protected $email;
protected $testId;
protected $smallInt;
protected $bigInt;
protected $preName;
protected $trueOrFalse;
protected $anotherBool;
protected $text;
protected $longText;
protected $time;
protected $datetime;
public function __construct($name = null) {
$this->addType('testId', Types::INTEGER);
$this->addType('trueOrFalse', 'bool');
$this->addType('smallInt', Types::SMALLINT);
$this->addType('bigInt', Types::BIGINT);
$this->addType('anotherBool', Types::BOOLEAN);
$this->addType('text', Types::TEXT);
$this->addType('longText', Types::BLOB);
$this->addType('time', Types::TIME);
$this->addType('datetime', Types::DATETIME_IMMUTABLE);
// Legacy types
$this->addType('trueOrFalse', 'bool');
$this->addType('legacyInt', 'int');
$this->addType('doubleNowFloat', 'double');
$this->name = $name;
}
@ -200,10 +211,28 @@ class EntityTest extends \Test\TestCase {
}
public function testSetterCasts(): void {
public function dataSetterCasts(): array {
return [
['Id', '3', 3],
['smallInt', '3', 3],
['bigInt', '' . PHP_INT_MAX, PHP_INT_MAX],
['trueOrFalse', 0, false],
['trueOrFalse', 1, true],
['anotherBool', 0, false],
['anotherBool', 1, true],
['text', 33, '33'],
['longText', PHP_INT_MAX, '' . PHP_INT_MAX],
];
}
/**
* @dataProvider dataSetterCasts
*/
public function testSetterCasts(string $field, mixed $in, mixed $out): void {
$entity = new TestEntity();
$entity->setId('3');
$this->assertSame(3, $entity->getId());
$entity->{'set' . $field}($in);
$this->assertSame($out, $entity->{'get' . $field}());
}
@ -248,11 +277,16 @@ class EntityTest extends \Test\TestCase {
$this->assertEquals([
'id' => Types::INTEGER,
'testId' => Types::INTEGER,
'trueOrFalse' => 'bool',
'smallInt' => Types::SMALLINT,
'bigInt' => Types::BIGINT,
'anotherBool' => Types::BOOLEAN,
'text' => Types::TEXT,
'longText' => Types::BLOB,
'time' => Types::TIME,
'datetime' => Types::DATETIME_IMMUTABLE,
'trueOrFalse' => Types::BOOLEAN,
'legacyInt' => Types::INTEGER,
'doubleNowFloat' => Types::FLOAT,
], $entity->getFieldTypes());
}

Loading…
Cancel
Save