diff --git a/source/packages/com_mokowaas/admin/sql/updates/mysql/02.35.00.sql b/source/packages/com_mokowaas/admin/sql/updates/mysql/02.35.00.sql
new file mode 100644
index 00000000..44aad811
--- /dev/null
+++ b/source/packages/com_mokowaas/admin/sql/updates/mysql/02.35.00.sql
@@ -0,0 +1,11 @@
+CREATE TABLE IF NOT EXISTS `#__mokowaas_download_keys` (
+ `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
+ `element` VARCHAR(100) NOT NULL DEFAULT '' COMMENT 'Extension element name',
+ `location` VARCHAR(512) NOT NULL DEFAULT '' COMMENT 'Update server URL',
+ `dlid` VARCHAR(255) NOT NULL DEFAULT '' COMMENT 'Download key value',
+ `created` DATETIME NOT NULL,
+ `modified` DATETIME NOT NULL,
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `idx_dlkey_element` (`element`),
+ KEY `idx_dlkey_location` (`location`(191))
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
diff --git a/source/packages/com_mokowaas/mokowaas.xml b/source/packages/com_mokowaas/mokowaas.xml
index 08379c3c..160a64c6 100644
--- a/source/packages/com_mokowaas/mokowaas.xml
+++ b/source/packages/com_mokowaas/mokowaas.xml
@@ -25,6 +25,12 @@
Moko\Component\MokoWaaS
+
+
+ sql/updates/mysql
+
+
+
diff --git a/source/script.php b/source/script.php
index 6d581090..f9739a46 100644
--- a/source/script.php
+++ b/source/script.php
@@ -109,6 +109,9 @@ class Pkg_MokowaasInstallerScript
// Clean up stale/duplicate update sites
$this->cleanupStaleUpdateSites();
+ // Ensure download keys table exists (belt-and-suspenders with schema update)
+ $this->ensureDownloadKeysTable();
+
// Restore download keys: first from preflight backup, then from DB table
$this->restoreDownloadKeys($this->savedDownloadKeys);
$this->reapplyKeysFromDatabase();
@@ -673,6 +676,33 @@ class Pkg_MokowaasInstallerScript
*
* @return array Map of update_site_id => extra_query
*/
+ /**
+ * Ensure the download keys table exists.
+ */
+ private function ensureDownloadKeysTable(): void
+ {
+ try
+ {
+ $db = Factory::getDbo();
+ $db->setQuery("CREATE TABLE IF NOT EXISTS `#__mokowaas_download_keys` (
+ `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
+ `element` VARCHAR(100) NOT NULL DEFAULT '',
+ `location` VARCHAR(512) NOT NULL DEFAULT '',
+ `dlid` VARCHAR(255) NOT NULL DEFAULT '',
+ `created` DATETIME NOT NULL,
+ `modified` DATETIME NOT NULL,
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `idx_dlkey_element` (`element`),
+ KEY `idx_dlkey_location` (`location`(191))
+ ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4");
+ $db->execute();
+ }
+ catch (\Throwable $e)
+ {
+ // Non-critical
+ }
+ }
+
private function backupDownloadKeys(): array
{
$keys = [];