Automatic deactivation of installed but deprecated extwensions fixed
[mailer.git] / inc / extensions-functions.php
index 9228cf4f42c2b7fd99bd6040ac28d6f4a09e4cb2..e7e6bce3085bee962e5c0d2925ddb8f408e4b940 100644 (file)
@@ -17,7 +17,7 @@
  * -------------------------------------------------------------------- *
  * Copyright (c) 2003 - 2009 by Roland Haeder                           *
  * Copyright (c) 2009 - 2011 by Mailer Developer Team                   *
- * For more information visit: http://www.mxchange.org                  *
+ * For more information visit: http://mxchange.org                      *
  *                                                                      *
  * This program is free software; you can redistribute it and/or modify *
  * it under the terms of the GNU General Public License as published by *
@@ -41,12 +41,13 @@ if (!defined('__SECURITY')) {
 } // END - if
 
 // Load the extension and maybe found language and function files.
-function loadExtension ($ext_name, $ext_mode, $ext_ver = '0.0', $dry_run = false) {
+function loadExtension ($ext_name, $ext_mode, $ext_ver = '0.0.0', $dry_run = false) {
+       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'ext_name=' . $ext_name . ',ext_mode=' . $ext_mode . ',ext_ver=' . $ext_ver . ',dry_run=' . intval($dry_run));
        // Loading an extension in same mode, but not test/update, twice is not
        // good, so is the extension $ext_name already loaded in mode $ext_mode?
        if ((isset($GLOBALS['loaded_extension'][$ext_name][$ext_mode])) && (!in_array($ext_mode, array('update', 'test')))) {
                // If this happens twice, we need the bug report from you, except for updates/tests
-               debug_report_bug(__FUNCTION__, __LINE__, '() is called twice: ext_name=' . $ext_name . ', ext_mode='. $ext_mode . ',ext_sqls=' . print_r(getExtensionSqls(), true) . ', ext_register_running=' . print_r($GLOBALS['ext_register_running'], true) . ', ext_running_updates=' . print_r($GLOBALS['ext_running_updates'], true));
+               debug_report_bug(__FUNCTION__, __LINE__, __FUNCTION__ . '() is called twice: ext_name=' . $ext_name . ', ext_mode='. $ext_mode . ',ext_sqls=' . print_r(getExtensionSqls(), true) . ', ext_register_running=' . print_r($GLOBALS['ext_register_running'], true) . ', ext_running_updates=' . print_r($GLOBALS['ext_running_updates'], true));
        } // END - if
 
        // Make sure this situation can only happen once
@@ -66,7 +67,7 @@ function loadExtension ($ext_name, $ext_mode, $ext_ver = '0.0', $dry_run = false
                setCurrentExtensionVersion($ext_ver);
        } else {
                // Set it to 0.0 by default
-               setCurrentExtensionVersion('0.0');
+               setCurrentExtensionVersion('0.0.0');
 
                // Is the extension installed?
                if ((isExtensionInstalled($ext_name)) && ($ext_mode != 'register')) {
@@ -75,7 +76,7 @@ function loadExtension ($ext_name, $ext_mode, $ext_ver = '0.0', $dry_run = false
                } // END - if
 
                // In all but test-mode we need these messages to debug! Please report all (together, e.g.)
-               if (($ext_mode != 'test') && (getCurrentExtensionVersion() == '0.0')) {
+               if (($ext_mode != 'test') && (getCurrentExtensionVersion() == '0.0.0')) {
                        // Abort here, this must now always be set!
                        debug_report_bug(__FUNCTION__, __LINE__, 'Extension version is empty, setting to 0.0. ext_name=' . $ext_name . ', ext_mode=' . $ext_mode . ', dry_run=' . intval($dry_run));
                } // END - if
@@ -151,19 +152,16 @@ function loadExtension ($ext_name, $ext_mode, $ext_ver = '0.0', $dry_run = false
        // Extensions are not always active by default
        setExtensionAlwaysActive('N');
 
-       // Extension update notes
-       // @TODO Do we still need this? setExtensionUpdateNotes('');
-
        // Include the extension file
-       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'Extension loaded.');
-       loadExtensionInclude();
+       loadCurrentExtensionInclude();
 
        // Is this extension deprecated?
-       if (isExtensionDeprecated()) {
+       if ((isExtensionDeprecated()) && (!in_array(getExtensionMode(), array('test', 'update', 'deactivate'))) && (isExtensionActive($ext_name))) {
                // Deactivate the extension
                doDeactivateExtension($ext_name);
 
                // Abort here
+               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'Extension load aborted, ext_name=' . $ext_name . ' - Extension is deprecated.');
                return false;
        } // END - if
 
@@ -174,13 +172,14 @@ function loadExtension ($ext_name, $ext_mode, $ext_ver = '0.0', $dry_run = false
        } // END - if
 
        // All fine!
+       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'Extension successfully loaded, ext_name=' . $ext_name);
        return true;
 }
 
-// Registeres an extension and possible update depencies
-function registerExtension ($ext_name, $taskId, $dry_run = false, $logout = true) {
+// Registers an extension and possible update dependencies
+function registerExtension ($ext_name, $taskId, $dry_run = false, $ignoreUpdates = false) {
        // Set current extension name
-       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'ext_name=' . $ext_name . ',task_id=' . $taskId . ',dry_run=' . intval($dry_run) . ',logout=' . intval($logout) . ' - ENTERED!');
+       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'ext_name=' . $ext_name . ',task_id=' . $taskId . ',dry_run=' . intval($dry_run) . ',ignoreUpdates=' . intval($ignoreUpdates) . ' - ENTERED!');
        setCurrentExtensionName($ext_name);
 
        // Enable dry-run
@@ -196,9 +195,10 @@ function registerExtension ($ext_name, $taskId, $dry_run = false, $logout = true
        } // END - if
 
        // When this extension is already in registration/update phase, all is fine
-       if ((isExtensionRegistrationRunning($ext_name)) || (isExtensionUpdateRunning($ext_name))) {
+       if ((isExtensionRegistrationRunning($ext_name)) || ((isExtensionUpdateRunning($ext_name)) && ($ignoreUpdates === false))) {
                // Then abort here with 'true' becaus it is fine
-               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'currName=' . getCurrentExtensionName() . ' - ALREADY!');
+               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'ext_name=' . $ext_name . ' - already in registration/update phase, all fine,taskId=' . $taskId . ',dry_run=' . intval($dry_run) . ',ignoreUpdates=' . intval($ignoreUpdates));
+               ///* BUG: */ debug_report_bug(__FUNCTION__, __LINE__, 'ext_name=' . $ext_name . ',taskId=' . $taskId . ',dry_run=' . intval($dry_run) . ',ignoreUpdates=' . intval($ignoreUpdates) . ' - Please investigate!');
                return true;
        } // END - if
 
@@ -238,15 +238,15 @@ function registerExtension ($ext_name, $taskId, $dry_run = false, $logout = true
 
        // Init variables
        $ret = false;
-       $test = false;
+       $processResult = false;
        initIncludePool('extension');
 
        // By default we have no failures
-       setExtensionReportsFailure(false);
+       enableExtensionReportingFailure();
 
        // Does this extension exists?
        //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'currName=' . getCurrentExtensionName());
-       if (loadExtension(getCurrentExtensionName(), 'register', '0.0', isExtensionDryRun())) {
+       if (loadExtension(getCurrentExtensionName(), 'register', '0.0.0', isExtensionDryRun())) {
                // Set current extension name again
                setCurrentExtensionName($ext_name);
 
@@ -286,17 +286,17 @@ function registerExtension ($ext_name, $taskId, $dry_run = false, $logout = true
                                // Extension version set? If empty the extension is not registered
                                if (empty($ext_ver)) {
                                        // Extension not registered so far so first load task's id...
-                                       $task = determineExtensionTaskId($ext_update);
+                                       $taskId = determineExtensionTaskId($ext_update);
 
                                        // Entry found?
-                                       if ($task > 0) {
+                                       if ($taskId > 0) {
                                                // Try to register the extension
-                                               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'currName=' . getCurrentExtensionName() . ':ext_update=' . $ext_update . ',taskId=' . $task);
-                                               $test = registerExtension($ext_update, $task, isExtensionDryRun(), false);
+                                               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'currName=' . getCurrentExtensionName() . ',ext_update=' . $ext_update . ',taskId=' . $taskId . ',isExtensionDryRun()=' . isExtensionDryRun());
+                                               $processResult = registerExtension($ext_update, $taskId, isExtensionDryRun(), true);
 
                                                // Reset extension name
                                                setCurrentExtensionName($ext_name);
-                                               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'currName=' . getCurrentExtensionName() . ',test=' . intval($test));
+                                               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'currName=' . getCurrentExtensionName() . ',ext_update=' . $ext_update . ',processResult=' . intval($processResult));
                                        } // END - if
                                } elseif ($ext_ver != getCurrentExtensionVersion()) {
                                        // Ok, update this extension now
@@ -311,14 +311,14 @@ function registerExtension ($ext_name, $taskId, $dry_run = false, $logout = true
                                        //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'currName=' . getCurrentExtensionName() . ',currVer=' . getCurrentExtensionVersion());
 
                                        // All okay!
-                                       $test = true;
+                                       $processResult = true;
                                } else {
                                        // Nothing to register / update before...
-                                       $test = true;
+                                       $processResult = true;
                                }
                        } else {
                                // Required file for update does not exists!
-                               $test = true;
+                               $processResult = true;
                                // But this is fine for the first time...
                        }
 
@@ -329,19 +329,19 @@ function registerExtension ($ext_name, $taskId, $dry_run = false, $logout = true
                // Is there no update?
                if (countExtensionUpdateDependencies(getCurrentExtensionName()) == 0) {
                        // Then test is passed!
-                       $test = true;
+                       $processResult = true;
                } // END - if
 
                // Switch back to register mode
                setExtensionMode('register');
 
                // Remains true if extension registration reports no failures
-               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'currName=' . getCurrentExtensionName() . ',test=' . intval($test));
-               $test = (($test === true) && (getExtensionReportsFailure() === false));
-               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'currName=' . getCurrentExtensionName() . ',test=' . intval($test));
+               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'currName=' . getCurrentExtensionName() . ',processResult=' . intval($processResult));
+               $processResult = (($processResult === true) && (isExtensionReportingFailure() === false));
+               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'currName=' . getCurrentExtensionName() . ',processResult=' . intval($processResult));
 
                // Does everthing before wents ok?
-               if ($test === true) {
+               if ($processResult === true) {
                        // "Dry-run-mode" activated?
                        if ((isExtensionDryRun() === false) && (!isExtensionOnRemovalList())) {
                                // Init SQLs and transfer ext->generic
@@ -357,7 +357,7 @@ function registerExtension ($ext_name, $taskId, $dry_run = false, $logout = true
                                if (isExtensionInstalledAndNewer('sql_patches', '0.0.6')) {
                                        // New way, with CSS
                                        //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'ext_name=' . getCurrentExtensionName() . ',always_active=' . getThisExtensionAlwaysActive() . ', ext_ver=' . getCurrentExtensionVersion() . 'ext_css=' . getExtensionHasCss());
-                                       SQL_QUERY_ESC("INSERT INTO `{?_MYSQL_PREFIX?}_extensions` (`ext_name`, `ext_active`, `ext_version`,`ext_has_css`) VALUES ('%s','%s','%s','%s')",
+                                       SQL_QUERY_ESC("INSERT INTO `{?_MYSQL_PREFIX?}_extensions` (`ext_name`,`ext_active`,`ext_version`,`ext_has_css`) VALUES ('%s','%s','%s','%s')",
                                                array(
                                                        getCurrentExtensionName(),
                                                        getThisExtensionAlwaysActive(),
@@ -367,7 +367,7 @@ function registerExtension ($ext_name, $taskId, $dry_run = false, $logout = true
                                } else {
                                        // Old way, no CSS
                                        //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'ext_name=' . getCurrentExtensionName() . ',always_active=' . getThisExtensionAlwaysActive() . ', ext_ver=' . getCurrentExtensionVersion());
-                                       SQL_QUERY_ESC("INSERT INTO `{?_MYSQL_PREFIX?}_extensions` (`ext_name`, `ext_active`, `ext_version`) VALUES ('%s','%s','%s')",
+                                       SQL_QUERY_ESC("INSERT INTO `{?_MYSQL_PREFIX?}_extensions` (`ext_name`,`ext_active`,`ext_version`) VALUES ('%s','%s','%s')",
                                                array(
                                                        getCurrentExtensionName(),
                                                        getThisExtensionAlwaysActive(),
@@ -408,28 +408,14 @@ function registerExtension ($ext_name, $taskId, $dry_run = false, $logout = true
                        $ret = false;
                }
        } elseif (($taskId > 0) && (getCurrentExtensionName() != '')) {
-               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'currName=' . getCurrentExtensionName());
                // Remove task from system when id and extension's name is valid
+               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'currName=' . getCurrentExtensionName());
                SQL_QUERY_ESC("DELETE LOW_PRIORITY FROM `{?_MYSQL_PREFIX?}_task_system` WHERE `id`=%s AND `status`='NEW' LIMIT 1",
                        array(bigintval($taskId)), __FUNCTION__, __LINE__);
        }
 
-       // Is this the sql_patches?
-       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'currentExtension=' . getCurrentExtensionName() . '/' . getExtensionMode());
-       if ((getCurrentExtensionName() == 'sql_patches') && ((getExtensionMode() == 'register') || (getExtensionMode() == 'remove')) && (!isExtensionDryRun()) && ($test)) {
-               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'currentExtension=' . getCurrentExtensionName() . ': LOAD!');
-               if ($logout === true) {
-                       // Then redirect to logout
-                       redirectToUrl('modules.php?module=admin&logout=1&' . getExtensionMode() . '=sql_patches');
-               } else {
-                       // Add temporary filter
-                       registerFilter('shutdown', 'REDIRECT_TO_LOGOUT_SQL_PATCHES', true, true);
-                       $GLOBALS['ext_load_mode'] = getExtensionMode();
-               }
-       } // END - if
-
        // Return status code
-       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'currName=' . getCurrentExtensionName() . ',ext_name=' . $ext_name . ',test=' . intval($test) . ' - EXIT!');
+       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'currName=' . getCurrentExtensionName() . ',ext_name=' . $ext_name . ',processResult=' . intval($processResult) . ' - EXIT!');
        return $ret;
 }
 
@@ -437,7 +423,9 @@ function registerExtension ($ext_name, $taskId, $dry_run = false, $logout = true
 // @TODO Change from ext_id to ext_name (not just even the variable! ;-) )
 function doExtensionSqls ($ext_id, $load_mode) {
        // This shall never do a non-admin user!
-       if (!isAdmin()) return false;
+       if (!isAdmin()) {
+               return false;
+       } // END - if
 
        // Get extension's name
        $ext_name = getExtensionName($ext_id);
@@ -459,7 +447,7 @@ function doExtensionSqls ($ext_id, $load_mode) {
 
        // Load extension in detected mode
        //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'ext_name[' . $ext_id . ']=' . getCurrentExtensionName() . ',load_mode=' . $load_mode);
-       loadExtension(getCurrentExtensionName(), $load_mode, '0.0', false);
+       loadExtension(getCurrentExtensionName(), $load_mode, '0.0.0', false);
 
        // Init these SQLs
        initSqls();
@@ -495,6 +483,7 @@ function doExtensionSqls ($ext_id, $load_mode) {
 // Check wether the given extension is installed
 function isExtensionInstalled ($ext_name) {
        // We don't like empty extension names here
+       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'ext_name=' . $ext_name . ' - ENTERED!');
        if (empty($ext_name)) {
                // Please fix them all
                debug_report_bug(__FUNCTION__, __LINE__, 'ext_name is empty.');
@@ -506,25 +495,28 @@ function isExtensionInstalled ($ext_name) {
        // Check if there is a cache entry
        if (isset($GLOBALS['ext_is_installed'][$ext_name])) {
                // Use cache built from below queries
+               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'ext_name=' . $ext_name . ' - CACHE!');
                $isInstalled = $GLOBALS['ext_is_installed'][$ext_name];
        } elseif (isset($GLOBALS['cache_array']['extension']['ext_id'][$ext_name])) {
                // Found!
+               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'ext_name=' . $ext_name . ' - FOUND!');
                $isInstalled = true;
 
                // Count cache hits
                incrementStatsEntry('cache_hits');
        } elseif ((isInstallationPhase())) {
                // Extensions are all inactive/not installed during installation
+               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'ext_name=' . $ext_name . ' - installion phase');
        } else {
                // Look in database
                $ext_id = getExtensionId($ext_name);
 
-               // Log debug message
-               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'Extension ' . $ext_name . ' has ext_id=' . $ext_id);
-
                // Do we have a record?
                $isInstalled = ($ext_id > 0);
 
+               // Log debug message
+               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'ext_name=' . $ext_name . ',ext_id=' . $ext_id . ',isInstalled=' . intval($isInstalled));
+
                // Is it installed, then cache the entry
                if ($isInstalled === true) {
                        // Dummy call (get is okay here)
@@ -536,6 +528,7 @@ function isExtensionInstalled ($ext_name) {
        }
 
        // Return status
+       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'ext_name=' . $ext_name . ',isInstalled=' . intval($isInstalled) . ' - EXIT!');
        return $isInstalled;
 }
 
@@ -600,6 +593,7 @@ function isExtensionActive ($ext_name) {
 // Get version from extensions
 function getExtensionVersion ($ext_name, $force = false) {
        // By default no extension is found
+       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'ext_name=' . $ext_name . ' - ENTERED!');
        $data['ext_version'] = 'false';
 
        // Empty extension name should be fixed!
@@ -609,13 +603,15 @@ function getExtensionVersion ($ext_name, $force = false) {
        } // END - if
 
        // Extensions are all inactive during installation
-       if (isInstallationPhase()) return '';
-       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'ext_name=' . $ext_name);
+       if (isInstallationPhase()) {
+               return '';
+       } // END - if
 
        // Is the cache written?
+       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'ext_name=' . $ext_name . ' - Checking cache ...');
        if (isset($GLOBALS['cache_array']['extension']['ext_version'][$ext_name])) {
                // Load data from cache
-               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, $ext_name . ': CACHE!');
+               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'ext_name=' . $ext_name . ' - CACHE!');
                $data['ext_version'] = $GLOBALS['cache_array']['extension']['ext_version'][$ext_name];
 
                // Count cache hits
@@ -624,22 +620,22 @@ function getExtensionVersion ($ext_name, $force = false) {
                // Load from database
                $result = SQL_QUERY_ESC("SELECT `ext_version` FROM `{?_MYSQL_PREFIX?}_extensions` WHERE `ext_name`='%s' LIMIT 1",
                        array($ext_name), __FUNCTION__, __LINE__);
-               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, $ext_name . ': DB - '.SQL_NUMROWS($result).'');
+               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'ext_name=' . $ext_name . ': DB - '.SQL_NUMROWS($result).'');
 
                // Is the extension there?
                if (SQL_NUMROWS($result) == 1) {
                        // Load entry
                        $data = SQL_FETCHARRAY($result);
+
+                       // Set cache
+                       $GLOBALS['cache_array']['extension']['ext_version'][$ext_name] = $data['ext_version'];
                } elseif (isDebugModeEnabled()) {
-                       // Not found, please report all
-                       debug_report_bug(__FUNCTION__, __LINE__, sprintf(": Cannot find extension %s in database!", $ext_name));
+                       // Not found, may happen while an extension is uninstalled
+                       logDebugMessage(__FUNCTION__, __LINE__, sprintf("Cannot find extension %s in database!", $ext_name));
                }
 
                // Free result
                SQL_FREERESULT($result);
-
-               // Set cache
-               $GLOBALS['cache_array']['extension']['ext_version'][$ext_name] = $data['ext_version'];
        }
 
        // Extension version should not be invalid
@@ -654,15 +650,25 @@ function getExtensionVersion ($ext_name, $force = false) {
 }
 
 // Updates a given extension with current extension version to latest version
-function updateExtension ($ext_name, $ext_ver, $dry_run = false) {
+function updateExtension ($ext_name, $ext_ver, $dry_run = false, $ignoreDependencies = false) {
        // Only admins are allowed to update extensions
+       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'ext_name=' . $ext_name . ',ext_ver=' . $ext_ver . ',dry_run=' . intval($dry_run) . ',ignoreDependencies=' . intval($ignoreDependencies) . ' - ENTERED!');
        if ((!isAdmin()) || (empty($ext_name))) {
-               return false;
+               // Called as non-admin or empty extension
+               debug_report_bug(__FUNCTION__, __LINE__, 'Called as non-admin (isAdmin()=' . intval(isAdmin()) . '), or empty extension name. ext_name=' . $ext_name);
        } // END - if
 
        // Set current SQL name
        setCurrentExtensionName($ext_name);
 
+       // Is this extension update already running?
+       if ((isExtensionUpdateRunning($ext_name, $ignoreDependencies)) && ($dry_run === false)) {
+               // This is fine but needs logging ATM
+               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'ext_name=' . $ext_name . ' - already in update phase, all fine.');
+               ///* BUG: */ debug_report_bug(__FUNCTION__, __LINE__, 'ext_name=' . $ext_name . ' - already in update phase, please investigate!');
+               return true;
+       } // END - if
+
        // Init arrays
        initExtensionSqls();
        initExtensionNotes();
@@ -678,10 +684,13 @@ function updateExtension ($ext_name, $ext_ver, $dry_run = false) {
        initExtensionSqls();
 
        // Check if version is updated
-       //* DEBUG: */ debugOutput(getCurrentExtensionName() . '/' . $ext_name . ':' . getThisExtensionVersion() . '/' . $ext_ver . '/' . intval(is_array($history)));
+       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, getCurrentExtensionName() . '/' . $ext_name . ':' . getThisExtensionVersion() . '/' . $ext_ver . '/' . intval(is_array($history)));
        if (((getThisExtensionVersion() != $ext_ver) || (isExtensionDryRun())) && (is_array($history))) {
-               // Search for starting point
-               $start = array_search($ext_ver, $history);
+               // Search for starting point (-1 for making 0.0 -> 0.0.0 switch work)
+               $start = -1;
+               if ($ext_ver != '0.0') {
+                       $start = array_search($ext_ver, $history);
+               } // END - if
 
                // And load SQL queries in order of version history
                for ($idx = ($start + 1); $idx < count($history); $idx++) {
@@ -709,19 +718,19 @@ function updateExtension ($ext_name, $ext_ver, $dry_run = false) {
                                                // Is the extension there?
                                                if (isExtensionInstalled($ext_depend)) {
                                                        // Update another extension first!
-                                                       $test = updateExtension($ext_depend, getExtensionVersion($ext_depend), isExtensionDryRun());
+                                                       $processResult = updateExtension($ext_depend, getExtensionVersion($ext_depend), isExtensionDryRun(), true);
                                                } else {
                                                        // Register new extension
-                                                       $test = registerExtension($ext_depend, 0, isExtensionDryRun(), false);
+                                                       $processResult = registerExtension($ext_depend, 0, isExtensionDryRun());
                                                }
                                        } // END - if
                                } // END - foreach
 
-                               // Set extension version here
-                               setCurrentExtensionVersion($ext_ver);
-
                                // Set name back
                                setCurrentExtensionName($ext_name);
+
+                               // Set extension version here
+                               setCurrentExtensionVersion($ext_ver);
                        } // END - if
 
                        // Add notes
@@ -748,14 +757,16 @@ function updateExtension ($ext_name, $ext_ver, $dry_run = false) {
                        runFilterChain('extension_update', getCurrentExtensionName());
                } // END - if
        } // END - if
+
+       //* DEBUG: */logDebugMessage(__FUNCTION__, __LINE__, 'ext_name=' . $ext_name . ',ext_ver=' . $ext_ver . ',dry_run=' . intval($dry_run) . ',ignoreDependencies=' . intval($ignoreDependencies) . ' - EXIT!');
 }
 
 // Output verbose SQL table for extension
-function addExtensionVerboseSqlTable ($title = '', $dashed = '', $switch = false, $width = '100%') {
+function addExtensionVerboseSqlTable ($title = '{--ADMIN_SQLS_EXECUTED_ON_REMOVAL--}') {
        // Empty title?
        if (empty($title)) {
-               // Then fix it to default
-               $title = '{--ADMIN_SQLS_EXECUTED_ON_REMOVAL--}';
+               // Then abort here
+               debug_report_bug(__FUNCTION__, __LINE__, 'title is empty.');
        } // END - if
 
        // Init variables
@@ -793,8 +804,6 @@ function addExtensionVerboseSqlTable ($title = '', $dashed = '', $switch = false
 
                        // Prepare content for template
                        $content = array(
-                               'width'  => $width,
-                               'dashed' => $dashed,
                                'title'  => $title,
                                'rows'   => $OUT
                        );
@@ -862,7 +871,7 @@ function getExtensionId ($ext_name) {
                incrementStatsEntry('cache_hits');
        } else {
                // Load from database
-               $result = SQL_QUERY_ESC("SELECT `id` AS ext_id FROM `{?_MYSQL_PREFIX?}_extensions` WHERE `ext_name`='%s' LIMIT 1",
+               $result = SQL_QUERY_ESC("SELECT `id` AS `ext_id` FROM `{?_MYSQL_PREFIX?}_extensions` WHERE `ext_name`='%s' LIMIT 1",
                        array($ext_name), __FUNCTION__, __LINE__);
 
                // Is the entry there?
@@ -939,7 +948,7 @@ function doDeactivateExtension ($ext_name) {
        // Is the extension installed?
        if (!isExtensionInstalled($ext_name)) {
                // Non-installed extensions cannot be activated
-               debug_report_bug(__FUNCTION__, __LINE__, 'Tried to deactivate non-installed extension ' . $ext_name);
+               debug_report_bug(__FUNCTION__, __LINE__, 'Tried to deactivate non-installed extension ' . $ext_name . ',getExtensionMode()=' . getExtensionMode());
        } // END - if
 
        // Activate the extension
@@ -952,6 +961,9 @@ function doDeactivateExtension ($ext_name) {
        // Create new task (we ignore the task id here)
        createExtensionDeactivationTask($ext_name);
 
+       // Rebuild cache
+       rebuildCache('extension', 'extension');
+
        // Notify the admin
        sendAdminNotification(
                '{--ADMIN_EXTENSION_DEACTIVATED_SUBJECT--}',
@@ -1008,7 +1020,7 @@ function createNewExtensionTask ($ext_name) {
        // Not installed and do we have created a task for the admin?
        if (($taskId == '0') && (!isExtensionInstalled($ext_name))) {
                // Set default message if ext-foo is missing
-               $message = getMaskedMessage('ADMIN_EXTENSION_TEXT_FILE_MISSING', $ext_name);
+               $message = '{%message,ADMIN_EXTENSION_TEXT_FILE_MISSING=' . $ext_name . '%}';
 
                // Template file
                $FQFN = sprintf("%stemplates/%s/html/ext/ext_%s.tpl",
@@ -1105,7 +1117,7 @@ function addExtensionNotes ($ext_ver) {
        // Is do we have verbose output enabled?
        if ((!isExtensionActive('sql_patches')) || (isVerboseSqlEnabled())) {
                // Update notes found?
-               if (isExtensionUpdateNoteSet($ext_ver)) {
+               if ((isExtensionUpdateNoteSet($ext_ver)) && ($ext_ver != '0.0.0')) {
                        // Update notes found
                        $content = array(
                                'ver'   => $ext_ver,
@@ -1114,12 +1126,21 @@ function addExtensionNotes ($ext_ver) {
 
                        // Reset them
                        setExtensionUpdateNotes('', $ext_ver);
-               } elseif (in_array($ext_ver, array('0.0', '0.0.0'))) {
-                       // Initial release
-                       $content = array(
-                               'ver'   => $ext_ver,
-                               'notes' => '{--INITIAL_RELEASE--}'
-                       );
+               } elseif ($ext_ver == '0.0.0') {
+                       // Is the extension productive?
+                       if (isExtensionProductive(getCurrentExtensionName())) {
+                               // Initial release
+                               $content = array(
+                                       'ver'   => $ext_ver,
+                                       'notes' => '{--INITIAL_RELEASE--}'
+                               );
+                       } else {
+                               // Not productive
+                               $content = array(
+                                       'ver'   => $ext_ver,
+                                       'notes' => '{--DEVELOPER_RELEASE--}'
+                               );
+                       }
                } else {
                        // No update notes found
                        $content = array(
@@ -1206,27 +1227,29 @@ function isExtensionDeprecated () {
 
 // Setter for EXT_UPDATE_DEPENDS flag
 function addExtensionDependency ($updateDepends) {
-       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'currName=' . getCurrentExtensionName() . '/' . $updateDepends . ' - ENTERED!');
        // Is the update depency empty? (NEED TO BE FIXED!)
+       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'currName=' . getCurrentExtensionName() . '/' . $updateDepends . ',extensionMode=' . getExtensionMode() . ' - ENTERED!');
        if (empty($updateDepends)) {
                // Please report this bug!
                debug_report_bug(__FUNCTION__, __LINE__, 'updateDepends is empty: currentExtension=' . getCurrentExtensionName());
        } // END - if
 
        // Is it not yet added?
-       /* Only for debugging!
        if ((isset($updateDepends, $GLOBALS['ext_running_updates'][getCurrentExtensionName()])) && (in_array($updateDepends, getExtensionUpdatesRunning()))) {
-               // Double-adding isn't fine, too
-               debug_report_bug(__FUNCTION__, __LINE__, '() called twice: updateDepends=' . $updateDepends . ',currentExtension=' . getCurrentExtensionName());
+               /*
+                * Double-adding happens when the extension and an update of the same
+                * extension requires the same other extension again.
+                */
+               logDebugMessage(__FUNCTION__, __LINE__, 'updateDepends=' . $updateDepends . ',extensionMode=' . getExtensionMode() . ',currentExtension=' . getCurrentExtensionName() . ' - called twice.');
+               return;
        } // END - if
-       */
 
        // Add it to the list of extension update depencies map
        $GLOBALS['ext_update_depends'][getCurrentExtensionName()][] = (string) $updateDepends;
 
        // Remember it in the list of running updates
        $GLOBALS['ext_running_updates'][getCurrentExtensionName()][] = $updateDepends;
-       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'currName=' . getCurrentExtensionName() . '/' . $updateDepends . ' - EXIT!');
+       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'currName=' . getCurrentExtensionName() . '/' . $updateDepends . ',extensionMode=' . getExtensionMode() . ' - EXIT!');
 }
 
 // Getter for running updates
@@ -1283,8 +1306,9 @@ function isExtensionUpdateDependenciesInitialized () {
 }
 
 // Checks wether an update is already running for given extension
-function isExtensionUpdateRunning ($ext_name) {
+function isExtensionUpdateRunning ($ext_name, $ignoreDependencies = false) {
        // Current and given extensions means whole array
+       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'currentExtension=' . getCurrentExtensionName() . ',ext_name=' . $ext_name . ',ignoreDependencies=' . intval($ignoreDependencies) . ' - ENTERED!');
        if ($ext_name == getCurrentExtensionName()) {
                // Default is not found
                $isRunning = false;
@@ -1292,16 +1316,17 @@ function isExtensionUpdateRunning ($ext_name) {
                // Walk through whole array
                foreach ($GLOBALS['ext_running_updates'] as $ext1=>$depends) {
                        // Is it found?
-                       if (($ext1 == $ext_name) || ($isRunning === true)) {
-                               // found
-                               logDebugMessage(__FUNCTION__, __LINE__, 'ext1=' . $ext1 . ',ext_name=' . $ext_name . ',isRunning=' . intval($isRunning));
+                       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'ext1=' . $ext1 . ',ext_name=' . $ext_name . ',depends=' . print_r($depends, true));
+                       if (($ext1 == $ext_name) || ((in_array($ext_name, $depends)) && ($ignoreDependencies === false))) {
+                               // Found
                                $isRunning = true;
+                               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'ext1=' . $ext1 . ',ext_name=' . $ext_name . ',isRunning=true - FOUND!');
                                break;
                        } // END - if
                } // END - foreach
 
                // Return result
-               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'currentExtension=' . getCurrentExtensionName() . ',ext_name=' . $ext_name . ', isRunning=' . intval($isRunning));
+               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'currentExtension=' . getCurrentExtensionName() . ',ext_name=' . $ext_name . ',ignoreDependencies=' . intval($ignoreDependencies) . ', isRunning=' . intval($isRunning) . ' - ALT-EXIT!');
                return $isRunning;
        } // END - if
 
@@ -1309,7 +1334,7 @@ function isExtensionUpdateRunning ($ext_name) {
        $isRunning = ((isExtensionUpdateDependenciesInitialized()) && (in_array($ext_name, getExtensionRunningUpdates())));
 
        // Return it
-       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'currentExtension=' . getCurrentExtensionName() . ',ext_name=' . $ext_name . ', isRunning=' . intval($isRunning));
+       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'currentExtension=' . getCurrentExtensionName() . ',ext_name=' . $ext_name . ',ignoreDependencies=' . intval($ignoreDependencies) . ', isRunning=' . intval($isRunning) . ' - EXIT!');
        return $isRunning;
 }
 
@@ -1324,19 +1349,19 @@ function initExtensionRuningUpdates () {
 
 // Getter for EXT_UPDATE_DEPENDS flag
 function getExtensionUpdateDependencies () {
-       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, "currName=".getCurrentExtensionName());
+       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'currName=' . getCurrentExtensionName());
        return $GLOBALS['ext_update_depends'][getCurrentExtensionName()];
 }
 
 // Getter for next iterator depency
 function getExtensionUpdateDependenciesIterator () {
-       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, "currName=".getCurrentExtensionName());
+       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'currName=' . getCurrentExtensionName());
        return ($GLOBALS['ext_update_depends'][getCurrentExtensionName()][getExtensionUpdateIterator()]);
 }
 
 // Counter for extension update depencies
 function countExtensionUpdateDependencies () {
-       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, "currName=".getCurrentExtensionName());
+       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'currName=' . getCurrentExtensionName());
        return count($GLOBALS['ext_update_depends'][getCurrentExtensionName()]);
 }
 
@@ -1357,7 +1382,7 @@ function removeExtensionDependency ($ext_name) {
 
 // Init iterator for update depencies
 function initExtensionUpdateIterator () {
-       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, "currName=".getCurrentExtensionName());
+       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'currName=' . getCurrentExtensionName());
        $GLOBALS['ext_depend_iterator'][getCurrentExtensionName()] = '0';
 }
 
@@ -1367,23 +1392,23 @@ function getExtensionUpdateIterator () {
        if (!isset($GLOBALS['ext_depend_iterator'][getCurrentExtensionName()])) initExtensionUpdateIterator();
 
        // Return it
-       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, "currName=".getCurrentExtensionName().'/'.$GLOBALS['ext_depend_iterator'][getCurrentExtensionName()]);
+       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'currName=' . getCurrentExtensionName().'/'.$GLOBALS['ext_depend_iterator'][getCurrentExtensionName()]);
        return $GLOBALS['ext_depend_iterator'][getCurrentExtensionName()];
 }
 
 // Increments the update iterator
 function incrementExtensionUpdateIterator () {
-       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, "currName=".getCurrentExtensionName());
+       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'currName=' . getCurrentExtensionName());
        $GLOBALS['ext_depend_iterator'][getCurrentExtensionName()]++;
 }
 
 // Setter for EXT_REPORTS_FAILURE flag
-function setExtensionReportsFailure ($reportsFailure) {
+function enableExtensionReportingFailure ($reportsFailure = false) {
        $GLOBALS['ext_reports_failure'] = (bool) $reportsFailure;
 }
 
 // Getter for EXT_REPORTS_FAILURE flag
-function getExtensionReportsFailure () {
+function isExtensionReportingFailure () {
        return $GLOBALS['ext_reports_failure'];
 }
 
@@ -1399,8 +1424,8 @@ function getExtensionVersionHistory () {
 
 // Setter for EXT_UPDATE_NOTES
 function setExtensionUpdateNotes ($updateNotes, $ext_ver = '') {
-       // . '/' . getCurrentExtensionVersion()
-       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'getCurrentExtensionName()=' . getCurrentExtensionName() . ',getExtensionMode()=' . getExtensionMode() . ',ext_ver=' . $ext_ver . ',updateNotes()=' . strlen($updateNotes));
+       //
+       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'getCurrentExtensionName()=' . getCurrentExtensionName() . ',getExtensionMode()=' . getExtensionMode() . ',ext_ver=' . $ext_ver . '/' . getCurrentExtensionVersion() . ',updateNotes()=' . strlen($updateNotes));
        if (empty($ext_ver)) {
                $GLOBALS['ext_update_notes'][getCurrentExtensionName()][getCurrentExtensionVersion()] = (string) $updateNotes;
        } else {
@@ -1578,7 +1603,7 @@ function getExtensionMode () {
 
 // Setter for dry-run
 function enableExtensionDryRun ($dry_run = true) {
-       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'getCurrentExtensionName()='.getCurrentExtensionName().',dry='.intval($dry_run));
+       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'getCurrentExtensionName()='.getCurrentExtensionName().',dry_run='.intval($dry_run));
        $GLOBALS['ext_dry_run'] = (bool) $dry_run;
 }
 
@@ -1630,28 +1655,29 @@ function removeExtensionFromArray () {
                        } // END - if
                }
        } // END - foreach
+
+       // Remove from other caches as well
+       unset($GLOBALS['ext_is_installed'][$ext_name]);
+       unset($GLOBALS['loaded_extension'][$ext_name]);
 }
 
 // "Getter" for 'extension has a CSS file' (with same name, of course)
 function getExtensionHasCss () {
-       // Default is no CSS
-       $hasCss = 'N';
-
-       // Construct FQFN for check
-       $FQFN = sprintf("%stheme/%s/css/%s.css",
-               getPath(),
-               getCurrentTheme(),
-               getCurrentExtensionName()
-       );
+       // Do we have cache?
+       if (!isset($GLOBALS[__FUNCTION__][getCurrentExtensionName()][getCurrentTheme()])) {
+               // Construct FQFN for check
+               $FQFN = sprintf("%stheme/%s/css/%s.css",
+                       getPath(),
+                       getCurrentTheme(),
+                       getCurrentExtensionName()
+               );
 
-       // Is it there?
-       if (isFileReadable($FQFN)) {
-               // Readable, so it is there...
-               $hasCss = 'Y';
+               // Is it there?
+               $GLOBALS[__FUNCTION__][getCurrentExtensionName()][getCurrentTheme()] = convertBooleanToYesNo(isFileReadable($FQFN));
        } // END - if
 
        // Return it
-       return $hasCss;
+       return $GLOBALS[__FUNCTION__][getCurrentExtensionName()][getCurrentTheme()];
 }
 
 // Checks wether the given extension has a language file
@@ -1661,25 +1687,16 @@ function ifExtensionHasLanguageFile ($ext_name) {
                // Count cache hits
                incrementStatsEntry('cache_hits');
        } else {
-               // Not readable is default
-               $readable = 'N';
-
-               // Is the language file readable for this extension?
-               if (isLanguageIncludeReadable($ext_name)) {
-                       // Readable
-                       $readable = 'Y';
-               } // END - if
-
-               // Put it in cache
-               $GLOBALS['cache_array']['extension']['ext_lang'][$ext_name] = $readable;
+               // Determine it and put it in cache
+               $GLOBALS['cache_array']['extension']['ext_lang'][$ext_name] = convertBooleanToYesNo(isLanguageIncludeReadable($ext_name));
        }
 
        // Return result
        return ($GLOBALS['cache_array']['extension']['ext_lang'][$ext_name] == 'Y');
 }
 
-// Load an extension's include file
-function loadExtensionInclude () {
+// Load current extension's include file
+function loadCurrentExtensionInclude () {
        // Is it readable?
        if (!isExtensionIncludeReadable()) {
                // Not readable
@@ -1696,7 +1713,9 @@ function loadExtensionInclude () {
 // Checks wether an extension is readable
 function isExtensionIncludeReadable ($ext_name = '') {
        // If empty, use current
-       if (empty($ext_name)) $ext_name = getCurrentExtensionName();
+       if (empty($ext_name)) {
+               $ext_name = getCurrentExtensionName();
+       } // END - if
 
        // Array found?
        if (!isset($GLOBALS['ext_inc_readable'][$ext_name])) {
@@ -1725,15 +1744,10 @@ function isExtensionFunctionFileReadable ($ext_name) {
                $funcsInclude = sprintf("inc/libs/%s_functions.php", $ext_name);
 
                // Is this include there?
-               if ((isFileReadable($funcsInclude)) && (!isExtensionLibraryLoaded($ext_name)) && (getExtensionMode() == 'test')) {
-                       // Cache it!
-                       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'ext_name=' . $ext_name . ',ext_func=Y - FOUND!');
-                       $GLOBALS['cache_array']['extension']['ext_func'][$ext_name] = 'Y';
-               } else {
-                       // Cache it!
-                       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'ext_name=' . $ext_name . ',ext_func=N - NOT FOUND!');
-                       $GLOBALS['cache_array']['extension']['ext_func'][$ext_name] = 'N';
-               }
+               $isIncludeFound = ((isFileReadable($funcsInclude)) && (!isExtensionLibraryLoaded($ext_name)) && (getExtensionMode() == 'test'));
+
+               // And put in cache, converted
+               $GLOBALS['cache_array']['extension']['ext_func'][$ext_name] = convertBooleanToYesNo($isIncludeFound);
        }
 
        // Return result
@@ -1742,11 +1756,16 @@ function isExtensionFunctionFileReadable ($ext_name) {
 }
 
 // Adds a CREATE TABLE statement if the requested table is not there
-function addCreateTableSql ($tableName, $sql) {
+function addCreateTableSql ($tableName, $sql, $comment) {
        // Is the table not there?
        if (!isSqlTableCreated($tableName)) {
                // Is not found, so add it
-               addExtensionSql('CREATE TABLE `{?_MYSQL_PREFIX?}_' . $tableName . '` ' . $sql);
+               addExtensionSql('CREATE TABLE
+       `{?_MYSQL_PREFIX?}_' . $tableName . '` (' . $sql . ')
+ENGINE = {?_TABLE_TYPE?}
+CHARACTER SET utf8
+COLLATE utf8_general_ci
+COMMENT ' . "'" . $comment . "'");
        } else {
                // Is already there, which should not happen
                debug_report_bug(__FUNCTION__, __LINE__, 'The table ' . $tableName . ' is already created which should not happen.');
@@ -1773,7 +1792,7 @@ function addAdminMenuSql ($action, $what, $title, $descr, $sort) {
                // Is what null?
                if (is_null($what)) {
                        // Add main menu
-                       $sql = sprintf("INSERT INTO `{?_MYSQL_PREFIX?}_admin_menu` (`action`,`what`,`title`,`descr`,`sort`) VALUES('%s',NULL,'%s','%s',%s)",
+                       $sql = sprintf("INSERT INTO `{?_MYSQL_PREFIX?}_admin_menu` (`action`,`what`,`title`,`descr`,`sort`) VALUES ('%s',NULL,'%s','%s',%s)",
                                $action,
                                $title,
                                $descr,
@@ -1781,7 +1800,7 @@ function addAdminMenuSql ($action, $what, $title, $descr, $sort) {
                        );
                } else {
                        // Add sub menu
-                       $sql = sprintf("INSERT INTO `{?_MYSQL_PREFIX?}_admin_menu` (`action`,`what`,`title`,`descr`,`sort`) VALUES('%s','%s','%s','%s',%s)",
+                       $sql = sprintf("INSERT INTO `{?_MYSQL_PREFIX?}_admin_menu` (`action`,`what`,`title`,`descr`,`sort`) VALUES ('%s','%s','%s','%s',%s)",
                                $action,
                                $what,
                                $title,
@@ -1799,27 +1818,23 @@ function addAdminMenuSql ($action, $what, $title, $descr, $sort) {
 }
 
 // Adds a guest menu to the SQL queue if the menu entry is not found
-function addGuestMenuSql ($action, $what, $title, $visible, $locked, $sort) {
+function addGuestMenuSql ($action, $what, $title, $sort) {
        // Now check if this menu is there
        if (!isMenuActionValid('guest', $action, $what)) {
                // Is what null?
                if (is_null($what)) {
                        // Add main menu
-                       $sql = sprintf("INSERT INTO `{?_MYSQL_PREFIX?}_guest_menu` (`action`,`what`,`title`,`visible`,`locked`,`sort`) VALUES('%s',NULL,'%s','%s','%s',%s)",
+                       $sql = sprintf("INSERT INTO `{?_MYSQL_PREFIX?}_guest_menu` (`action`,`what`,`title`,`visible`,`locked`,`sort`) VALUES ('%s',NULL,'%s','N','Y',%s)",
                                $action,
                                $title,
-                               $visible,
-                               $locked,
                                bigintval($sort)
                        );
                } else {
                        // Add sub menu
-                       $sql = sprintf("INSERT INTO `{?_MYSQL_PREFIX?}_guest_menu` (`action`,`what`,`title`,`visible`,`locked`,`sort`) VALUES('%s','%s','%s','%s','%s',%s)",
+                       $sql = sprintf("INSERT INTO `{?_MYSQL_PREFIX?}_guest_menu` (`action`,`what`,`title`,`visible`,`locked`,`sort`) VALUES ('%s','%s','%s','N','Y',%s)",
                                $action,
                                $what,
                                $title,
-                               $visible,
-                               $locked,
                                bigintval($sort)
                        );
                }
@@ -1828,32 +1843,28 @@ function addGuestMenuSql ($action, $what, $title, $visible, $locked, $sort) {
                addExtensionSql($sql);
        } elseif (isDebugModeEnabled()) {
                // Double menus should be located and fixed!
-               logDebugMessage(__FUNCTION__, __LINE__, sprintf("Double guest menu action=%s,what=%s,title=%s,locked=%s,visible=%s detected.", $action, $what, $title, $locked, $visible));
+               logDebugMessage(__FUNCTION__, __LINE__, sprintf("Double guest menu action=%s,what=%s,title=%s detected.", $action, $what, $title));
        }
 }
 
 // Adds a member menu to the SQL queue if the menu entry is not found
-function addMemberMenuSql ($action, $what, $title, $visible, $locked, $sort) {
+function addMemberMenuSql ($action, $what, $title, $sort) {
        // Now check if this menu is there
        if (!isMenuActionValid('member', $action, $what)) {
                // Is what null?
                if (is_null($what)) {
                        // Add main menu
-                       $sql = sprintf("INSERT INTO `{?_MYSQL_PREFIX?}_member_menu` (`action`,`what`,`title`,`visible`,`locked`,`sort`) VALUES('%s',NULL,'%s','%s','%s',%s)",
+                       $sql = sprintf("INSERT INTO `{?_MYSQL_PREFIX?}_member_menu` (`action`,`what`,`title`,`visible`,`locked`,`sort`) VALUES ('%s',NULL,'%s','N','Y',%s)",
                                $action,
                                $title,
-                               $visible,
-                               $locked,
                                bigintval($sort)
                        );
                } else {
                        // Add sub menu
-                       $sql = sprintf("INSERT INTO `{?_MYSQL_PREFIX?}_member_menu` (`action`,`what`,`title`,`visible`,`locked`,`sort`) VALUES('%s','%s','%s','%s','%s',%s)",
+                       $sql = sprintf("INSERT INTO `{?_MYSQL_PREFIX?}_member_menu` (`action`,`what`,`title`,`visible`,`locked`,`sort`) VALUES ('%s','%s','%s','N','Y',%s)",
                                $action,
                                $what,
                                $title,
-                               $visible,
-                               $locked,
                                bigintval($sort)
                        );
                }
@@ -1862,7 +1873,7 @@ function addMemberMenuSql ($action, $what, $title, $visible, $locked, $sort) {
                addExtensionSql($sql);
        } elseif (isDebugModeEnabled()) {
                // Double menus should be located and fixed!
-               logDebugMessage(__FUNCTION__, __LINE__, sprintf("Double member menu action=%s,what=%s,title=%s,visivle=%s,locked=%s detected.", $action, $what, $title, $visible, $locked));
+               logDebugMessage(__FUNCTION__, __LINE__, sprintf("Double member menu action=%s,what=%s,title=%s detected.", $action, $what, $title));
        }
 }
 
@@ -1873,7 +1884,7 @@ function addSponsorMenuSql ($action, $what, $title, $active, $sort) {
                // Is what null?
                if (is_null($what)) {
                        // Add main menu
-                       $sql = sprintf("INSERT INTO `{?_MYSQL_PREFIX?}_sponsor_menu` (`action`,`what`,`title`,`active`,`sort`) VALUES('%s',NULL,'%s','%s',%s)",
+                       $sql = sprintf("INSERT INTO `{?_MYSQL_PREFIX?}_sponsor_menu` (`action`,`what`,`title`,`active`,`sort`) VALUES ('%s',NULL,'%s','%s',%s)",
                                $action,
                                $title,
                                $active,
@@ -1881,7 +1892,7 @@ function addSponsorMenuSql ($action, $what, $title, $active, $sort) {
                        );
                } else {
                        // Add sub menu
-                       $sql = sprintf("INSERT INTO `{?_MYSQL_PREFIX?}_sponsor_menu` (`action`,`what`,`title`,`active`,`sort`) VALUES('%s','%s','%s','%s',%s)",
+                       $sql = sprintf("INSERT INTO `{?_MYSQL_PREFIX?}_sponsor_menu` (`action`,`what`,`title`,`active`,`sort`) VALUES ('%s','%s','%s','%s',%s)",
                                $action,
                                $what,
                                $title,
@@ -1904,7 +1915,7 @@ function addConfigAddSql ($columnName, $columnSql) {
        if (!isSqlTableColumnFound('{?_MYSQL_PREFIX?}_config', $columnName)) {
                // Not found, so add it
                addExtensionSql('ALTER TABLE `{?_MYSQL_PREFIX?}_config` ADD `' . $columnName . '` ' . $columnSql);
-       } else {
+       } elseif (isDebugModeEnabled()) {
                // Add debug line
                logDebugMessage(__FUNCTION__, __LINE__, 'Configuration entry ' . $columnName . ' already created. columnSql=' . $columnSql);
        }
@@ -1916,7 +1927,7 @@ function addConfigDropSql ($columnName) {
        if (isSqlTableColumnFound('{?_MYSQL_PREFIX?}_config', $columnName)) {
                // Found, so add it
                addExtensionSql('ALTER TABLE `{?_MYSQL_PREFIX?}_config` DROP `' . $columnName . '`');
-       } else {
+       } elseif (isDebugModeEnabled()) {
                // Add debug line, debug_report_bug() would cause some extenion updates fail
                logDebugMessage(__FUNCTION__, __LINE__, 'Configuration entry ' . $columnName . ' not found.');
        }
@@ -1924,14 +1935,8 @@ function addConfigDropSql ($columnName) {
 
 // Change configuration entry for actual extension
 function addConfigChangeSql ($oldColumnName, $newColumnName, $columnSql) {
-       // Is the old column there?
-       if (isSqlTableColumnFound('{?_MYSQL_PREFIX?}_config', $oldColumnName)) {
-               // Found so add it
-               addExtensionSql('ALTER TABLE `{?_MYSQL_PREFIX?}_config` CHANGE `' . $oldColumnName . '` `' . $newColumnName . '` ' . $columnSql);
-       } else {
-               // Add debug line, debug_report_bug() would cause some extenion updates fail
-               logDebugMessage(__FUNCTION__, __LINE__, 'Configuration entry ' . $oldColumnName . ' not found.');
-       }
+       // Add the SQL statement
+       addExtensionSql('ALTER TABLE `{?_MYSQL_PREFIX?}_config` CHANGE `' . $oldColumnName . '` `' . $newColumnName . '` ' . $columnSql);
 }
 
 // Enables/disables productive mode for current extension (used only while
@@ -1939,7 +1944,7 @@ function addConfigChangeSql ($oldColumnName, $newColumnName, $columnSql) {
 // @TODO This should be rewrittten to allow, more development states, e.g. 'planing','alpha','beta','beta2','stable'
 function enableExtensionProductive ($isProductive = true) {
        // Log debug message
-       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, sprintf("ext_name=%s,isProductive=%d", getCurrentExtensionName(), intval($isProductive)));
+       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'ext_name=' . getCurrentExtensionName() . ',isProductive=', intval($isProductive));
 
        // Set it
        $GLOBALS['ext_productive'][getCurrentExtensionName()] = (bool) $isProductive;
@@ -1953,6 +1958,7 @@ function isExtensionProductive ($ext_name = '') {
                // Get current extension name
                $ext_name = getCurrentExtensionName();
        } // END - if
+       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'ext_name=' . $ext_name . ' - ENTERED!');
 
        // Do we have cache?
        if (!isset($GLOBALS[__FUNCTION__][$ext_name])) {
@@ -1966,10 +1972,8 @@ function isExtensionProductive ($ext_name = '') {
                $GLOBALS[__FUNCTION__][$ext_name] = ((isset($GLOBALS['ext_productive'][$ext_name])) && ($GLOBALS['ext_productive'][$ext_name] === true));
        } // END - if
 
-       // Log debug message
-       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, sprintf("ext_name=%s,isProductive=%s", $ext_name, intval($GLOBALS[__FUNCTION__][$ext_name])));
-
        // Return result
+       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'ext_name=' . $ext_name . ',isProductive=', intval($GLOBALS[__FUNCTION__][$ext_name]) . ' - EXIT!');
        return $GLOBALS[__FUNCTION__][$ext_name];
 }
 
@@ -1982,6 +1986,7 @@ function markExtensionAsLoaded ($ext_name) {
        } // END - if
 
        // Mark it
+       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'ext_name=' . $ext_name . ',ext_loaded=true');
        $GLOBALS['ext_loaded']['ext_name'][$ext_name] = true;
 }