diff --git a/cms/lib/database_functions.php b/cms/lib/database_functions.php index e5a3ef9..3aa8db7 100755 --- a/cms/lib/database_functions.php +++ b/cms/lib/database_functions.php @@ -43,6 +43,49 @@ function connectToMySQL($returnErrors = false) { return ''; } +/** + * Motor de almacenamiento para las tablas que crea el CMS. + * + * InnoDB da recuperacion ante caida (MyISAM se corrompe con un apagon o un OOM + * y hay que repararlo a mano) y bloqueo por fila. Pero en servidores antiguos + * no es seguro: MariaDB 5.5 (hay un servidor de produccion con 5.5.68) no + * admite FULLTEXT en InnoDB, limita los indices a 767 bytes y usa filas + * COMPACT. Por eso el motor se decide por la version del servidor, igual que + * mysqlStrictMode decide el modo SQL: + * + * MariaDB >= 10.2 o MySQL >= 5.7 -> InnoDB (Barracuda/DYNAMIC por defecto) + * cualquier otro o desconocido -> MyISAM (lo de siempre) + * + * No cambia que INSERT se aceptan: el CMS conecta en modo estricto + * (mysqlStrictMode / TRADITIONAL en Db.php) y en un INSERT de una fila eso + * rechaza lo mismo con los dos motores. Ver docs/motor-innodb.md (repo Forge). + */ +function acaiTableEngine() { + static $engine = null; + if ($engine === null) { + $engine = acaiEngineForServerVersion(mysql_get_server_info()); + } + return $engine; +} + +/** Decision pura, separada para poder probarla sin servidor. */ +function acaiEngineForServerVersion($serverInfo) { + $info = trim((string) $serverInfo); + // Clientes antiguos ven MariaDB 10+ como "5.5.5-10.6.25-MariaDB": el + // "5.5.5-" es un disfraz de compatibilidad, la version real va detras. + if (preg_match('/^5\.5\.5-(\d+\.\d+(?:\.\d+)?)/', $info, $m)) { + $version = $m[1]; + $isMariaDb = true; + } elseif (preg_match('/^(\d+\.\d+(?:\.\d+)?)/', $info, $m)) { + $version = $m[1]; + $isMariaDb = stripos($info, 'mariadb') !== false; + } else { + return 'MyISAM'; + } + $minimo = $isMariaDb ? '10.2' : '5.7'; + return version_compare($version, $minimo, '>=') ? 'InnoDB' : 'MyISAM'; +} + function mysqlStrictMode($strictMode) { $currentVersion = preg_replace("/[^0-9\.]/", "", mysql_get_server_info()); $isMySql5 = version_compare($currentVersion, '5.0.0', '>='); @@ -74,12 +117,9 @@ function createMissingSchemaTablesAndFields() { $mysqlTableName = $TABLE_PREFIX . $tableName; if (!in_array($mysqlTableName, $mysqlTables)) { notice("Creating MySQL table for schema table: $tableName
\n"); - // InnoDB (antes MyISAM): las tablas nuevas nacen con recuperacion - // ante caida y bloqueo por fila. No cambia que INSERT se aceptan: - // el CMS conecta en modo estricto (mysqlStrictMode / TRADITIONAL - // en Db.php) y en un INSERT de una fila eso rechaza lo mismo con - // MyISAM que con InnoDB. Ver docs/motor-innodb.md del repo Forge. - $result = mysql_query("CREATE TABLE `".mysql_real_escape_string($mysqlTableName)."` (num int(10) unsigned NOT NULL auto_increment, PRIMARY KEY (num)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;"); + // Motor segun el servidor (ver acaiTableEngine): InnoDB donde lo + // soporta bien, MyISAM en los antiguos. + $result = mysql_query("CREATE TABLE `".mysql_real_escape_string($mysqlTableName)."` (num int(10) unsigned NOT NULL auto_increment, PRIMARY KEY (num)) ENGINE=".acaiTableEngine()." DEFAULT CHARSET=utf8mb4;"); if (!$result) { alert("Error creating MySQL table: $mysqlTableName
\MySQL error was: ". htmlspecialchars(mysql_error()) . "\n"); } } diff --git a/cms/lib/plugins/index.php b/cms/lib/plugins/index.php index 9304024..633f308 100644 --- a/cms/lib/plugins/index.php +++ b/cms/lib/plugins/index.php @@ -210,7 +210,7 @@ function addTablePlugin($path,$file) { $result = mysql_query("CREATE TABLE `".mysql_real_escape_string($tableNameWithPrefix)."` ( num int(10) unsigned NOT NULL auto_increment, PRIMARY KEY (num) - ) ENGINE=InnoDB DEFAULT CHARSET=utf8;"); + ) ENGINE=".acaiTableEngine()." DEFAULT CHARSET=utf8;"); if (!$result) { print "Error creating MySQL table.\n\nMySQL error was: ". htmlspecialchars(mysql_error()) . "\n"; exit;