Un amigo tenía un problema para instalar Moodle ya que le resultaba imposible que el servidor le diera permisos para crear índices así que me pidió ayuda. Su versión era la 1.9.8+ (Build: 20100505).
Entre las 19:38 horas y las 21:05 estuve pensando y programando hasta solucionarlo, después de ir a /lib/db/mysql.php y cambiar las consultas fácilmente de «CREATE INDEX» a ALTER TABLE, aún existían errores, de modo que creé un script para mysql ,la base de datos que mi amigo utiliza y si se modifica queda así:
<?php //... //execute_sql("CREATE UNIQUE INDEX {$CFG->prefix}cont_conins_uix ON {$CFG->prefix}context (contextlevel, instanceid);", false); execute_sql("ALTER TABLE {$CFG->prefix}context ADD UNIQUE INDEX {$CFG->prefix}cont_conins_uix (contextlevel, instanceid);", false); ?>
hasta aquí era fácil, pero luego había que decirle al motor de base de datos, que tomara las definiciones en XML de cada módulo, componente,etc. y al generar el comando SQL hiciera exactamente lo mismo…,entonces fui al fichero
/lib/adodb/datadict/datadict-mysql.inc.php modificando la función _IndexSQL en la línea 168
<?php //.... if ($this->alterTableAddIndex) $s = "ALTER TABLE $tabname ADD $unique INDEX $idxname "; else $s = 'ALTER TABLE INDEX '. $tabname. " ADD $unique INDEX " . $idxname." "; //... ?>
y lo mismo para el fichero /lib/adodb/adodb.inc.php en la línea 891:
<?php //... //CREATE INDEX mdl_assi_cou_ix ON mdl_assignment (course) if (substr($sql,0,8)=="CREATE I"){ $_sql= split(" ",$sql); $sql = "ALTER TABLE "; $sql .= $_sql[4]." ADD INDEX ".$_sql[2]; for ($i=5; $i $sql .= " " . $_sql[$i]; } } elseif (substr($sql,0,8)=="CREATE U"){ //CREATE UNIQUE INDEX mdl_conf_nam_uix ON mdl_config (name) $_sql= split(" ",$sql); $sql = "ALTER TABLE "; $sql .= $_sql[5]." ADD UNIQUE INDEX ".$_sql[3]; for ($i=6; $i_Execute($sql,false); if (!$ret){ ob_flush(); ob_end_flush(); echo $sql; } //... ?>
de forma que modificamos así todas las instrucciones que usan CREATE INDEX por ALTER TABLE ___ ADD INDEX
y todo funciona a las mil maravillas :)