Fixed bug #10735: Wrong returnUrl with clipboard actions
[Packages/TYPO3.CMS.git] / t3lib / class.t3lib_install.php
old mode 100755 (executable)
new mode 100644 (file)
index b45f1f3..dc0e89f
@@ -2,7 +2,7 @@
 /***************************************************************
 *  Copyright notice
 *
-*  (c) 1999-2006 Kasper Skaarhoj (kasperYYYY@typo3.com)
+*  (c) 1999-2009 Kasper Skaarhoj (kasperYYYY@typo3.com)
 *  All rights reserved
 *
 *  This script is part of the TYPO3 project. The TYPO3 project is
@@ -93,6 +93,7 @@ class t3lib_install {
        var $backPath = '../';                          // Backpath (used for icons etc.)
 
        var $multiplySize = 1;                          // Multiplier of SQL field size (for char, varchar and text fields)
+       var $character_sets = array();                  // Caching output of $GLOBALS['TYPO3_DB']->admin_get_charsets()
 
                // Internal, dynamic:
        var $setLocalconf = 0;                          // Used to indicate that a value is change in the line-array of localconf and that it should be written.
@@ -312,9 +313,23 @@ class t3lib_install {
                        } else {
                                if (substr($value,0,1)==')' && substr($value,-1)==';')  {
                                        $ttype = array();
-                                       if (preg_match('/(ENGINE|TYPE)=([a-zA-Z]*)/',$value,$ttype)) {
+                                       if (preg_match('/(ENGINE|TYPE)[ ]*=[ ]*([a-zA-Z]*)/',$value,$ttype)) {
                                                $total[$table]['extra']['ENGINE'] = $ttype[2];
+                                       } // Otherwise, just do nothing: If table engine is not defined, just accept the system default.
+
+                                               // Set the collation, if specified
+                                       if (preg_match('/(COLLATE)[ ]*=[ ]*([a-zA-z0-9_-]+)/', $value, $tcollation)) {
+                                               $total[$table]['extra']['COLLATE'] = $tcollation[2];
+                                       } else {
+                                                       // Otherwise, get the CHARACTER SET and try to find the default collation for it as returned by "SHOW CHARACTER SET" query (for details, see http://dev.mysql.com/doc/refman/5.1/en/charset-table.html)
+                                               if (preg_match('/(CHARSET|CHARACTER SET)[ ]*=[ ]*([a-zA-z0-9_-]+)/', $value, $tcharset)) {      // Note: Keywords "DEFAULT CHARSET" and "CHARSET" are the same, so "DEFAULT" can just be ignored
+                                                       $charset = $tcharset[2];
+                                               } else {
+                                                       $charset = $GLOBALS['TYPO3_DB']->default_charset;       // Fallback to default charset
+                                               }
+                                               $total[$table]['extra']['COLLATE'] = $this->getCollationForCharset($charset);
                                        }
+
                                        $table = '';    // Remove table marker and start looking for the next "CREATE TABLE" statement
                                } else {
                                        $lineV = preg_replace('/,$/','',$value);        // Strip trailing commas
@@ -351,7 +366,14 @@ class t3lib_install {
 
                                                $newParts = explode(' ',$parts[1],2);
                                                $key = $parts[0]=='PRIMARY' ? $parts[0] : $newParts[0];
+
                                                $total[$table]['keys'][$key] = $lineV;
+
+                                                       // This is a protection against doing something stupid: Only allow clearing of cache_* and index_* tables.
+                                               if (preg_match('/^(cache|index)_/',$table)) {
+                                                               // Suggest to truncate (clear) this table
+                                                       $total[$table]['extra']['CLEAR'] = 1;
+                                               }
                                        }
                                }
                        }
@@ -411,7 +433,7 @@ class t3lib_install {
                                                                                                }
                                                                                                $keys[] = $kfN;
                                                                                        }
-                                                                                       $total[$table]['keys'][$kN] = $match[1].'('.join(',',$keys).')'.$match[3];
+                                                                                       $total[$table]['keys'][$kN] = $match[1].'('.implode(',',$keys).')'.$match[3];
                                                                                }
                                                                        }
                                                                }
@@ -430,6 +452,25 @@ class t3lib_install {
        }
 
        /**
+        * Look up the default collation for specified character set based on "SHOW CHARACTER SET" output
+        *
+        * @param       string          Character set
+        * @return      string          Corresponding default collation
+        */
+       function getCollationForCharset($charset)       {
+                       // Load character sets, if not cached already
+               if (!count($this->character_sets)) {
+                       $this->character_sets = $GLOBALS['TYPO3_DB']->admin_get_charsets();
+               }
+
+               if (isset($this->character_sets[$charset]['Default collation'])) {
+                       $collation = $this->character_sets[$charset]['Default collation'];
+               }
+
+               return $collation;
+       }
+
+       /**
         * Reads the field definitions for the current database
         *
         * @return      array           Array with information about table.
@@ -589,6 +630,18 @@ class t3lib_install {
                                                        if ($info['whole_table']) {
                                                                $whole_table[]=$fN.' '.$fV;
                                                        } else {
+                                                                       // Special case to work around MySQL problems when adding auto_increment fields:
+                                                               if (stristr($fV, 'auto_increment')) {
+                                                                               // The field can only be set "auto_increment" if there exists a PRIMARY key of that field already.
+                                                                               // The check does not look up which field is primary but just assumes it must be the field with the auto_increment value...
+                                                                       if (isset($diffArr['extra'][$table]['keys']['PRIMARY'])) {
+                                                                                       // Remove "auto_increment" from the statement - it will be suggested in a 2nd step after the primary key was created
+                                                                               $fV = str_replace(' auto_increment', '', $fV);
+                                                                       } else {
+                                                                                       // In the next step, attempt to clear the table once again (2 = force)
+                                                                               $info['extra']['CLEAR'] = 2;
+                                                                       }
+                                                               }
                                                                if ($theKey=='extra') {
                                                                        if ($remove) {
                                                                                if (substr($fN,0,strlen($deletedPrefixKey))!=$deletedPrefixKey) {
@@ -635,16 +688,31 @@ class t3lib_install {
                                        if (is_array($info['extra'])) {
                                                $extras = array();
                                                $extras_currentValue = array();
+                                               $clear_table = false;
+
                                                foreach ($info['extra'] as $fN => $fV) {
 
                                                                // Only consider statements which are missing in the database but don't remove existing properties
                                                        if (!$remove) {
                                                                if (!$info['whole_table']) {    // If the whole table is created at once, we take care of this later by imploding all elements of $info['extra']
-                                                                       $extras[] = $fN.'='.$fV;
-                                                                       $extras_currentValue[] = $fN.'='.$diffArr['diff_currentValues'][$table]['extra'][$fN];
+                                                                       if ($fN=='CLEAR') {
+                                                                                       // Truncate table must happen later, not now
+                                                                                       // Valid values for CLEAR: 1=only clear if keys are missing, 2=clear anyway (force)
+                                                                               if (count($info['keys']) || $fV==2) {
+                                                                                       $clear_table = true;
+                                                                               }
+                                                                               continue;
+                                                                       } else {
+                                                                               $extras[] = $fN.'='.$fV;
+                                                                               $extras_currentValue[] = $fN.'='.$diffArr['diff_currentValues'][$table]['extra'][$fN];
+                                                                       }
                                                                }
                                                        }
                                                }
+                                               if ($clear_table) {
+                                                       $statement = 'TRUNCATE TABLE '.$table.';';
+                                                       $statements['clear_table'][md5($statement)] = $statement;
+                                               }
                                                if (count($extras)) {
                                                        $statement = 'ALTER TABLE '.$table.' '.implode(' ',$extras).';';
                                                        $statements['change'][md5($statement)] = $statement;
@@ -661,13 +729,15 @@ class t3lib_install {
                                                                $statements['drop_table'][md5($statement)] = $statement;
                                                        }
                                                                // count:
-                                                       $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('count(*)', $table, '');
-                                                       list($count) = $GLOBALS['TYPO3_DB']->sql_fetch_row($res);
+                                                       $count = $GLOBALS['TYPO3_DB']->exec_SELECTcountRows('*', $table);
                                                        $statements['tables_count'][md5($statement)] = $count?'Records in table: '.$count:'';
                                                } else {
                                                        $statement = 'CREATE TABLE '.$table." (\n".implode(",\n",$whole_table)."\n)";
                                                        if ($info['extra']) {
                                                                foreach ($info['extra'] as $k=>$v) {
+                                                                       if ($k=='COLLATE' || $k=='CLEAR') {
+                                                                               continue;       // Skip these special statements. TODO: collation support is currently disabled (needs more testing)
+                                                                       }
                                                                        $statement.= ' '.$k.'='.$v;     // Add extra attributes like ENGINE, CHARSET, etc.
                                                                }
                                                        }
@@ -844,7 +914,10 @@ class t3lib_install {
         */
        function getListOfTables()      {
                $whichTables = $GLOBALS['TYPO3_DB']->admin_get_tables(TYPO3_db);
-               return array_keys($whichTables);
+               foreach ($whichTables as $key=>&$value) {
+                       $value = $key;
+               }
+               return $whichTables;
        }
 
        /**
@@ -863,14 +936,17 @@ class t3lib_install {
                if (is_array($arr))     {
                        foreach($arr as $key => $string)        {
                                $ico = '';
+                               $warnings = array();
+
                                if ($iconDis)   {
-                                       if (stristr($string,' user_'))  {
+                                       if (preg_match('/^TRUNCATE/i',$string)) {
+                                               $ico.= '<img src="'.$this->backPath.'gfx/icon_warning.gif" width="18" height="16" align="top" alt="" /><strong> </strong>';
+                                               $warnings['clear_table_info'] = 'Clearing the table is sometimes neccessary when adding new keys. In case of cache_* tables this should not hurt at all. However, use it with care.';
+                                       } elseif (stristr($string,' user_'))    {
                                                $ico.= '<img src="'.$this->backPath.'gfx/icon_warning.gif" width="18" height="16" align="top" alt="" /><strong>(USER) </strong>';
-                                       }
-                                       if (stristr($string,' app_'))   {
+                                       } elseif (stristr($string,' app_'))     {
                                                $ico.= '<img src="'.$this->backPath.'gfx/icon_warning.gif" width="18" height="16" align="top" alt="" /><strong>(APP) </strong>';
-                                       }
-                                       if (stristr($string,' ttx_') || stristr($string,' tx_'))        {
+                                       } elseif (stristr($string,' ttx_') || stristr($string,' tx_'))  {
                                                $ico.= '<img src="'.$this->backPath.'gfx/icon_warning.gif" width="18" height="16" align="top" alt="" /><strong>(EXT) </strong>';
                                        }
                                }
@@ -887,6 +963,13 @@ class t3lib_install {
                                        </tr>';
                                }
                        }
+                       if (count($warnings)) {
+                               $out[] = '
+                                       <tr>
+                                               <td valign="top"></td>
+                                               <td style="color : #666666;"><em>' . implode('<br />',$warnings) . '</em></td>
+                                       </tr>';
+                       }
 
                        // Compile rows:
                        $content = '
@@ -914,4 +997,5 @@ class t3lib_install {
 if (defined('TYPO3_MODE') && $TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['t3lib/class.t3lib_install.php'])  {
        include_once($TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['t3lib/class.t3lib_install.php']);
 }
-?>
+
+?>
\ No newline at end of file