Skip to content

Commit

Permalink
Fix reading blob data as resource
Browse files Browse the repository at this point in the history
PostgreSQL returns data as resource when using IQueryBuilder::PARAM_LOB
(which is used for QBMapper).

Previously we just converted this resource using settype, which produced
things like "Resource id #14" instead of the actual resource data.

Now we read the stream correctly if the returned data is a resource

See context at #22472

Fixes #22439

Signed-off-by: Thomas Citharel <tcit@tcit.fr>
  • Loading branch information
tcitworld committed Jul 6, 2022
1 parent dfbfe5a commit be520d7
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 0 deletions.
3 changes: 3 additions & 0 deletions lib/public/AppFramework/Db/Entity.php
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,9 @@ protected function setter($name, $args) {
$type = $this->_fieldTypes[$name];
if ($type === 'blob') {
// (B)LOB is treated as string when we read from the DB
if (is_resource($args[0])) {
$args[0] = stream_get_contents($args[0]);
}
$type = 'string';
}

Expand Down
17 changes: 17 additions & 0 deletions tests/lib/AppFramework/Db/EntityTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,8 @@
* @method bool getAnotherBool()
* @method bool isAnotherBool()
* @method void setAnotherBool(bool $anotherBool)
* @method string getLongText()
* @method void setLongText(string $longText)
*/
class TestEntity extends Entity {
protected $name;
Expand All @@ -51,11 +53,13 @@ class TestEntity extends Entity {
protected $preName;
protected $trueOrFalse;
protected $anotherBool;
protected $longText;

public function __construct($name = null) {
$this->addType('testId', 'integer');
$this->addType('trueOrFalse', 'bool');
$this->addType('anotherBool', 'boolean');
$this->addType('longText', 'blob');
$this->name = $name;
}
}
Expand Down Expand Up @@ -210,6 +214,18 @@ public function testSetterDoesNotCastOnNull() {
$this->assertSame(null, $entity->getId());
}

public function testSetterConvertsResourcesToStringProperly() {
$string = 'Definitely a string';
$stream = fopen('php://memory','r+');
fwrite($stream, $string);
rewind($stream);

$entity = new TestEntity();
$entity->setLongText($stream);
fclose($stream);
$this->assertSame($string, $entity->getLongText());
}


public function testGetFieldTypes() {
$entity = new TestEntity();
Expand All @@ -218,6 +234,7 @@ public function testGetFieldTypes() {
'testId' => 'integer',
'trueOrFalse' => 'bool',
'anotherBool' => 'boolean',
'longText' => 'blob',
], $entity->getFieldTypes());
}

Expand Down

0 comments on commit be520d7

Please sign in to comment.