View source
<?php
function content_requirements($phase) {
$requirements = array();
$t = get_t();
if (module_exists('views') && (!function_exists('views_api_version') || views_api_version() < 2.0)) {
$requirements['cck_views'] = array(
'title' => $t('CCK - No Views integration'),
'description' => $t("CCK integration with Views module requires Views 6.x-2.0-rc2 or greater."),
'severity' => REQUIREMENT_ERROR,
);
}
return $requirements;
}
function content_types_install() {
drupal_load('module', 'content');
module_load_include('inc', 'content', '/includes/content.crud');
$module_field_types = $module_widgets = array();
foreach (module_list() as $module) {
if ($field_type = module_invoke($module, 'field_info')) {
$module_field_types[$module] = $field_type;
}
if ($widget_type = module_invoke($module, 'widget_info')) {
$module_widgets[$module] = $widget_type;
}
}
$fields = array();
$db_result = db_query("SELECT * FROM {" . content_instance_tablename() . "} nfi " . " LEFT JOIN {" . content_field_tablename() . "} nf ON nf.field_name = nfi.field_name");
while ($row = db_fetch_array($db_result)) {
$field = array_merge($row, unserialize($row['global_settings']));
unset($field['global_settings']);
unset($field['module']);
unset($field['widget_module']);
$field['columns'] = isset($field['db_columns']) ? $field['db_columns'] : array();
unset($field['db_columns']);
foreach ($module_field_types as $module => $types) {
foreach ($types as $type_name => $type) {
if ($field['type'] == $type_name) {
$field['module'] = $module;
}
}
}
foreach ($module_widgets as $module => $types) {
foreach ($types as $type_name => $type) {
if ($field['widget_type'] == $type_name) {
$field['widget_module'] = $module;
}
}
}
if (!empty($field['module']) && !empty($field['widget_module'])) {
$field['widget_settings'] = unserialize($field['widget_settings']);
$field['display_settings'] = unserialize($field['display_settings']);
$field['columns'] = (array) module_invoke($field['module'], 'field_settings', 'database columns', $field);
$field = content_field_instance_expand($field);
$fields[$field['type_name']][$field['field_name']] = $field;
}
}
return $fields;
}
function content_install() {
variable_set('content_schema_version', 6009);
drupal_install_schema('content');
}
function content_uninstall() {
drupal_uninstall_schema('content');
variable_del('content_schema_version');
foreach (node_get_types('names') as $type_name) {
variable_del("content_extra_weights_{$type_name}");
}
}
function content_enable() {
cache_clear_all('*', 'cache_content', TRUE);
content_clear_type_cache(TRUE);
}
function content_disable() {
cache_clear_all('*', 'cache_content', TRUE);
content_clear_type_cache(TRUE);
}
function content_schema() {
$schema['content_node_field'] = array(
'fields' => array(
'field_name' => array(
'type' => 'varchar',
'length' => 32,
'not null' => TRUE,
'default' => '',
),
'type' => array(
'type' => 'varchar',
'length' => 127,
'not null' => TRUE,
'default' => '',
),
'global_settings' => array(
'type' => 'text',
'size' => 'medium',
'not null' => TRUE,
'serialize' => TRUE,
),
'required' => array(
'type' => 'int',
'size' => 'tiny',
'not null' => TRUE,
'default' => 0,
),
'multiple' => array(
'type' => 'int',
'size' => 'tiny',
'not null' => TRUE,
'default' => 0,
),
'db_storage' => array(
'type' => 'int',
'size' => 'tiny',
'not null' => TRUE,
'default' => 1,
),
'module' => array(
'type' => 'varchar',
'length' => 127,
'not null' => TRUE,
'default' => '',
),
'db_columns' => array(
'type' => 'text',
'size' => 'medium',
'not null' => TRUE,
'serialize' => TRUE,
),
'active' => array(
'type' => 'int',
'size' => 'tiny',
'not null' => TRUE,
'default' => 0,
),
'locked' => array(
'type' => 'int',
'size' => 'tiny',
'not null' => TRUE,
'default' => 0,
),
),
'primary key' => array(
'field_name',
),
);
$schema['content_node_field_instance'] = array(
'fields' => array(
'field_name' => array(
'type' => 'varchar',
'length' => 32,
'not null' => TRUE,
'default' => '',
),
'type_name' => array(
'type' => 'varchar',
'length' => 32,
'not null' => TRUE,
'default' => '',
),
'weight' => array(
'type' => 'int',
'not null' => TRUE,
'default' => 0,
),
'label' => array(
'type' => 'varchar',
'length' => 255,
'not null' => TRUE,
'default' => '',
),
'widget_type' => array(
'type' => 'varchar',
'length' => 32,
'not null' => TRUE,
'default' => '',
),
'widget_settings' => array(
'type' => 'text',
'size' => 'medium',
'not null' => TRUE,
'serialize' => TRUE,
),
'display_settings' => array(
'type' => 'text',
'size' => 'medium',
'not null' => TRUE,
'serialize' => TRUE,
),
'description' => array(
'type' => 'text',
'size' => 'medium',
'not null' => TRUE,
),
'widget_module' => array(
'type' => 'varchar',
'length' => 127,
'not null' => TRUE,
'default' => '',
),
'widget_active' => array(
'type' => 'int',
'size' => 'tiny',
'not null' => TRUE,
'default' => 0,
),
),
'primary key' => array(
'field_name',
'type_name',
),
);
$schema['cache_content'] = drupal_get_schema_unprocessed('system', 'cache');
if (!db_table_exists('content_node_field') || !db_table_exists('content_node_field_instance')) {
return $schema;
}
drupal_load('module', 'content');
$db_result = db_query("SELECT * FROM {" . content_instance_tablename() . "} nfi " . " LEFT JOIN {" . content_field_tablename() . "} nf ON nf.field_name = nfi.field_name WHERE nf.active = 1 AND nfi.widget_active = 1");
while ($field = db_fetch_array($db_result)) {
$field['columns'] = unserialize($field['db_columns']);
unset($field['db_columns']);
$content_table = _content_tablename($field['type_name'], CONTENT_DB_STORAGE_PER_CONTENT_TYPE);
$field_table = _content_tablename($field['field_name'], CONTENT_DB_STORAGE_PER_FIELD);
if (!isset($schema[$content_table])) {
$schema[$content_table] = content_table_schema();
}
$base_schema = content_table_schema($field);
if ($field['db_storage'] == CONTENT_DB_STORAGE_PER_FIELD) {
if (!isset($schema[$field_table])) {
$schema[$field_table] = $base_schema;
}
}
else {
$schema[$content_table]['fields'] = array_merge($schema[$content_table]['fields'], $base_schema['fields']);
$schema[$content_table]['content fields'] = array_merge($schema[$content_table]['content fields'], $base_schema['content fields']);
}
}
return $schema;
}
function content_update_last_removed() {
return 1008;
}
function content_check_update($module = NULL) {
$ret = array();
if (!module_exists('content') || $module && !module_exists($module)) {
drupal_set_message(t("Updates for CCK-related modules are not run until the modules are enabled on the <a href=\"@admin-modules-path\">administer modules page</a>. When you enable them, you'll need to return to <a href=\"@update-php\">update.php</a> and run the remaining updates.", array(
'@admin-modules-path' => url('admin/build/modules'),
'@update-php' => base_path() . 'update.php?op=selection',
)), 'warning', FALSE);
if ($module && !module_exists('content') && module_exists($module)) {
$query_message = t('!module.module has updates but cannot be updated because content.module is not enabled.<br />If and when content.module is enabled, you will need to re-run the update script. You will continue to see this message until the module is enabled and updates are run.', array(
'!module' => $module,
));
}
else {
$query_message = t('!module.module has updates and is available in the modules folder but is not enabled.<br />If and when it is enabled, you will need to re-run the update script. You will continue to see this message until the module is enabled and updates are run.', array(
'!module' => $module ? $module : 'content',
));
}
$ret['#abort'] = array(
'success' => FALSE,
'query' => $query_message,
);
return $ret;
}
if ($module && drupal_get_installed_schema_version('content', TRUE) < max(drupal_get_schema_versions('content'))) {
drupal_set_message(t('Some updates are still pending. Please return to <a href="@update-php">update.php</a> and run the remaining updates.', array(
'@update-php' => base_path() . 'update.php?op=selection',
)), 'warning', FALSE);
$ret['#abort'] = array(
'success' => FALSE,
'query' => t('Some updates are still pending.<br/>Please re-run the update script.'),
);
return $ret;
}
if ($module and module_exists($module)) {
content_associate_fields($module);
}
}
function content_update_6000() {
if ($abort = content_check_update()) {
return $abort;
}
$ret = array();
drupal_load('module', 'content');
if (db_column_exists(content_field_tablename(), 'active')) {
return $ret;
}
db_add_field($ret, content_field_tablename(), 'module', array(
'type' => 'varchar',
'length' => 127,
'not null' => TRUE,
'default' => '',
));
db_add_field($ret, content_field_tablename(), 'db_columns', array(
'type' => 'text',
'size' => 'medium',
'not null' => TRUE,
'initial' => '',
));
db_add_field($ret, content_field_tablename(), 'active', array(
'type' => 'int',
'size' => 'tiny',
'not null' => TRUE,
'default' => 0,
));
db_add_field($ret, content_instance_tablename(), 'widget_module', array(
'type' => 'varchar',
'length' => 127,
'not null' => TRUE,
'default' => '',
));
db_add_field($ret, content_instance_tablename(), 'widget_active', array(
'type' => 'int',
'size' => 'tiny',
'not null' => TRUE,
'default' => 0,
));
foreach (module_list() as $module) {
content_associate_fields($module);
}
if (db_table_exists('cache_content')) {
db_drop_table($ret, 'cache_content');
}
db_create_table($ret, 'cache_content', drupal_get_schema_unprocessed('system', 'cache'));
variable_set('content_schema_version', 6000);
$ret[] = update_sql('DELETE FROM {cache}');
return $ret;
}
function content_update_6001() {
if ($abort = content_check_update()) {
return $abort;
}
$ret = array();
drupal_load('module', 'content');
if (db_table_exists('content_node_field')) {
return $ret;
}
db_rename_table($ret, 'node_field', 'content_node_field');
db_rename_table($ret, 'node_field_instance', 'content_node_field_instance');
variable_set('content_schema_version', 6001);
content_clear_type_cache(TRUE);
return $ret;
}
function content_update_6002() {
if ($abort = content_check_update()) {
return $abort;
}
$ret = array();
drupal_load('module', 'content');
$db_types = content_types_install();
$field_types = array();
$result = db_query("SELECT DISTINCT type_name FROM {" . content_instance_tablename() . "}");
while ($type = db_fetch_array($result)) {
$field_types[] = $type['type_name'];
}
foreach ($db_types as $content_type => $content_info) {
if (!in_array($content_type, $field_types)) {
$table = _content_tablename($content_type, CONTENT_DB_STORAGE_PER_CONTENT_TYPE);
if (db_table_exists($table)) {
db_drop_table($ret, $table);
}
}
}
variable_set('content_schema_version', 6002);
content_clear_type_cache(TRUE);
return $ret;
}
function content_update_6003() {
if ($abort = content_check_update()) {
return $abort;
}
$ret = array();
if (db_column_exists('content_node_field', 'columns')) {
db_change_field($ret, 'content_node_field', 'columns', 'db_columns', array(
'type' => 'text',
'size' => 'medium',
'not null' => TRUE,
));
}
variable_set('content_schema_version', 6003);
return $ret;
}
function content_update_6004(&$sandbox) {
if ($abort = content_check_update()) {
return $abort;
}
$ret = array();
if (variable_get('content_update_1009', FALSE)) {
return $ret;
}
if (!isset($sandbox['tables'])) {
drupal_load('module', 'content');
$sandbox['tables'] = array();
$result = db_query('SELECT * FROM {' . content_instance_tablename() . '} nfi ' . ' LEFT JOIN {' . content_field_tablename() . '} nf ON nf.field_name = nfi.field_name');
while ($field = db_fetch_array($result)) {
if ($field['db_storage'] == CONTENT_DB_STORAGE_PER_FIELD) {
$table = _content_tablename($field['field_name'], CONTENT_DB_STORAGE_PER_FIELD);
}
else {
$table = _content_tablename($field['type_name'], CONTENT_DB_STORAGE_PER_CONTENT_TYPE);
}
$sandbox['tables'][$table] = $table;
}
$sandbox['count'] = count($sandbox['tables']);
}
if ($table = array_shift($sandbox['tables'])) {
db_add_index($ret, $table, 'nid', array(
'nid',
));
}
if ($sandbox['count']) {
$ret['#finished'] = 1 - count($sandbox['tables']) / $sandbox['count'];
}
variable_set('content_schema_version', 6004);
return $ret;
}
function content_update_6005() {
if ($abort = content_check_update()) {
return $abort;
}
$ret = array();
drupal_load('module', 'content');
db_add_field($ret, content_field_tablename(), 'locked', array(
'type' => 'int',
'size' => 'tiny',
'not null' => TRUE,
'default' => 0,
));
variable_set('content_schema_version', 6005);
return $ret;
}
function content_update_6006() {
if ($abort = content_check_update()) {
return $abort;
}
$ret = array();
drupal_load('module', 'content');
db_change_field($ret, content_field_tablename(), 'locked', 'locked', array(
'type' => 'int',
'size' => 'tiny',
'not null' => TRUE,
'default' => 0,
));
variable_set('content_schema_version', 6006);
return $ret;
}
function content_update_6007() {
if ($abort = content_check_update()) {
return $abort;
}
variable_set('content_schema_version', 6007);
return array();
}
function content_update_6008() {
if ($abort = content_check_update()) {
return $abort;
}
variable_set('content_schema_version', 6008);
return array();
}
function content_update_6009() {
if ($abort = content_check_update()) {
return $abort;
}
$ret = array();
$result = db_query("SELECT * FROM {content_node_field_instance}");
while ($type = db_fetch_array($result)) {
$new_settings = array();
$display_settings = unserialize($type['display_settings']);
if (!empty($display_settings)) {
foreach ($display_settings as $key => $val) {
$new_settings[$key] = $val;
if ($key !== 'label' && is_array($val)) {
$new_settings[$key]['exclude'] = 0;
}
}
}
else {
$new_settings = array(
'label' => array(
'format' => 'above',
),
'full' => array(
'format' => 'default',
'exclude' => 0,
),
'teaser' => array(
'format' => 'default',
'exclude' => 0,
),
);
}
db_query("UPDATE {content_node_field_instance} SET display_settings='%s' WHERE field_name='%s' AND type_name='%s'", serialize($new_settings), $type['field_name'], $type['type_name']);
}
variable_set('content_schema_version', 6009);
return $ret;
}
function content_update_6010(&$sandbox) {
if ($abort = content_check_update()) {
return $abort;
}
$ret = array();
drupal_load('module', 'content');
if (!isset($sandbox['tables'])) {
$sandbox['tables'] = array();
$fields = content_fields();
foreach ($fields as $name => $field) {
$db_info = content_database_info($field);
foreach ($db_info['columns'] as $column => $attributes) {
if (isset($attributes['serialize']) && $attributes['serialize']) {
$sandbox['tables'][$db_info['table']]['table'] = $db_info['table'];
$sandbox['tables'][$db_info['table']]['columns'][] = $attributes['column'];
$sandbox['tables'][$db_info['table']]['multiple'] = $field['multiple'];
}
}
}
$sandbox['count'] = count($sandbox['tables']);
$sandbox['current_vid'] = 0;
$sandbox['current_delta'] = 0;
}
$limit = 500;
if ($table_info = array_shift($sandbox['tables'])) {
$table = $table_info['table'];
$columns = $table_info['columns'];
if ($table_info['multiple']) {
$query = "SELECT * FROM {" . $table . "} WHERE (vid = %d AND delta > %d) OR (vid > %d) ORDER BY vid ASC, delta ASC";
$args = array(
$sandbox['current_vid'],
$sandbox['current_delta'],
$sandbox['current_vid'],
);
}
else {
$query = "SELECT * FROM {" . $table . "} WHERE vid > %d ORDER BY vid ASC";
$args = array(
$sandbox['current_vid'],
);
}
$result = db_query_range($query, $args, 0, $limit);
$count = 0;
while ($row = db_fetch_array($result)) {
$update_query = $update_args = array();
foreach ($columns as $column) {
$data = $row[$column];
if (!empty($data)) {
while (is_string($data)) {
$unserialized = @unserialize($data);
if ($unserialized !== FALSE) {
$data = $unserialized;
}
else {
break;
}
}
$data = serialize($data);
if ($data !== $row[$column]) {
$update_query[] = "{$column} = '%s'";
$update_args[] = $data;
}
}
}
if ($update_query) {
$update_args[] = $row['vid'];
db_query("UPDATE {" . $table . "} SET " . implode(', ', $update_query) . " WHERE vid = %d", $update_args);
}
$sandbox['current_vid'] = $row['vid'];
$sandbox['current_delta'] = isset($row['delta']) ? $row['delta'] : 0;
$count++;
}
if ($count == $limit) {
array_unshift($sandbox['tables'], $table_info);
}
else {
$sandbox['current_vid'] = 0;
$sandbox['current_delta'] = 0;
$ret[] = array(
'success' => TRUE,
'query' => "Fixed serialized values in table {$table}",
);
}
}
if ($sandbox['count']) {
$ret['#finished'] = 1 - count($sandbox['tables']) / $sandbox['count'];
}
return $ret;
}