]> git.mxchange.org Git - mailer.git/blobdiff - inc/extensions-functions.php
Renamed function so it might be more understandable
[mailer.git] / inc / extensions-functions.php
index f1df6010e5bdc4ea34f18cb27130c9107dd88183..fa35d12e2b4a9f40bc7299f99f502092a161ef7c 100644 (file)
@@ -14,8 +14,6 @@
  * $Date::                                                            $ *
  * $Tag:: 0.2.1-FINAL                                                 $ *
  * $Author::                                                          $ *
- * Needs to be in all Files and every File needs "svn propset           *
- * svn:keywords Date Revision" (autoprobset!) at least!!!!!!            *
  * -------------------------------------------------------------------- *
  * Copyright (c) 2003 - 2009 by Roland Haeder                           *
  * Copyright (c) 2009, 2010 by Mailer Developer Team                    *
@@ -43,9 +41,11 @@ if (!defined('__SECURITY')) {
 } // END - if
 
 // Load the extension and maybe found language and function files.
-function loadExtension ($ext_name, $ext_mode = 'init', $ext_ver = '', $dry_run = false) {
-       // If this happens twice, we need the bug report from you, except for updates/tests
+function loadExtension ($ext_name, $ext_mode, $ext_ver = '0.0', $dry_run = false) {
+       // 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));
        } // END - if
 
@@ -58,17 +58,26 @@ function loadExtension ($ext_name, $ext_mode = 'init', $ext_ver = '', $dry_run =
        // Set current extension name
        setCurrentExtensionName($ext_name);
 
+       // By default all extensions are in productive phase
+       enableExtensionProductive();
+
        if (!empty($ext_ver)) {
                // Set current extension version
                setCurrentExtensionVersion($ext_ver);
        } else {
-               // Set it to 0.0
+               // Set it to 0.0 by default
                setCurrentExtensionVersion('0.0');
 
+               // Is the extension installed?
+               if ((isExtensionInstalled($ext_name)) && ($ext_mode != 'register')) {
+                       // Get extension's version
+                       setCurrentExtensionVersion(getExtensionVersion($ext_name));
+               } // END - if
+
                // In all but test-mode we need these messages to debug! Please report all (together, e.g.)
-               if ($ext_mode != 'test') {
-                       // Log empty versions not in test-mode, but maybe it is fine...
-                       logDebugMessage(__FUNCTION__, __LINE__, 'Extension version is empty, setting to 0.0. ext_name=' . $ext_name . ', ext_mode=' . $ext_mode . ', dry_run=' . intval($dry_run));
+               if (($ext_mode != 'test') && (getCurrentExtensionVersion() == '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
        }
 
@@ -116,7 +125,7 @@ function loadExtension ($ext_name, $ext_mode = 'init', $ext_ver = '', $dry_run =
        if (isExtensionFunctionFileReadable($ext_name)) {
                // Not yet loaded?
                if ((($GLOBALS['cache_array']['extension']['ext_func'][$ext_name] == 'Y') || (!isset($GLOBALS['cache_array']['extension']['ext_func'][$ext_name]))) && (!isset($GLOBALS['ext_loaded']['funcs'][$ext_name]))) {
-                       // Construct FQFN for functions file
+                       // Construct IFN for functions file
                        $funcsInclude = sprintf("inc/libs/%s_functions.php", $ext_name);
 
                        // Mark it as loaded
@@ -125,7 +134,7 @@ function loadExtension ($ext_name, $ext_mode = 'init', $ext_ver = '', $dry_run =
                        // Download functions file
                        loadIncludeOnce($funcsInclude);
                } // END - if
-       } elseif ((!isset($GLOBALS['cache_array']['extension']['ext_func'][$ext_name])) && (isDebugModeEnabled()) && (getOutputMode() == '0') && ($ext_name != 'sql_patches') && (substr($ext_name, 0, 10) != 'admintheme') && (getExtensionMode() == 'test')) {
+       } elseif ((!isset($GLOBALS['cache_array']['extension']['ext_func'][$ext_name])) && (isDebugModeEnabled()) && (isHtmlOutputMode()) && ($ext_name != 'sql_patches') && (substr($ext_name, 0, 10) != 'admintheme') && (getExtensionMode() == 'test')) {
                // No functions file is not so good...
                logDebugMessage(__FUNCTION__, __LINE__, sprintf("NOTICE: Extension %s has no own functions file or we cannot read from it. mode=%s",
                        $ext_name,
@@ -234,7 +243,7 @@ function registerExtension ($ext_name, $taskId, $dry_run = false, $logout = true
 
        // Does this extension exists?
        //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'currName=' . getCurrentExtensionName());
-       if (loadExtension(getCurrentExtensionName(), 'register', '', isExtensionDryRun())) {
+       if (loadExtension(getCurrentExtensionName(), 'register', '0.0', isExtensionDryRun())) {
                // Set current extension name again
                setCurrentExtensionName($ext_name);
 
@@ -284,8 +293,7 @@ function registerExtension ($ext_name, $taskId, $dry_run = false, $logout = true
 
                                                // Reset extension name
                                                setCurrentExtensionName($ext_name);
-                                               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'currName=' . getCurrentExtensionName());
-                                               //* DEBUG: */ debugOutput(getCurrentExtensionName().':<pre>' . print_r($test, true) . '</pre>');
+                                               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'currName=' . getCurrentExtensionName() . ',test=' . intval($test));
                                        } // END - if
                                } elseif ($ext_ver != getCurrentExtensionVersion()) {
                                        // Ok, update this extension now
@@ -325,11 +333,9 @@ function registerExtension ($ext_name, $taskId, $dry_run = false, $logout = true
                setExtensionMode('register');
 
                // Remains true if extension registration reports no failures
-               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'currName=' . getCurrentExtensionName());
-               //* DEBUG: */ debugOutput(getCurrentExtensionName().':<pre>' . print_r($test, true) . '</pre>');
+               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'currName=' . getCurrentExtensionName() . ',test=' . intval($test));
                $test = (($test === true) && (getExtensionReportsFailure() === false));
-               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'currName=' . getCurrentExtensionName());
-               //* DEBUG: */ debugOutput(getCurrentExtensionName().':<pre>' . print_r($test, true) . '</pre>');
+               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'currName=' . getCurrentExtensionName() . ',test=' . intval($test));
 
                // Does everthing before wents ok?
                if ($test === true) {
@@ -341,7 +347,7 @@ function registerExtension ($ext_name, $taskId, $dry_run = false, $logout = true
                                setSqlsArray(getExtensionSqls());
 
                                // Run installation pre-installation filters
-                               runFilterChain('pre_extension_installed', array('dry_run' => isExtensionDryRun()));
+                               runFilterChain('pre_extension_installed', array('dry_run' => isExtensionDryRun(), 'enable_codes' => false));
 
                                // Register extension
                                //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'insert=' . getCurrentExtensionName() . '/' . getCurrentExtensionVersion() . ' - INSERT!');
@@ -366,6 +372,13 @@ function registerExtension ($ext_name, $taskId, $dry_run = false, $logout = true
                                                ), __FUNCTION__, __LINE__);
                                }
 
+                               // Use the insert id as extension id and cache it for early usage
+                               $GLOBALS['cache_array']['extension']['ext_id'][getCurrentExtensionName()] = SQL_INSERTID();
+                               $GLOBALS['cache_array']['extension']['ext_name'][SQL_INSERTID()] = getCurrentExtensionName();
+
+                               // Mark it as installed
+                               $GLOBALS['ext_is_installed'][getCurrentExtensionName()] = true;
+
                                // Remove cache file(s) if extension is active
                                runFilterChain('post_extension_installed', array(
                                        'pool'     => 'extension',
@@ -375,10 +388,7 @@ function registerExtension ($ext_name, $taskId, $dry_run = false, $logout = true
 
                                // Re-init queries and notes
                                initExtensionSqls(true);
-                               initExtensionNotes();
-
-                               // Mark it as installed
-                               $GLOBALS['ext_is_installed'][getCurrentExtensionName()] = true;
+                               initExtensionNotes(true);
 
                                // In normal mode return a true on success
                                $ret = true;
@@ -416,8 +426,7 @@ function registerExtension ($ext_name, $taskId, $dry_run = false, $logout = true
        } // END - if
 
        // Return status code
-       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'currName=' . getCurrentExtensionName() . ',ext_name=' . $ext_name . ' - EXIT!');
-       //* DEBUG: */ debugOutput(getCurrentExtensionName().':<pre>'.print_r($ret, true).'</pre>');
+       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'currName=' . getCurrentExtensionName() . ',ext_name=' . $ext_name . ',test=' . intval($test) . ' - EXIT!');
        return $ret;
 }
 
@@ -440,20 +449,23 @@ function doExtensionSqls ($ext_id, $load_mode) {
        } // END - if
 
        // Init array
-       initExtensionSqls();
+       initExtensionSqls(true);
 
        // By default no SQL has been executed
        $sqlRan = false;
 
        // Load extension in detected mode
-       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, ":ext_name[{$ext_id}]=".getCurrentExtensionName()."");
-       loadExtension(getCurrentExtensionName(), $load_mode, '', false);
+       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'ext_name[' . $ext_id . ']=' . getCurrentExtensionName() . ',load_mode=' . $load_mode);
+       loadExtension(getCurrentExtensionName(), $load_mode, '0.0', false);
 
        // Init these SQLs
        initSqls();
        setSqlsArray(getExtensionSqls());
 
-       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, ":SQLs::count=".countSqls()."");
+       // Debug message
+       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'SQLs::count=' . countSqls());
+
+       // Do we have entries?
        if (isSqlsValid()) {
                // Run SQL commands...
                runFilterChain('run_sqls');
@@ -463,16 +475,16 @@ function doExtensionSqls ($ext_id, $load_mode) {
        runFilterChain('extension_' . $load_mode);
 
        // Remove cache file(s) if extension is active
-       if (((isExtensionActive('cache')) && ((SQL_AFFECTEDROWS() == 1)) || ($sqlRan === true) || ($load_mode == 'activate') || ($load_mode == 'deactivate'))) {
+       if (((isExtensionActive('cache')) && ((!SQL_HASZEROAFFECTED())) || ($sqlRan === true) || ($load_mode == 'activate') || ($load_mode == 'deactivate'))) {
                // Run filters
                runFilterChain('post_extension_run_sql', getCurrentExtensionName());
        } // END - if
 
        // Is this the sql_patches?
-       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, ": id=".$ext_id.",currName=".getCurrentExtensionName().",loadMode=".$load_mode);
+       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'id=' . $ext_id . ',currName=' . getCurrentExtensionName() . ',loadMode=' . $load_mode);
        if ((getCurrentExtensionName() == 'sql_patches') && (($load_mode == 'register') || ($load_mode == 'remove'))) {
                // Then redirect to logout
-               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, ": LOAD!");
+               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, ': LOAD!');
                redirectToUrl('modules.php?module=admin&amp;logout=1&amp;' . $load_mode . '=sql_patches');
        } // END - if
 }
@@ -482,7 +494,7 @@ function isExtensionInstalled ($ext_name) {
        // We don't like empty extension names here
        if (empty($ext_name)) {
                // Please fix them all
-               debug_report_bug(__FUNCTION__.': ext_name is empty.');
+               debug_report_bug(__FUNCTION__, __LINE__, 'ext_name is empty.');
        } // END - if
 
        // By default non is installed
@@ -504,6 +516,9 @@ function isExtensionInstalled ($ext_name) {
                // 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);
 
@@ -523,8 +538,16 @@ function isExtensionInstalled ($ext_name) {
 
 // Check if given extension is active
 function isExtensionActive ($ext_name) {
-       // Extensions are all inactive during installation
-       if ((isInstallationPhase()) || (empty($ext_name))) return false;
+       if (isInstallationPhase()) {
+               // Extensions are all inactive during installation
+               return false;
+       } elseif (empty($ext_name)) {
+               // Empty extension names must befixed
+               debug_report_bug(__FUNCTION__, __LINE__, 'Empty extension name provided.');
+       } elseif (!isExtensionInstalled($ext_name)) {
+               // Not installed extensions are always inactive
+               return false;
+       }
 
        // Not active is the default
        $data['ext_active'] = 'N';
@@ -532,7 +555,7 @@ function isExtensionActive ($ext_name) {
        // Check cache
        if (isset($GLOBALS['cache_array']['extension']['ext_active'][$ext_name])) {
                // Load from cache
-               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, "CACHE! ext_name={$ext_name}");
+               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'CACHE! ext_name=' . $ext_name);
                $data['ext_active'] = $GLOBALS['cache_array']['extension']['ext_active'][$ext_name];
 
                // Count cache hits
@@ -541,7 +564,7 @@ function isExtensionActive ($ext_name) {
                // @TODO Extension is loaded, what next?
                debug_report_bug(__FUNCTION__, __LINE__, 'LOADED:' . $ext_name);
        } elseif (($ext_name == 'cache') || (!isExtensionInstalled('cache'))) {
-               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, "DB! ext_name={$ext_name}");
+               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'DB! ext_name=' . $ext_name);
                // Load from database
                $result = SQL_QUERY_ESC("SELECT `ext_active` FROM `{?_MYSQL_PREFIX?}_extensions` WHERE `ext_name`='%s' LIMIT 1",
                        array($ext_name), __FUNCTION__, __LINE__);
@@ -556,16 +579,16 @@ function isExtensionActive ($ext_name) {
                SQL_FREERESULT($result);
 
                // Write cache array
-               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, "ext_name=".$ext_name."[DB]: ".$data['ext_active']."");
+               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'ext_name=' . $ext_name . '[DB]: ' . $data['ext_active']);
                $GLOBALS['cache_array']['extension']['ext_active'][$ext_name] = $data['ext_active'];
        } else {
                // Extension not active!
-               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, "ext_name=".$ext_name.": Not active!");
+               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'ext_name=' . $ext_name . ': Not active!');
                $GLOBALS['cache_array']['extension']['ext_active'][$ext_name] = 'N';
        }
 
        // Debug message
-       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, "ext_name=".$ext_name.",active=".$data['ext_active']."");
+       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'ext_name=' . $ext_name . ',active=' . $data['ext_active']);
 
        // Is this extension activated? (For admins we always have active extensions...)
        return ($data['ext_active'] == 'Y');
@@ -584,7 +607,7 @@ function getExtensionVersion ($ext_name, $force = false) {
 
        // Extensions are all inactive during installation
        if (isInstallationPhase()) return '';
-       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, ": ext_name=".$ext_name."");
+       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'ext_name=' . $ext_name);
 
        // Is the cache written?
        if (isset($GLOBALS['cache_array']['extension']['ext_version'][$ext_name])) {
@@ -594,7 +617,7 @@ function getExtensionVersion ($ext_name, $force = false) {
 
                // Count cache hits
                incrementStatsEntry('cache_hits');
-       } elseif ((!isCacheInstanceValid()) || (isset($GLOBALS['cache_array']['extension'])) || (getOutputMode() != 0)) {
+       } elseif ((!isCacheInstanceValid()) || (isset($GLOBALS['cache_array']['extension'])) || (!isHtmlOutputMode())) {
                // 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__);
@@ -623,7 +646,7 @@ function getExtensionVersion ($ext_name, $force = false) {
        } // END - if
 
        // Return result
-       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, ": ret={$data['ext_version']}");
+       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'ext_version=' . $data['ext_version']);
        return $data['ext_version'];
 }
 
@@ -713,7 +736,7 @@ function updateExtension ($ext_name, $ext_ver, $dry_run = false) {
                setSqlsArray(getExtensionSqls());
 
                // Run SQLs
-               runFilterChain('run_sqls', array('dry_run' => isExtensionDryRun()));
+               runFilterChain('run_sqls', array('dry_run' => isExtensionDryRun(), 'enable_codes' => false));
 
                if (isExtensionDryRun() === false) {
                        // Run filters on success extension update
@@ -734,7 +757,7 @@ function addExtensionVerboseSqlTable ($title = '', $dashed = '', $switch = false
        $OUT = '';
 
        // Do we have queries?
-       if ((isExtensionInstalledAndNewer('sql_patches', '0.0.7')) && (getConfig('verbose_sql') == 'Y')) {
+       if (isVerboseSqlEnabled()) {
                // Do we have entries?
                if (countExtensionSqls() > 0) {
                        // Init counter
@@ -751,7 +774,7 @@ function addExtensionVerboseSqlTable ($title = '', $dashed = '', $switch = false
                                                // Prepare output for template
                                                $content = array(
                                                        'i'   => ($idx + 1),
-                                                       'sql' => $sql
+                                                       'sql' => str_replace('{', '&#123;', str_replace('}', '&#125;', encodeEntities($sql)))
                                                );
 
                                                // Load row template
@@ -892,38 +915,44 @@ function isExtensionIdValid ($ext_id) {
 
 // Activate given extension
 function doActivateExtension ($ext_name) {
+       // Is the extension installed?
+       if (!isExtensionInstalled($ext_name)) {
+               // Non-installed extensions cannot be activated
+               debug_report_bug(__FUNCTION__, __LINE__, 'Tried to activate non-installed extension ' . $ext_name);
+       } // END - if
+
        // Activate the extension
        SQL_QUERY_ESC("UPDATE `{?_MYSQL_PREFIX?}_extensions` SET `ext_active`='Y' WHERE `ext_name`='%s' LIMIT 1",
                array($ext_name), __FUNCTION__, __LINE__);
 
-       // Extension has been activated?
-       if (SQL_AFFECTEDROWS() == 1) {
-               // Then run all queries
-               doExtensionSqls(getExtensionId($ext_name), 'activate');
-       } // END - if
+       // Then run all queries
+       doExtensionSqls(getExtensionId($ext_name), 'activate');
 }
 
 // Deactivate given extension
-function doDeactivateExtension($ext_name) {
+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);
+       } // END - if
+
        // Activate the extension
        SQL_QUERY_ESC("UPDATE `{?_MYSQL_PREFIX?}_extensions` SET `ext_active`='N' WHERE `ext_name`='%s' LIMIT 1",
                array($ext_name), __FUNCTION__, __LINE__);
 
-       // Extension has been activated?
-       if (SQL_AFFECTEDROWS() == 1) {
-               // Then run all queries
-               doExtensionSqls(getExtensionId($ext_name), 'deactivate');
+       // Then run all queries
+       doExtensionSqls(getExtensionId($ext_name), 'deactivate');
 
-               // Create new task (we ignore the task id here)
-               createExtensionDeactivationTask($ext_name);
+       // Create new task (we ignore the task id here)
+       createExtensionDeactivationTask($ext_name);
 
-               // Notify the admin
-               sendAdminNotification(
-                       '{--ADMIN_EXTENSION_DEACTIVATED_SUBJECT--}',
-                       'admin_extension_deactivated',
-                       array('ext_name' => $ext_name)
-               );
-       } // END - if
+       // Notify the admin
+       sendAdminNotification(
+               '{--ADMIN_EXTENSION_DEACTIVATED_SUBJECT--}',
+               'admin_extension_deactivated',
+               array('ext_name' => $ext_name)
+       );
 }
 
 // Checks wether the extension is older than given
@@ -978,7 +1007,7 @@ function createNewExtensionTask ($ext_name) {
 
                // Template file
                $tpl = sprintf("%stemplates/%s/html/ext/ext_%s.tpl",
-                       getConfig('PATH'),
+                       getPath(),
                        getLanguage(),
                        $ext_name
                );
@@ -1018,57 +1047,6 @@ function createExtensionDeactivationTask ($ext_name) {
        return $taskId;
 }
 
-// Checks if the module has a menu
-function ifModuleHasMenu ($mod, $forceDb = false) {
-       // All is false by default
-       $ret = false;
-
-       // Extension installed and newer than or has version 0.1.2?
-       if (isExtensionInstalledAndNewer('cache', '0.1.2')) {
-               // Cache version is okay, so let's check the cache!
-               if (isset($GLOBALS['cache_array']['modules']['has_menu'][$mod])) {
-                       // Check module cache and count hit
-                       $ret = ($GLOBALS['cache_array']['modules']['has_menu'][$mod] == 'Y');
-                       incrementStatsEntry('cache_hits');
-               } elseif (isset($GLOBALS['cache_array']['extension']['ext_menu'][$mod])) {
-                       // Check cache and count hit
-                       $ret = ($GLOBALS['cache_array']['extension']['ext_menu'][$mod] == 'Y');
-                       incrementStatsEntry('cache_hits');
-               } else {
-                       // Admin/guest/member/sponsor modules have always a menu!
-                       $ret = in_array($mod, array('admin', 'index', 'login', 'sponsor'));
-               }
-       } elseif ((isExtensionInstalledAndNewer('sql_patches', '0.3.6')) && ((!isExtensionActive('cache')) || ($forceDb === true))) {
-               // Check database for entry
-               $result = SQL_QUERY_ESC("SELECT `has_menu` FROM `{?_MYSQL_PREFIX?}_mod_reg` WHERE `module`='%s' LIMIT 1",
-                       array($mod), __FUNCTION__, __LINE__);
-
-               // Entry found?
-               if (SQL_NUMROWS($result) == 1) {
-                       // Load "has_menu" column
-                       $data = SQL_FETCHARRAY($result);
-
-                       // Fake cache... ;-)
-                       $GLOBALS['cache_array']['extension']['ext_menu'][$mod] = $data['has_menu'];
-
-                       // Does it have a menu?
-                       $ret = ($data['has_menu'] == 'Y');
-               } // END  - if
-
-               // Free memory
-               SQL_FREERESULT($result);
-       } elseif (!isExtensionInstalled('sql_patches')) {
-               // No sql_patches installed, so maybe in admin/guest/member/sponsor area or no admin registered?
-               $ret = in_array($mod, array('admin', 'index', 'login', 'sponsor')); // Then there is a menu!
-       } else {
-               // Unsupported state!
-               logDebugMessage(__FUNCTION__, __LINE__, 'This should never be reached.');
-       }
-
-       // Return status
-       return $ret;
-}
-
 // Determines the task id for given extension
 function determineExtensionTaskId ($ext_name) {
        // Default is not found
@@ -1120,7 +1098,7 @@ function addExtensionNotes ($ext_ver) {
        $content = array();
 
        // Is do we have verbose output enabled?
-       if ((!isExtensionActive('sql_patches')) || (getConfig('verbose_sql') == 'Y')) {
+       if ((!isExtensionActive('sql_patches')) || (isVerboseSqlEnabled())) {
                // Update notes found?
                if (isExtensionUpdateNoteSet($ext_ver)) {
                        // Update notes found
@@ -1222,8 +1200,8 @@ function isExtensionDeprecated () {
 }
 
 // Setter for EXT_UPDATE_DEPENDS flag
-function addExtensionUpdateDependency ($updateDepends) {
-       //* DEBUG */ logDebugMessage(__FUNCTION__, __LINE__, 'currName=' . getCurrentExtensionName() . '/' . $updateDepends . ' - ENTERED!');
+function addExtensionDependency ($updateDepends) {
+       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'currName=' . getCurrentExtensionName() . '/' . $updateDepends . ' - ENTERED!');
        // Is the update depency empty? (NEED TO BE FIXED!)
        if (empty($updateDepends)) {
                // Please report this bug!
@@ -1231,7 +1209,7 @@ function addExtensionUpdateDependency ($updateDepends) {
        } // END - if
 
        // Is it not yet added?
-       /* DEBUG:
+       /* 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());
@@ -1243,7 +1221,7 @@ function addExtensionUpdateDependency ($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 . ' - EXIT!');
 }
 
 // Getter for running updates
@@ -1358,7 +1336,7 @@ function countExtensionUpdateDependencies () {
 }
 
 // Removes given extension from update denpency list
-function removeExtensionUpdateDependency ($ext_name) {
+function removeExtensionDependency ($ext_name) {
        // Look it up
        $key = array_search($ext_name, getExtensionUpdateDependencies());
 
@@ -1417,7 +1395,7 @@ function getExtensionVersionHistory () {
 // Setter for EXT_UPDATE_NOTES
 function setExtensionUpdateNotes ($updateNotes, $ext_ver = '') {
        // . '/' . getCurrentExtensionVersion()
-       //* DEBUG: */ debug_report_bug(__FUNCTION__.':' . getCurrentExtensionName() . '/' . getExtensionMode() . '/' . $ext_ver . '=' . $updateNotes);
+       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'getCurrentExtensionName()=' . getCurrentExtensionName() . ',getExtensionMode()=' . getExtensionMode() . ',ext_ver=' . $ext_ver . ',updateNotes()=' . strlen($updateNotes));
        if (empty($ext_ver)) {
                $GLOBALS['ext_update_notes'][getCurrentExtensionName()][getCurrentExtensionVersion()] = (string) $updateNotes;
        } else {
@@ -1436,9 +1414,9 @@ function isExtensionUpdateNoteSet ($ext_ver) {
 }
 
 // Init extension notice
-function initExtensionNotes () {
+function initExtensionNotes ($force = false) {
        // Is it already initialized?
-       if (isset($GLOBALS['ext_notes'][getCurrentExtensionName()])) {
+       if (($force === false) && (isset($GLOBALS['ext_notes'][getCurrentExtensionName()]))) {
                // This is mostly not wanted, so please report it
                debug_report_bug(__FUNCTION__, __LINE__, 'ext_notes already set for extension ' . getCurrentExtensionName());
        } // END - if
@@ -1477,7 +1455,7 @@ function getCurrentExtensionName () {
 // Init SQLs array for current extension
 function initExtensionSqls ($force = false) {
        // Auto-init the array or if forced
-       if ((!isset($GLOBALS['ext_sqls'][getCurrentExtensionName()])) || ($force === true)) {
+       if (($force === true) || (!isset($GLOBALS['ext_sqls'][getCurrentExtensionName()]))) {
                // Set the array
                $GLOBALS['ext_sqls'][getCurrentExtensionName()] = array();
 
@@ -1489,6 +1467,7 @@ function initExtensionSqls ($force = false) {
 // Adds SQLs to the SQLs array but "assigns" it with current extension name
 function addExtensionSql ($sql) {
        // Add it
+       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'ext_name=' . getCurrentExtensionName() . ',ext_version=' . getCurrentExtensionVersion() . ',sql=' . $sql);
        $GLOBALS['ext_sqls'][getCurrentExtensionName()][getCurrentExtensionVersion()][] = $sql;
 }
 
@@ -1567,19 +1546,19 @@ function redirectOnUninstalledExtension ($ext_name) {
 // Filter for initialization of all extensions by loading them in 'init' mode
 function FILTER_INIT_EXTENSIONS () {
        // Do we have some entries?
-       //* DEBUG */ print __FUNCTION__.': ENTRY!<br />';
+       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'ENTRY!');
        if (isset($GLOBALS['cache_array']['extension']['ext_name'])) {
                // Load all found extensions if found
-               //* DEBUG */ print __FUNCTION__.': CACHE - START!<br />';
+               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'CACHE - START!');
                foreach ($GLOBALS['cache_array']['extension']['ext_name'] as $key => $ext_name) {
                        // Load it
-                       //* DEBUG */ print __FUNCTION__.': '.$ext_name.' - START<br />';
+                       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'ext_name='.$ext_name.' - START');
                        loadExtension($ext_name, 'init', getExtensionVersion($ext_name));
-                       //* DEBUG */ print __FUNCTION__.': '.$ext_name.' - END<br />';
+                       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'ext_name='.$ext_name.' - END');
                } // END - foreach
-               //* DEBUG */ print __FUNCTION__.': CACHE - END!<br />';
+               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'CACHE - END!');
        } // END - if
-       //* DEBUG */ print __FUNCTION__.': EXIT!<br />';
+       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'EXIT!');
 }
 
 // Setter for extension mode
@@ -1594,7 +1573,7 @@ function getExtensionMode () {
 
 // Setter for dry-run
 function enableExtensionDryRun ($dry_run = true) {
-       //* DEBUG: */ debugOutput(__FUNCTION__.': '.getCurrentExtensionName().'='.intval($dry_run));
+       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'getCurrentExtensionName()='.getCurrentExtensionName().',dry='.intval($dry_run));
        $GLOBALS['ext_dry_run'] = (bool) $dry_run;
 }
 
@@ -1655,7 +1634,7 @@ function getExtensionHasCss () {
 
        // Construct FQFN for check
        $FQFN = sprintf("%stheme/%s/css/%s.css",
-               getConfig('PATH'),
+               getPath(),
                getCurrentTheme(),
                getCurrentExtensionName()
        );
@@ -1672,14 +1651,8 @@ function getExtensionHasCss () {
 
 // Checks wether the given extension has a language file
 function ifExtensionHasLanguageFile ($ext_name) {
-       // Default is no language file
-       $hasLanguage = false;
-
        // Do we have cache?
        if (isset($GLOBALS['cache_array']['extension']['ext_lang'][$ext_name])) {
-               // Then use it
-               $hasLanguage = ($GLOBALS['cache_array']['extension']['ext_lang'][$ext_name] == 'Y');
-
                // Count cache hits
                incrementStatsEntry('cache_hits');
        } else {
@@ -1693,7 +1666,7 @@ function ifExtensionHasLanguageFile ($ext_name) {
                } // END - if
 
                // Put it in cache
-               $GLOBALS['cache_array']['extension']['ext_lang'][$ext_name] = 'Y';
+               $GLOBALS['cache_array']['extension']['ext_lang'][$ext_name] = $readable;
        }
 
        // Return result
@@ -1736,24 +1709,30 @@ function isExtensionIncludeReadable ($ext_name = '') {
 
 // Checks if an extension's function file is readable
 function isExtensionFunctionFileReadable ($ext_name) {
+       // Is cache there?
+       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'ext_name=' . $ext_name);
        if (isset($GLOBALS['cache_array']['extension']['ext_func'][$ext_name])) {
                // Just count cache hits
+               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'ext_name=' . $ext_name . ',ext_func=' . $GLOBALS['cache_array']['extension']['ext_func'][$ext_name] .' - CACHE!');
                incrementStatsEntry('cache_hits');
        } else {
-               // Construct FQFN for functions file
+               // Construct IFN for functions file
                $funcsInclude = sprintf("inc/libs/%s_functions.php", $ext_name);
 
                // Is this include there?
                if ((isFileReadable($funcsInclude)) && (!isset($GLOBALS['ext_loaded']['funcs'][$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';
                }
        }
 
        // Return result
+       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'ext_name=' . $ext_name . ',ext_func=' . $GLOBALS['cache_array']['extension']['ext_func'][$ext_name]);
        return ($GLOBALS['cache_array']['extension']['ext_func'][$ext_name] == 'Y');
 }
 
@@ -1785,7 +1764,7 @@ function addAdminMenuSql ($action, $what, $title, $descr, $sort) {
                addExtensionSql($sql);
        } elseif (isDebugModeEnabled()) {
                // Double menus should be located and fixed!
-               logDebugMessage(__FUNCTION__, __LINE__, sprintf("Double admin menu action=%s, what=%s detected.", $action, $what));
+               logDebugMessage(__FUNCTION__, __LINE__, sprintf("Double admin menu action=%s,what=%s,title=%s detected.", $action, $what, $title));
        }
 }
 
@@ -1819,7 +1798,7 @@ 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 detected.", $action, $what));
+               logDebugMessage(__FUNCTION__, __LINE__, sprintf("Double guest menu action=%s,what=%s,title=%s,locked=%s,visible=%s detected.", $action, $what, $title, $locked, $visible));
        }
 }
 
@@ -1853,7 +1832,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 detected.", $action, $what));
+               logDebugMessage(__FUNCTION__, __LINE__, sprintf("Double member menu action=%s,what=%s,title=%s,visivle=%s,locked=%s detected.", $action, $what, $title, $visible, $locked));
        }
 }
 
@@ -1885,20 +1864,46 @@ function addSponsorMenuSql ($action, $what, $title, $active, $sort) {
                addExtensionSql($sql);
        } elseif (isDebugModeEnabled()) {
                // Double menus should be located and fixed!
-               logDebugMessage(__FUNCTION__, __LINE__, sprintf("Double sponsor menu action=%s, what=%s detected.", $action, $what));
+               logDebugMessage(__FUNCTION__, __LINE__, sprintf("Double sponsor menu action=%s,what=%s,title=%s,active=%s detected.", $action, $what, $title, $active));
        }
 }
 
 // Enables/disables productive mode for current extension (used only while
 // registration).
 function enableExtensionProductive ($isProductive = true) {
+       // Log debug message
+       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, sprintf("ext_name=%s,isProductive=%d", getCurrentExtensionName(), intval($isProductive)));
+
+       // Set it
        $GLOBALS['ext_productive'][getCurrentExtensionName()] = (bool) $isProductive;
 }
 
 // Checks wether the extension is in productive phase. If not set, development
 // phase (=false) is assumed.
-function isExtensionProductive () {
-       return ((isset($GLOBALS['ext_productive'][getCurrentExtensionName()])) && ($GLOBALS['ext_productive'][getCurrentExtensionName()] === true));
+function isExtensionProductive ($ext_name = '') {
+       // Is the extension name empty? Then use current
+       if (empty($ext_name)) {
+               // Get current extension name
+               $ext_name = getCurrentExtensionName();
+       } // END - if
+
+       // Do we have cache?
+       if (!isset($GLOBALS[__FUNCTION__][$ext_name])) {
+               // Load extension only if not yet loaded
+               if (!isset($GLOBALS['ext_productive'][$ext_name])) {
+                       // Load extension in test mode
+                       loadExtension($ext_name, 'test');
+               } // END - if
+
+               // Determine it
+               $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
+       return $GLOBALS[__FUNCTION__][$ext_name];
 }
 
 // [EOF]