From 701bc3bb8b1a8c4dff1bcd1711587c8cc13901a3 Mon Sep 17 00:00:00 2001 From: Jordan Diaz Date: Tue, 22 Sep 2026 17:44:26 +0000 Subject: [PATCH] feat(core): el motor de las tablas nuevas depende de la version del servidor MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit El cambio anterior (8d92d08) creaba siempre las tablas nuevas en InnoDB. Hay un servidor de produccion con MariaDB 5.5.68, donde InnoDB no es seguro: no admite FULLTEXT, limita los indices a 767 bytes y usa filas COMPACT. Con «Subir core», las tablas nuevas de una web de ese servidor habrian nacido en InnoDB sobre 5.5. Ahora `acaiTableEngine()` decide por la version, con el mismo patron que `mysqlStrictMode` usa para el modo SQL: MariaDB >= 10.2 o MySQL >= 5.7 -> InnoDB (Barracuda/DYNAMIC por defecto) cualquier otro o desconocido -> MyISAM (lo de siempre) Contempla el disfraz "5.5.5-10.x.y-MariaDB" con el que algunos clientes antiguos ven a MariaDB 10+. La decision pura (`acaiEngineForServerVersion`) esta separada para poder probarla sin servidor. Usada en los dos sitios que crean tablas: createMissingSchemaTablesAndFields y la instalacion de plugins. Comprobado: 12 versiones (Forge 10.6, webserver2 11.4, servidor antiguo 5.5, disfraces, MySQL 5.6/5.7/8.0, vacio) y de punta a punta contra el MariaDB de Forge a traves del shim mysql_*: InnoDB. Co-Authored-By: Claude Opus 5.5 (1M context) --- cms/lib/database_functions.php | 52 ++++++++++++++++++++++++++++++---- cms/lib/plugins/index.php | 2 +- 2 files changed, 47 insertions(+), 7 deletions(-) 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;