]> git.mxchange.org Git - mailer.git/blobdiff - inc/extensions-functions.php
A lot code rewritten:
[mailer.git] / inc / extensions-functions.php
index a9c6fd92391bdc6227654e03015edf95292af0a8..af6f615564a4c64766b55fc337f9023e12d8386b 100644 (file)
@@ -18,6 +18,7 @@
  * svn:keywords Date Revision" (autoprobset!) at least!!!!!!            *
  * -------------------------------------------------------------------- *
  * Copyright (c) 2003 - 2009 by Roland Haeder                           *
+ * Copyright (c) 2009, 2010 by Mailer Developer Team                    *
  * For more information visit: http://www.mxchange.org                  *
  *                                                                      *
  * This program is free software; you can redistribute it and/or modify *
@@ -43,29 +44,51 @@ if (!defined('__SECURITY')) {
 
 // Load the extension and maybe found language and function files.
 function loadExtension ($ext_name, $ext_mode = 'init', $ext_ver = '', $dry_run = false) {
-       // Set current extension name
-       setCurrentExtensionName($ext_name);
+       // If this happens twice, we need the bug report from you, except for updates/tests
+       if ((isset($GLOBALS['loaded_extension'][$ext_name][$ext_mode])) && (!in_array($ext_mode, array('update', 'test')))) {
+               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
 
-       // Set current extension version
-       setCurrentExtensionVersion($ext_ver);
+       // Make sure this situation can only happen once
+       $GLOBALS['loaded_extension'][$ext_name][$ext_mode] = true;
 
        // Set extension mode
        setExtensionMode($ext_mode);
 
+       // Set current extension name
+       setCurrentExtensionName($ext_name);
+
+       if (!empty($ext_ver)) {
+               // Set current extension version
+               setCurrentExtensionVersion($ext_ver);
+       } else {
+               // Set it to 0.0
+               setCurrentExtensionVersion('0.0');
+
+               // 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));
+               } // END - if
+       }
+
        // Set dry-run
        enableExtensionDryRun($dry_run);
 
        // Init array
        initIncludePool('extension');
 
-       // Init EXT_UPDATE_DEPENDS
-       initExtensionUpdateDependencies();
+       // Init EXT_UPDATE_DEPENDS if not yet done
+       if (!isExtensionUpdateDependenciesInitialized()) {
+               // Init here...
+               initExtensionUpdateDependencies();
+       } // END - if
 
        // Init current extension name list
        initExtensionSqls();
 
        // Is the extension already loaded?
-       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, "Loading extension {$ext_name}, mode=".getExtensionMode().", ver=".getCurrentExtensionVersion()."");
+       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'Loading extension ' . $ext_name . ', mode=' . getExtensionMode() . ', ver=' . getCurrentExtensionVersion());
        if ((isset($GLOBALS['ext_loaded']['ext'][$ext_name])) && (getExtensionMode() == 'init')) {
                // Debug message
                logDebugMessage(__FUNCTION__, __LINE__, sprintf("Extension %s already loaded.", $ext_name));
@@ -117,10 +140,10 @@ function loadExtension ($ext_name, $ext_mode = 'init', $ext_ver = '', $dry_run =
        setExtensionAlwaysActive('N');
 
        // Extension update notes
-       setExtensionUpdateNotes('');
+       // @TODO Do we still need this? setExtensionUpdateNotes('');
 
        // Include the extension file
-       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, "Extension loaded.");
+       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'Extension loaded.');
        loadExtensionInclude();
 
        // Is this extension deprecated?
@@ -143,8 +166,9 @@ function loadExtension ($ext_name, $ext_mode = 'init', $ext_ver = '', $dry_run =
 }
 
 // Registeres an extension and possible update depencies
-function registerExtension ($ext_name, $task_id, $dry_run = false, $logout = true) {
+function registerExtension ($ext_name, $taskId, $dry_run = false, $logout = true) {
        // Set current extension name
+       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'ext_name=' . $ext_name . ',task_id=' . $taskId . ',dry_run=' . intval($dry_run) . ',logout=' . intval($logout) . ' - ENTERED!');
        setCurrentExtensionName($ext_name);
 
        // Enable dry-run
@@ -153,37 +177,46 @@ function registerExtension ($ext_name, $task_id, $dry_run = false, $logout = tru
        // By default all extensions are in productive phase
        enableExtensionProductive();
 
-       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, "currName=".getCurrentExtensionName()." - ENTERED!");
        // This shall never do a non-admin user or if the extension is active (already installed)
        if ((!isAdmin()) || (isExtensionInstalled($ext_name))) {
+               // Abort here with 'false'
                return false;
        } // END - if
 
-       // When this extension is already in install/update phase, all is fine
-       if (isExtensionRegisterRunning($ext_name)) {
-               // Then abort here which is fine
-               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, "currName=".getCurrentExtensionName()." - ALREADY!");
+       // When this extension is already in registration/update phase, all is fine
+       if ((isExtensionRegistrationRunning($ext_name)) || (isExtensionUpdateRunning($ext_name))) {
+               // Then abort here with 'true' becaus it is fine
+               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'currName=' . getCurrentExtensionName() . ' - ALREADY!');
                return true;
        } // END - if
 
        // This registration is running
        addExtensionRunningRegistration($ext_name);
 
-       // Init EXT_UPDATE_DEPENDS
-       initExtensionUpdateDependencies();
+       // Init EXT_UPDATE_DEPENDS if not yet done
+       if (!isExtensionUpdateDependenciesInitialized()) {
+               // Init here...
+               initExtensionUpdateDependencies();
+       } // END - if
 
        // Is the task id zero? Then we need to auto-fix it here
-       if ($task_id == '0') {
+       if ($taskId == '0') {
                // Try to find the task
-               $task_id = determineExtensionTaskId(getCurrentExtensionName());
+               $taskId = determineExtensionTaskId(getCurrentExtensionName());
 
                // Still zero and not in dry-run?
-               if (($task_id == '0') && (!getExtensionDryRun())) {
-                       // Then request a bug report
-                       debug_report_bug(sprintf("%s: task_id is still zero after determineExtensionTaskId(%s)",
-                               __FUNCTION__,
-                               getCurrentExtensionName()
-                       ));
+               if (($taskId == '0') && (!isExtensionDryRun())) {
+                       // Now try to create a new task
+                       $taskId = createNewExtensionTask(getCurrentExtensionName());
+
+                       // Is it still zero?
+                       if ($taskId == '0') {
+                               // Then request a bug report
+                               debug_report_bug(__FUNCTION__, __LINE__, sprintf("%s: task_id is still zero after determineExtensionTaskId(%s)",
+                                       __FUNCTION__,
+                                       getCurrentExtensionName()
+                               ));
+                       } // END - if
                } // END - if
        } // END - if
 
@@ -200,18 +233,18 @@ function registerExtension ($ext_name, $task_id, $dry_run = false, $logout = tru
        setExtensionReportsFailure(false);
 
        // Does this extension exists?
-       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, "currName=".getCurrentExtensionName()."");
-       if (loadExtension(getCurrentExtensionName(), 'register', '', getExtensionDryRun())) {
+       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'currName=' . getCurrentExtensionName());
+       if (loadExtension(getCurrentExtensionName(), 'register', '', isExtensionDryRun())) {
                // Set current extension name again
                setCurrentExtensionName($ext_name);
 
                // And run possible updates
-               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, "".getCurrentExtensionName());
+               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'currentExtension=' . getCurrentExtensionName());
                $history = getExtensionVersionHistory();
                foreach ($history as $ver) {
-                       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, "ext_name=".getCurrentExtensionName().", ext_ver={$ver}");
+                       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'ext_name=' . getCurrentExtensionName() . ', ext_ver=' . $ver);
                        // Load extension in update mode
-                       loadExtension(getCurrentExtensionName(), 'update', $ver, getExtensionDryRun());
+                       loadExtension(getCurrentExtensionName(), 'update', $ver, isExtensionDryRun());
 
                        // Add update notes to our output
                        addExtensionNotes($ver);
@@ -225,8 +258,9 @@ function registerExtension ($ext_name, $task_id, $dry_run = false, $logout = tru
                        // Increment here to avoid endless loop
                        incrementExtensionUpdateIterator();
 
-                       // Check for required file
-                       if ((!isExtensionInstalled($ext_update)) && (loadExtension($ext_update, 'register', '', getExtensionDryRun()))) {
+                       // Check if extension is not installed and not already in registration procedure and if loading it wents finally fine...
+                       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'ext_name=' . $ext_name . ',isExtensionRegistrationRunning(' . $ext_update . ')=' . intval(isExtensionRegistrationRunning($ext_update)));
+                       if ((!isExtensionInstalled($ext_update)) && (!isExtensionRegistrationRunning($ext_update)) && (loadExtension($ext_update, 'test', '', isExtensionDryRun()))) {
                                // Set current extension name again
                                setCurrentExtensionName($ext_name);
 
@@ -245,24 +279,25 @@ function registerExtension ($ext_name, $task_id, $dry_run = false, $logout = tru
                                        // Entry found?
                                        if ($task > 0) {
                                                // Try to register the extension
-                                               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, "currName=".getCurrentExtensionName().":ext_update=".$ext_update.",taskId=".$task."");
-                                               $test = registerExtension($ext_update, $task, getExtensionDryRun(), false);
+                                               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'currName=' . getCurrentExtensionName() . ':ext_update=' . $ext_update . ',taskId=' . $task);
+                                               $test = registerExtension($ext_update, $task, isExtensionDryRun(), false);
 
                                                // Reset extension name
                                                setCurrentExtensionName($ext_name);
-                                               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, "currName=".getCurrentExtensionName()); print getCurrentExtensionName().':<pre>'.print_r($test);
+                                               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'currName=' . getCurrentExtensionName());
+                                               //* DEBUG: */ debugOutput(getCurrentExtensionName().':<pre>' . print_r($test, true) . '</pre>');
                                        } // END - if
                                } elseif ($ext_ver != getCurrentExtensionVersion()) {
                                        // Ok, update this extension now
-                                       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'currName='.getCurrentExtensionName().',currVer='.getCurrentExtensionVersion().'');
+                                       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'currName=' . getCurrentExtensionName() . ',currVer=' . getCurrentExtensionVersion());
                                        $GLOBALS['ext_backup_name'][$ext_update][$ext_ver] = getCurrentExtensionName();
                                        $GLOBALS['ext_backup_ver'][$ext_update][$ext_ver] = getCurrentExtensionVersion();
-                                       updateExtension($ext_update, $ext_ver, getExtensionDryRun());
+                                       updateExtension($ext_update, $ext_ver, isExtensionDryRun());
                                        setCurrentExtensionName($GLOBALS['ext_backup_name'][$ext_update][$ext_ver]);
                                        setCurrentExtensionVersion($GLOBALS['ext_backup_ver'][$ext_update][$ext_ver]);
                                        unset($GLOBALS['ext_backup_name'][$ext_update][$ext_ver]);
                                        unset($GLOBALS['ext_backup_ver'][$ext_update][$ext_ver]);
-                                       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'currName='.getCurrentExtensionName().',currVer='.getCurrentExtensionVersion().'');
+                                       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'currName=' . getCurrentExtensionName() . ',currVer=' . getCurrentExtensionVersion());
 
                                        // All okay!
                                        $test = true;
@@ -281,7 +316,7 @@ function registerExtension ($ext_name, $task_id, $dry_run = false, $logout = tru
                } // END - for
 
                // Is there no update?
-               if (countExtensionUpdateDependencies(getCurrentExtensionName()) == '0') {
+               if (countExtensionUpdateDependencies(getCurrentExtensionName()) == 0) {
                        // Then test is passed!
                        $test = true;
                } // END - if
@@ -290,75 +325,89 @@ function registerExtension ($ext_name, $task_id, $dry_run = false, $logout = tru
                setExtensionMode('register');
 
                // Remains true if extension registration reports no failures
-               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, "currName=".getCurrentExtensionName()); print getCurrentExtensionName().':<pre>'.print_r($test, true).'</pre>';
+               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'currName=' . getCurrentExtensionName());
+               //* DEBUG: */ debugOutput(getCurrentExtensionName().':<pre>' . print_r($test, true) . '</pre>');
                $test = (($test === true) && (getExtensionReportsFailure() === false));
-               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, "currName=".getCurrentExtensionName()); print getCurrentExtensionName().':<pre>'.print_r($test, true).'</pre>';
+               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'currName=' . getCurrentExtensionName());
+               //* DEBUG: */ debugOutput(getCurrentExtensionName().':<pre>' . print_r($test, true) . '</pre>');
 
                // Does everthing before wents ok?
                if ($test === true) {
                        // "Dry-run-mode" activated?
-                       if ((getExtensionDryRun() === false) && (!isExtensionOnRemovalList())) {
-                               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, "ext_name=".getCurrentExtensionName());
+                       if ((isExtensionDryRun() === false) && (!isExtensionOnRemovalList())) {
+                               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'ext_name=' . getCurrentExtensionName());
                                // Init SQLs and transfer ext->generic
                                initSqls();
                                setSqlsArray(getExtensionSqls());
 
                                // Run installation pre-installation filters
-                               runFilterChain('pre_extension_installed', array('dry_run' => getExtensionDryRun()));
+                               runFilterChain('pre_extension_installed', array('dry_run' => isExtensionDryRun()));
 
                                // Register extension
-                               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, "insert=".getCurrentExtensionName().'/'.getCurrentExtensionVersion()." - INSERT!");
+                               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'insert=' . getCurrentExtensionName() . '/' . getCurrentExtensionVersion() . ' - INSERT!');
                                if (isExtensionInstalledAndNewer('sql_patches', '0.0.6')) {
+                                       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'ext_name=' . getCurrentExtensionName() . ',always_active=' . getExtensionAlwaysActive() . ', ext_ver=' . getCurrentExtensionVersion() . 'ext_css=' . getExtensionHasCss());
                                        // New way, with CSS
                                        SQL_QUERY_ESC("INSERT INTO `{?_MYSQL_PREFIX?}_extensions` (`ext_name`, `ext_active`, `ext_version`,`ext_has_css`) VALUES ('%s','%s','%s','%s')",
-                                               array(getCurrentExtensionName(), getExtensionAlwaysActive(), getCurrentExtensionVersion(), getExtensionHasCss()), __FUNCTION__, __LINE__);
+                                               array(
+                                                       getCurrentExtensionName(),
+                                                       getExtensionAlwaysActive(),
+                                                       getCurrentExtensionVersion(),
+                                                       getExtensionHasCss()
+                                               ), __FUNCTION__, __LINE__);
                                } else {
+                                       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'ext_name=' . getCurrentExtensionName() . ',always_active=' . getExtensionAlwaysActive() . ', ext_ver=' . getCurrentExtensionVersion());
                                        // Old way, no CSS
                                        SQL_QUERY_ESC("INSERT INTO `{?_MYSQL_PREFIX?}_extensions` (`ext_name`, `ext_active`, `ext_version`) VALUES ('%s','%s','%s')",
-                                               array(getCurrentExtensionName(), getExtensionAlwaysActive(), getCurrentExtensionVersion()), __FUNCTION__, __LINE__);
+                                               array(
+                                                       getCurrentExtensionName(),
+                                                       getExtensionAlwaysActive(),
+                                                       getCurrentExtensionVersion()
+                                               ), __FUNCTION__, __LINE__);
                                }
 
                                // Remove cache file(s) if extension is active
                                runFilterChain('post_extension_installed', array(
                                        'pool'     => 'extension',
                                        'ext_name' => getCurrentExtensionName(),
-                                       'task_id'  => $task_id
+                                       'task_id'  => $taskId
                                ));
 
-                               // Remove all SQL commands
-                               unsetSqls();
+                               // Re-init queries and notes
+                               initExtensionSqls(true);
+                               initExtensionNotes();
 
                                // Mark it as installed
                                $GLOBALS['ext_is_installed'][getCurrentExtensionName()] = true;
 
                                // In normal mode return a true on success
                                $ret = true;
-                       } elseif (getExtensionDryRun() === true) {
-                               // In  "dry-run" mode return array with all SQL commands
-                               $ret = getExtensionSqls();
+                       } elseif (isExtensionDryRun() === true) {
+                               // In  "dry-run" mode do always return a true
+                               $ret = true;
 
-                               // Remove all SQL commands
-                               unsetSqls();
+                               // Re-init queries and notes
+                               initExtensionNotes();
                        } else {
                                // Extension has been removed for updates, so all is fine!
                                $ret = true;
                        }
                } else {
                        // No, an error occurs while registering extension :-(
-                       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, "".getCurrentExtensionName());
+                       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'currentExtension=' . getCurrentExtensionName());
                        $ret = false;
                }
-       } elseif (($task_id > 0) && (getCurrentExtensionName() != '')) {
-               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, "currName=".getCurrentExtensionName()."");
+       } elseif (($taskId > 0) && (getCurrentExtensionName() != '')) {
+               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'currName=' . getCurrentExtensionName());
                // Remove task from system when id and extension's name is valid
                SQL_QUERY_ESC("DELETE LOW_PRIORITY FROM `{?_MYSQL_PREFIX?}_task_system` WHERE `id`=%s AND `status`='NEW' LIMIT 1",
-                       array(bigintval($task_id)), __FUNCTION__, __LINE__);
+                       array(bigintval($taskId)), __FUNCTION__, __LINE__);
        }
 
        // Is this the sql_patches?
-       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, ':'.getCurrentExtensionName()."/".getExtensionMode()."");
-       if ((getCurrentExtensionName() == 'sql_patches') && ((getExtensionMode() == 'register') || (getExtensionMode() == 'remove')) && (!getExtensionDryRun()) && ($test)) {
-               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, ": LOAD!");
+       //* 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&amp;logout=1&amp;' . getExtensionMode() . '=sql_patches');
@@ -370,8 +419,8 @@ function registerExtension ($ext_name, $task_id, $dry_run = false, $logout = tru
        } // END - if
 
        // Return status code
-       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, "currName=".getCurrentExtensionName()." - LEFT!");
-       //* DEBUG: */ print getCurrentExtensionName().':<pre>'.print_r($ret, true).'</pre>';
+       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'currName=' . getCurrentExtensionName() . ',ext_name=' . $ext_name . ' - EXIT!');
+       //* DEBUG: */ debugOutput(getCurrentExtensionName().':<pre>'.print_r($ret, true).'</pre>');
        return $ret;
 }
 
@@ -388,7 +437,10 @@ function doExtensionSqls ($ext_id, $load_mode) {
        setCurrentExtensionName($ext_name);
 
        // Init EXT_UPDATE_DEPENDS
-       initExtensionUpdateDependencies();
+       if (!isExtensionUpdateDependenciesInitialized()) {
+               // Init here...
+               initExtensionUpdateDependencies();
+       } // END - if
 
        // Init array
        initExtensionSqls();
@@ -490,7 +542,7 @@ function isExtensionActive ($ext_name) {
                incrementStatsEntry('cache_hits');
        } elseif (isset($GLOBALS['ext_loaded'][$ext_name])) {
                // @TODO Extension is loaded, what next?
-               app_die(__FUNCTION__, __LINE__, 'LOADED:' . $ext_name);
+               debug_report_bug(__FUNCTION__, __LINE__, 'LOADED:' . $ext_name);
        } elseif (($ext_name == 'cache') || (!isExtensionInstalled('cache'))) {
                //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, "DB! ext_name={$ext_name}");
                // Load from database
@@ -530,7 +582,7 @@ function getExtensionVersion ($ext_name, $force = false) {
        // Empty extension name should be fixed!
        if (empty($ext_name)) {
                // Please report this bug!
-               debug_report_bug(__FUNCTION__ . ': ext_name is empty which is not allowed here.');
+               debug_report_bug(__FUNCTION__, __LINE__, 'ext_name is empty which is not allowed here.');
        } // END - if
 
        // Extensions are all inactive during installation
@@ -557,7 +609,7 @@ function getExtensionVersion ($ext_name, $force = false) {
                        $data = SQL_FETCHARRAY($result);
                } elseif (isDebugModeEnabled()) {
                        // Not found, please report all
-                       debug_report_bug(sprintf(": Cannot find extension %s in database!", $ext_name));
+                       debug_report_bug(__FUNCTION__, __LINE__, sprintf(": Cannot find extension %s in database!", $ext_name));
                }
 
                // Free result
@@ -570,7 +622,7 @@ function getExtensionVersion ($ext_name, $force = false) {
        // Extension version should not be invalid
        if (($data['ext_version'] == 'false') && ($force === false)) {
                // Please report this trouble
-               debug_report_bug(sprintf("Extension <strong>%s</strong> has empty version!", $ext_name));
+               debug_report_bug(__FUNCTION__, __LINE__, sprintf("Extension <span class=\"data\">%s</span> has empty version!", $ext_name));
        } // END - if
 
        // Return result
@@ -592,7 +644,7 @@ function updateExtension ($ext_name, $ext_ver, $dry_run = false) {
        initIncludePool('extension');
 
        // Load extension in test mode
-       loadExtension($ext_name, 'test', $ext_ver, getExtensionDryRun());
+       loadExtension($ext_name, 'test', $ext_ver, isExtensionDryRun());
 
        // Save version history
        $history = getExtensionVersionHistory();
@@ -601,8 +653,8 @@ function updateExtension ($ext_name, $ext_ver, $dry_run = false) {
        initExtensionSqls();
 
        // Check if version is updated
-       //* DEBUG: */ print getCurrentExtensionName().'/'.$ext_name.':'.getThisExtensionVersion().'/'.$ext_ver.'/'.intval(is_array($history)).'<br />';
-       if (((getThisExtensionVersion() != $ext_ver) || (getExtensionDryRun())) && (is_array($history))) {
+       //* DEBUG: */ debugOutput(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);
 
@@ -612,7 +664,7 @@ function updateExtension ($ext_name, $ext_ver, $dry_run = false) {
                        $GLOBALS['update_ver'][getCurrentExtensionName()] = $history[$idx];
 
                        // Load again...
-                       loadExtension(getCurrentExtensionName(), 'update', $GLOBALS['update_ver'][getCurrentExtensionName()], getExtensionDryRun());
+                       loadExtension(getCurrentExtensionName(), 'update', $GLOBALS['update_ver'][getCurrentExtensionName()], isExtensionDryRun());
 
                        // Get all depencies
                        $depencies = getExtensionUpdateDependencies();
@@ -632,14 +684,17 @@ 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), getExtensionDryRun());
+                                                       $test = updateExtension($ext_depend, getExtensionVersion($ext_depend), isExtensionDryRun());
                                                } else {
                                                        // Register new extension
-                                                       $test = registerExtension($ext_depend, 0, getExtensionDryRun(), false);
+                                                       $test = registerExtension($ext_depend, 0, isExtensionDryRun(), false);
                                                }
                                        } // END - if
                                } // END - foreach
 
+                               // Set extension version here
+                               setCurrentExtensionVersion($ext_ver);
+
                                // Set name back
                                setCurrentExtensionName($ext_name);
                        } // END - if
@@ -649,7 +704,7 @@ function updateExtension ($ext_name, $ext_ver, $dry_run = false) {
                } // END - for
 
                // In real-mode execute any existing includes
-               if (getExtensionDryRun() === false) {
+               if (isExtensionDryRun() === false) {
                        $GLOBALS['ext_inc_pool'][getCurrentExtensionName()] = getIncludePool('extension');
                        runFilterChain('load_includes', 'extension');
                        setIncludePool('extension', $GLOBALS['ext_inc_pool'][getCurrentExtensionName()]);
@@ -661,9 +716,9 @@ function updateExtension ($ext_name, $ext_ver, $dry_run = false) {
                setSqlsArray(getExtensionSqls());
 
                // Run SQLs
-               runFilterChain('run_sqls', array('dry_run' => getExtensionDryRun()));
+               runFilterChain('run_sqls', array('dry_run' => isExtensionDryRun()));
 
-               if (getExtensionDryRun() === false) {
+               if (isExtensionDryRun() === false) {
                        // Run filters on success extension update
                        runFilterChain('extension_update', getCurrentExtensionName());
                } // END - if
@@ -675,7 +730,7 @@ function addExtensionVerboseSqlTable ($title = '', $dashed = '', $switch = false
        // Empty title?
        if (empty($title)) {
                // Then fix it to default
-               $title = getMessage('ADMIN_SQLS_EXECUTED_ON_REMOVAL');
+               $title = '{--ADMIN_SQLS_EXECUTED_ON_REMOVAL--}';
        } // END - if
 
        // Init variables
@@ -683,9 +738,6 @@ function addExtensionVerboseSqlTable ($title = '', $dashed = '', $switch = false
 
        // Do we have queries?
        if ((isExtensionInstalledAndNewer('sql_patches', '0.0.7')) && (getConfig('verbose_sql') == 'Y')) {
-               // Init switch color
-               $SW = 2;
-
                // Get all SQLs
                foreach (getExtensionSqls() as $sqls) {
                        // New array format is recursive
@@ -697,16 +749,12 @@ function addExtensionVerboseSqlTable ($title = '', $dashed = '', $switch = false
                                if (!empty($sql)) {
                                        // Prepare output for template
                                        $content = array(
-                                               'sw'  => $SW,
                                                'i'   => ($idx+1),
                                                'sql' => $sql
                                        );
 
                                        // Load row template
                                        $OUT .= loadTemplate('admin_ext_sql_row', true, $content);
-
-                                       // Switch color
-                                       $SW = 3 - $SW;
                                } // END - if
                        } // END - foreach
                } // END - foreach
@@ -723,7 +771,7 @@ function addExtensionVerboseSqlTable ($title = '', $dashed = '', $switch = false
                $OUT = loadTemplate('admin_ext_sql_table', true, $content);
        } elseif ((isExtensionInstalledAndNewer('sql_patches', '0.0.7')) && (getConfig('verbose_sql') == 'Y')) {
                // No addional SQL commands to run
-               $OUT = loadTemplate('admin_settings_saved', true, getMessage('ADMIN_NO_ADDITIONAL_SQLS'));
+               $OUT = loadTemplate('admin_settings_saved', true, '{--ADMIN_NO_ADDITIONAL_SQLS--}');
        } // END - if
 
        // Return output
@@ -760,7 +808,7 @@ function getExtensionName ($ext_id) {
        // Did we find some extension?
        if (empty($data['ext_name'])) {
                // We should fix these all!
-               debug_report_bug(__FUNCTION__ . ': ext_name is empty. ext_id=' . $ext_id);
+               debug_report_bug(__FUNCTION__, __LINE__, 'ext_name is empty. ext_id=' . $ext_id);
        } // END - if
 
        // Return the extension name
@@ -861,12 +909,12 @@ function doDeactivateExtension($ext_name) {
                // Then run all queries
                doExtensionSqls(getExtensionId($ext_name), 'deactivate');
 
-               // Create new task
+               // Create new task (we ignore the task id here)
                createExtensionDeactivationTask($ext_name);
 
                // Notify the admin
                sendAdminNotification(
-                       getMessage('ADMIN_SUBJECT_EXTENSION_DEACTIVATED'),
+                       '{--ADMIN_EXTENSION_DEACTIVATED_SUBJECT--}',
                        'admin_ext_deactivated',
                        array('ext_name' => $ext_name)
                );
@@ -889,59 +937,80 @@ function isExtensionOlder ($ext_name, $ext_ver) {
 // Creates a new task for updated extension
 function createExtensionUpdateTask ($adminId, $ext_name, $ext_ver, $notes) {
        // Create subject line
-       $subject = '[UPDATE-' . $ext_name . '-' . $ext_ver . ':] {--ADMIN_UPDATE_EXT_SUBJ--}';
+       $subject = '[UPDATE-' . $ext_name . '-' . $ext_ver . ':] {--ADMIN_UPDATE_EXTENSION_SUBJECT--}';
+
+       // Get task id
+       $taskId = determineTaskIdBySubject($subject);
 
        // Is the extension there?
        if (isExtensionInstalled($ext_name)) {
                // Check if task is not there
-               if (determineTaskIdBySubject($subject) == '0') {
+               if ($taskId == '0') {
                        // Create extension update-task
-                       createNewTask($subject, $notes, 'EXTENSION_UPDATE', 0, $adminId);
+                       $taskId = createNewTask($subject, $notes, 'EXTENSION_UPDATE', 0, $adminId);
                } // END - if
        } else {
                // Extension not there! :-(
-               debug_report_bug(sprintf("Extension <strong>%s</strong> not found but should be updated?", $ext_name));
+               debug_report_bug(__FUNCTION__, __LINE__, sprintf("Extension <span class=\"data\">%s</span> not found but should be updated?", $ext_name));
        }
+
+       // Return task id
+       return $taskId;
 }
 
 // Creates a new task for newly installed extension
-function createNewExtensionTask ($adminId, $subject, $ext) {
+function createNewExtensionTask ($ext_name) {
+       // Generate subject line
+       $subject = sprintf("[%s:]", $ext_name);
+
+       // Get task id
+       $taskId = determineTaskIdBySubject($subject);
+
        // Not installed and do we have created a task for the admin?
-       if ((determineTaskIdBySubject($subject) == '0') && (!isExtensionInstalled($ext))) {
+       if (($taskId == '0') && (!isExtensionInstalled($ext_name))) {
                // Set default message if ext-foo is missing
-               $message = getMaskedMessage('ADMIN_EXT_TEXT_FILE_MISSING', $ext);
+               $message = getMaskedMessage('ADMIN_EXTENSION_TEXT_FILE_MISSING', $ext_name);
 
                // Template file
                $tpl = sprintf("%stemplates/%s/html/ext/ext_%s.tpl",
                        getConfig('PATH'),
                        getLanguage(),
-                       $ext
+                       $ext_name
                );
 
                // Load text for task if found
                if (isFileReadable($tpl)) {
                        // Load extension's own text template (HTML!)
-                       $message = loadTemplate('ext_' . $ext, true);
+                       $message = loadTemplate('ext_' . $ext_name, true);
                } else {
                        // Write this in debug.log as well
                        logDebugMessage(__FUNCTION__, __LINE__, $message);
                }
 
                // Task not created so it's a brand-new extension which we need to register and create a task for!
-               createNewTask($subject, $message, 'EXTENSION', 0, $adminId, false);
+               $taskId = createNewTask($subject, $message, 'EXTENSION', 0, getCurrentAdminId(), false);
        } // END - if
+
+       // Return task id
+       return $taskId;
 }
 
 // Creates a task for automatically deactivated (deprecated) extension
-function createExtensionDeactivationTask ($ext) {
+function createExtensionDeactivationTask ($ext_name) {
        // Create subject line
-       $subject = sprintf("[%s:] %s", $ext, getMessage('TASK_SUBJ_EXTENSION_DEACTIVATED'));
+       $subject = sprintf("[%s:] %s", $ext_name, '{--ADMIN_TASK_EXTENSION_DEACTIVATED_SUBJECT--}');
+
+       // Get task id
+       $taskId = determineTaskIdBySubject($subject);
 
        // Not installed and do we have created a task for the admin?
-       if ((determineTaskIdBySubject($subject) == '0') && (getExtensionVersion($ext) != '')) {
+       if (($taskId == '0') && (isExtensionInstalled($ext_name))) {
                // Task not created so add it
-               createNewTask($subject, SQL_ESCAPE(loadTemplate('task_ext_deactivated', true, $ext)), 'EXTENSION_DEACTIVATION');
+               $taskId = createNewTask($subject, SQL_ESCAPE(loadTemplate('task_EXTENSION_deactivated', true, $ext_name)), 'EXTENSION_DEACTIVATION');
        } // END - if
+
+       // Return task id
+       return $taskId;
 }
 
 // Checks if the module has a menu
@@ -964,7 +1033,7 @@ function ifModuleHasMenu ($mod, $forceDb = false) {
                        // Admin/guest/member/sponsor modules have always a menu!
                        $ret = in_array($mod, array('admin', 'index', 'login', 'sponsor'));
                }
-       } elseif ((isExtensionInstalled('sql_patches')) && (getExtensionVersion('sql_patches') >= '0.3.6') && ((!isExtensionActive('cache')) || ($forceDb === true))) {
+       } 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__);
@@ -988,7 +1057,7 @@ function ifModuleHasMenu ($mod, $forceDb = false) {
                $ret = in_array($mod, array('admin', 'index', 'login', 'sponsor')); // Then there is a menu!
        } else {
                // Unsupported state!
-               debug_report_bug('This should never be reached.');
+               logDebugMessage(__FUNCTION__, __LINE__, 'This should never be reached.');
        }
 
        // Return status
@@ -1047,7 +1116,7 @@ function addExtensionNotes ($ver) {
        // Is do we have verbose output enabled?
        if ((!isExtensionActive('sql_patches')) || (getConfig('verbose_sql') == 'Y')) {
                // Update notes found?
-               if (getExtensionUpdateNotes($ver) != '') {
+               if (isExtensionUpdateNoteSet($ver)) {
                        // Update notes found
                        $content = array(
                                'ver'   => $ver,
@@ -1060,18 +1129,18 @@ function addExtensionNotes ($ver) {
                        // Initial release
                        $content = array(
                                'ver'   => $ver,
-                               'notes' => getMessage('INITIAL_RELEASE')
+                               'notes' => '{--INITIAL_RELEASE--}'
                        );
                } else {
                        // No update notes found!
                        $content = array(
                                'ver'   => $ver,
-                               'notes' => getMessage('NO_UPDATE_NOTES')
+                               'notes' => '{--NO_UPDATE_NOTES--}'
                        );
                }
 
                // Load template
-               $out = loadTemplate('admin_ext_notes', true, $content);
+               $out = loadTemplate('admin_EXTENSION_notes', true, $content);
        } // END - if
 
        // Add the notes
@@ -1121,6 +1190,11 @@ function getExtensionAlwaysActive () {
        return $GLOBALS['ext_always_active'][getCurrentExtensionName()];
 }
 
+// Checks wether the current extension is always active
+function isExtensionAlwaysActive () {
+       return (getExtensionAlwaysActive() == 'Y');
+}
+
 // Setter for EXT_VERSION flag
 function setThisExtensionVersion ($version) {
        $GLOBALS['ext_version'][getCurrentExtensionName()] = (string) $version;
@@ -1143,57 +1217,113 @@ function isExtensionDeprecated () {
 
 // Setter for EXT_UPDATE_DEPENDS flag
 function addExtensionUpdateDependency ($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!
-               debug_report_bug('updateDepends is left empty!');
+               debug_report_bug(__FUNCTION__, __LINE__, 'updateDepends is empty: currentExtension=' . getCurrentExtensionName());
        } // END - if
 
        // Is it not yet added?
-       if (!in_array($updateDepends, $GLOBALS['ext_running_updates'])) {
-               //* DEBUG */ logDebugMessage(__FUNCTION__, __LINE__, "currName=".getCurrentExtensionName().'/'.$updateDepends);
-               // 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'][] = $updateDepends;
+       /* DEBUG:
+       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());
        } // 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!');
+}
+
+// Getter for running updates
+function getExtensionUpdatesRunning () {
+       return $GLOBALS['ext_running_updates'][getCurrentExtensionName()];
 }
 
 // Checks wether the given extension registration is in progress
-function isExtensionRegisterRunning ($ext_name) {
-       return ((isset($GLOBALS['ext_register_running'])) && (in_array($ext_name, $GLOBALS['ext_register_running'])));
+function isExtensionRegistrationRunning ($ext_name) {
+       // Simply check it
+       $isRunning = ((isset($GLOBALS['ext_register_running'])) && (in_array($ext_name, $GLOBALS['ext_register_running'])));
+
+       // Return it
+       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'ext_name=' . $ext_name . ', isRunning=' . intval($isRunning));
+       return $isRunning;
 }
 
 // Init EXT_UPDATE_DEPENDS flag
 function initExtensionUpdateDependencies () {
-       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, "currName=".getCurrentExtensionName());
+       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'currName=' . getCurrentExtensionName() . ' - ENTERED!');
 
        // Init update depency map automatically if not found
-       if (!isExtensionUpdateDependenciesInitialized()) {
-               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, "currName=".getCurrentExtensionName()." - INIT!");
-               $GLOBALS['ext_update_depends'][getCurrentExtensionName()] = array();
+       if (isExtensionUpdateDependenciesInitialized()) {
+               // We need these bug reports as well...
+               debug_report_bug(__FUNCTION__, __LINE__, '() is called twice: currName=' . getCurrentExtensionName());
        } // END - if
 
+       $GLOBALS['ext_update_depends'][getCurrentExtensionName()] = array();
+
        // Init running updates array
        initExtensionRuningUpdates();
+
+       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'currName=' . getCurrentExtensionName() . ' - EXIT!');
 }
 
 // Adds an extension as "registration in progress"
 function addExtensionRunningRegistration ($ext_name) {
        // Is it running?
-       if (!isExtensionRegisterRunning($ext_name)) {
-               // Then add it!
-               $GLOBALS['ext_register_running'][] = $ext_name;
+       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'Registration in progress: ext_name=' . $ext_name . ' - ENTERED!');
+       if (isExtensionRegistrationRunning($ext_name)) {
+               // This is really bad and should not be quietly ignored
+               debug_report_bug(__FUNCTION__, __LINE__, '() already called! ext_name=' . $ext_name);
        } // END - if
+
+       // Then add it!
+       $GLOBALS['ext_register_running'][] = $ext_name;
+       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'Registration in progress: ext_name=' . $ext_name . ' - EXIT!');
 }
 
 // Checks wether EXT_UPDATE_DEPENDS is initialized
 function isExtensionUpdateDependenciesInitialized () {
-       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, "currName=".getCurrentExtensionName());
+       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'currName=' . getCurrentExtensionName());
        return (isset($GLOBALS['ext_update_depends'][getCurrentExtensionName()]));
 }
 
+// Checks wether an update is already running for given extension
+function isExtensionUpdateRunning ($ext_name) {
+       // Current and given extensions means whole array
+       if ($ext_name == getCurrentExtensionName()) {
+               // Default is not found
+               $isRunning = false;
+
+               // 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));
+                               $isRunning = true;
+                               break;
+                       } // END - if
+               } // END - foreach
+
+               // Return result
+               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'currentExtension=' . getCurrentExtensionName() . ',ext_name=' . $ext_name . ', isRunning=' . intval($isRunning));
+               return $isRunning;
+       } // END - if
+
+       // Simply check it
+       $isRunning = ((isExtensionUpdateDependenciesInitialized()) && (in_array($ext_name, getExtensionRunningUpdates())));
+
+       // Return it
+       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'currentExtension=' . getCurrentExtensionName() . ',ext_name=' . $ext_name . ', isRunning=' . intval($isRunning));
+       return $isRunning;
+}
+
 // Initializes the list of running updates
 function initExtensionRuningUpdates () {
        // Auto-init ext_running_updates
@@ -1280,7 +1410,8 @@ function getExtensionVersionHistory () {
 
 // Setter for EXT_UPDATE_NOTES
 function setExtensionUpdateNotes ($updateNotes, $ver='') {
-       //* DEBUG: */ print __FUNCTION__.':'.getCurrentExtensionName().'/'.getCurrentExtensionVersion().'/'.$ver.'='.$updateNotes.'<br />';
+       // . '/' . getCurrentExtensionVersion()
+       //* DEBUG: */ debug_report_bug(__FUNCTION__.':' . getCurrentExtensionName() . '/' . getExtensionMode() . '/' . $ver . '=' . $updateNotes);
        if (empty($ver)) {
                $GLOBALS['ext_update_notes'][getCurrentExtensionName()][getCurrentExtensionVersion()] = (string) $updateNotes;
        } else {
@@ -1293,6 +1424,11 @@ function getExtensionUpdateNotes ($ver) {
        return $GLOBALS['ext_update_notes'][getCurrentExtensionName()][$ver];
 }
 
+// Checks if ext_update_notes is set
+function isExtensionUpdateNoteSet ($ver) {
+       return isset($GLOBALS['ext_update_notes'][getCurrentExtensionName()][$ver]);
+}
+
 // Init extension notice
 function initExtensionNotes () {
        $GLOBALS['ext_notes'][getCurrentExtensionName()] = '';
@@ -1310,24 +1446,28 @@ function getExtensionNotes () {
 
 // Setter for current extension name
 function setCurrentExtensionName ($ext_name) {
-       $GLOBALS['curr_ext_name'] = (string) trim($ext_name);
+       $GLOBALS['curr_EXTENSION_name'] = (string) trim($ext_name);
 }
 
 // Getter for current extension name
 function getCurrentExtensionName () {
-       if (isset($GLOBALS['curr_ext_name'])) {
-               return $GLOBALS['curr_ext_name'];
+       if (isset($GLOBALS['curr_EXTENSION_name'])) {
+               return $GLOBALS['curr_EXTENSION_name'];
        } // END - if
 
        // Not set!
-       debug_report_bug(__FUNCTION__.": curr_ext_name not initialized. Please execute initExtensionSqls() before calling this function.");
+       debug_report_bug(__FUNCTION__.": curr_EXTENSION_name not initialized. Please execute initExtensionSqls() before calling this function.");
 }
 
 // Init SQLs array for current extension
-function initExtensionSqls () {
-       // Auto-init the array now...
-       if (!isset($GLOBALS['ext_sqls'][getCurrentExtensionName()])) {
+function initExtensionSqls ($force = false) {
+       // Auto-init the array or if forced
+       if ((!isset($GLOBALS['ext_sqls'][getCurrentExtensionName()])) || ($force === true)) {
+               // Set the array
                $GLOBALS['ext_sqls'][getCurrentExtensionName()] = array();
+
+               // Initialize the generic array
+               initSqls();
        } // END - if
 }
 
@@ -1342,7 +1482,7 @@ function getExtensionSqls () {
        // Output debug backtrace if not found (SHOULD NOT HAPPEN!)
        if (!isset($GLOBALS['ext_sqls'][getCurrentExtensionName()])) {
                // Not found, should not happen
-               debug_report_bug(sprintf("ext_sqls is empty, current extension: %s",
+               debug_report_bug(__FUNCTION__, __LINE__, sprintf("ext_sqls is empty, current extension: %s",
                        getCurrentExtensionName()
                ));
        } // END - if
@@ -1405,7 +1545,7 @@ function FILTER_INIT_EXTENSIONS () {
                foreach ($GLOBALS['cache_array']['extension']['ext_name'] as $key => $ext_name) {
                        // Load it
                        //* DEBUG */ print __FUNCTION__.': '.$ext_name.' - START<br />';
-                       loadExtension($ext_name, 'init');
+                       loadExtension($ext_name, 'init', getExtensionVersion($ext_name));
                        //* DEBUG */ print __FUNCTION__.': '.$ext_name.' - END<br />';
                } // END - foreach
                //* DEBUG */ print __FUNCTION__.': CACHE - END!<br />';
@@ -1425,32 +1565,35 @@ function getExtensionMode () {
 
 // Setter for dry-run
 function enableExtensionDryRun ($dry_run = true) {
-       //* DEBUG: */ print __FUNCTION__.': '.getCurrentExtensionName().'='.intval($dry_run).'<br />';
+       //* DEBUG: */ debugOutput(__FUNCTION__.': '.getCurrentExtensionName().'='.intval($dry_run));
        $GLOBALS['ext_dry_run'] = (bool) $dry_run;
 }
 
 // Getter for dry-run
-function getExtensionDryRun () {
+function isExtensionDryRun () {
        return $GLOBALS['ext_dry_run'];
 }
 
 // Setter for current extension version
 function setCurrentExtensionVersion ($ext_ver) {
-       if (empty($ext_ver)) {
-               // 0.0 is okay here
-               $GLOBALS['ext_current_version'] = '0.0';
-       } else {
-               // Add version
-               $GLOBALS['ext_current_version'] = (string) $ext_ver;
-       }
+       // ext_ver should never be empty in other modes than 'test'
+       if ((empty($ext_ver)) && (getExtensionMode() != 'test')) {
+               // Please report all these messages
+               debug_report_bug(__FUNCTION__, __LINE__, 'ext_ver is empty. Current extension name: ' . getCurrentExtensionName() . ', mode=' . getExtensionMode());
+       } // END - if
+
+       // Add version
+       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'ext_name=' . getCurrentExtensionName() . ', ext_ver[' . gettype($ext_ver) . ']=' . $ext_ver);
+       $GLOBALS['ext_current_version'][getCurrentExtensionName()] = (string) $ext_ver;
 }
 
 // Getter for current extension version
 function getCurrentExtensionVersion () {
-       return $GLOBALS['ext_current_version'];
+       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'ext_name=' . getCurrentExtensionName() . ', ext_ver=' . $GLOBALS['ext_current_version'][getCurrentExtensionName()]);
+       return $GLOBALS['ext_current_version'][getCurrentExtensionName()];
 }
 
-// Remove the extension from global cache array
+// Remove the extension from cache array
 function removeExtensionFromArray () {
        // "Cache" this name
        $ext_name = getCurrentExtensionName();
@@ -1533,7 +1676,7 @@ function loadExtensionInclude () {
        // Is it readable?
        if (!isExtensionIncludeReadable()) {
                // Not readable
-               debug_report_bug('Extension ' . getCurrentExtensionName() . ' should be loaded, but is not readable.');
+               debug_report_bug(__FUNCTION__, __LINE__, 'Extension ' . getCurrentExtensionName() . ' should be loaded, but is not readable.');
        } // END - if
 
        // Generate INC name