Rewrites of debug lines, possible fix for extension installation bug
[mailer.git] / inc / extensions.php
index 11cf83c782903240b5a51600d3ed4573f125c7c1..2ef4bb88fdbdf051f0961a29ed6e0db091a88073 100644 (file)
@@ -44,12 +44,12 @@ if (!defined('__SECURITY')) {
 
 // Load the extension and maybe found language and function files.
 function LOAD_EXTENSION ($ext_name, $EXT_LOAD_MODE = "", $EXT_VER = "", $dry_run = false) {
-       // Init array
-       INIT_INC_POOL();
-
        // Set current extension name
        EXT_SET_CURR_NAME($ext_name);
 
+       // Init array
+       INIT_INC_POOL();
+
        // Init EXT_UPDATE_DEPENDS
        EXT_INIT_UPDATE_DEPENDS();
 
@@ -133,15 +133,25 @@ function LOAD_EXTENSION ($ext_name, $EXT_LOAD_MODE = "", $EXT_VER = "", $dry_run
 
 // Registeres an extension and possible update depencies
 function REGISTER_EXTENSION ($ext_name, $task_id, $dry_run = false, $logout = true) {
-       // This shall never do a non-admin user!
-       if (!IS_ADMIN()) return false;
-
-       // Is this extension already installed?
-       if (EXT_IS_ACTIVE($ext_name)) return false;
-
        // Set current extension name
        EXT_SET_CURR_NAME($ext_name);
 
+       //* DEBUG: */ print __FUNCTION__."[".__LINE__."]:currName=".EXT_GET_CURR_NAME()." - ENTERED!<br />\n";
+       // This shall never do a non-admin user or if the extension is active (already installed)
+       if ((!IS_ADMIN()) || (EXT_IS_ACTIVE($ext_name))) {
+               return false;
+       } // END - if
+
+       // When this extension is already in install/update phase, all is fine
+       if (EXT_IS_REGISTER_RUNNING($ext_name)) {
+               // Then abort here which is fine
+               //* DEBUG: */ print __FUNCTION__."[".__LINE__."]:currName=".EXT_GET_CURR_NAME()." - ALREADY!<br />\n";
+               return true;
+       } // END - if
+
+       // This registration is running
+       EXT_ADD_RUNNING_REGISTRATION($ext_name);
+
        // Init EXT_UPDATE_DEPENDS
        EXT_INIT_UPDATE_DEPENDS();
 
@@ -173,13 +183,16 @@ function REGISTER_EXTENSION ($ext_name, $task_id, $dry_run = false, $logout = tr
        EXT_SET_REPORTS_FAILURE(false);
 
        // Does this extension exists?
-       //* DEBUG: */ print __LINE__.":".EXT_GET_CURR_NAME()."<br />\n";
+       //* DEBUG: */ DEBUG_LOG(__FUNCTION__, __LINE__, "currName=".EXT_GET_CURR_NAME()."");
        if (LOAD_EXTENSION(EXT_GET_CURR_NAME(), "register", "", $dry_run)) {
+               // Set current extension name again
+               EXT_SET_CURR_NAME($ext_name);
+
                // And run possible updates
-               //* DEBUG: */ print __LINE__.":".EXT_GET_CURR_NAME()."<br />\n";
+               //* DEBUG: */ DEBUG_LOG(__FUNCTION__, __LINE__, "".EXT_GET_CURR_NAME());
                $history = EXT_GET_VER_HISTORY();
                foreach ($history as $ver) {
-                       //* DEBUG: */ DEBUG_LOG(__FUNCTION__, __LINE__, "ext_name={EXT_GET_CURR_NAME()}, ext_ver={$ver}");
+                       //* DEBUG: */ DEBUG_LOG(__FUNCTION__, __LINE__, "ext_name=".EXT_GET_CURR_NAME().", ext_ver={$ver}");
                        // Load extension in update mode
                        LOAD_EXTENSION(EXT_GET_CURR_NAME(), "update", $ver, $dry_run);
 
@@ -197,6 +210,9 @@ function REGISTER_EXTENSION ($ext_name, $task_id, $dry_run = false, $logout = tr
 
                        // Check for required file
                        if (LOAD_EXTENSION($ext_update, "register", "", $dry_run)) {
+                               // Set current extension name again
+                               EXT_SET_CURR_NAME($ext_name);
+
                                // If versions mismatch update extension first
                                $ext_ver = GET_EXT_VERSION($ext_update);
 
@@ -208,9 +224,9 @@ function REGISTER_EXTENSION ($ext_name, $task_id, $dry_run = false, $logout = tr
                                        // Entry found?
                                        if ($task > 0) {
                                                // Try to register the extension
-                                               //* DEBUG: */ print __LINE__.sprintf(":ext_update=%s,task=%s<br />\n", $ext_update, $task);
+                                               //* DEBUG: */ print __FUNCTION__."[".__LINE__."]:currName=".EXT_GET_CURR_NAME().":ext_update=".$ext_update.",taskId=".$task."<br />\n";
                                                $test = REGISTER_EXTENSION($ext_update, $task, $dry_run, false);
-                                               //* DEBUG: */ var_dump($test);
+                                               //* DEBUG: */ print __FUNCTION__."[".__LINE__."]:currName=".EXT_GET_CURR_NAME().":"; var_dump($test);
                                        } // END - if
                                } elseif ($ext_ver != EXT_GET_VERSION()) {
                                        // Ok, update this extension now
@@ -242,16 +258,15 @@ function REGISTER_EXTENSION ($ext_name, $task_id, $dry_run = false, $logout = tr
                $EXT_LOAD_MODE = "register";
 
                // Remains true if extension registration reports no failures
-               //* DEBUG: */ print __LINE__.":".EXT_GET_CURR_NAME();
-               //* DEBUG: */ var_dump($test);
+               //* DEBUG: */ print __FUNCTION__."[".__LINE__."]:currName=".EXT_GET_CURR_NAME().":"; var_dump($test);
                $test = (($test === true) && (EXT_GET_REPORTS_FAILURE() === false));
-               //* DEBUG: */ var_dump($test);
+               //* DEBUG: */ print __FUNCTION__."[".__LINE__."]:currName=".EXT_GET_CURR_NAME().":"; var_dump($test);
 
                // Does everthing before wents ok?
                if ($test === true) {
                        // "Dry-run-mode" activated?
                        if ((!$dry_run) && (!EXT_IS_ON_REMOVAL_LIST())) {
-                               //* DEBUG: */ print __LINE__.": ext_name=".EXT_GET_CURR_NAME()."<br />\n";
+                               //* DEBUG: */ DEBUG_LOG(__FUNCTION__, __LINE__, " ext_name=".EXT_GET_CURR_NAME());
                                // Init SQLs and transfer ext->generic
                                INIT_SQLS();
                                SET_SQLS(GET_EXT_SQLS());
@@ -261,7 +276,7 @@ function REGISTER_EXTENSION ($ext_name, $task_id, $dry_run = false, $logout = tr
 
                                // Register extension
                                SQL_QUERY_ESC("INSERT INTO `{!_MYSQL_PREFIX!}_extensions` (ext_name, ext_active, ext_version) VALUES ('%s','%s','%s')",
-                                       array(EXT_GET_CURR_NAME(), EXT_GET_ALWAYS_ACTIVE(), EXT_GET_VERSION()), __FILE__, __LINE__);
+                                       array(EXT_GET_CURR_NAME(), EXT_GET_ALWAYS_ACTIVE(), EXT_GET_VERSION()), __FUNCTION__, __LINE__);
 
                                // Remove cache file(s) if extension is active
                                runFilterChain('post_extension_installed', array('ext_name' => EXT_GET_CURR_NAME(), 'task_id' => $task_id));
@@ -293,17 +308,18 @@ function REGISTER_EXTENSION ($ext_name, $task_id, $dry_run = false, $logout = tr
                        }
                } else {
                        // No, an error occurs while registering extension :-(
-                       //* DEBUG: */ print __LINE__.":".EXT_GET_CURR_NAME()."<br />\n";
+                       //* DEBUG: */ DEBUG_LOG(__FUNCTION__, __LINE__, "".EXT_GET_CURR_NAME());
                        $ret = false;
                }
        } elseif (($task_id > 0) && (EXT_GET_CURR_NAME() != "")) {
+               //* DEBUG: */ print __FUNCTION__."[".__LINE__."]:currName=".EXT_GET_CURR_NAME()."<br />\n";
                // 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)), __FILE__, __LINE__);
+                       array(bigintval($task_id)), __FUNCTION__, __LINE__);
        }
 
        // Is this the sql_patches?
-       //* DEBUG: */ DEBUG_LOG(__FUNCTION__, __LINE__, ":{EXT_GET_CURR_NAME()}/{$EXT_LOAD_MODE}");
+       //* DEBUG: */ DEBUG_LOG(__FUNCTION__, __LINE__, ":".EXT_GET_CURR_NAME()."/{$EXT_LOAD_MODE}");
        if ((EXT_GET_CURR_NAME() == "sql_patches") && (($EXT_LOAD_MODE == "register") || ($EXT_LOAD_MODE == "remove")) && (!$dry_run) && ($test)) {
                //* DEBUG: */ DEBUG_LOG(__FUNCTION__, __LINE__, ": LOAD!");
                if ($logout === true) {
@@ -317,6 +333,8 @@ function REGISTER_EXTENSION ($ext_name, $task_id, $dry_run = false, $logout = tr
        } // END - if
 
        // Return status code
+       //* DEBUG: */ print __FUNCTION__."[".__LINE__."]:currName=".EXT_GET_CURR_NAME()." - LEFT!<br />\n";
+       //* DEBUG: */ var_dump($ret);
        return $ret;
 }
 
@@ -345,7 +363,7 @@ function EXTENSION_RUN_SQLS ($ext_id, $load_mode) {
        $sqlRan = false;
 
        // Load extension in detected mode
-       //* DEBUG: */ DEBUG_LOG(__FUNCTION__, __LINE__, ":ext_name[{$ext_id}]={EXT_GET_CURR_NAME()}");
+       //* DEBUG: */ DEBUG_LOG(__FUNCTION__, __LINE__, ":ext_name[{$ext_id}]=".EXT_GET_CURR_NAME()."");
        LOAD_EXTENSION(EXT_GET_CURR_NAME(), $load_mode, "", false);
 
        // Init these SQLs
@@ -361,7 +379,7 @@ function EXTENSION_RUN_SQLS ($ext_id, $load_mode) {
                if ($load_mode == "remove") {
                        // Delete this extension (remember to remove it from your server *before* you click on welcome!
                        SQL_QUERY_ESC("DELETE LOW_PRIORITY FROM `{!_MYSQL_PREFIX!}_extensions` WHERE ext_name='%s' LIMIT 1",
-                               array(EXT_GET_CURR_NAME()), __FILE__, __LINE__);
+                               array(EXT_GET_CURR_NAME()), __FUNCTION__, __LINE__);
                } // END - if
        } // END - if
 
@@ -372,7 +390,7 @@ function EXTENSION_RUN_SQLS ($ext_id, $load_mode) {
        } // END - if
 
        // Is this the sql_patches?
-       //* DEBUG: */ DEBUG_LOG(__FUNCTION__, __LINE__, ": {$ext_id}/{EXT_GET_CURR_NAME()}/{$load_mode}");
+       //* DEBUG: */ DEBUG_LOG(__FUNCTION__, __LINE__, ": id=".$ext_id.",currName=".EXT_GET_CURR_NAME().",loadMode=".$load_mode);
        if ((EXT_GET_CURR_NAME() == "sql_patches") && (($load_mode == "register") || ($load_mode == "remove"))) {
                // Then redirect to logout
                //* DEBUG: */ DEBUG_LOG(__FUNCTION__, __LINE__, ": LOAD!");
@@ -398,12 +416,12 @@ function EXT_IS_ACTIVE ($ext_name) {
                incrementConfigEntry('cache_hits');
        } elseif (isset($GLOBALS['ext_loaded'][$ext_name])) {
                // @TODO Extension is loaded, what next?
-               mxchange_die("LOADED:$ext_name");
+               app_die(__FUNCTION__, __LINE__, "LOADED:$ext_name");
        } elseif (($ext_name == "cache") || (GET_EXT_VERSION("cache") == "")) {
                //* DEBUG: */ DEBUG_LOG(__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), __FILE__, __LINE__);
+                       array($ext_name), __FUNCTION__, __LINE__);
 
                // Entry found?
                if (SQL_NUMROWS($result) == 1) {
@@ -415,11 +433,11 @@ function EXT_IS_ACTIVE ($ext_name) {
                SQL_FREERESULT($result);
 
                // Write cache array
-               //* DEBUG: */ echo $ext_name."[DB]: {$active}<br />\n";
+               //* DEBUG: */ DEBUG_LOG(__FUNCTION__, __LINE__, "ext_name=".$ext_name."[DB]: {$active}");
                $GLOBALS['cache_array']['extensions']['ext_active'][$ext_name] = $active;
        } else {
                // Extension not active!
-               //* DEBUG: */ echo $ext_name.": Not active!<br />\n";
+               //* DEBUG: */ DEBUG_LOG(__FUNCTION__, __LINE__, "ext_name=".$ext_name.": Not active!");
                $GLOBALS['cache_array']['extensions']['ext_active'][$ext_name] = "N";
        }
 
@@ -455,7 +473,7 @@ function GET_EXT_VERSION ($ext_name) {
        } elseif (!isCacheInstanceValid()) {
                // Load from database
                $result = SQL_QUERY_ESC("SELECT ext_version FROM `{!_MYSQL_PREFIX!}_extensions` WHERE ext_name='%s' LIMIT 1",
-                       array($ext_name), __FILE__, __LINE__);
+                       array($ext_name), __FUNCTION__, __LINE__);
                //* DEBUG: */ DEBUG_LOG(__FUNCTION__, __LINE__, ": DB - ".SQL_NUMROWS($result)."");
 
                // Is the extension there?
@@ -547,7 +565,7 @@ function EXTENSION_UPDATE ($ext_name, $ext_ver, $dry_run = false) {
 
                        // Update extension's version
                        SQL_QUERY_ESC("UPDATE `{!_MYSQL_PREFIX!}_extensions` SET ext_version='%s' WHERE ext_name='%s' LIMIT 1",
-                               array($GLOBALS['cache_array']['update_ver'][EXT_GET_CURR_NAME()], EXT_GET_CURR_NAME()), __FILE__, __LINE__);
+                               array($GLOBALS['cache_array']['update_ver'][EXT_GET_CURR_NAME()], EXT_GET_CURR_NAME()), __FUNCTION__, __LINE__);
 
                        // Remove arrays
                        UNSET_SQLS();
@@ -635,7 +653,7 @@ function GET_EXT_NAME ($ext_id) {
        } elseif (!EXT_IS_ACTIVE("cache")) {
                // Load from database
                $result = SQL_QUERY_ESC("SELECT ext_name FROM `{!_MYSQL_PREFIX!}_extensions` WHERE id=%s LIMIT 1",
-                       array(bigintval($ext_id)), __FILE__, __LINE__);
+                       array(bigintval($ext_id)), __FUNCTION__, __LINE__);
                list($ret) = SQL_FETCHROW($result);
                SQL_FREERESULT($result);
        }
@@ -655,7 +673,7 @@ function GET_EXT_ID ($ext_name) {
        } elseif (!EXT_IS_ACTIVE("cache")) {
                // Load from database
                $result = SQL_QUERY_ESC("SELECT id FROM `{!_MYSQL_PREFIX!}_extensions` WHERE ext_name='%s' LIMIT 1",
-                       array($ext_name), __FILE__, __LINE__);
+                       array($ext_name), __FUNCTION__, __LINE__);
                list($ret) = SQL_FETCHROW($result);
                SQL_FREERESULT($result);
        }
@@ -668,7 +686,7 @@ function GET_EXT_ID ($ext_name) {
 function ACTIVATE_EXTENSION ($ext_name) {
        // Activate the extension
        SQL_QUERY_ESC("UPDATE `{!_MYSQL_PREFIX!}_extensions` SET ext_active='Y' WHERE ext_name='%s' LIMIT 1",
-               array($ext_name), __FILE__, __LINE__);
+               array($ext_name), __FUNCTION__, __LINE__);
 
        // Extension has been activated?
        if (SQL_AFFECTEDROWS() == 1) {
@@ -681,7 +699,7 @@ function ACTIVATE_EXTENSION ($ext_name) {
 function DEACTIVATE_EXTENSION($ext_name) {
        // Activate the extension
        SQL_QUERY_ESC("UPDATE `{!_MYSQL_PREFIX!}_extensions` SET ext_active='N' WHERE ext_name='%s' LIMIT 1",
-               array($ext_name), __FILE__, __LINE__);
+               array($ext_name), __FUNCTION__, __LINE__);
 
        // Extension has been activated?
        if (SQL_AFFECTEDROWS() == 1) {
@@ -724,7 +742,7 @@ function CREATE_EXTENSION_UPDATE_TASK ($admin_id, $ext_name, $ext_ver, $notes) {
                if (DETERMINE_TASK_ID_BY_SUBJECT($subject) == 0) {
                        // Task not created so it's a brand-new extension which we need to register and create a task for!
                        SQL_QUERY_ESC("INSERT INTO `{!_MYSQL_PREFIX!}_task_system` (assigned_admin, userid, status, task_type, subject, text, task_created) VALUES ('%s','0','NEW','EXTENSION_UPDATE','%s','%s', UNIX_TIMESTAMP())",
-                               array($admin_id, $subject, $notes), __FILE__, __LINE__);
+                               array($admin_id, $subject, $notes), __FUNCTION__, __LINE__);
                } // END - if
        } // END - if
 }
@@ -740,23 +758,26 @@ function CREATE_NEW_EXTENSION_TASK ($admin_id, $subject, $ext) {
                        $ext
                );
 
-               // Load text for task
+               // Set default message if ext-foo is missing
+               $msg = sprintf(getMessage('ADMIN_EXT_TEXT_FILE_MISSING'), $ext);
+
+               // Load text for task if found
                if (FILE_READABLE($tpl)) {
                        // Load extension's own text template (HTML!)
-                       $msg = LOAD_TEMPLATE("ext_".$ext, true);
+                       $msg = LOAD_TEMPLATE("ext_" . $ext, true);
                } else {
-                       // Load default message
-                       $msg = LOAD_TEMPLATE("admin_new_ext", "", 0);
+                       // Write this in debug.log as well
+                       DEBUG_LOG(__FUNCTION__, __LINE__, $msg);
                }
 
                // Task not created so it's a brand-new extension which we need to register and create a task for!
                SQL_QUERY_ESC("INSERT INTO `{!_MYSQL_PREFIX!}_task_system` (assigned_admin, userid, status, task_type, subject, text, task_created)
-VALUES (%s,0,'NEW','EXTENSION','%s','%s',UNIX_TIMESTAMP())",
+VALUES (%s, 0, 'NEW', 'EXTENSION', '%s', '%s', UNIX_TIMESTAMP())",
                        array(
                                $admin_id,
                                $subject,
-                               SQL_ESCAPE($msg),
-                       ),  __FILE__, __LINE__, true, false
+                               smartAddSlashes($msg),
+                       ),  __FUNCTION__, __LINE__, true, false, false
                );
        } // END - if
 }
@@ -770,11 +791,11 @@ function CREATE_EXTENSION_DEACTIVATION_TASK ($ext) {
        if ((DETERMINE_TASK_ID_BY_SUBJECT($subject) == 0) && (GET_EXT_VERSION($ext) != "")) {
                // Task not created so add it
                SQL_QUERY_ESC("INSERT INTO `{!_MYSQL_PREFIX!}_task_system` (assigned_admin, userid, status, task_type, subject, text, task_created)
-VALUES (0,0,'NEW','EXTENSION_DEACTIVATION','%s','%s',UNIX_TIMESTAMP())",
+VALUES (0, 0, 'NEW', 'EXTENSION_DEACTIVATION', '%s', '%s', UNIX_TIMESTAMP())",
                        array(
                                $subject,
                                SQL_ESCAPE(LOAD_TEMPLATE("task_ext_deactivated", true, $ext)),
-                       ),  __FILE__, __LINE__, true, false
+                       ),  __FUNCTION__, __LINE__, true, false
                );
        } // END - if
 }
@@ -784,7 +805,7 @@ function MODULE_HAS_MENU ($mod, $forceDb = false) {
        // All is false by default
        $ret = false;
 
-       //* DEBUG: */ print __FUNCTION__."(<font color=\"#0000aa\">".__LINE__."</font>):mod={$mod},cache=".GET_EXT_VERSION("cache")."<br />\n";
+       //* DEBUG: */ DEBUG_LOG(__FUNCTION__, __LINE__, "mod={$mod},cache=".GET_EXT_VERSION("cache"));
        if (GET_EXT_VERSION("cache") >= "0.1.2") {
                // Cache version is okay, so let's check the cache!
                if (isset($GLOBALS['cache_array']['modules']['has_menu'][$mod])) {
@@ -801,8 +822,8 @@ function MODULE_HAS_MENU ($mod, $forceDb = false) {
                }
        } elseif ((GET_EXT_VERSION("sql_patches") >= "0.3.6") && ((!EXT_IS_ACTIVE("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), __FILE__, __LINE__);
+               $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) {
@@ -824,7 +845,7 @@ function MODULE_HAS_MENU ($mod, $forceDb = false) {
        }
 
        // Return status
-       //* DEBUG: */ var_dump($ret);
+       //* DEBUG: */ print __FUNCTION__."[".__LINE__."]:currName=".EXT_GET_CURR_NAME().":"; var_dump($ret);
        return $ret;
 }
 
@@ -835,7 +856,7 @@ function DETERMINE_EXTENSION_TASK_ID ($ext_name) {
 
        // Search for extension task's id
        $result = SQL_QUERY_ESC("SELECT id FROM `{!_MYSQL_PREFIX!}_task_system` WHERE task_type='EXTENSION' AND subject='[%s:]' LIMIT 1",
-               array($ext_name), __FILE__, __LINE__);
+               array($ext_name), __FUNCTION__, __LINE__);
 
        // Entry found?
        if (SQL_NUMROWS($result) == 1) {
@@ -857,7 +878,7 @@ function DETERMINE_TASK_ID_BY_SUBJECT ($subject) {
 
        // Search for task id
        $result = SQL_QUERY_ESC("SELECT id FROM `{!_MYSQL_PREFIX!}_task_system` WHERE subject LIKE '%s%%' LIMIT 1",
-               array($subject), __FILE__, __LINE__);
+               array($subject), __FUNCTION__, __LINE__);
 
        // Entry found?
        if (SQL_NUMROWS($result) == 1) {
@@ -985,7 +1006,7 @@ function EXT_ADD_UPDATE_DEPENDS ($updateDepends) {
 
        // Is it not yet added?
        if (!in_array($updateDepends, $GLOBALS['ext_running_updates'])) {
-               //* DEBUG */ print __FUNCTION__.":".EXT_GET_CURR_NAME()."/".$updateDepends."<br />\n";
+               //* DEBUG */ DEBUG_LOG(__FUNCTION__, __LINE__, "currName=".EXT_GET_CURR_NAME()."/".$updateDepends);
                // Add it to the list of extension update depencies map
                $GLOBALS['ext_update_depends'][EXT_GET_CURR_NAME()][] = (string) $updateDepends;
 
@@ -994,40 +1015,64 @@ function EXT_ADD_UPDATE_DEPENDS ($updateDepends) {
        } // END - if
 }
 
+// Checks wether the given extension registration is in progress
+function EXT_IS_REGISTER_RUNNING ($ext_name) {
+       return ((isset($GLOBALS['ext_register_running'])) && (in_array($ext_name, $GLOBALS['ext_register_running'])));
+}
+
 // Init EXT_UPDATE_DEPENDS flag
 function EXT_INIT_UPDATE_DEPENDS () {
-       //* DEBUG: */ print __FUNCTION__.":".EXT_GET_CURR_NAME()."<br />\n";
+       //* DEBUG: */ DEBUG_LOG(__FUNCTION__, __LINE__, "currName=".EXT_GET_CURR_NAME());
 
-       // Init update depency map
-       $GLOBALS['ext_update_depends'][EXT_GET_CURR_NAME()] = array();
+       // Init update depency map automatically if not found
+       if (!EXT_IS_UPDATE_DEPENDS_INIT()) {
+               //* DEBUG: */ DEBUG_LOG(__FUNCTION__, __LINE__, "currName=".EXT_GET_CURR_NAME()." - INIT!");
+               $GLOBALS['ext_update_depends'][EXT_GET_CURR_NAME()] = array();
+       } // END - if
 
        // Init running updates array
        EXT_INIT_RUNNING_UPDATES();
 }
 
+// Adds an extension as "registration in progress"
+function EXT_ADD_RUNNING_REGISTRATION ($ext_name) {
+       // Is it running?
+       if (!EXT_IS_REGISTER_RUNNING($ext_name)) {
+               // Then add it!
+               $GLOBALS['ext_register_running'][] = $ext_name;
+       } // END - if
+}
+
+// Checks wether EXT_UPDATE_DEPENDS is initialized
+function EXT_IS_UPDATE_DEPENDS_INIT () {
+       //* DEBUG: */ DEBUG_LOG(__FUNCTION__, __LINE__, "currName=".EXT_GET_CURR_NAME());
+       return (isset($GLOBALS['ext_update_depends'][EXT_GET_CURR_NAME()]));
+}
+
 // Initializes the list of running updates
 function EXT_INIT_RUNNING_UPDATES () {
        // Auto-init ext_running_updates
        if (!isset($GLOBALS['ext_running_updates'])) {
                $GLOBALS['ext_running_updates'] = array();
+               $GLOBALS['ext_register_running'] = array();
        } // END - if
 }
 
 // Getter for EXT_UPDATE_DEPENDS flag
 function EXT_GET_UPDATE_DEPENDS () {
-       //* DEBUG: */ print __FUNCTION__.":".EXT_GET_CURR_NAME()."<br />\n";
+       //* DEBUG: */ DEBUG_LOG(__FUNCTION__, __LINE__, "currName=".EXT_GET_CURR_NAME());
        return $GLOBALS['ext_update_depends'][EXT_GET_CURR_NAME()];
 }
 
 // Getter for next iterator depency
 function EXT_GET_ITERATOR_UPDATE_DEPENDS () {
-       //* DEBUG: */ print __FUNCTION__.":".EXT_GET_CURR_NAME()."<br />\n";
+       //* DEBUG: */ DEBUG_LOG(__FUNCTION__, __LINE__, "currName=".EXT_GET_CURR_NAME());
        return ($GLOBALS['ext_update_depends'][EXT_GET_CURR_NAME()][EXT_GET_UPDATE_ITERATOR()]);
 }
 
 // Counter for extension update depencies
 function EXT_COUNT_UPDATE_DEPENDS () {
-       //* DEBUG: */ print __FUNCTION__.":".EXT_GET_CURR_NAME()."<br />\n";
+       //* DEBUG: */ DEBUG_LOG(__FUNCTION__, __LINE__, "currName=".EXT_GET_CURR_NAME());
        return count($GLOBALS['ext_update_depends'][EXT_GET_CURR_NAME()]);
 }
 
@@ -1048,7 +1093,7 @@ function EXT_REMOVE_UPDATE_DEPENDS ($ext_name) {
 
 // Init iterator for update depencies
 function EXT_INIT_UPDATE_ITERATOR () {
-       //* DEBUG: */ print __FUNCTION__.":".EXT_GET_CURR_NAME()."<br />\n";
+       //* DEBUG: */ DEBUG_LOG(__FUNCTION__, __LINE__, "currName=".EXT_GET_CURR_NAME());
        $GLOBALS['ext_depend_iterator'][EXT_GET_CURR_NAME()] = 0;
 }
 
@@ -1058,13 +1103,13 @@ function EXT_GET_UPDATE_ITERATOR () {
        if (!isset($GLOBALS['ext_depend_iterator'][EXT_GET_CURR_NAME()])) EXT_INIT_UPDATE_ITERATOR();
 
        // Return it
-       //* DEBUG: */ print __FUNCTION__.":".EXT_GET_CURR_NAME()."/".$GLOBALS['ext_depend_iterator'][EXT_GET_CURR_NAME()]."<br />\n";
+       //* DEBUG: */ DEBUG_LOG(__FUNCTION__, __LINE__, "currName=".EXT_GET_CURR_NAME()."/".$GLOBALS['ext_depend_iterator'][EXT_GET_CURR_NAME()]);
        return $GLOBALS['ext_depend_iterator'][EXT_GET_CURR_NAME()];
 }
 
 // Increments the update iterator
 function EXT_INCREMENT_UPDATE_INTERATOR () {
-       //* DEBUG: */ print __FUNCTION__.":".EXT_GET_CURR_NAME()."<br />\n";
+       //* DEBUG: */ DEBUG_LOG(__FUNCTION__, __LINE__, "currName=".EXT_GET_CURR_NAME());
        $GLOBALS['ext_depend_iterator'][EXT_GET_CURR_NAME()]++;
 }