XMLSITEMAP_MAX_SITEMAP_INDEX_LINKS &&
$chunk_size < XMLSITEMAP_MAX_SITEMAP_LINKS) {
// Determine the number of chunks we are over the maximum index links.
$chunk_adjust = $chunk_count - XMLSITEMAP_MAX_SITEMAP_INDEX_LINKS;
// Determine the number of links to adjust the chunk size.
$chunk_adjust = $chunk_adjust * $chunk_size;
if (($chunk_size + $chunk_adjust) <= XMLSITEMAP_MAX_SITEMAP_LINKS) {
$chunk_size += $chunk_adjust;
}
else {
$chunk_size = XMLSITEMAP_MAX_SITEMAP_LINKS;
}
variable_set('xmlsitemap_chunk_size', $chunk_size);
watchdog('xmlsitemap', 'Chunk size has been updated to @chunk-size.', array('@chunk-size' => $chunk_size));
}
elseif($chunk_count > XMLSITEMAP_MAX_SITEMAP_INDEX_LINKS) {
watchdog('xmlsitemap', 'The maximum number of allowed links has been reached.', NULL, WATCHDOG_ERROR);
}
if (isset($chunk) && !is_numeric($chunk)) {
drupal_not_found();
exit();
}
$id = xmlsitemap_language_id();
if (variable_get('xmlsitemap_sitemap_needs_update', FALSE)) {
variable_set('xmlsitemap_update_timestamp', REQUEST_TIME);
db_query("DELETE FROM {xmlsitemap} WHERE type ='frontpage'");
$row = new stdClass();
$row->module = 'xmlsitemap';
$row->type = 'frontpage';
$changefreq = variable_get('xmlsitemap_front_page_changefreq', 3600);
$row->changed = REQUEST_TIME - $changefreq;
$row->changefreq = $changefreq;
$row->priority = variable_get('xmlsitemap_front_page_priority', 1);
drupal_write_record('xmlsitemap', $row);
module_invoke_all('xmlsitemap_links');
variable_set('xmlsitemap_sitemap_needs_update', FALSE);
$result = _xmlsitemap_create_cache_files();
if (variable_get("xmlsitemap_create_cache_result_$id", -1) !== $result) {
variable_set("xmlsitemap_create_cache_result_$id", $result);
}
}
elseif (_xmlsitemap_check_cache_files()) {
$result = _xmlsitemap_create_cache_files();
if (variable_get("xmlsitemap_create_cache_result_$id", -1) !== $result) {
variable_set("xmlsitemap_create_cache_result_$id", $result);
}
}
if (!isset($chunk)) {
if (($chunks = (integer) $link_count / $chunk_size) != variable_get('xmlsitemap_previous_chunks_count', -1)) {
variable_set('xmlsitemap_previous_chunks_count', $chunks);
if (!variable_get('menu_rebuild_needed', FALSE)) {
variable_set('menu_rebuild_needed', TRUE);
}
}
}
if (isset($result) && !$result) {
drupal_not_found();
exit();
}
$parent_directory = variable_get('xmlsitemap_cache_directory', file_directory_path() .'/xmlsitemap');
$headers = array("Content-type: text/xml; charset=utf-8");
if (isset($chunk)) {
if ($chunk < $link_count / $chunk_size) {
file_transfer("$parent_directory/xsm-$id-$chunk.xml", $headers);
}
}
else {
file_transfer("$parent_directory/xsm-$id.xml", $headers);
}
}
/*****************************************************************************
* Private functions.
****************************************************************************/
/**
* Check the cache files.
*
* @return
* TRUE if the cache files must be updated / created, FALSE otherwise.
*/
function _xmlsitemap_check_cache_files() {
$chunk_size = variable_get('xmlsitemap_chunk_size', 1000);
$link_count = xmlsitemap_link_count();
$id = xmlsitemap_language_id();
$parent_directory = variable_get('xmlsitemap_cache_directory', file_directory_path() .'/xmlsitemap');
// If the directory that should contains the cache files doesn't exist, then
// the cache files must be created.
if (!file_check_directory($parent_directory, FILE_CREATE_DIRECTORY)) {
return TRUE;
}
$update_timestamp = variable_get('xmlsitemap_update_timestamp', REQUEST_TIME);
// If the cache files creation has failed last time, the cache files must be
// created.
if (variable_get("xmlsitemap_create_cache_result_$id", -1) !== TRUE) {
return TRUE;
}
// If the main cache file doesn't exist, then the cache files must be
// created.
if (!file_exists($parent_directory ."/xsm-$id.xml")) {
return TRUE;
}
// If the main cache file has been created before the sitemap content has
// been updated, then the cache files must be updated.
if (filemtime($parent_directory ."/xsm-$id.xml") < $update_timestamp) {
return TRUE;
}
// Check also the other cache files.
if ($link_count > $chunk_size) {
for ($chunk = 0; $chunk < $link_count / $chunk_size; ++$chunk) {
if (!file_exists($parent_directory ."/xsm-$id-$chunk.xml")) {
return TRUE;
}
if (filemtime($parent_directory ."/xsm-$id-$chunk.xml") < $update_timestamp) {
return TRUE;
}
}
}
return FALSE;
}
/**
* Create a sitemap chunk cache file.
*
* @param $fp
* A file resource used to write in.
* @param $chunk_size
* The number of links the chunk must cointain.
* @param $chunk
* The progressive number associated with the sitemap chunk (starting from
* 0).
*/
function _xmlsitemap_create_cache_chunk($fp, $chunk_size, $chunk = 0) {
fwrite($fp, '' . "\n");
if ($xsl = _xmlsitemap_xsl()) {
fwrite($fp, '' . "\n");
}
fwrite($fp, '' . "\n");
$start = $chunk * $chunk_size;
$links = db_query_range("SELECT xsm.loc, xsm.module, xsm.type, xsm.id, xsm.sid, xsm.changed, xsm.changefreq, xsm.priority". xmlsitemap_sitemap_query() ."ORDER BY xsm.priority DESC, xsm.changed DESC, xsm.changefreq, xsm.loc", $start, $chunk_size);
while ($link = db_fetch_object($links)) {
if ($link->type == 'frontpage') {
$url = url(NULL, array('absolute' => TRUE));
}
else {
$url = url($link->loc, array('absolute' => TRUE));
}
$link->url = $url;
if ($link->module && function_exists($link->module .'_xmlsitemap_link_status')) {
$function = $link->module .'_xmlsitemap_link_status';
$link->status = $function($link->type, $link->id, $link->sid);
}
else {
$link->status = 0;
}
drupal_alter('xmlsitemap_data', $link);
if (($link->status & XMLSITEMAP_LINK_DISABLED) != XMLSITEMAP_LINK_DISABLED) {
$link->output = "\n";
$link->output .= "\t". check_url($link->url) ."\n";
$link->output .= "\t". gmdate(DATE_W3C, $link->changed) ."\n";
$link->output .= "\t". xmlsitemap_sitemap_frequency($link->changefreq) ."\n";
$link->output .= "\t". number_format($link->priority, 1) ."\n";
$link->output .= "\n";
fwrite($fp, $link->output);
}
}
fwrite($fp, '');
}
/**
* Determine path for a xml stylesheet.
*
* @return
* - The stylesheet path or FALSE.
*/
function _xmlsitemap_xsl() {
if (variable_get('xmlsitemap_use_stylesheet', FALSE)) {
$paths = array(
variable_get('xmlsitemap_cache_directory', file_directory_path() . '/xmlsitemap') . '/gss.xsl',
drupal_get_path('module', 'xmlsitemap') . '/gss/gss.xsl',
);
foreach ($paths as $path) {
if (file_exists($path)) {
return base_path() . $path;
}
}
}
return FALSE;
}
/**
* Create the cache files containing the sitemap.
*
* @return
* TRUE if the operation has been successfull, FALSE otherwise.
*/
function _xmlsitemap_create_cache_files() {
$chunk_size = variable_get('xmlsitemap_chunk_size', 1000);
$link_count = xmlsitemap_link_count();
$id = xmlsitemap_language_id();
$parent_directory = variable_get('xmlsitemap_cache_directory', file_directory_path() .'/xmlsitemap');
// If the directory doesn't exist, then create it.
if (!file_check_directory($parent_directory, FILE_CREATE_DIRECTORY)) {
return TRUE;
}
if ($link_count > $chunk_size) {
if (!$fp = fopen($parent_directory ."/xsm-$id.xml", 'wb')) {
watchdog('xmlsitemap', 'Could not create the cache file @file.', array('@file' => $parent_directory ."/xsm-$id.xml"), WATCHDOG_ERROR);
return FALSE;
}
fwrite($fp, '' . "\n");
if ($xsl = _xmlsitemap_xsl()) {
fwrite($fp, '' . "\n");
}
fwrite($fp, '' . "\n");
for ($chunk = 0; $chunk < $link_count / $chunk_size; ++$chunk) {
fwrite($fp, ' ' . "\n");
fwrite($fp, ' '. url("sitemap$chunk.xml", array('absolute' => TRUE)) .'' . "\n");
$from = $chunk * $chunk_size;
$changed = db_result(db_query_range("SELECT xsm.changed". xmlsitemap_sitemap_query() ."ORDER BY xsm.priority DESC, xsm.changed DESC", $from, $chunk_size));
fwrite($fp, ' '. gmdate(DATE_W3C, $changed) .'' . "\n");
fwrite($fp, ' ' . "\n");
}
fwrite($fp, '');
fclose($fp);
// Set standard file permissions for webserver-generated files.
@chmod($parent_directory ."/xsm-$id.xml", 0664);
for ($chunk = 0; $chunk < $link_count / $chunk_size; ++$chunk) {
if (!$fp = fopen($parent_directory ."/xsm-$id-$chunk.xml", 'wb')) {
watchdog('xmlsitemap', 'Could not create the cache file @file.', array('@file' => $parent_directory ."/xsm-$id-$chunk.xml"), WATCHDOG_ERROR);
return FALSE;
}
_xmlsitemap_create_cache_chunk($fp, $chunk_size, $chunk);
fclose($fp);
// Set standard file permissions for webserver-generated files.
@chmod($parent_directory ."/xsm-$id-$chunk.xml", 0664);
}
}
else {
if (!$fp = fopen($parent_directory ."/xsm-$id.xml", 'wb')) {
watchdog('xmlsitemap', 'Could not create the cache file @file.', array('@file' => $parent_directory ."/xsm-$id.xml"), WATCHDOG_ERROR);
return FALSE;
}
_xmlsitemap_create_cache_chunk($fp, $chunk_size);
fclose($fp);
// Set standard file permissions for webserver-generated files.
@chmod($parent_directory ."/xsm-$id.xml", 0664);
}
return TRUE;
}
/**
* @} End of "addtogroup xmlsitemap".
*/