feeds.install in Feeds 7.2
Same filename and directory in other branches
Schema definitions install/update/uninstall hooks.
File
feeds.installView source
<?php
/**
* @file
* Schema definitions install/update/uninstall hooks.
*/
/**
* Implements hook_requirements().
*/
function feeds_requirements($phase) {
$t = get_t();
$requirements = array();
module_load_include('module', 'feeds');
// Check if we have any SimplePie importers.
$needs_simplepie = FALSE;
foreach (feeds_importer_load_all() as $importer) {
if ($importer->config['parser']['plugin_key'] === 'FeedsSimplePieParser') {
$needs_simplepie = TRUE;
break;
}
}
if (!$needs_simplepie) {
return $requirements;
}
$requirements['simplepie'] = array(
'title' => $t('SimplePie'),
'value' => $t('Installed'),
'description' => $t('The SimplePie library is required for Feeds SimplePie Parser.'),
'severity' => REQUIREMENT_OK,
);
if (!feeds_simplepie_exists()) {
$requirements['simplepie']['value'] = $t('Not installed');
$folder = drupal_get_path('module', 'feeds') . '/libraries';
if (module_exists('libraries')) {
$folder = 'sites/all/libraries/simplepie';
}
$args = array(
'!url' => 'http://simplepie.org/downloads/',
'%folder' => $folder,
'%file' => 'simplepie.compiled.php',
);
$requirements['simplepie']['description'] .= $t('<br />Download the compiled, single-file version of the library from the <a href="!url">SimplePie download page</a>, place it into %folder and rename it to %file.', $args);
$requirements['simplepie']['severity'] = REQUIREMENT_ERROR;
}
return $requirements;
}
/**
* Implements hook_install().
*/
function feeds_install() {
// Activate our custom cache handler for the HTTP cache.
variable_set('cache_class_cache_feeds_http', 'FeedsHTTPCache');
}
/**
* Implements hook_uninstall().
*/
function feeds_uninstall() {
variable_del('cache_class_cache_feeds_http');
variable_del('cache_flush_cache_feeds_http');
variable_del('default_feeds_importer');
variable_del('feeds_debug');
variable_del('feeds_http_file_cache_dir');
variable_del('feeds_importer_class');
variable_del('feeds_in_progress_dir');
variable_del('feeds_library_dir');
variable_del('feeds_never_use_curl');
variable_del('feeds_process_limit');
variable_del('feeds_reschedule');
variable_del('feeds_source_class');
variable_del('feeds_sync_cache_feeds_http_interval');
variable_del('feeds_sync_cache_feeds_http_last_check');
variable_del('feeds_use_mbstring');
variable_del('http_request_timeout');
// Remove Feeds related jobs from job scheduler.
$names = db_or()
->condition('name', 'feeds_source_import')
->condition('name', 'feeds_source_clear')
->condition('name', 'feeds_source_expire')
->condition('name', 'feeds_push_unsubscribe');
db_delete('job_schedule')
->condition($names)
->execute();
}
/**
* Implements hook_schema().
*/
function feeds_schema() {
$schema = array();
$schema['feeds_importer'] = array(
'description' => 'Configuration of feeds objects.',
'export' => array(
'key' => 'id',
'identifier' => 'feeds_importer',
// Function hook name.
'default hook' => 'feeds_importer_default',
'api' => array(
'owner' => 'feeds',
// Base name for api include files.
'api' => 'feeds_importer_default',
'minimum_version' => 1,
'current_version' => 1,
),
),
'fields' => array(
'id' => array(
'type' => 'varchar',
'length' => 128,
'not null' => TRUE,
'default' => '',
'description' => 'Id of the fields object.',
),
'config' => array(
'type' => 'blob',
'size' => 'big',
'not null' => FALSE,
'description' => 'Configuration of the feeds object.',
'serialize' => TRUE,
),
),
'primary key' => array(
'id',
),
);
$schema['feeds_source'] = array(
'description' => 'Source definitions for feeds.',
'fields' => array(
'id' => array(
'type' => 'varchar',
'length' => 128,
'not null' => TRUE,
'default' => '',
'description' => 'Id of the feed configuration.',
),
'feed_nid' => array(
'type' => 'int',
'not null' => TRUE,
'default' => 0,
'unsigned' => TRUE,
'description' => 'Node nid if this particular source is attached to a feed node.',
),
'config' => array(
'type' => 'blob',
'size' => 'big',
'not null' => FALSE,
'description' => 'Configuration of the source.',
'serialize' => TRUE,
),
'source' => array(
'type' => 'text',
'not null' => TRUE,
'description' => 'Main source resource identifier. E. g. a path or a URL.',
),
'state' => array(
'type' => 'blob',
'size' => 'big',
'not null' => FALSE,
'description' => 'State of import or clearing batches.',
'serialize' => TRUE,
),
'fetcher_result' => array(
'type' => 'blob',
'size' => 'big',
'not null' => FALSE,
'description' => 'Cache for fetcher result.',
'serialize' => TRUE,
),
'imported' => array(
'type' => 'int',
'not null' => TRUE,
'default' => 0,
'unsigned' => TRUE,
'description' => 'Timestamp when this source was imported last.',
),
),
'primary key' => array(
'id',
'feed_nid',
),
'indexes' => array(
'id' => array(
'id',
),
'feed_nid' => array(
'feed_nid',
),
'id_source' => array(
'id',
array(
'source',
128,
),
),
),
);
$schema['feeds_item'] = array(
'description' => 'Tracks items such as nodes, terms, users.',
'fields' => array(
'entity_type' => array(
'type' => 'varchar',
'length' => 32,
'not null' => TRUE,
'default' => '',
'description' => 'The entity type.',
),
'entity_id' => array(
'type' => 'int',
'unsigned' => TRUE,
'not null' => TRUE,
'description' => 'The imported entity\'s serial id.',
),
'id' => array(
'type' => 'varchar',
'length' => 128,
'not null' => TRUE,
'default' => '',
'description' => 'The id of the importer that created this item.',
),
'feed_nid' => array(
'type' => 'int',
'unsigned' => TRUE,
'not null' => TRUE,
'description' => 'Node id of the source, if available.',
),
'imported' => array(
'type' => 'int',
'not null' => TRUE,
'default' => 0,
'description' => 'Import date of the feed item, as a Unix timestamp.',
),
'url' => array(
'type' => 'text',
'not null' => TRUE,
'description' => 'Link to the feed item.',
),
'guid' => array(
'type' => 'text',
'not null' => TRUE,
'description' => 'Unique identifier for the feed item.',
),
'hash' => array(
'type' => 'varchar',
// 32 is the length of an MD5 hash.
'length' => 32,
'not null' => TRUE,
'default' => '',
'description' => 'The hash of the source item.',
),
),
'primary key' => array(
'entity_type',
'entity_id',
),
'indexes' => array(
'id' => array(
'id',
),
'feed_nid' => array(
'feed_nid',
),
'lookup_url' => array(
'entity_type',
'id',
'feed_nid',
array(
'url',
128,
),
),
'lookup_guid' => array(
'entity_type',
'id',
'feed_nid',
array(
'guid',
128,
),
),
'global_lookup_url' => array(
'entity_type',
array(
'url',
128,
),
),
'global_lookup_guid' => array(
'entity_type',
array(
'guid',
128,
),
),
'imported' => array(
'imported',
),
),
);
$schema['feeds_push_subscriptions'] = array(
'description' => 'PubSubHubbub subscriptions.',
'fields' => array(
'domain' => array(
'type' => 'varchar',
'length' => 128,
'not null' => TRUE,
'default' => '',
'description' => 'Domain of the subscriber. Corresponds to an importer id.',
),
'subscriber_id' => array(
'type' => 'int',
'not null' => TRUE,
'default' => 0,
'unsigned' => TRUE,
'description' => 'ID of the subscriber. Corresponds to a feed nid.',
),
'timestamp' => array(
'type' => 'int',
'unsigned' => FALSE,
'default' => 0,
'not null' => TRUE,
'description' => 'Created timestamp.',
),
'hub' => array(
'type' => 'text',
'not null' => TRUE,
'description' => 'The URL of the hub endpoint of this subscription.',
),
'topic' => array(
'type' => 'text',
'not null' => TRUE,
'description' => 'The topic URL (feed URL) of this subscription.',
),
'secret' => array(
'type' => 'varchar',
'length' => 128,
'not null' => TRUE,
'default' => '',
'description' => 'Shared secret for message authentication.',
),
'status' => array(
'type' => 'varchar',
'length' => 64,
'not null' => TRUE,
'default' => '',
'description' => 'Status of subscription.',
),
'post_fields' => array(
'type' => 'text',
'not null' => FALSE,
'description' => 'Fields posted.',
'serialize' => TRUE,
),
),
'primary key' => array(
'domain',
'subscriber_id',
),
'indexes' => array(
'timestamp' => array(
'timestamp',
),
),
);
$schema['feeds_log'] = array(
'description' => 'Table that contains logs of feeds events.',
'fields' => array(
'flid' => array(
'type' => 'serial',
'not null' => TRUE,
'description' => 'Primary Key: Unique feeds event ID.',
),
'id' => array(
'type' => 'varchar',
'length' => 128,
'not null' => TRUE,
'default' => '',
'description' => 'The id of the importer that logged the event.',
),
'feed_nid' => array(
'type' => 'int',
'unsigned' => TRUE,
'not null' => TRUE,
'description' => 'Node id of the source, if available.',
),
'log_time' => array(
'type' => 'int',
'not null' => TRUE,
'default' => 0,
'description' => 'Unix timestamp of when event occurred.',
),
'request_time' => array(
'type' => 'int',
'not null' => TRUE,
'default' => 0,
'description' => 'Unix timestamp of the request when the event occurred.',
),
'type' => array(
'type' => 'varchar',
'length' => 64,
'not null' => TRUE,
'default' => '',
'description' => 'Type of log message, for example "feeds_import"."',
),
'message' => array(
'type' => 'text',
'not null' => TRUE,
'size' => 'big',
'description' => 'Text of log message to be passed into the t() function.',
),
'variables' => array(
'type' => 'blob',
'not null' => TRUE,
'size' => 'big',
'description' => 'Serialized array of variables that match the message string and that is passed into the t() function.',
),
'severity' => array(
'type' => 'int',
'unsigned' => TRUE,
'not null' => TRUE,
'default' => 0,
'size' => 'tiny',
'description' => 'The severity level of the event; ranges from 0 (Emergency) to 7 (Debug)',
),
),
'primary key' => array(
'flid',
),
'indexes' => array(
'id' => array(
'id',
),
'id_feed_nid' => array(
'id',
'feed_nid',
),
'request_time' => array(
'request_time',
),
'log_time' => array(
'log_time',
),
'type' => array(
'type',
),
),
);
$schema['cache_feeds_http'] = drupal_get_schema_unprocessed('system', 'cache');
$schema['cache_feeds_http']['description'] = 'Cache table for Feeds downloads.';
return $schema;
}
/**
* Rename feeds_source.batch to feeds_source.state, add slot for caching fetcher
* result.
*/
function feeds_update_7100() {
$spec = array(
'type' => 'text',
'size' => 'big',
'not null' => FALSE,
'description' => 'State of import or clearing batches.',
'serialize' => TRUE,
);
db_change_field('feeds_source', 'batch', 'state', $spec);
$spec = array(
'type' => 'text',
'size' => 'big',
'not null' => FALSE,
'description' => 'Cache for fetcher result.',
'serialize' => TRUE,
);
db_add_field('feeds_source', 'fetcher_result', $spec);
}
/**
* Add imported timestamp to feeds_source table.
*/
function feeds_update_7201() {
$spec = array(
'type' => 'int',
'not null' => TRUE,
'default' => 0,
'unsigned' => TRUE,
'description' => 'Timestamp when this source was imported last.',
);
db_add_field('feeds_source', 'imported', $spec);
}
/**
* Create a single feeds_item table tracking all imports.
*/
function feeds_update_7202() {
$spec = array(
'description' => 'Tracks items such as nodes, terms, users.',
'fields' => array(
'entity_type' => array(
'type' => 'varchar',
'length' => 32,
'not null' => TRUE,
'default' => '',
'description' => 'The entity type.',
),
'entity_id' => array(
'type' => 'int',
'unsigned' => TRUE,
'not null' => TRUE,
'description' => 'The imported entity\'s serial id.',
),
'id' => array(
'type' => 'varchar',
'length' => 128,
'not null' => TRUE,
'default' => '',
'description' => 'The id of the importer that created this item.',
),
'feed_nid' => array(
'type' => 'int',
'unsigned' => TRUE,
'not null' => TRUE,
'description' => 'Node id of the source, if available.',
),
'imported' => array(
'type' => 'int',
'not null' => TRUE,
'default' => 0,
'description' => 'Import date of the feed item, as a Unix timestamp.',
),
'url' => array(
'type' => 'text',
'not null' => TRUE,
'description' => 'Link to the feed item.',
),
'guid' => array(
'type' => 'text',
'not null' => TRUE,
'description' => 'Unique identifier for the feed item.',
),
'hash' => array(
'type' => 'varchar',
// 32 is the length of an MD5 hash.
'length' => 32,
'not null' => TRUE,
'default' => '',
'description' => 'The hash of the source item.',
),
),
'primary key' => array(
'entity_type',
'entity_id',
),
'indexes' => array(
'id' => array(
'id',
),
'feed_nid' => array(
'feed_nid',
),
'lookup_url' => array(
'entity_type',
'id',
'feed_nid',
array(
'url',
128,
),
),
'lookup_guid' => array(
'entity_type',
'id',
'feed_nid',
array(
'guid',
128,
),
),
'imported' => array(
'imported',
),
),
);
db_create_table('feeds_item', $spec);
// Copy all existing values from old tables and drop them.
$insert = "INSERT INTO {feeds_item} (entity_type, entity_id, id, feed_nid, imported, url, guid, hash)";
db_query($insert . " SELECT 'node', nid, id, feed_nid, imported, url, guid, hash FROM {feeds_node_item}");
db_query($insert . " SELECT 'taxonomy_term', tid, id, feed_nid, 0, '', '', '' FROM {feeds_term_item}");
db_drop_table('feeds_node_item');
db_drop_table('feeds_term_item');
}
/**
* Add feeds_log table.
*/
function feeds_update_7203() {
$schema = array(
'description' => 'Table that contains logs of feeds events.',
'fields' => array(
'flid' => array(
'type' => 'serial',
'not null' => TRUE,
'description' => 'Primary Key: Unique feeds event ID.',
),
'id' => array(
'type' => 'varchar',
'length' => 128,
'not null' => TRUE,
'default' => '',
'description' => 'The id of the importer that logged the event.',
),
'feed_nid' => array(
'type' => 'int',
'unsigned' => TRUE,
'not null' => TRUE,
'description' => 'Node id of the source, if available.',
),
'log_time' => array(
'type' => 'int',
'not null' => TRUE,
'default' => 0,
'description' => 'Unix timestamp of when event occurred.',
),
'request_time' => array(
'type' => 'int',
'not null' => TRUE,
'default' => 0,
'description' => 'Unix timestamp of the request when the event occurred.',
),
'type' => array(
'type' => 'varchar',
'length' => 64,
'not null' => TRUE,
'default' => '',
'description' => 'Type of log message, for example "feeds_import"."',
),
'message' => array(
'type' => 'text',
'not null' => TRUE,
'size' => 'big',
'description' => 'Text of log message to be passed into the t() function.',
),
'variables' => array(
'type' => 'blob',
'not null' => TRUE,
'size' => 'big',
'description' => 'Serialized array of variables that match the message string and that is passed into the t() function.',
),
'severity' => array(
'type' => 'int',
'unsigned' => TRUE,
'not null' => TRUE,
'default' => 0,
'size' => 'tiny',
'description' => 'The severity level of the event; ranges from 0 (Emergency) to 7 (Debug)',
),
),
'primary key' => array(
'flid',
),
'indexes' => array(
'id' => array(
'id',
),
'id_feed_nid' => array(
'id',
'feed_nid',
),
'request_time' => array(
'request_time',
),
'log_time' => array(
'log_time',
),
'type' => array(
'type',
),
),
);
db_create_table('feeds_log', $schema);
}
/**
* Add index for looking up by entity_type + url/ guid to feeds_item table.
*/
function feeds_update_7204() {
db_add_index('feeds_item', 'global_lookup_url', array(
'entity_type',
array(
'url',
128,
),
));
db_add_index('feeds_item', 'global_lookup_guid', array(
'entity_type',
array(
'guid',
128,
),
));
}
/**
* Shorten {feeds_item}.entity_type to 32 chars and shorten relevant indexes.
*/
function feeds_update_7205() {
db_drop_primary_key('feeds_item');
db_drop_index('feeds_item', 'lookup_url');
db_drop_index('feeds_item', 'lookup_guid');
db_drop_index('feeds_item', 'global_lookup_url');
db_drop_index('feeds_item', 'global_lookup_guid');
db_change_field('feeds_item', 'entity_type', 'entity_type', array(
'type' => 'varchar',
'length' => 32,
'not null' => TRUE,
'default' => '',
'description' => 'The entity type.',
));
db_add_primary_key('feeds_item', array(
'entity_type',
'entity_id',
));
db_add_index('feeds_item', 'lookup_url', array(
'entity_type',
'id',
'feed_nid',
array(
'url',
128,
),
));
db_add_index('feeds_item', 'lookup_guid', array(
'entity_type',
'id',
'feed_nid',
array(
'guid',
128,
),
));
db_add_index('feeds_item', 'global_lookup_url', array(
'entity_type',
array(
'url',
128,
),
));
db_add_index('feeds_item', 'global_lookup_guid', array(
'entity_type',
array(
'guid',
128,
),
));
}
/**
* Change state and fetcher_result fields from text to blob.
*/
function feeds_update_7206() {
db_change_field('feeds_source', 'state', 'state', array(
'type' => 'blob',
'size' => 'big',
'not null' => FALSE,
'description' => 'State of import or clearing batches.',
'serialize' => TRUE,
));
db_change_field('feeds_source', 'fetcher_result', 'fetcher_result', array(
'type' => 'blob',
'size' => 'big',
'not null' => FALSE,
'description' => 'Cache for fetcher result.',
'serialize' => TRUE,
));
}
/**
* Change config fields from text to big blobs.
*/
function feeds_update_7207() {
db_change_field('feeds_importer', 'config', 'config', array(
'type' => 'blob',
'size' => 'big',
'not null' => FALSE,
'description' => 'Configuration of the feeds object.',
'serialize' => TRUE,
));
db_change_field('feeds_source', 'config', 'config', array(
'type' => 'blob',
'size' => 'big',
'not null' => FALSE,
'description' => 'Configuration of the feeds object.',
'serialize' => TRUE,
));
}
/**
* Update to use generic bundle handling.
*/
function feeds_update_7208(&$sandbox) {
if (!isset($sandbox['importers'])) {
// Get all importers.
$sandbox['importers'] = db_query("SELECT id FROM {feeds_importer}")
->fetchCol();
$sandbox['total'] = count($sandbox['importers']);
}
$importer = array_pop($sandbox['importers']);
$config = db_query("SELECT config FROM {feeds_importer} WHERE id = :id", array(
':id' => $importer,
))
->fetchField();
if ($config) {
$config = unserialize($config);
switch ($config['processor']['plugin_key']) {
case 'FeedsNodeProcessor':
$config_key = 'content_type';
break;
case 'FeedsTermProcessor':
$config_key = 'vocabulary';
break;
default:
$config_key = FALSE;
break;
}
if ($config_key && isset($config['processor']['config'][$config_key])) {
$config['processor']['config']['bundle'] = $config['processor']['config'][$config_key];
unset($config['processor']['config'][$config_key]);
// Update databse.
db_update('feeds_importer')
->fields(array(
'config' => serialize($config),
))
->condition('id', $importer)
->execute();
}
$sandbox['#finished'] = 1 - count($sandbox['importers']) / $sandbox['total'];
}
else {
$sandbox['#finished'] = 1;
}
}
/**
* Reschedules feeds jobs.
*/
function feeds_update_7209() {
// Reschedule all importers.
variable_set('feeds_reschedule', TRUE);
// Our expire callback has changed names, remove all existing callbacks.
db_delete('job_schedule')
->condition('name', 'feeds_importer_expire')
->execute();
DrupalQueue::get('feeds_importer_expire')
->deleteQueue();
}
/**
* Does nothing. Update removed.
*/
function feeds_update_7211(&$sandbox) {
}
/**
* Create {cache_feeds_http} table.
*/
function feeds_update_7212() {
if (!db_table_exists('cache_feeds_http')) {
$schema = drupal_get_schema_unprocessed('system', 'cache');
$schema['description'] = 'Cache table for Feeds downloads.';
db_create_table('cache_feeds_http', $schema);
}
}
/**
* Set cache class for Feeds HTTP cache.
*/
function feeds_update_7213() {
// Check if Feeds is enabled first.
if (!class_exists('FeedsHTTPCache') && !module_exists('feeds')) {
throw new DrupalUpdateException('Please enable the Feeds module to perform this update.');
}
// Perform a registry rebuild so the system hopefully discovers the
// FeedsHTTPCache class.
if (!class_exists('FeedsHTTPCache') && function_exists('registry_rebuild')) {
registry_rebuild();
}
// Abort when the FeedsHTTPCache class is not yet found to avoid fatal errors
// in _cache_get_object().
if (!class_exists('FeedsHTTPCache')) {
throw new DrupalUpdateException('Setting the cache class for the cache_feeds_http bin failed because the FeedsHTTPCache class could not be found. Please rebuild the Drupal class registry and perform database updates again.');
}
// Activate our custom cache handler for the HTTP cache.
variable_set('cache_class_cache_feeds_http', 'FeedsHTTPCache');
}
Functions
Name | Description |
---|---|
feeds_install | Implements hook_install(). |
feeds_requirements | Implements hook_requirements(). |
feeds_schema | Implements hook_schema(). |
feeds_uninstall | Implements hook_uninstall(). |
feeds_update_7100 | Rename feeds_source.batch to feeds_source.state, add slot for caching fetcher result. |
feeds_update_7201 | Add imported timestamp to feeds_source table. |
feeds_update_7202 | Create a single feeds_item table tracking all imports. |
feeds_update_7203 | Add feeds_log table. |
feeds_update_7204 | Add index for looking up by entity_type + url/ guid to feeds_item table. |
feeds_update_7205 | Shorten {feeds_item}.entity_type to 32 chars and shorten relevant indexes. |
feeds_update_7206 | Change state and fetcher_result fields from text to blob. |
feeds_update_7207 | Change config fields from text to big blobs. |
feeds_update_7208 | Update to use generic bundle handling. |
feeds_update_7209 | Reschedules feeds jobs. |
feeds_update_7211 | Does nothing. Update removed. |
feeds_update_7212 | Create {cache_feeds_http} table. |
feeds_update_7213 | Set cache class for Feeds HTTP cache. |