privatemsg.install in Privatemsg 7
Same filename and directory in other branches
Install file for privatemsg.module
File
privatemsg.installView source
<?php
/**
* @file
* Install file for privatemsg.module
*/
/**
* Implements hook_schema().
*/
function privatemsg_schema() {
$schema = array();
$schema['pm_index'] = array(
'description' => '{pm_index} holds indexing information about messages and recipients for fast retrieval',
'fields' => array(
'mid' => array(
'description' => 'Private Message ID',
'type' => 'int',
'not null' => TRUE,
'unsigned' => TRUE,
),
'thread_id' => array(
'description' => 'Messages thread ID',
'type' => 'int',
'not null' => TRUE,
'unsigned' => TRUE,
),
'recipient' => array(
'description' => 'ID of the recipient object, typically user',
'type' => 'int',
'not null' => TRUE,
'unsigned' => TRUE,
),
'is_new' => array(
'description' => 'Whether the user has read this message',
'type' => 'int',
'default' => 1,
'not null' => TRUE,
'unsigned' => TRUE,
),
'deleted' => array(
'description' => 'Whether the user has deleted this message',
'type' => 'int',
'unsigned' => TRUE,
'not null' => TRUE,
'default' => 0,
),
'type' => array(
'description' => 'Type of recipient object',
'type' => 'varchar',
'length' => 255,
'not null' => TRUE,
'default' => 'user',
),
),
'primary key' => array(
'mid',
'recipient',
'type',
),
'indexes' => array(
'list' => array(
'recipient',
'type',
'deleted',
'is_new',
),
'messages' => array(
'mid',
'recipient',
'type',
),
'participants' => array(
'thread_id',
'recipient',
'type',
'deleted',
),
),
);
$schema['pm_message'] = array(
'description' => '{pm_messages} holds the message information',
'fields' => array(
'mid' => array(
'description' => 'Private Message ID',
'type' => 'serial',
'not null' => TRUE,
'unsigned' => TRUE,
),
'author' => array(
'description' => 'UID of the author',
'type' => 'int',
'not null' => TRUE,
'unsigned' => TRUE,
),
'subject' => array(
'description' => 'Subject text of the message',
'type' => 'varchar',
'length' => 255,
'not null' => TRUE,
),
'body' => array(
'description' => 'Body of the message',
'type' => 'text',
'not null' => TRUE,
'size' => 'big',
),
'format' => array(
'type' => 'varchar',
'length' => 255,
'not null' => FALSE,
'description' => 'The {filter_formats}.format of the message text.',
),
'timestamp' => array(
'description' => 'Time when the message was sent',
'type' => 'int',
'not null' => TRUE,
'unsigned' => TRUE,
),
'has_tokens' => array(
'description' => 'Indicates if the message has tokens',
'type' => 'int',
'size' => 'small',
'not null' => TRUE,
'unsigned' => TRUE,
'default' => 0,
),
),
'primary key' => array(
'mid',
),
);
$schema['pm_disable'] = array(
'description' => '{pm_disable} holds the list of users that have disabled private messaging',
'fields' => array(
'uid' => array(
'description' => 'ID of the user',
'type' => 'int',
'not null' => TRUE,
'unsigned' => TRUE,
),
),
'primary key' => array(
'uid',
),
);
return $schema;
}
/**
* Implements hook_install().
*/
function privatemsg_install() {
// Define default formats for date format types.
variable_set("date_format_privatemsg_current_day", 'g:i a');
variable_set("date_format_privatemsg_current_year", 'M j');
variable_set("date_format_privatemsg_years", 'n/j/y');
}
/**
* Implements hook_uninstall().
*/
function privatemsg_uninstall() {
variable_del('private_message_view_template');
variable_del('privatemsg_per_page');
variable_del('privatemsg_display_loginmessage');
variable_del('privatemsg_display_fields');
variable_del('privatemsg_display_link_self');
variable_del('privatemsg_view_default_amount');
variable_del('privatemsg_view_max_amount');
variable_del('privatemsg_view_use_max_as_default');
variable_del('privatemsg_display_profile_links');
variable_del('privatemsg_link_node_types');
variable_del('privatemsg_display_on_teaser');
variable_del('privatemsg_no_messages_notification');
variable_del('privatemsg_display_on_comments');
}
/**
* Implements hook_update_dependencies().
*/
function privatemsg_update_dependencies() {
if (module_exists('privatemsg_filter')) {
$dependencies['privatemsg']['7004']['privatemsg_filter'] = '7001';
return $dependencies;
}
}
/**
* Implements hook_update_last_removed().
*/
function privatemsg_update_last_removed() {
// Only upgrading from 6.x-1.3 or later is supported.
return 6007;
}
/**
* Add has_tokens field to indicate if a message is using tokens.
*/
function privatemsg_update_7000() {
db_add_field('pm_message', 'has_tokens', array(
'description' => 'Indicates if the message has tokens',
'type' => 'int',
'size' => 'small',
'not null' => TRUE,
'unsigned' => TRUE,
'default' => 0,
));
}
/**
* Update format column to varchar.
*/
function privatemsg_update_7001() {
db_change_field('pm_message', 'format', 'format', array(
'type' => 'varchar',
'length' => 255,
'not null' => FALSE,
'description' => 'The {filter_formats}.format of the message text.',
));
}
/**
* Add {pm_disable} table.
*/
function privatemsg_update_7002() {
// Make sure to not run this update twice.
if (db_table_exists('pm_disable')) {
return;
}
$schema['pm_disable'] = array(
'description' => '{pm_disable} holds the list of users that have disabled private messaging',
'fields' => array(
'uid' => array(
'description' => 'ID of the user',
'type' => 'int',
'not null' => TRUE,
'unsigned' => TRUE,
),
),
'primary key' => array(
'uid',
),
);
if (!db_table_exists('pm_disable')) {
db_create_table('pm_disable', $schema['pm_disable']);
}
}
/**
* Change schema to allow other recipients than single users.
*/
function privatemsg_update_7003() {
// Make sure to not run this update twice.
if (db_field_exists('pm_index', 'recipient')) {
return;
}
db_drop_index('pm_index', 'list');
db_drop_index('pm_index', 'messages');
db_drop_index('pm_index', 'participants');
db_change_field('pm_index', 'uid', 'recipient', array(
'description' => 'ID of the recipient object, typically user',
'type' => 'int',
'not null' => TRUE,
'unsigned' => TRUE,
));
db_add_field('pm_index', 'type', array(
'description' => 'Type of recipient object',
'type' => 'varchar',
'not null' => TRUE,
'length' => '255',
'default' => 'user',
), array(
'indexes' => array(
'list' => array(
'recipient',
'type',
'deleted',
'is_new',
),
'messages' => array(
'mid',
'recipient',
'type',
),
'participants' => array(
'thread_id',
'recipient',
'type',
'deleted',
),
),
));
}
/**
* Remove duplicate entries in {pm_index}.
*/
function privatemsg_update_7004(&$sandbox) {
// If the primary key already exists, this doesn't need to run.
if (db_index_exists('pm_index', 'PRIMARY')) {
return;
}
// First run, initialize sandbox and check if we are ready to run.
if (!isset($sandbox['current_thread_id'])) {
$sandbox['current_thread_id'] = 0;
// Assume that the thread ids are distributed more or less equally over the
// whole data set. This allows us to calculate the approximate progress.
$sandbox['max'] = db_query('SELECT MAX(thread_id) FROM {pm_index}')
->fetchField();
}
// Fetch the next 10 thread_ids.
$result = db_query_range('SELECT DISTINCT thread_id FROM {pm_index} WHERE thread_id > :thread_id ORDER BY thread_id ASC', 0, 20, array(
':thread_id' => $sandbox['current_thread_id'],
));
$threads = $result
->fetchCol();
if (!empty($threads)) {
// By limiting this slow query (having condition) on a specific set of
// threads, this allows us to process the slow having part on a relatively
// small subset of pm_index that can be selected based on the thread_id
// index. There might also be cases where is_new and/or deleted are not
// equal, use MAX(is_new) and MIN(deleted) for these cases.
$sql = 'SELECT COUNT(*) AS count, pmi.recipient, pmi.type, pmi.mid, pmi.thread_id, MAX(pmi.is_new) As is_new, MIN(pmi.deleted) AS deleted FROM {pm_index} pmi WHERE thread_id IN (:threads) GROUP BY pmi.recipient, pmi.type, pmi.mid, pmi.thread_id HAVING COUNT(*) > 1';
$result = db_query($sql, array(
':threads' => $threads,
));
foreach ($result as $row) {
// Delete all occurrences of these entries.
db_delete('pm_index')
->condition('mid', $row->mid)
->condition('recipient', $row->recipient)
->condition('type', $row->type)
->execute();
// Re-insert a single entry. We do this to explicitly keep messages
// unread and undeleted if there are conflicting entries.
db_insert('pm_index')
->fields(array(
'mid' => $row->mid,
'thread_id' => $row->thread_id,
'recipient' => $row->recipient,
'type' => $row->type,
'is_new' => $row->is_new,
'deleted' => $row->deleted,
))
->execute();
}
$sandbox['current_thread_id'] = max($threads);
}
// Set #finished based on sandbox.
$sandbox['#finished'] = empty($sandbox['max']) ? 1 : $sandbox['current_thread_id'] / $sandbox['max'];
}
/**
* Add primary key to {pm_index}.
*/
function privatemsg_update_7005() {
if (!db_index_exists('pm_index', 'PRIMARY')) {
db_add_primary_key('pm_index', array(
'mid',
'recipient',
'type',
));
}
}
/**
* Define default formats for date format types.
*/
function privatemsg_update_7006() {
variable_set("date_format_privatemsg_current_day", 'g:i a');
variable_set("date_format_privatemsg_current_year", 'M j');
variable_set("date_format_privatemsg_years", 'n/j/y');
}
Functions
Name | Description |
---|---|
privatemsg_install | Implements hook_install(). |
privatemsg_schema | Implements hook_schema(). |
privatemsg_uninstall | Implements hook_uninstall(). |
privatemsg_update_7000 | Add has_tokens field to indicate if a message is using tokens. |
privatemsg_update_7001 | Update format column to varchar. |
privatemsg_update_7002 | Add {pm_disable} table. |
privatemsg_update_7003 | Change schema to allow other recipients than single users. |
privatemsg_update_7004 | Remove duplicate entries in {pm_index}. |
privatemsg_update_7005 | Add primary key to {pm_index}. |
privatemsg_update_7006 | Define default formats for date format types. |
privatemsg_update_dependencies | Implements hook_update_dependencies(). |
privatemsg_update_last_removed | Implements hook_update_last_removed(). |