loadCacheFile('extensions', true)) && ($GLOBALS['cache_instance']->extensionVersionMatches('sql_patches'))) { case true : $GLOBALS['cache_mode'] = 'load'; break; case false: $GLOBALS['cache_mode'] = 'init'; break; } // END - switch // Do we need to init the cache? But not in "CSS mode". if (($GLOBALS['cache_mode'] == 'init') && (getConfig('cache_exts') == 'Y') && (getOutputMode() == '0')) { // Init cache file $GLOBALS['cache_instance']->init('EXTENSIONS'); $GLOBALS['cache_instance']->storeExtensionVersion('sql_patches'); } elseif (getConfig('cache_exts') != 'Y') { // Cache will not be created for extensions $GLOBALS['cache_mode'] = 'skip'; } } // END - if // Load cache? if ($GLOBALS['cache_mode'] == 'load') { // Init include array $EXT_POOL = array(); // Re-initialize handler $GLOBALS['cache_instance']->loadCacheFile('extensions', true); // Load extension data from cache file $EXT_DUMMY = $GLOBALS['cache_instance']->getArrayFromCache(); // Is the cache file fine? if (!isset($EXT_DUMMY['ext_name'])) { // Cache file is damaged so kill it $GLOBALS['cache_instance']->destroyCacheFile(); // Retry it require(__FILE__); return; } // END - if // Begin with the cache preparation of extensions $EXT_NAMES = array(); foreach ($EXT_DUMMY['ext_name'] as $k => $name) { // Load CSS file if ($EXT_DUMMY['ext_css'][$k] == 'Y') EXT_ADD_CSS_FILE($name . '.css'); // Load extension file itself if ((($EXT_DUMMY['ext_active'][$k] == 'Y') || ($EXT_DUMMY['ext_keep'][$k] == 'Y') || (IS_ADMIN())) && (!in_array($name, array('sql_patches', 'cache')))) { $EXT_POOL[] = $name; } // END - if // Version number $EXT_DUMMY['ext_version'][$name] = $EXT_DUMMY['ext_version'][$k]; unset($EXT_DUMMY['ext_version'][$k]); // Extension is active $EXT_DUMMY['ext_active'][$name] = $EXT_DUMMY['ext_active'][$k]; unset($EXT_DUMMY['ext_active'][$k]); // Ext menu $EXT_DUMMY['ext_menu'][$name] = $EXT_DUMMY['ext_menu'][$k]; unset($EXT_DUMMY['ext_menu'][$k]); // Extension id $EXT_DUMMY['ext_id'][$name] = $EXT_DUMMY['ext_id'][$k]; $id = $EXT_DUMMY['ext_id'][$name]; unset($EXT_DUMMY['ext_id'][$k]); // Add ext name $EXT_NAMES[$id] = $name; // Add deprecated flag (defaults to 'not deprecated') $EXT_DUMMY['ext_deprecated'][$name] = 'N'; // Mark it as active extension $GLOBALS['cache_array']['active_extensions']['$name'] = $EXT_DUMMY['ext_keep'][$k]; unset($EXT_DUMMY['ext_keep'][$k]); // Remove unneccessary data from memory unset($EXT_DUMMY['ext_css'][$k]); } // END - foreach // Write dummy array back $EXT_DUMMY['ext_name'] = $EXT_NAMES; unset($EXT_NAMES); // Loading cache is done so let's free some memory! unset($EXT_DUMMY['ext_keep']); unset($EXT_DUMMY['ext_css']); $GLOBALS['cache_array']['extensions'] = $EXT_DUMMY; unset($EXT_DUMMY); // No database load needed $res_ext_crt = false; // Load all extension files foreach ($EXT_POOL as $ext) { LOAD_EXTENSION($ext); } // END - foreach // Init filter system initFilterSystem(); // Load more cache files (like admins) loadIncludeOnce('inc/load_cache.php'); // Remove array unset($EXT_POOL); } else { // If current user is not admin load only activated extensions. But load // them all if we are going to init the cache files. The admin shall use // every available extension for testing purposes. if ((!IS_ADMIN()) && ($GLOBALS['cache_mode'] != 'init')) $add = " WHERE `ext_active`='Y'"; if (GET_EXT_VERSION('sql_patches') >= '0.0.6') { // Query with CSS file from DB $res_ext_crt = SQL_QUERY("SELECT id AS ext_id, ext_name, ext_has_css AS ext_css, ext_active, ext_version FROM `{!_MYSQL_PREFIX!}_extensions`" . $add . " ORDER BY ext_name", __FILE__, __LINE__); } else { // Old obsolete query string $res_ext_crt = SQL_QUERY("SELECT id AS ext_id, ext_name, ext_name, ext_active, ext_version FROM `{!_MYSQL_PREFIX!}_extensions`" . $add . " ORDER BY ext_name", __FILE__, __LINE__); } } // Array for removed but not uninstalled extensions $DEL = array(); // At least one found? if ((SQL_NUMROWS($res_ext_crt) > 0) && ((($GLOBALS['cache_mode'] == 'init') && (getOutputMode() != '1') && (getOutputMode() != '-1')) || ($GLOBALS['cache_mode'] == 'no'))) { // Extensions are registered so we load them while ($content = SQL_FETCHARRAY($res_ext_crt)) { // Get menu entry $content['ext_menu'] = 'N'; if (MODULE_HAS_MENU($content['ext_name'], true)) { $content['ext_menu'] = 'Y'; } // END - if // Generate FQFN for extension $FQFN = sprintf("%sinc/extensions/ext-%s.php", constant('PATH'), $content['ext_name']); // Does the extension file exists? if (isFileReadable($FQFN)) { // By default no extension is always active, except sql_patches EXT_SET_ALWAYS_ACTIVE('N'); // Load extension if (($content['ext_name'] != 'sql_patches') && (($content['ext_name'] != 'cache') || (!EXT_IS_ACTIVE('cache')))) { // Load extension LOAD_EXTENSION($content['ext_name']); } else { // Keep sql_patches always active EXT_SET_ALWAYS_ACTIVE('Y'); } // Transfer EXT_ALWAYS_ACTIVE flag $content['ext_keep'] = EXT_GET_ALWAYS_ACTIVE(); // CSS file handling: if ((!isset($content['ext_css'])) || ($content['ext_css'] == 'Y')) { // Create FQFN for the CSS file $FQFN = sprintf("%stheme/%s/css/%s.css", constant('PATH'), getCurrentTheme(), $content['ext_name']); // Is the file there? if (isFileReadable($FQFN)) { // CSS file for extension was found (use only relative path for now!) EXT_ADD_CSS_FILE($content['ext_name'] . '.css'); $content['ext_css'] = 'Y'; } else { // Don't load CSS file $content['ext_css'] = 'N'; } } // END - if // Shall we cache? if ($GLOBALS['cache_mode'] == 'init') { // Add cache row $GLOBALS['cache_instance']->addRow($content); } elseif ($GLOBALS['cache_mode'] == 'no') { // Remember this value for later usage $GLOBALS['cache_array']['active_extensions'][$content['ext_name']] = EXT_GET_ALWAYS_ACTIVE(); } } elseif (!isFileReadable($FQFN)) { // Deleted extension file so we mark it for removal from DB $DEL[] = $content['ext_name']; } } // END - while // Init filter system initFilterSystem(); if ($GLOBALS['cache_mode'] == 'init') { // Close cache file $GLOBALS['cache_instance']->finalize(); // Load more cache files (like admins) loadIncludeOnce('inc/load_cache.php'); } // END - if // Free memory SQL_FREERESULT($res_ext_crt); } elseif (!EXT_IS_ACTIVE('cache')) { // Init filter system even when there are no extensions installed. #16 initFilterSystem(); } // Run the filter runFilterChain('load_includes'); // Uninstall extensions that are no longer in our system if (!empty($DEL[0])) { // Remove extensions from two tables: extension registry and tasks table foreach ($DEL as $del_ext) { // First remove entry from extensions table SQL_QUERY_ESC("DELETE LOW_PRIORITY FROM `{!_MYSQL_PREFIX!}_extensions` WHERE `ext_name`='%s' LIMIT 1", array($del_ext), __FILE__, __LINE__); // Remove (maybe?) found tasks (main task and possible updates SQL_QUERY_ESC("DELETE LOW_PRIORITY FROM `{!_MYSQL_PREFIX!}_task_system` WHERE subject='[%s:]' AND (task_type='EXTENSION' OR task_type='EXTENSION_UPDATE')", array($del_ext), __FILE__, __LINE__); } // END - foreach // I think it's not neccessary to run the optimization function here // because we didn't delete so much data from database. Can you aggree? } // END - if // ?>