[BUGFIX] Install Tool-FAL metadata migration fails for big sets 80/28580/7
authorKrystian Szymukowicz <k.szymukowicz@gmail.com>
Thu, 20 Mar 2014 20:05:21 +0000 (21:05 +0100)
committerMarkus Klein <klein.t3@mfc-linz.at>
Wed, 26 Mar 2014 20:54:03 +0000 (21:54 +0100)
In install tool there is migration script that copy part of sys_file
into sys_file_metadata. For long data sets (tested with 20.000 sys_file)
this update scripts returns FAIL.

Inserting using
https://dev.mysql.com/doc/refman/5.1/de/insert-select.html
overcomes all problems.

Resolves: #57103
Releases: 6.2
Change-Id: I1d2b97565f52bdd168f50651f285023f153fb3be
Reviewed-on: https://review.typo3.org/28580
Reviewed-by: Jigal van Hemert
Tested-by: Jigal van Hemert
Reviewed-by: Markus Klein
Tested-by: Markus Klein
typo3/sysext/install/Classes/Updates/FileTableSplittingUpdate.php

index 72ceb48..1555ffc 100644 (file)
@@ -80,27 +80,26 @@ class FileTableSplittingUpdate extends AbstractUpdate {
        public function performUpdate(array &$dbQueries, &$customMessages) {
 
                if (!array_key_exists($this->metaDataTable, $GLOBALS['TYPO3_DB']->admin_get_tables())) {
-                       $customMessages = 'ERROR! Make sure you already created the table. If you added custom metadata to sys_file table add TCA configuration as well as sql definitions to sys_file_metadata, too.';
+                       $customMessages = 'ERROR! Make sure you already created the table. If you added custom metadata to sys_file table add TCA ' .
+                               'configuration as well as SQL definitions to sys_file_metadata, too.';
                        return FALSE;
                }
 
-               $filesToMigrateRows = $GLOBALS['TYPO3_DB']->exec_SELECTgetRows(
-                       'uid',
-                       'sys_file',
-                       'uid NOT IN (' . $GLOBALS['TYPO3_DB']->SELECTquery('file', $this->metaDataTable, '') . ')'
-               );
-               $filesToMigrateUids = array();
-               foreach ($filesToMigrateRows as $row) {
-                       $filesToMigrateUids[] = (int)$row['uid'];
+               $fieldsToMigrate = $this->detectFieldsToMigrate();
+               if (empty($fieldsToMigrate)) {
+                       return TRUE;
                }
-               $filesToMigrateUids = array_unique($filesToMigrateUids);
-               $dataToMove = $GLOBALS['TYPO3_DB']->exec_SELECTgetRows(
-                       implode(',', $this->detectFieldsToMigrate()) . ', uid AS file',
-                       'sys_file',
-                       'uid IN (' . implode(',', $filesToMigrateUids) . ')'
-               );
-
-               $resultObject = $GLOBALS['TYPO3_DB']->exec_INSERTmultipleRows($this->metaDataTable, array_keys(current($dataToMove)), $dataToMove);
+               $fieldsToWrite = $fieldsToMigrate;
+               $fieldsToWrite[] = 'file';
+               $fieldsToSelect = $fieldsToMigrate;
+               $fieldsToSelect[] = 'uid AS file';
+
+               $resultObject = $GLOBALS['TYPO3_DB']->sql_query(
+                               'INSERT INTO ' . $this->metaDataTable . ' (' . implode(',', $fieldsToWrite) . ') ' .
+                               'SELECT ' . implode(',', $fieldsToSelect) .
+                               'FROM sys_file ' .
+                               'WHERE uid NOT IN (SELECT file FROM ' . $this->metaDataTable . ')');
+
                return $resultObject !== FALSE;
        }