mirror of
https://github.com/nuxsmin/sysPass.git
synced 2026-03-11 19:06:57 +01:00
* [MOD] Improved database handling
* [FIX] Use unbuffered queries when performing database backup Signed-off-by: nuxsmin <nuxsmin@syspass.org>
This commit is contained in:
@@ -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();
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
*/
|
||||
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user