Microoptimizations of exportData

Signed-off-by: Kamil Tekiela <tekiela246@gmail.com>
This commit is contained in:
Kamil Tekiela 2022-02-13 22:34:25 +00:00
parent 116708ffd4
commit d93a816691
2 changed files with 48 additions and 60 deletions

View File

@ -646,11 +646,11 @@ class ExportSql extends ExportPlugin
*
* @return string The formatted comment
*/
private function exportComment($text = '')
private function exportComment(string $text = ''): string
{
if (isset($GLOBALS['sql_include_comments']) && $GLOBALS['sql_include_comments']) {
// see https://dev.mysql.com/doc/refman/5.0/en/ansi-diff-comments.html
if (empty($text)) {
if ($text === '') {
return '--' . $GLOBALS['crlf'];
}
@ -2179,7 +2179,6 @@ class ExportSql extends ExportPlugin
$sqlQuery,
array $aliases = []
): bool {
$GLOBALS['current_row'] = $GLOBALS['current_row'] ?? null;
$GLOBALS['sql_backquotes'] = $GLOBALS['sql_backquotes'] ?? null;
// Do not export data for merge tables
@ -2191,11 +2190,7 @@ class ExportSql extends ExportPlugin
$tableAlias = $table;
$this->initAlias($aliases, $dbAlias, $tableAlias);
if (isset($GLOBALS['sql_compatibility'])) {
$compat = $GLOBALS['sql_compatibility'];
} else {
$compat = 'NONE';
}
$compat = $GLOBALS['sql_compatibility'] ?? 'NONE';
$formattedTableName = Util::backquoteCompat($tableAlias, $compat, $GLOBALS['sql_backquotes']);
@ -2311,7 +2306,7 @@ class ExportSql extends ExportPlugin
}
//\x08\\x09, not required
$GLOBALS['current_row'] = 0;
$current_row = 0;
$querySize = 0;
if (
($GLOBALS['sql_insert_syntax'] === 'extended'
@ -2326,7 +2321,7 @@ class ExportSql extends ExportPlugin
}
while ($row = $result->fetchRow()) {
if ($GLOBALS['current_row'] == 0) {
if ($current_row === 0) {
$head = $this->possibleCRLF()
. $this->exportComment()
. $this->exportComment(
@ -2342,9 +2337,9 @@ class ExportSql extends ExportPlugin
// We need to SET IDENTITY_INSERT ON for MSSQL
if (
isset($GLOBALS['sql_compatibility'])
$current_row === 0
&& isset($GLOBALS['sql_compatibility'])
&& $GLOBALS['sql_compatibility'] === 'MSSQL'
&& $GLOBALS['current_row'] == 0
) {
if (
! $this->export->outputHandler(
@ -2361,22 +2356,22 @@ class ExportSql extends ExportPlugin
}
}
$GLOBALS['current_row']++;
$current_row++;
$values = [];
for ($j = 0; $j < $fieldsCnt; $j++) {
foreach ($fieldsMeta as $j => $metaInfo) {
// NULL
if (! isset($row[$j])) {
if ($row[$j] === null) {
$values[] = 'NULL';
} elseif (
$fieldsMeta[$j]->isNumeric
&& ! $fieldsMeta[$j]->isMappedTypeTimestamp
&& ! $fieldsMeta[$j]->isBlob
$metaInfo->isNumeric
&& ! $metaInfo->isMappedTypeTimestamp
&& ! $metaInfo->isBlob
) {
// a number
// timestamp is numeric on some MySQL 4.1, BLOBs are
// sometimes numeric
$values[] = $row[$j];
} elseif ($fieldsMeta[$j]->isBinary && isset($GLOBALS['sql_hex_for_binary'])) {
} elseif ($metaInfo->isBinary && isset($GLOBALS['sql_hex_for_binary'])) {
// a true BLOB
// - mysqldump only generates hex data when the --hex-blob
// option is used, for fields having the binary attribute
@ -2391,16 +2386,16 @@ class ExportSql extends ExportPlugin
} else {
$values[] = '0x' . bin2hex($row[$j]);
}
} elseif ($fieldsMeta[$j]->isMappedTypeBit) {
} elseif ($metaInfo->isMappedTypeBit) {
// detection of 'bit' works only on mysqli extension
$values[] = "b'" . $GLOBALS['dbi']->escapeString(
Util::printableBitValue(
(int) $row[$j],
(int) $fieldsMeta[$j]->length
$metaInfo->length
)
)
. "'";
} elseif ($fieldsMeta[$j]->isMappedTypeGeometry) {
} elseif ($metaInfo->isMappedTypeGeometry) {
// export GIS types as hex
$values[] = '0x' . bin2hex($row[$j]);
} elseif (! empty($GLOBALS['exporting_metadata']) && $row[$j] === '@LAST_PAGE') {
@ -2436,45 +2431,38 @@ class ExportSql extends ExportPlugin
);
$insertLine .= ' WHERE ' . $tmpUniqueCondition;
unset($tmpUniqueCondition, $tmpClauseIsUnique);
} else {
} elseif ($GLOBALS['sql_insert_syntax'] === 'extended' || $GLOBALS['sql_insert_syntax'] === 'both') {
// Extended inserts case
if ($GLOBALS['sql_insert_syntax'] === 'extended' || $GLOBALS['sql_insert_syntax'] === 'both') {
if ($GLOBALS['current_row'] == 1) {
$insertLine = $schemaInsert . '('
. implode(', ', $values) . ')';
} else {
$insertLine = '(' . implode(', ', $values) . ')';
$insertLineSize = mb_strlen($insertLine);
$sqlMaxSize = $GLOBALS['sql_max_query_size'];
if (isset($sqlMaxSize) && $sqlMaxSize > 0 && $querySize + $insertLineSize > $sqlMaxSize) {
if (! $this->export->outputHandler(';' . $crlf)) {
return false;
}
$querySize = 0;
$GLOBALS['current_row'] = 1;
$insertLine = $schemaInsert . $insertLine;
}
}
$querySize += mb_strlen($insertLine);
// Other inserts case
if ($current_row === 1) {
$insertLine = $schemaInsert . '('
. implode(', ', $values) . ')';
} else {
$insertLine = $schemaInsert
. '(' . implode(', ', $values) . ')';
$insertLine = '(' . implode(', ', $values) . ')';
$insertLineSize = mb_strlen($insertLine);
$sqlMaxSize = $GLOBALS['sql_max_query_size'];
if (isset($sqlMaxSize) && $sqlMaxSize > 0 && $querySize + $insertLineSize > $sqlMaxSize) {
if (! $this->export->outputHandler(';' . $crlf)) {
return false;
}
$querySize = 0;
$current_row = 1;
$insertLine = $schemaInsert . $insertLine;
}
}
$querySize += mb_strlen($insertLine);
} else {
// Other inserts case
$insertLine = $schemaInsert . '(' . implode(', ', $values) . ')';
}
unset($values);
if (
! $this->export->outputHandler(($GLOBALS['current_row'] == 1 ? '' : $separator . $crlf) . $insertLine)
) {
if (! $this->export->outputHandler(($current_row === 1 ? '' : $separator . $crlf) . $insertLine)) {
return false;
}
}
if ($GLOBALS['current_row'] > 0) {
if ($current_row > 0) {
if (! $this->export->outputHandler(';' . $crlf)) {
return false;
}
@ -2484,7 +2472,7 @@ class ExportSql extends ExportPlugin
if (
isset($GLOBALS['sql_compatibility'])
&& $GLOBALS['sql_compatibility'] === 'MSSQL'
&& $GLOBALS['current_row'] > 0
&& $current_row > 0
) {
$outputSucceeded = $this->export->outputHandler(
$crlf . 'SET IDENTITY_INSERT '
@ -2510,7 +2498,7 @@ class ExportSql extends ExportPlugin
*
* @return string MSSQL compatible create table statement
*/
private function makeCreateTableMSSQLCompatible($createQuery)
private function makeCreateTableMSSQLCompatible(string $createQuery)
{
// In MSSQL
// 1. No 'IF NOT EXISTS' in CREATE TABLE
@ -2521,7 +2509,7 @@ class ExportSql extends ExportPlugin
// 5. No KEY and INDEX inside CREATE TABLE
// 6. DOUBLE field doesn't exists, we will use FLOAT instead
$createQuery = (string) preg_replace('/^CREATE TABLE IF NOT EXISTS/', 'CREATE TABLE', (string) $createQuery);
$createQuery = (string) preg_replace('/^CREATE TABLE IF NOT EXISTS/', 'CREATE TABLE', $createQuery);
// first we need to replace all lines ended with '" DATE ...,\n'
// last preg_replace preserve us from situation with date text
// inside DEFAULT field value

View File

@ -10024,8 +10024,10 @@
<code>$oneKey['ref_index_list'][$index]</code>
<code>$values[$val]</code>
</MixedArrayOffset>
<MixedAssignment occurrences="37">
<code>$GLOBALS['current_row']</code>
<MixedArrayTypeCoercion occurrences="1">
<code>$row[$j]</code>
</MixedArrayTypeCoercion>
<MixedAssignment occurrences="36">
<code>$GLOBALS['sql_auto_increments']</code>
<code>$GLOBALS['sql_backquotes']</code>
<code>$GLOBALS['sql_backquotes']</code>
@ -10132,9 +10134,7 @@
<PropertyTypeCoercion occurrences="1">
<code>$field-&gt;key-&gt;columns</code>
</PropertyTypeCoercion>
<RedundantCastGivenDocblockType occurrences="3">
<code>(int) $fieldsMeta[$j]-&gt;length</code>
<code>(string) $createQuery</code>
<RedundantCastGivenDocblockType occurrences="1">
<code>(string) $table</code>
</RedundantCastGivenDocblockType>
<RedundantCondition occurrences="1">