diff --git a/lib/SP/Services/Backup/FileBackupService.php b/lib/SP/Services/Backup/FileBackupService.php index 714e04d9..83cd5b9b 100644 --- a/lib/SP/Services/Backup/FileBackupService.php +++ b/lib/SP/Services/Backup/FileBackupService.php @@ -291,7 +291,7 @@ final class FileBackupService extends Service $queryData->setQuery('SELECT * FROM `' . $tableName . '`'); // Consulta para obtener los registros de la tabla - $queryRes = $db->doQueryRaw($queryData, [\PDO::ATTR_CURSOR => \PDO::CURSOR_SCROLL]); + $queryRes = $db->doQueryRaw($queryData, [\PDO::ATTR_CURSOR => \PDO::CURSOR_SCROLL], false); $numColumns = $queryRes->columnCount(); diff --git a/lib/SP/Services/Install/Installer.php b/lib/SP/Services/Install/Installer.php index 7f151669..c0ac0e7a 100644 --- a/lib/SP/Services/Install/Installer.php +++ b/lib/SP/Services/Install/Installer.php @@ -57,7 +57,7 @@ final class Installer extends Service */ const VERSION = [3, 0, 0]; const VERSION_TEXT = '3.0-beta'; - const BUILD = 18110503; + const BUILD = 18110601; /** * @var DatabaseSetupInterface diff --git a/lib/SP/Storage/Database/Database.php b/lib/SP/Storage/Database/Database.php index a9d09942..032c1a31 100644 --- a/lib/SP/Storage/Database/Database.php +++ b/lib/SP/Storage/Database/Database.php @@ -164,18 +164,15 @@ final class Database implements DatabaseInterface * Realizar una consulta a la BBDD. * * @param $queryData QueryData Los datos de la consulta - * @param $getRawData bool realizar la consulta para obtener registro a registro * * @return QueryResult * @throws QueryException * @throws ConstraintException */ - public function doQuery(QueryData $queryData, $getRawData = false) + public function doQuery(QueryData $queryData): QueryResult { $stmt = $this->prepareQueryData($queryData); - $this->setFetchMode($queryData, $stmt); - $this->eventDispatcher->notifyEvent('database.query', new Event($this, EventMessage::factory() ->addDescription($queryData->getQuery()) @@ -185,7 +182,7 @@ final class Database implements DatabaseInterface if (preg_match("/^(select|show)\s/i", $queryData->getQuery())) { $this->numFields = $stmt->columnCount(); - return new QueryResult($stmt->fetchAll()); + return new QueryResult($this->fetch($queryData, $stmt)); } return (new QueryResult()) @@ -279,18 +276,18 @@ final class Database implements DatabaseInterface /** * @param QueryData $queryData * @param PDOStatement $stmt + * + * @return array */ - private function setFetchMode(QueryData $queryData, PDOStatement $stmt) + private function fetch(QueryData $queryData, PDOStatement $stmt): array { if ($queryData->isUseKeyPair()) { - $stmt->setFetchMode(PDO::FETCH_KEY_PAIR); - } elseif (null !== $queryData->getMapClass()) { - $stmt->setFetchMode(PDO::FETCH_INTO, $queryData->getMapClass()); + return $stmt->fetchAll(PDO::FETCH_KEY_PAIR); } elseif ($queryData->getMapClassName()) { - $stmt->setFetchMode(PDO::FETCH_CLASS | PDO::FETCH_PROPS_LATE, $queryData->getMapClassName()); - } else { - $stmt->setFetchMode(PDO::FETCH_OBJ); + return $stmt->fetchAll(PDO::FETCH_CLASS | PDO::FETCH_PROPS_LATE, $queryData->getMapClassName()); } + + return $stmt->fetchAll(); } /** @@ -317,15 +314,24 @@ final class Database implements DatabaseInterface /** * Don't fetch records and return prepared statement * - * @param QueryData $queryData - * @param array|null $options + * @param QueryData $queryData + * @param array $options + * @param bool $buffered Set buffered behavior (useful for big datasets) * * @return \PDOStatement * @throws ConstraintException * @throws QueryException */ - public function doQueryRaw(QueryData $queryData, array $options = []) + public function doQueryRaw(QueryData $queryData, array $options = [], bool $buffered = null) { + if ($buffered === false + && $this->dbHandler instanceof MySQLHandler + ) { + $this->dbHandler + ->getConnection() + ->setAttribute(\PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false); + } + return $this->prepareQueryData($queryData, $options); } diff --git a/lib/SP/Storage/Database/DatabaseInterface.php b/lib/SP/Storage/Database/DatabaseInterface.php index ac0fb82b..687a84c5 100644 --- a/lib/SP/Storage/Database/DatabaseInterface.php +++ b/lib/SP/Storage/Database/DatabaseInterface.php @@ -43,7 +43,7 @@ interface DatabaseInterface * @throws QueryException * @throws ConstraintException */ - public function doQuery(QueryData $queryData); + public function doQuery(QueryData $queryData): QueryResult; /** * Don't fetch records and return prepared statement diff --git a/lib/SP/Storage/Database/MySQLHandler.php b/lib/SP/Storage/Database/MySQLHandler.php index 4fb4e8af..b6e68ef7 100644 --- a/lib/SP/Storage/Database/MySQLHandler.php +++ b/lib/SP/Storage/Database/MySQLHandler.php @@ -40,7 +40,8 @@ final class MySQLHandler implements DBStorageInterface const PDO_OPTS = [ PDO::ATTR_EMULATE_PREPARES => false, PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, - PDO::MYSQL_ATTR_FOUND_ROWS => true + PDO::MYSQL_ATTR_FOUND_ROWS => true, + PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_OBJ ]; /** * @var PDO diff --git a/lib/SP/Storage/Database/QueryData.php b/lib/SP/Storage/Database/QueryData.php index bf754255..d158c525 100644 --- a/lib/SP/Storage/Database/QueryData.php +++ b/lib/SP/Storage/Database/QueryData.php @@ -163,22 +163,6 @@ final class QueryData $this->mapClassName = $mapClassName; } - /** - * @return DataModelBase - */ - public function getMapClass() - { - return $this->mapClass; - } - - /** - * @param DataModelBase $mapClass - */ - public function setMapClass(DataModelBase $mapClass) - { - $this->mapClass = $mapClass; - } - /** * @return bool */ diff --git a/tests/res/config/config.xml b/tests/res/config/config.xml index 1149a15a..a14c29cb 100644 --- a/tests/res/config/config.xml +++ b/tests/res/config/config.xml @@ -9,11 +9,11 @@ 1 1 - beb03b6bfd783be4fa25698979a225020ba40b18 + 5185a5ba55cadceb1968623709dddb1d7626ed44 0 0 - 1541439997 - 7177ada035ddf5b691cceed5315deec47845fb15 + 1541544393 + f292660712a4970a14bb85c93d08c5611d8077a4 @@ -32,7 +32,7 @@ 0 - 60d51abafc8742c1a1cbace3d03040a48238e654 + 9d4a01b3e797c5d98f932e13ef6666d2fe5b52e9 PDF JPG