NOBUG: partially re-introduce DB object static cache, as we need to avoid dupes
authorEloy Lafuente <stronk7@moodle.org>
Thu, 18 Mar 2010 00:48:48 +0000 (00:48 +0000)
committerEloy Lafuente <stronk7@moodle.org>
Thu, 18 Mar 2010 00:48:48 +0000 (00:48 +0000)
when two indexes are created in the same sentence and initials are the same (contenthash, contextid)
This introduces some problems in Oracle but... better to keep the rest working.

lib/ddl/sql_generator.php

index 810eba2..f54b728 100644 (file)
@@ -947,6 +947,12 @@ abstract class sql_generator {
 
         $name = '';
 
+    /// Implement one basic cache to avoid object name duplication
+    /// along all the request life, but never to return cached results
+        if (!isset($used_names)) {
+            static $used_names = array();
+        }
+
     /// Use standard naming. See http://docs.moodle.org/en/XMLDB_key_and_index_naming
         $tablearr = explode ('_', $tablename);
         foreach ($tablearr as $table) {
@@ -969,7 +975,7 @@ abstract class sql_generator {
         }
 
     /// If the calculated name is in the cache, or if we detect it by introspecting the DB let's modify if
-        if ($this->isNameInUse($namewithsuffix, $suffix, $tablename)) {
+        if (in_array($namewithsuffix, $used_names) || $this->isNameInUse($namewithsuffix, $suffix, $tablename)) {
             $counter = 2;
         /// If have free space, we add 2
             if (strlen($namewithsuffix) < $this->names_max_length) {
@@ -983,7 +989,7 @@ abstract class sql_generator {
                 $newnamewithsuffix = $newnamewithsuffix . '_' . $suffix;
             }
         /// Now iterate until not used name is found, incrementing the counter
-            while ($this->isNameInUse($newnamewithsuffix, $suffix, $tablename)) {
+            while (in_array($newnamewithsuffix, $used_names) || $this->isNameInUse($newnamewithsuffix, $suffix, $tablename)) {
                 $counter++;
                 $newname = substr($name, 0, strlen($newname)-1) . $counter;
                 $newnamewithsuffix = $newname;
@@ -994,6 +1000,9 @@ abstract class sql_generator {
             $namewithsuffix = $newnamewithsuffix;
         }
 
+    /// Add the name to the cache
+        $used_names[$tablename.'-'.$fields.'-'.$suffix] = $namewithsuffix;
+
     /// Quote it if necessary (reserved words)
         $namewithsuffix = $this->getEncQuoted($namewithsuffix);