/** * Load information stored in the database about modules. * * This method grabs modules dependencies from the database and updates modules * objects. * * This is not inside the module code because it is much faster to * request all of the information at once than it is to have each module * requests its own information. This sacrifice of modularity yields a substantial * performance improvement. * * @param array $modules List of module names to preload information for * @param ResourceLoaderContext $context Context to load the information within */ public function preloadModuleInfo(array $modules, ResourceLoaderContext $context) { if (!count($modules)) { // Or else Database*::select() will explode, plus it's cheaper! return; } $dbr = wfGetDB(DB_SLAVE); $skin = $context->getSkin(); $lang = $context->getLanguage(); // Batched version of ResourceLoaderModule::getFileDependencies $vary = "{$skin}|{$lang}"; $res = $dbr->select('module_deps', array('md_module', 'md_deps'), array('md_module' => $modules, 'md_skin' => $vary), __METHOD__); // Prime in-object cache values for each module $modulesWithDeps = array(); foreach ($res as $row) { $module = $this->getModule($row->md_module); if ($module) { $module->setFileDependencies($context, ResourceLoaderModule::expandRelativePaths(FormatJson::decode($row->md_deps, true))); $modulesWithDeps[] = $row->md_module; } } // Register the absence of a dependency row too foreach (array_diff($modules, $modulesWithDeps) as $name) { $module = $this->getModule($name); if ($module) { $this->getModule($name)->setFileDependencies($context, array()); } } // Get message blob mtimes. Only do this for modules with messages $modulesWithMessages = array(); foreach ($modules as $name) { $module = $this->getModule($name); if ($module && count($module->getMessages())) { $modulesWithMessages[] = $name; } } $modulesWithoutMessages = array_flip($modules); // Will be trimmed down by the loop below if (count($modulesWithMessages)) { $res = $dbr->select('msg_resource', array('mr_resource', 'mr_timestamp'), array('mr_resource' => $modulesWithMessages, 'mr_lang' => $lang), __METHOD__); foreach ($res as $row) { $module = $this->getModule($row->mr_resource); if ($module) { $module->setMsgBlobMtime($lang, wfTimestamp(TS_UNIX, $row->mr_timestamp)); unset($modulesWithoutMessages[$row->mr_resource]); } } } foreach (array_keys($modulesWithoutMessages) as $name) { $module = $this->getModule($name); if ($module) { $module->setMsgBlobMtime($lang, 1); } } }
/** * Load information stored in the database about modules. * * This method grabs modules dependencies from the database and updates modules * objects. * * This is not inside the module code because it is much faster to * request all of the information at once than it is to have each module * requests its own information. This sacrifice of modularity yields a substantial * performance improvement. * * @param array $moduleNames List of module names to preload information for * @param ResourceLoaderContext $context Context to load the information within */ public function preloadModuleInfo(array $moduleNames, ResourceLoaderContext $context) { if (!$moduleNames) { // Or else Database*::select() will explode, plus it's cheaper! return; } $dbr = wfGetDB(DB_SLAVE); $skin = $context->getSkin(); $lang = $context->getLanguage(); // Batched version of ResourceLoaderModule::getFileDependencies $vary = "{$skin}|{$lang}"; $res = $dbr->select('module_deps', array('md_module', 'md_deps'), array('md_module' => $moduleNames, 'md_skin' => $vary), __METHOD__); // Prime in-object cache for file dependencies $modulesWithDeps = array(); foreach ($res as $row) { $module = $this->getModule($row->md_module); if ($module) { $module->setFileDependencies($context, ResourceLoaderModule::expandRelativePaths(FormatJson::decode($row->md_deps, true))); $modulesWithDeps[] = $row->md_module; } } // Register the absence of a dependency row too foreach (array_diff($moduleNames, $modulesWithDeps) as $name) { $module = $this->getModule($name); if ($module) { $this->getModule($name)->setFileDependencies($context, array()); } } // Prime in-object cache for message blobs for modules with messages $modules = array(); foreach ($moduleNames as $name) { $module = $this->getModule($name); if ($module && $module->getMessages()) { $modules[$name] = $module; } } $store = $this->getMessageBlobStore(); $blobs = $store->getBlobs($modules, $lang); foreach ($blobs as $name => $blob) { $modules[$name]->setMessageBlob($blob, $lang); } }