* [MOD] Improved database handling

* [FIX] Use unbuffered queries when performing database backup

Signed-off-by: nuxsmin <nuxsmin@syspass.org>
This commit is contained in:
nuxsmin
2018-11-06 23:52:23 +01:00
parent 8d2bb417a9
commit f0959f0e9c
7 changed files with 30 additions and 39 deletions

View File

@@ -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();

View File

@@ -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

View File

@@ -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);
}

View File

@@ -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

View File

@@ -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

View File

@@ -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
*/

View File

@@ -9,11 +9,11 @@
<authBasicAutoLoginEnabled>1</authBasicAutoLoginEnabled>
<authBasicDomain></authBasicDomain>
<authBasicEnabled>1</authBasicEnabled>
<backup_hash>beb03b6bfd783be4fa25698979a225020ba40b18</backup_hash>
<backup_hash>5185a5ba55cadceb1968623709dddb1d7626ed44</backup_hash>
<checkUpdates>0</checkUpdates>
<checknotices>0</checknotices>
<configDate>1541439997</configDate>
<configHash>7177ada035ddf5b691cceed5315deec47845fb15</configHash>
<configDate>1541544393</configDate>
<configHash>f292660712a4970a14bb85c93d08c5611d8077a4</configHash>
<configSaver></configSaver>
<configVersion></configVersion>
<databaseVersion></databaseVersion>
@@ -32,7 +32,7 @@
<dokuwikiUrlBase></dokuwikiUrlBase>
<dokuwikiUser></dokuwikiUser>
<encryptSession>0</encryptSession>
<export_hash>60d51abafc8742c1a1cbace3d03040a48238e654</export_hash>
<export_hash>9d4a01b3e797c5d98f932e13ef6666d2fe5b52e9</export_hash>
<filesAllowedExts>
<item type="filesAllowedExts">PDF</item>
<item type="filesAllowedExts">JPG</item>