diff --git a/source/script.php b/source/script.php index a0c155ee..0e772ebf 100644 --- a/source/script.php +++ b/source/script.php @@ -511,7 +511,22 @@ class Pkg_MokosuiteclientInstallerScript return; } - // No row exists at all — create one from the manifest XML on disk + // Verify no row exists before inserting (prevent duplicates) + $db->setQuery( + $db->getQuery(true) + ->select('COUNT(*)') + ->from($db->quoteName('#__extensions')) + ->where($db->quoteName('type') . ' = ' . $db->quote('plugin')) + ->where($db->quoteName('folder') . ' = ' . $db->quote($group)) + ->where($db->quoteName('element') . ' = ' . $db->quote($element)) + ); + + if ((int) $db->loadResult() > 0) + { + return; + } + + // No row exists — create one from the manifest XML on disk $manifestFile = $pluginDir . '/' . $element . '.xml'; if (is_file($manifestFile)) @@ -577,7 +592,7 @@ class Pkg_MokosuiteclientInstallerScript $db->execute(); $deleted = $db->getAffectedRows(); - // Also delete rows where element is the display name (spaces) + // Delete rows where element is the display name (spaces) $db->setQuery( $db->getQuery(true) ->delete($db->quoteName('#__extensions')) @@ -592,6 +607,22 @@ class Pkg_MokosuiteclientInstallerScript Log::add("Deleted {$deleted} orphaned plugin row(s)", Log::INFO, 'mokosuiteclient'); } + // Deduplicate: keep only the lowest extension_id per element+folder + $db->setQuery( + "DELETE e1 FROM " . $db->quoteName('#__extensions') . " e1" + . " INNER JOIN " . $db->quoteName('#__extensions') . " e2" + . " ON e1.element = e2.element AND e1.folder = e2.folder AND e1.type = e2.type" + . " AND e1.extension_id > e2.extension_id" + . " WHERE e1.element LIKE 'mokosuiteclient%' AND e1.type = 'plugin'" + ); + $db->execute(); + $deduped = $db->getAffectedRows(); + + if ($deduped > 0) + { + Log::add("Removed {$deduped} duplicate extension row(s)", Log::INFO, 'mokosuiteclient'); + } + // 2. Clean up stale plugin files that leaked to group roots $groupDirs = [JPATH_PLUGINS . '/system', JPATH_PLUGINS . '/task', JPATH_PLUGINS . '/webservices'];