Index: modules/system/system.api.php
===================================================================
RCS file: /cvs/drupal/drupal/modules/system/system.api.php,v
retrieving revision 1.114
diff -u -p -r1.114 system.api.php
--- modules/system/system.api.php	31 Dec 2009 13:22:35 -0000	1.114
+++ modules/system/system.api.php	1 Jan 2010 16:18:58 -0000
@@ -1758,191 +1758,6 @@ function hook_file_url_alter(&$uri) {
     }
   }
 }
-                                                                                                      /**
- * Check installation requirements and do status reporting.
- *
- * This hook has two closely related uses, determined by the $phase argument:
- * checking installation requirements ($phase == 'install')
- * and status reporting ($phase == 'runtime').
- *
- * Note that this hook, like all others dealing with installation and updates,
- * must reside in a module_name.install file, or it will not properly abort
- * the installation of the module if a critical requirement is missing.
- *
- * During the 'install' phase, modules can for example assert that
- * library or server versions are available or sufficient.
- * Note that the installation of a module can happen during installation of
- * Drupal itself (by install.php) with an installation profile or later by hand.
- * As a consequence, install-time requirements must be checked without access
- * to the full Drupal API, because it is not available during install.php.
- * For localization you should for example use $t = get_t() to
- * retrieve the appropriate localization function name (t() or st()).
- * If a requirement has a severity of REQUIREMENT_ERROR, install.php will abort
- * or at least the module will not install.
- * Other severity levels have no effect on the installation.
- * Module dependencies do not belong to these installation requirements,
- * but should be defined in the module's .info file.
- *
- * The 'runtime' phase is not limited to pure installation requirements
- * but can also be used for more general status information like maintenance
- * tasks and security issues.
- * The returned 'requirements' will be listed on the status report in the
- * administration section, with indication of the severity level.
- * Moreover, any requirement with a severity of REQUIREMENT_ERROR severity will
- * result in a notice on the the administration overview page.
- *
- * @param $phase
- *   The phase in which hook_requirements is run:
- *   - 'install': the module is being installed.
- *   - 'runtime': the runtime requirements are being checked and shown on the
- *              status report page.
- *
- * @return
- *   A keyed array of requirements. Each requirement is itself an array with
- *   the following items:
- *     - 'title': the name of the requirement.
- *     - 'value': the current value (e.g. version, time, level, ...). During
- *       install phase, this should only be used for version numbers, do not set
- *       it if not applicable.
- *     - 'description': description of the requirement/status.
- *     - 'severity': the requirement's result/severity level, one of:
- *         - REQUIREMENT_INFO:    For info only.
- *         - REQUIREMENT_OK:      The requirement is satisfied.
- *         - REQUIREMENT_WARNING: The requirement failed with a warning.
- *         - REQUIREMENT_ERROR:   The requirement failed with an error.
- */
-function hook_requirements($phase) {
-  $requirements = array();
-  // Ensure translations don't break at install time
-  $t = get_t();
-
-  // Report Drupal version
-  if ($phase == 'runtime') {
-    $requirements['drupal'] = array(
-      'title' => $t('Drupal'),
-      'value' => VERSION,
-      'severity' => REQUIREMENT_INFO
-    );
-  }
-
-  // Test PHP version
-  $requirements['php'] = array(
-    'title' => $t('PHP'),
-    'value' => ($phase == 'runtime') ? l(phpversion(), 'admin/logs/status/php') : phpversion(),
-  );
-  if (version_compare(phpversion(), DRUPAL_MINIMUM_PHP) < 0) {
-    $requirements['php']['description'] = $t('Your PHP installation is too old. Drupal requires at least PHP %version.', array('%version' => DRUPAL_MINIMUM_PHP));
-    $requirements['php']['severity'] = REQUIREMENT_ERROR;
-  }
-
-  // Report cron status
-  if ($phase == 'runtime') {
-    $cron_last = variable_get('cron_last');
-
-    if (is_numeric($cron_last)) {
-      $requirements['cron']['value'] = $t('Last run !time ago', array('!time' => format_interval(REQUEST_TIME - $cron_last)));
-    }
-    else {
-      $requirements['cron'] = array(
-        'description' => $t('Cron has not run. It appears cron jobs have not been setup on your system. Please check the help pages for <a href="@url">configuring cron jobs</a>.', array('@url' => 'http://drupal.org/cron')),
-        'severity' => REQUIREMENT_ERROR,
-        'value' => $t('Never run'),
-      );
-    }
-
-    $requirements['cron']['description'] .= ' ' . t('You can <a href="@cron">run cron manually</a>.', array('@cron' => url('admin/logs/status/run-cron')));
-
-    $requirements['cron']['title'] = $t('Cron maintenance tasks');
-  }
-
-  return $requirements;
-}
-
-/**
- * Define the current version of the database schema.
- *
- * A Drupal schema definition is an array structure representing one or
- * more tables and their related keys and indexes. A schema is defined by
- * hook_schema() which must live in your module's .install file.
- *
- * By implementing hook_schema() and specifying the tables your module
- * declares, you can easily create and drop these tables on all
- * supported database engines. You don't have to deal with the
- * different SQL dialects for table creation and alteration of the
- * supported database engines.
- *
- * See the Schema API Handbook at http://drupal.org/node/146843 for
- * details on schema definition structures.
- *
- * @return
- * A schema definition structure array. For each element of the
- * array, the key is a table name and the value is a table structure
- * definition.
- */
-function hook_schema() {
-  $schema['node'] = array(
-    // example (partial) specification for table "node"
-    'description' => 'The base table for nodes.',
-    'fields' => array(
-      'nid' => array(
-        'description' => 'The primary identifier for a node.',
-        'type' => 'serial',
-        'unsigned' => TRUE,
-        'not null' => TRUE),
-      'vid' => array(
-        'description' => 'The current {node_revision}.vid version identifier.',
-        'type' => 'int',
-        'unsigned' => TRUE,
-        'not null' => TRUE,
-        'default' => 0),
-      'type' => array(
-        'description' => 'The {node_type} of this node.',
-        'type' => 'varchar',
-        'length' => 32,
-        'not null' => TRUE,
-        'default' => ''),
-      'title' => array(
-        'description' => 'The title of this node, always treated a non-markup plain text.',
-        'type' => 'varchar',
-        'length' => 255,
-        'not null' => TRUE,
-        'default' => ''),
-      ),
-    'indexes' => array(
-      'node_changed'        => array('changed'),
-      'node_created'        => array('created'),
-      ),
-    'unique keys' => array(
-      'nid_vid' => array('nid', 'vid'),
-      'vid'     => array('vid')
-      ),
-    'primary key' => array('nid'),
-  );
-  return $schema;
-}
-
-/**
- * Perform alterations to existing database schemas.
- *
- * When a module modifies the database structure of another module (by
- * changing, adding or removing fields, keys or indexes), it should
- * implement hook_schema_alter() to update the default $schema to take
- * it's changes into account.
- *
- * See hook_schema() for details on the schema definition structure.
- *
- * @param $schema
- *   Nested array describing the schemas for all modules.
- */
-function hook_schema_alter(&$schema) {
-  // Add field to existing schema.
-  $schema['users']['fields']['timezone_id'] = array(
-    'type' => 'int',
-    'not null' => TRUE,
-    'default' => 0,
-    'description' => 'Per-user timezone configuration.',
-  );
-}
 
 /**
  * Perform alterations to a structured query.
@@ -2008,252 +1823,42 @@ function hook_query_TAG_alter(QueryAlter
 }
 
 /**
- * Perform setup tasks when the module is installed.
- *
- * If the module implements hook_schema(), the database tables will
- * be created before this hook is fired.
+ * Perform necessary alterations to the list of files parsed by the registry.
  *
- * The hook will be called the first time a module is installed, and the
- * module's schema version will be set to the module's greatest numbered update
- * hook. Because of this, anytime a hook_update_N() is added to the module, this
- * function needs to be updated to reflect the current version of the database
- * schema.
+ * Modules can manually modify the list of files before the registry parses
+ * them. The $modules array provides the .info file information, which includes
+ * the list of files registered to each module. Any files in the list can then
+ * be added to the list of files that the registry will parse, or modify
+ * attributes of a file.
  *
- * See the Schema API documentation at
- * @link http://drupal.org/node/146843 http://drupal.org/node/146843 @endlink
- * for details on hook_schema and how database tables are defined.
+ * A necessary alteration made by the core SimpleTest module is to force .test
+ * files provided by disabled modules into the list of files parsed by the
+ * registry.
  *
- * Note that since this function is called from a full bootstrap, all functions
- * (including those in modules enabled by the current page request) are
- * available when this hook is called. Use cases could be displaying a user
- * message, or calling a module function necessary for initial setup, etc.
+ * @param $files
+ *   List of files to be parsed by the registry. The list will contain
+ *   files found in each enabled module's info file and the core includes
+ *   directory. The array is keyed by the file path and contains an array of
+ *   the related module's name and weight as used internally by
+ *   _registry_update() and related functions.
  *
- * Please be sure that anything added or modified in this function that can
- * be removed during uninstall should be removed with hook_uninstall().
+ *   For example:
+ *   @code
+ *     $files["modules/system/system.module"] = array(
+ *       'module' => 'system',
+ *       'weight' => 0,
+ *     );
+ *   @endcode
+ * @param $modules
+ *   An array containing all module information stored in the {system} table.
+ *   Each element of the array also contains the module's .info file
+ *   information in the property 'info'. An additional 'dir' property has been
+ *   added to the module information which provides the path to the directory
+ *   in which the module resides. The example shows how to take advantage of
+ *   both properties.
  *
- * @see hook_uninstall()
- * @see hook_schema()
- */
-function hook_install() {
-  // Populate the default {node_access} record.
-  db_insert('node_access')
-    ->fields(array(
-      'nid' => 0,
-      'gid' => 0,
-      'realm' => 'all',
-      'grant_view' => 1,
-      'grant_update' => 0,
-      'grant_delete' => 0,
-    ))
-    ->execute();
-}
-
-/**
- * Perform a single update. For each patch which requires a database change add
- * a new hook_update_N() which will be called by update.php.
- *
- * The database updates are numbered sequentially according to the version of Drupal you are compatible with.
- *
- * Schema updates should adhere to the Schema API:
- * @link http://drupal.org/node/150215 http://drupal.org/node/150215 @endlink
- *
- * Database updates consist of 3 parts:
- * - 1 digit for Drupal core compatibility
- * - 1 digit for your module's major release version (e.g. is this the 5.x-1.* (1) or 5.x-2.* (2) series of your module?)
- * - 2 digits for sequential counting starting with 00
- *
- * The 2nd digit should be 0 for initial porting of your module to a new Drupal
- * core API.
- *
- * Examples:
- * - mymodule_update_5200()
- *   - This is the first update to get the database ready to run mymodule 5.x-2.*.
- * - mymodule_update_6000()
- *   - This is the required update for mymodule to run with Drupal core API 6.x.
- * - mymodule_update_6100()
- *   - This is the first update to get the database ready to run mymodule 6.x-1.*.
- * - mymodule_update_6200()
- *   - This is the first update to get the database ready to run mymodule 6.x-2.*.
- *     Users can directly update from 5.x-2.* to 6.x-2.* and they get all 60XX
- *     and 62XX updates, but not 61XX updates, because those reside in the
- *     6.x-1.x branch only.
- *
- * A good rule of thumb is to remove updates older than two major releases of
- * Drupal. See hook_update_last_removed() to notify Drupal about the removals.
- *
- * Never renumber update functions.
- *
- * Further information about releases and release numbers:
- * - @link http://drupal.org/handbook/version-info http://drupal.org/handbook/version-info @endlink
- * - @link http://drupal.org/node/93999 http://drupal.org/node/93999 @endlink (Overview of contributions branches and tags)
- * - @link http://drupal.org/handbook/cvs/releases http://drupal.org/handbook/cvs/releases @endlink
- *
- * Implementations of this hook should be placed in a mymodule.install file in
- * the same directory as mymodule.module. Drupal core's updates are implemented
- * using the system module as a name and stored in database/updates.inc.
- *
- * If your update task is potentially time-consuming, you'll need to implement a
- * multipass update to avoid PHP timeouts. Multipass updates use the $sandbox
- * parameter provided by the batch API (normally, $context['sandbox']) to store
- * information between successive calls, and the $sandbox['#finished'] value
- * to provide feedback regarding completion level.
- *
- * See the batch operations page for more information on how to use the batch API:
- * @link http://drupal.org/node/146843 http://drupal.org/node/146843 @endlink
- *
- * @throws DrupalUpdateException, PDOException
- *   In case of error, update hooks should throw an instance of DrupalUpdateException
- *   with a meaningful message for the user. If a database query fails for whatever
- *   reason, it will throw a PDOException.
- *
- * @return
- *   Optionally update hooks may return a translated string that will be displayed
- *   to the user. If no message is returned, no message will be presented to the
- *   user.
- */
-function hook_update_N(&$sandbox) {
-  // For non-multipass updates, the signature can simply be;
-  // function hook_update_N() {
-
-  // For most updates, the following is sufficient.
-  db_add_field('mytable1', 'newcol', array('type' => 'int', 'not null' => TRUE, 'description' => 'My new integer column.'));
-
-  // However, for more complex operations that may take a long time,
-  // you may hook into Batch API as in the following example.
-
-  // Update 3 users at a time to have an exclamation point after their names.
-  // (They're really happy that we can do batch API in this hook!)
-  if (!isset($sandbox['progress'])) {
-    $sandbox['progress'] = 0;
-    $sandbox['current_uid'] = 0;
-    // We'll -1 to disregard the uid 0...
-    $sandbox['max'] = db_query('SELECT COUNT(DISTINCT uid) FROM {users}')->fetchField() - 1;
-  }
-  db_select('users', 'u')
-    ->fields('u', array('uid', 'name'))
-    ->condition('uid', $sandbox['current_uid'], '>')
-    ->range(0, 3)
-    ->orderBy('uid', 'ASC')
-    ->execute();
-  foreach ($users as $user) {
-    $user->name .= '!';
-    db_update('users')
-      ->fields(array('name' => $user->name))
-      ->condition('uid', $user->uid)
-      ->execute();
-
-    $sandbox['progress']++;
-    $sandbox['current_uid'] = $user->uid;
-  }
-
-  $sandbox['#finished'] = empty($sandbox['max']) ? 1 : ($sandbox['progress'] / $sandbox['max']);
-
-  // To display a message to the user when the update is completed, return it.
-  // If you do not want to display a completion message, simply return nothing.
-  return t('The update did what it was supposed to do.');
-
-  // In case of an error, simply throw an exception with an error message.
-  throw new DrupalUpdateException('Something went wrong; here is what you should do.');
-}
-
-/**
- * Return a number which is no longer available as hook_update_N().
- *
- * If you remove some update functions from your mymodule.install file, you
- * should notify Drupal of those missing functions. This way, Drupal can
- * ensure that no update is accidentally skipped.
- *
- * Implementations of this hook should be placed in a mymodule.install file in
- * the same directory as mymodule.module.
- *
- * @return
- *   An integer, corresponding to hook_update_N() which has been removed from
- *   mymodule.install.
- *
- * @see hook_update_N()
- */
-function hook_update_last_removed() {
-  // We've removed the 5.x-1.x version of mymodule, including database updates.
-  // The next update function is mymodule_update_5200().
-  return 5103;
-}
-
-/**
- * Remove any information that the module sets.
- *
- * The information that the module should remove includes:
- * - variables that the module has set using variable_set() or system_settings_form()
- * - modifications to existing tables
- *
- * The module should not remove its entry from the {system} table. Database tables
- * defined by hook_schema() will be removed automatically.
- *
- * The uninstall hook will fire when the module gets uninstalled but before the
- * module's database tables are removed, allowing your module to query its own
- * tables during this routine.
- *
- * @see hook_install()
- * @see hook_schema()
- */
-function hook_uninstall() {
-  variable_del('upload_file_types');
-}
-
-/**
- * Perform necessary actions after module is enabled.
- *
- * The hook is called everytime module is enabled.
- */
-function hook_enable() {
-  mymodule_cache_rebuild();
-}
-
-/**
- * Perform necessary actions before module is disabled.
- *
- * The hook is called everytime module is disabled.
- */
-function hook_disable() {
-  mymodule_cache_rebuild();
-}
-
-/**
- * Perform necessary alterations to the list of files parsed by the registry.
- *
- * Modules can manually modify the list of files before the registry parses
- * them. The $modules array provides the .info file information, which includes
- * the list of files registered to each module. Any files in the list can then
- * be added to the list of files that the registry will parse, or modify
- * attributes of a file.
- *
- * A necessary alteration made by the core SimpleTest module is to force .test
- * files provided by disabled modules into the list of files parsed by the
- * registry.
- *
- * @param $files
- *   List of files to be parsed by the registry. The list will contain
- *   files found in each enabled module's info file and the core includes
- *   directory. The array is keyed by the file path and contains an array of
- *   the related module's name and weight as used internally by
- *   _registry_update() and related functions.
- *
- *   For example:
- *   @code
- *     $files["modules/system/system.module"] = array(
- *       'module' => 'system',
- *       'weight' => 0,
- *     );
- *   @endcode
- * @param $modules
- *   An array containing all module information stored in the {system} table.
- *   Each element of the array also contains the module's .info file
- *   information in the property 'info'. An additional 'dir' property has been
- *   added to the module information which provides the path to the directory
- *   in which the module resides. The example shows how to take advantage of
- *   both properties.
- *
- * @see _registry_update()
- * @see simpletest_test_get_all()
+ * @see _registry_update()
+ * @see simpletest_test_get_all()
  */
 function hook_registry_files_alter(&$files, $modules) {
   foreach ($modules as $module) {
@@ -2906,5 +2511,412 @@ function hook_username_alter(&$name, $ac
 }
 
 /**
+ * @defgroup hooks_file_module_dot_install Install file hooks
+ * @{
+ * Hooks whose implementation should be placed in the module's .install file.
+ *  
+ * See also @link hooks the full list of hooks @endlink
+ */
+                                                                                                     /**
+ * Check installation requirements and do status reporting.
+ *
+ * This hook has two closely related uses, determined by the $phase argument:
+ * checking installation requirements ($phase == 'install')
+ * and status reporting ($phase == 'runtime').
+ *
+ * Note that this hook, like all others dealing with installation and updates,
+ * must reside in a module_name.install file, or it will not properly abort
+ * the installation of the module if a critical requirement is missing.
+ *
+ * During the 'install' phase, modules can for example assert that
+ * library or server versions are available or sufficient.
+ * Note that the installation of a module can happen during installation of
+ * Drupal itself (by install.php) with an installation profile or later by hand.
+ * As a consequence, install-time requirements must be checked without access
+ * to the full Drupal API, because it is not available during install.php.
+ * For localization you should for example use $t = get_t() to
+ * retrieve the appropriate localization function name (t() or st()).
+ * If a requirement has a severity of REQUIREMENT_ERROR, install.php will abort
+ * or at least the module will not install.
+ * Other severity levels have no effect on the installation.
+ * Module dependencies do not belong to these installation requirements,
+ * but should be defined in the module's .info file.
+ *
+ * The 'runtime' phase is not limited to pure installation requirements
+ * but can also be used for more general status information like maintenance
+ * tasks and security issues.
+ * The returned 'requirements' will be listed on the status report in the
+ * administration section, with indication of the severity level.
+ * Moreover, any requirement with a severity of REQUIREMENT_ERROR severity will
+ * result in a notice on the the administration overview page.
+ *
+ * @param $phase
+ *   The phase in which hook_requirements is run:
+ *   - 'install': the module is being installed.
+ *   - 'runtime': the runtime requirements are being checked and shown on the
+ *              status report page.
+ *
+ * @return
+ *   A keyed array of requirements. Each requirement is itself an array with
+ *   the following items:
+ *     - 'title': the name of the requirement.
+ *     - 'value': the current value (e.g. version, time, level, ...). During
+ *       install phase, this should only be used for version numbers, do not set
+ *       it if not applicable.
+ *     - 'description': description of the requirement/status.
+ *     - 'severity': the requirement's result/severity level, one of:
+ *         - REQUIREMENT_INFO:    For info only.
+ *         - REQUIREMENT_OK:      The requirement is satisfied.
+ *         - REQUIREMENT_WARNING: The requirement failed with a warning.
+ *         - REQUIREMENT_ERROR:   The requirement failed with an error.
+ */
+function hook_requirements($phase) {
+  $requirements = array();
+  // Ensure translations don't break at install time
+  $t = get_t();
+
+  // Report Drupal version
+  if ($phase == 'runtime') {
+    $requirements['drupal'] = array(
+      'title' => $t('Drupal'),
+      'value' => VERSION,
+      'severity' => REQUIREMENT_INFO
+    );
+  }
+
+  // Test PHP version
+  $requirements['php'] = array(
+    'title' => $t('PHP'),
+    'value' => ($phase == 'runtime') ? l(phpversion(), 'admin/logs/status/php') : phpversion(),
+  );
+  if (version_compare(phpversion(), DRUPAL_MINIMUM_PHP) < 0) {
+    $requirements['php']['description'] = $t('Your PHP installation is too old. Drupal requires at least PHP %version.', array('%version' => DRUPAL_MINIMUM_PHP));
+    $requirements['php']['severity'] = REQUIREMENT_ERROR;
+  }
+
+  // Report cron status
+  if ($phase == 'runtime') {
+    $cron_last = variable_get('cron_last');
+
+    if (is_numeric($cron_last)) {
+      $requirements['cron']['value'] = $t('Last run !time ago', array('!time' => format_interval(REQUEST_TIME - $cron_last)));
+    }
+    else {
+      $requirements['cron'] = array(
+        'description' => $t('Cron has not run. It appears cron jobs have not been setup on your system. Please check the help pages for <a href="@url">configuring cron jobs</a>.', array('@url' => 'http://drupal.org/cron')),
+        'severity' => REQUIREMENT_ERROR,
+        'value' => $t('Never run'),
+      );
+    }
+
+    $requirements['cron']['description'] .= ' ' . t('You can <a href="@cron">run cron manually</a>.', array('@cron' => url('admin/logs/status/run-cron')));
+
+    $requirements['cron']['title'] = $t('Cron maintenance tasks');
+  }
+
+  return $requirements;
+}
+
+/**
+ * Define the current version of the database schema.
+ *
+ * A Drupal schema definition is an array structure representing one or
+ * more tables and their related keys and indexes. A schema is defined by
+ * hook_schema() which must live in your module's .install file.
+ *
+ * By implementing hook_schema() and specifying the tables your module
+ * declares, you can easily create and drop these tables on all
+ * supported database engines. You don't have to deal with the
+ * different SQL dialects for table creation and alteration of the
+ * supported database engines.
+ *
+ * See the Schema API Handbook at http://drupal.org/node/146843 for
+ * details on schema definition structures.
+ *
+ * @return
+ * A schema definition structure array. For each element of the
+ * array, the key is a table name and the value is a table structure
+ * definition.
+ */
+function hook_schema() {
+  $schema['node'] = array(
+    // example (partial) specification for table "node"
+    'description' => 'The base table for nodes.',
+    'fields' => array(
+      'nid' => array(
+        'description' => 'The primary identifier for a node.',
+        'type' => 'serial',
+        'unsigned' => TRUE,
+        'not null' => TRUE),
+      'vid' => array(
+        'description' => 'The current {node_revision}.vid version identifier.',
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'default' => 0),
+      'type' => array(
+        'description' => 'The {node_type} of this node.',
+        'type' => 'varchar',
+        'length' => 32,
+        'not null' => TRUE,
+        'default' => ''),
+      'title' => array(
+        'description' => 'The title of this node, always treated a non-markup plain text.',
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => TRUE,
+        'default' => ''),
+      ),
+    'indexes' => array(
+      'node_changed'        => array('changed'),
+      'node_created'        => array('created'),
+      ),
+    'unique keys' => array(
+      'nid_vid' => array('nid', 'vid'),
+      'vid'     => array('vid')
+      ),
+    'primary key' => array('nid'),
+  );
+  return $schema;
+}
+
+/**
+ * Perform alterations to existing database schemas.
+ *
+ * When a module modifies the database structure of another module (by
+ * changing, adding or removing fields, keys or indexes), it should
+ * implement hook_schema_alter() to update the default $schema to take
+ * it's changes into account.
+ *
+ * See hook_schema() for details on the schema definition structure.
+ *
+ * @param $schema
+ *   Nested array describing the schemas for all modules.
+ */
+function hook_schema_alter(&$schema) {
+  // Add field to existing schema.
+  $schema['users']['fields']['timezone_id'] = array(
+    'type' => 'int',
+    'not null' => TRUE,
+    'default' => 0,
+    'description' => 'Per-user timezone configuration.',
+  );
+}
+
+/**
+ * Perform setup tasks when the module is installed.
+ *
+ * If the module implements hook_schema(), the database tables will
+ * be created before this hook is fired.
+ *
+ * The hook will be called the first time a module is installed, and the
+ * module's schema version will be set to the module's greatest numbered update
+ * hook. Because of this, anytime a hook_update_N() is added to the module, this
+ * function needs to be updated to reflect the current version of the database
+ * schema.
+ *
+ * See the Schema API documentation at
+ * @link http://drupal.org/node/146843 http://drupal.org/node/146843 @endlink
+ * for details on hook_schema and how database tables are defined.
+ *
+ * Note that since this function is called from a full bootstrap, all functions
+ * (including those in modules enabled by the current page request) are
+ * available when this hook is called. Use cases could be displaying a user
+ * message, or calling a module function necessary for initial setup, etc.
+ *
+ * Please be sure that anything added or modified in this function that can
+ * be removed during uninstall should be removed with hook_uninstall().
+ *
+ * @see hook_uninstall()
+ * @see hook_schema()
+ */
+function hook_install() {
+  // Populate the default {node_access} record.
+  db_insert('node_access')
+    ->fields(array(
+      'nid' => 0,
+      'gid' => 0,
+      'realm' => 'all',
+      'grant_view' => 1,
+      'grant_update' => 0,
+      'grant_delete' => 0,
+    ))
+    ->execute();
+}
+
+/**
+ * Perform a single update. For each patch which requires a database change add
+ * a new hook_update_N() which will be called by update.php.
+ *
+ * The database updates are numbered sequentially according to the version of Drupal you are compatible with.
+ *
+ * Schema updates should adhere to the Schema API:
+ * @link http://drupal.org/node/150215 http://drupal.org/node/150215 @endlink
+ *
+ * Database updates consist of 3 parts:
+ * - 1 digit for Drupal core compatibility
+ * - 1 digit for your module's major release version (e.g. is this the 5.x-1.* (1) or 5.x-2.* (2) series of your module?)
+ * - 2 digits for sequential counting starting with 00
+ *
+ * The 2nd digit should be 0 for initial porting of your module to a new Drupal
+ * core API.
+ *
+ * Examples:
+ * - mymodule_update_5200()
+ *   - This is the first update to get the database ready to run mymodule 5.x-2.*.
+ * - mymodule_update_6000()
+ *   - This is the required update for mymodule to run with Drupal core API 6.x.
+ * - mymodule_update_6100()
+ *   - This is the first update to get the database ready to run mymodule 6.x-1.*.
+ * - mymodule_update_6200()
+ *   - This is the first update to get the database ready to run mymodule 6.x-2.*.
+ *     Users can directly update from 5.x-2.* to 6.x-2.* and they get all 60XX
+ *     and 62XX updates, but not 61XX updates, because those reside in the
+ *     6.x-1.x branch only.
+ *
+ * A good rule of thumb is to remove updates older than two major releases of
+ * Drupal. See hook_update_last_removed() to notify Drupal about the removals.
+ *
+ * Never renumber update functions.
+ *
+ * Further information about releases and release numbers:
+ * - @link http://drupal.org/handbook/version-info http://drupal.org/handbook/version-info @endlink
+ * - @link http://drupal.org/node/93999 http://drupal.org/node/93999 @endlink (Overview of contributions branches and tags)
+ * - @link http://drupal.org/handbook/cvs/releases http://drupal.org/handbook/cvs/releases @endlink
+ *
+ * Implementations of this hook should be placed in a mymodule.install file in
+ * the same directory as mymodule.module. Drupal core's updates are implemented
+ * using the system module as a name and stored in database/updates.inc.
+ *
+ * If your update task is potentially time-consuming, you'll need to implement a
+ * multipass update to avoid PHP timeouts. Multipass updates use the $sandbox
+ * parameter provided by the batch API (normally, $context['sandbox']) to store
+ * information between successive calls, and the $sandbox['#finished'] value
+ * to provide feedback regarding completion level.
+ *
+ * See the batch operations page for more information on how to use the batch API:
+ * @link http://drupal.org/node/146843 http://drupal.org/node/146843 @endlink
+ *
+ * @throws DrupalUpdateException, PDOException
+ *   In case of error, update hooks should throw an instance of DrupalUpdateException
+ *   with a meaningful message for the user. If a database query fails for whatever
+ *   reason, it will throw a PDOException.
+ *
+ * @return
+ *   Optionally update hooks may return a translated string that will be displayed
+ *   to the user. If no message is returned, no message will be presented to the
+ *   user.
+ */
+function hook_update_N(&$sandbox) {
+  // For non-multipass updates, the signature can simply be;
+  // function hook_update_N() {
+
+  // For most updates, the following is sufficient.
+  db_add_field('mytable1', 'newcol', array('type' => 'int', 'not null' => TRUE, 'description' => 'My new integer column.'));
+
+  // However, for more complex operations that may take a long time,
+  // you may hook into Batch API as in the following example.
+
+  // Update 3 users at a time to have an exclamation point after their names.
+  // (They're really happy that we can do batch API in this hook!)
+  if (!isset($sandbox['progress'])) {
+    $sandbox['progress'] = 0;
+    $sandbox['current_uid'] = 0;
+    // We'll -1 to disregard the uid 0...
+    $sandbox['max'] = db_query('SELECT COUNT(DISTINCT uid) FROM {users}')->fetchField() - 1;
+  }
+  db_select('users', 'u')
+    ->fields('u', array('uid', 'name'))
+    ->condition('uid', $sandbox['current_uid'], '>')
+    ->range(0, 3)
+    ->orderBy('uid', 'ASC')
+    ->execute();
+  foreach ($users as $user) {
+    $user->name .= '!';
+    db_update('users')
+      ->fields(array('name' => $user->name))
+      ->condition('uid', $user->uid)
+      ->execute();
+
+    $sandbox['progress']++;
+    $sandbox['current_uid'] = $user->uid;
+  }
+
+  $sandbox['#finished'] = empty($sandbox['max']) ? 1 : ($sandbox['progress'] / $sandbox['max']);
+
+  // To display a message to the user when the update is completed, return it.
+  // If you do not want to display a completion message, simply return nothing.
+  return t('The update did what it was supposed to do.');
+
+  // In case of an error, simply throw an exception with an error message.
+  throw new DrupalUpdateException('Something went wrong; here is what you should do.');
+}
+
+/**
+ * Return a number which is no longer available as hook_update_N().
+ *
+ * If you remove some update functions from your mymodule.install file, you
+ * should notify Drupal of those missing functions. This way, Drupal can
+ * ensure that no update is accidentally skipped.
+ *
+ * Implementations of this hook should be placed in a mymodule.install file in
+ * the same directory as mymodule.module.
+ *
+ * @return
+ *   An integer, corresponding to hook_update_N() which has been removed from
+ *   mymodule.install.
+ *
+ * @see hook_update_N()
+ */
+function hook_update_last_removed() {
+  // We've removed the 5.x-1.x version of mymodule, including database updates.
+  // The next update function is mymodule_update_5200().
+  return 5103;
+}
+
+/**
+ * Remove any information that the module sets.
+ *
+ * The information that the module should remove includes:
+ * - variables that the module has set using variable_set() or system_settings_form()
+ * - modifications to existing tables
+ *
+ * The module should not remove its entry from the {system} table. Database tables
+ * defined by hook_schema() will be removed automatically.
+ *
+ * The uninstall hook will fire when the module gets uninstalled but before the
+ * module's database tables are removed, allowing your module to query its own
+ * tables during this routine.
+ *
+ * @see hook_install()
+ * @see hook_schema()
+ */
+function hook_uninstall() {
+  variable_del('upload_file_types');
+}
+
+/**
+ * Perform necessary actions after module is enabled.
+ *
+ * The hook is called everytime module is enabled.
+ */
+function hook_enable() {
+  mymodule_cache_rebuild();
+}
+
+/**
+ * Perform necessary actions before module is disabled.
+ *
+ * The hook is called everytime module is disabled.
+ */
+function hook_disable() {
+  mymodule_cache_rebuild();
+}
+
+/**
+ * @} End of "defgroup hooks_file_module_dot_install".
+ */
+
+/**
  * @} End of "addtogroup hooks".
  */
