More fixes for installation and extension registration
[mailer.git] / inc / extensions-functions.php
index 4a21cc45aab05ce7c628814916e53d021cf6c0e6..c73a57fe4c3bc0d2adbbc45b50623c868a5f61d3 100644 (file)
@@ -1,7 +1,7 @@
 <?php
 /************************************************************************
- * MXChange v0.2.1                                    Start: 10/25/2009 *
- * ===============                              Last change: 10/25/2009 *
+ * Mailer v0.2.1-FINAL                                Start: 10/25/2009 *
+ * ===================                          Last change: 10/25/2009 *
  *                                                                      *
  * -------------------------------------------------------------------- *
  * File              : extensions-functions.php                         *
@@ -102,7 +102,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()) && (getOutputMode() == '0') && ($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,
@@ -173,12 +173,12 @@ function registerExtension ($ext_name, $task_id, $dry_run = false, $logout = tru
        initExtensionUpdateDependencies();
 
        // Is the task id zero? Then we need to auto-fix it here
-       if ($task_id == 0) {
+       if ($task_id == '0') {
                // Try to find the task
                $task_id = determineExtensionTaskId(getCurrentExtensionName());
 
                // Still zero and not in dry-run?
-               if (($task_id == 0) && (!getExtensionDryRun())) {
+               if (($task_id == '0') && (!getExtensionDryRun())) {
                        // Then request a bug report
                        debug_report_bug(sprintf("%s: task_id is still zero after determineExtensionTaskId(%s)",
                                __FUNCTION__,
@@ -226,7 +226,7 @@ function registerExtension ($ext_name, $task_id, $dry_run = false, $logout = tru
                        incrementExtensionUpdateIterator();
 
                        // Check for required file
-                       if (loadExtension($ext_update, 'register', '', getExtensionDryRun())) {
+                       if ((!isExtensionInstalled($ext_update)) && (loadExtension($ext_update, 'register', '', getExtensionDryRun()))) {
                                // Set current extension name again
                                setCurrentExtensionName($ext_name);
 
@@ -239,7 +239,7 @@ function registerExtension ($ext_name, $task_id, $dry_run = false, $logout = tru
 
                                // Extension version set? If empty the extension is not registered
                                if (empty($ext_ver)) {
-                                       // Extension not registered so far so first load task's ID...
+                                       // Extension not registered so far so first load task's id...
                                        $task = determineExtensionTaskId($ext_update);
 
                                        // Entry found?
@@ -254,12 +254,15 @@ function registerExtension ($ext_name, $task_id, $dry_run = false, $logout = tru
                                        } // END - if
                                } elseif ($ext_ver != getCurrentExtensionVersion()) {
                                        // Ok, update this extension now
-                                       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, "currName=".getCurrentExtensionName().",ext_update=".$ext_update.",ext_ver=".$ext_ver."/".getCurrentExtensionVersion()."");
-                                       $GLOBALS['ext_backup'][$ext_update][$ext_ver] = getCurrentExtensionName();
+                                       //* 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());
-                                       setCurrentExtensionName($GLOBALS['ext_backup'][$ext_update][$ext_ver]);
-                                       unset($GLOBALS['ext_backup'][$ext_update][$ext_ver]);
-                                       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, "currName=".getCurrentExtensionName()."");
+                                       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().'');
 
                                        // All okay!
                                        $test = true;
@@ -278,7 +281,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
@@ -450,11 +453,10 @@ function isExtensionInstalled ($ext_name) {
                // Extensions are all inactive/not installed during installation
        } else {
                // Look in database
-               $result = SQL_QUERY_ESC("SELECT `id` FROM `{?_MYSQL_PREFIX?}_extensions` WHERE `ext_name`='%s' LIMIT 1",
-                       array($ext_name), __FILE__, __LINE__);
+               $ext_id = getExtensionId($ext_name);
 
                // Do we have a record?
-               $isInstalled = (SQL_NUMROWS($result) == 1);
+               $isInstalled = ($ext_id > 0);
 
                // Is it installed, then cache the entry
                if ($isInstalled === true) {
@@ -462,9 +464,6 @@ function isExtensionInstalled ($ext_name) {
                        getExtensionId($ext_name, true);
                } // END - if
 
-               // Free result
-               SQL_FREERESULT($result);
-
                // Remember the status
                $GLOBALS['ext_is_installed'][$ext_name] = $isInstalled;
        }
@@ -479,19 +478,19 @@ function isExtensionActive ($ext_name) {
        if ((isInstallationPhase()) || (empty($ext_name))) return false;
 
        // Not active is the default
-       $active = 'N';
+       $data['ext_active'] = 'N';
 
        // Check cache
        if (isset($GLOBALS['cache_array']['extension']['ext_active'][$ext_name])) {
                // Load from cache
                //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, "CACHE! ext_name={$ext_name}");
-               $active = $GLOBALS['cache_array']['extension']['ext_active'][$ext_name];
+               $data['ext_active'] = $GLOBALS['cache_array']['extension']['ext_active'][$ext_name];
 
                // Count cache hits
                incrementStatsEntry('cache_hits');
        } elseif (isset($GLOBALS['ext_loaded'][$ext_name])) {
                // @TODO Extension is loaded, what next?
-               app_die(__FUNCTION__, __LINE__, "LOADED:$ext_name");
+               app_die(__FUNCTION__, __LINE__, 'LOADED:' . $ext_name);
        } elseif (($ext_name == 'cache') || (!isExtensionInstalled('cache'))) {
                //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, "DB! ext_name={$ext_name}");
                // Load from database
@@ -501,15 +500,15 @@ function isExtensionActive ($ext_name) {
                // Entry found?
                if (SQL_NUMROWS($result) == 1) {
                        // Load entry
-                       list($active) = SQL_FETCHROW($result);
+                       $data = SQL_FETCHARRAY($result);
                } // END - if
 
                // Free result
                SQL_FREERESULT($result);
 
                // Write cache array
-               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, "ext_name=".$ext_name."[DB]: {$active}");
-               $GLOBALS['cache_array']['extension']['ext_active'][$ext_name] = $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!");
@@ -517,16 +516,16 @@ function isExtensionActive ($ext_name) {
        }
 
        // Debug message
-       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, "ext_name={$ext_name},active={$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 ($active == 'Y');
+       return ($data['ext_active'] == 'Y');
 }
 
 // Get version from extensions
-function getExtensionVersion ($ext_name) {
+function getExtensionVersion ($ext_name, $force = false) {
        // By default no extension is found
-       $ext_ver = 'invalid';
+       $data['ext_version'] = 'false';
 
        // Empty extension name should be fixed!
        if (empty($ext_name)) {
@@ -536,13 +535,13 @@ function getExtensionVersion ($ext_name) {
 
        // 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])) {
                // Load data from cache
-               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, ": CACHE!");
-               $ext_ver = $GLOBALS['cache_array']['extension']['ext_version'][$ext_name];
+               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, $ext_name . ': CACHE!');
+               $data['ext_version'] = $GLOBALS['cache_array']['extension']['ext_version'][$ext_name];
 
                // Count cache hits
                incrementStatsEntry('cache_hits');
@@ -550,33 +549,33 @@ function getExtensionVersion ($ext_name) {
                // Load from database
                $result = SQL_QUERY_ESC("SELECT `ext_version` FROM `{?_MYSQL_PREFIX?}_extensions` WHERE `ext_name`='%s' LIMIT 1",
                        array($ext_name), __FUNCTION__, __LINE__);
-               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, ": DB - ".SQL_NUMROWS($result)."");
+               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, $ext_name . ': DB - '.SQL_NUMROWS($result).'');
 
                // Is the extension there?
                if (SQL_NUMROWS($result) == 1) {
                        // Load entry
-                       list($ext_ver) = SQL_FETCHROW($result);
+                       $data = SQL_FETCHARRAY($result);
                } elseif (isDebugModeEnabled()) {
-                       // Not found!
-                       logDebugMessage(__FUNCTION__, __LINE__, sprintf(": Cannot find extension %s in database!", $ext_name));
+                       // Not found, please report all
+                       debug_report_bug(sprintf(": Cannot find extension %s in database!", $ext_name));
                }
 
                // Free result
                SQL_FREERESULT($result);
 
                // Set cache
-               $GLOBALS['cache_array']['extension']['ext_version'][$ext_name] = $ext_ver;
+               $GLOBALS['cache_array']['extension']['ext_version'][$ext_name] = $data['ext_version'];
        }
 
        // Extension version should not be invalid
-       if ($ext_ver == '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));
        } // END - if
 
        // Return result
-       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, ": ret={$ext_ver}");
-       return $ext_ver;
+       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, ": ret={$data['ext_version']}");
+       return $data['ext_version'];
 }
 
 // Updates a given extension with current extension version to latest version
@@ -734,12 +733,12 @@ function addExtensionVerboseSqlTable ($title = '', $dashed = '', $switch = false
 // Get extension name from id
 function getExtensionName ($ext_id) {
        // Init extension name
-       $ret = '';
+       $data['ext_name'] = '';
 
        // Is cache there?
        if (isset($GLOBALS['cache_array']['extension']['ext_name'][$ext_id])) {
                // Load from cache
-               $ret = $GLOBALS['cache_array']['extension']['ext_name'][$ext_id];
+               $data['ext_name'] = $GLOBALS['cache_array']['extension']['ext_name'][$ext_id];
 
                // Count cache hits
                incrementStatsEntry('cache_hits');
@@ -751,7 +750,7 @@ function getExtensionName ($ext_id) {
                // Is the entry there?
                if (SQL_NUMROWS($result) == 1) {
                        // Get the extension's name from database
-                       list($ret) = SQL_FETCHROW($result);
+                       $data = SQL_FETCHARRAY($result);
                } // END - if
 
                // Free result
@@ -759,51 +758,47 @@ function getExtensionName ($ext_id) {
        }
 
        // Did we find some extension?
-       if (empty($ret)) {
+       if (empty($data['ext_name'])) {
                // We should fix these all!
                debug_report_bug(__FUNCTION__ . ': ext_name is empty. ext_id=' . $ext_id);
        } // END - if
 
        // Return the extension name
-       return $ret;
+       return $data['ext_name'];
 }
 
 // Get extension id from name
-function getExtensionId ($ext_name, $forceDb = false) {
-       // Init ID number
-       $ret = 0;
+function getExtensionId ($ext_name) {
+       // Init id number
+       $data['ext_id'] = '0';
 
+       // Do we have cache?
        if (isset($GLOBALS['cache_array']['extension']['ext_id'][$ext_name])) {
                // Load from cache
-               $ret = $GLOBALS['cache_array']['extension']['ext_id'][$ext_name];
+               $data['ext_id'] = $GLOBALS['cache_array']['extension']['ext_id'][$ext_name];
 
                // Count cache hits
                incrementStatsEntry('cache_hits');
-       } elseif (($forceDb === true) || (!isExtensionActive('cache'))) {
+       } else {
                // Load from database
-               $result = SQL_QUERY_ESC("SELECT `id` FROM `{?_MYSQL_PREFIX?}_extensions` WHERE `ext_name`='%s' LIMIT 1",
+               $result = SQL_QUERY_ESC("SELECT `id` AS ext_id FROM `{?_MYSQL_PREFIX?}_extensions` WHERE `ext_name`='%s' LIMIT 1",
                        array($ext_name), __FUNCTION__, __LINE__);
 
                // Is the entry there?
                if (SQL_NUMROWS($result) == 1) {
                        // Get the extension's id from database
-                       list($ret) = SQL_FETCHROW($result);
+                       $data = SQL_FETCHARRAY($result);
                } // END - if
 
                // Free result
                SQL_FREERESULT($result);
 
                // Cache it
-               $GLOBALS['cache_array']['extension']['ext_id'][$ext_name] = $ret;
+               $GLOBALS['cache_array']['extension']['ext_id'][$ext_name] = $data['ext_id'];
        }
 
-       if ($ret == 0) {
-               // We should fix these all!
-               debug_report_bug(__FUNCTION__ . ': Invalid extension name found. ext_name=' . $ext_name);
-       } // END - if
-
        // Return value
-       return $ret;
+       return $data['ext_id'];
 }
 
 // Determines wether the given extension name is valid
@@ -899,7 +894,7 @@ function createExtensionUpdateTask ($adminId, $ext_name, $ext_ver, $notes) {
        // Is the extension there?
        if (isExtensionInstalled($ext_name)) {
                // Check if task is not there
-               if (determineTaskIdBySubject($subject) == 0) {
+               if (determineTaskIdBySubject($subject) == '0') {
                        // Create extension update-task
                        createNewTask($subject, $notes, 'EXTENSION_UPDATE', 0, $adminId);
                } // END - if
@@ -912,9 +907,9 @@ function createExtensionUpdateTask ($adminId, $ext_name, $ext_ver, $notes) {
 // Creates a new task for newly installed extension
 function createNewExtensionTask ($adminId, $subject, $ext) {
        // Not installed and do we have created a task for the admin?
-       if ((determineTaskIdBySubject($subject) == 0) && (!isExtensionInstalled($ext))) {
+       if ((determineTaskIdBySubject($subject) == '0') && (!isExtensionInstalled($ext))) {
                // Set default message if ext-foo is missing
-               $message = sprintf(getMessage('ADMIN_EXT_TEXT_FILE_MISSING'), $ext);
+               $message = getMaskedMessage('ADMIN_EXT_TEXT_FILE_MISSING', $ext);
 
                // Template file
                $tpl = sprintf("%stemplates/%s/html/ext/ext_%s.tpl",
@@ -943,7 +938,7 @@ function createExtensionDeactivationTask ($ext) {
        $subject = sprintf("[%s:] %s", $ext, getMessage('TASK_SUBJ_EXTENSION_DEACTIVATED'));
 
        // Not installed and do we have created a task for the admin?
-       if ((determineTaskIdBySubject($subject) == 0) && (getExtensionVersion($ext) != '')) {
+       if ((determineTaskIdBySubject($subject) == '0') && (getExtensionVersion($ext) != '')) {
                // Task not created so add it
                createNewTask($subject, SQL_ESCAPE(loadTemplate('task_ext_deactivated', true, $ext)), 'EXTENSION_DEACTIVATION');
        } // END - if
@@ -954,7 +949,7 @@ function ifModuleHasMenu ($mod, $forceDb = false) {
        // All is false by default
        $ret = false;
 
-       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, "mod={$mod},cache=".getExtensionVersion('cache'));
+       // 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])) {
@@ -977,13 +972,13 @@ function ifModuleHasMenu ($mod, $forceDb = false) {
                // Entry found?
                if (SQL_NUMROWS($result) == 1) {
                        // Load "has_menu" column
-                       list($has_menu) = SQL_FETCHROW($result);
+                       $data = SQL_FETCHARRAY($result);
 
                        // Fake cache... ;-)
-                       $GLOBALS['cache_array']['extension']['ext_menu'][$mod] = $has_menu;
+                       $GLOBALS['cache_array']['extension']['ext_menu'][$mod] = $data['has_menu'];
 
                        // Does it have a menu?
-                       $ret = ($has_menu == 'Y');
+                       $ret = ($data['has_menu'] == 'Y');
                } // END  - if
 
                // Free memory
@@ -994,52 +989,51 @@ function ifModuleHasMenu ($mod, $forceDb = false) {
        }
 
        // Return status
-       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, "currName=".getCurrentExtensionName().intval($ret));
        return $ret;
 }
 
 // Determines the task id for given extension
 function determineExtensionTaskId ($ext_name) {
        // Default is not found
-       $task_id = 0;
+       $data['task_id'] = '0';
 
        // 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",
+       $result = SQL_QUERY_ESC("SELECT `id` AS task_id FROM `{?_MYSQL_PREFIX?}_task_system` WHERE `task_type`='EXTENSION' AND `subject`='[%s:]' LIMIT 1",
                array($ext_name), __FUNCTION__, __LINE__);
 
        // Entry found?
        if (SQL_NUMROWS($result) == 1) {
-               // Task found so load task's ID and register extension...
-               list($task_id) = SQL_FETCHROW($result);
+               // Task found so load task's id and register extension...
+               $data = SQL_FETCHARRAY($result);
        } // END - if
 
        // Free result
        SQL_FREERESULT($result);
 
        // Return it
-       return $task_id;
+       return $data['task_id'];
 }
 
 // Determines the task id for given subject
 function determineTaskIdBySubject ($subject) {
        // Default is not found
-       $task_id = 0;
+       $data['task_id'] = '0';
 
        // Search for task id
-       $result = SQL_QUERY_ESC("SELECT `id` FROM `{?_MYSQL_PREFIX?}_task_system` WHERE `subject` LIKE '%s%%' LIMIT 1",
+       $result = SQL_QUERY_ESC("SELECT `id` AS task_id FROM `{?_MYSQL_PREFIX?}_task_system` WHERE `subject` LIKE '%s%%' LIMIT 1",
                array($subject), __FUNCTION__, __LINE__);
 
        // Entry found?
        if (SQL_NUMROWS($result) == 1) {
-               // Task found so load task's ID and register extension...
-               list($task_id) = SQL_FETCHROW($result);
+               // Task found so load task's id and register extension...
+               $data = SQL_FETCHARRAY($result);
        } // END - if
 
        // Free result
        SQL_FREERESULT($result);
 
        // Return it
-       return $task_id;
+       return $data['task_id'];
 }
 
 // Add updates notes for given version
@@ -1149,7 +1143,7 @@ function addExtensionUpdateDependency ($updateDepends) {
        // 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('updateDepends is left empty!');
        } // END - if
 
        // Is it not yet added?
@@ -1242,7 +1236,7 @@ function removeExtensionUpdateDependency ($ext_name) {
 // Init iterator for update depencies
 function initExtensionUpdateIterator () {
        //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, "currName=".getCurrentExtensionName());
-       $GLOBALS['ext_depend_iterator'][getCurrentExtensionName()] = 0;
+       $GLOBALS['ext_depend_iterator'][getCurrentExtensionName()] = '0';
 }
 
 // Getter for depency iterator
@@ -1459,7 +1453,7 @@ function removeExtensionFromArray () {
        $ext_name = getCurrentExtensionName();
 
        // Now loop through the whole cache
-       foreach ($GLOBALS['cache_array']['extension'] as $cacheName=>$cacheArray) {
+       foreach ($GLOBALS['cache_array']['extension'] as $cacheName => $cacheArray) {
                // Is it an element?
                if (isset($cacheArray[$ext_name])) {
                        // Array element
@@ -1561,7 +1555,7 @@ function isExtensionIncludeReadable ($ext_name = '') {
        } // END - if
 
        // Return result
-       //* DEBUG: */ print __FUNCTION__.': '.$ext_name.'='.intval($GLOBALS['ext_inc_readable'][$ext_name]).'<br />';
+       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'ext_name=' . $ext_name . ',realable='.intval($GLOBALS['ext_inc_readable'][$ext_name]));
        return $GLOBALS['ext_inc_readable'][$ext_name];
 }