summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDries Buytaert <dries@buytaert.net>2009-09-10 06:38:20 +0000
committerDries Buytaert <dries@buytaert.net>2009-09-10 06:38:20 +0000
commit029c48c68d7f4f2bc94e93e3333908ca158433c5 (patch)
treebf1fef18db8910f94ee977861829b966d42efb00
parent82b51dff1d2fd90b439129c70b415d30a06d1bce (diff)
downloadbrdo-029c48c68d7f4f2bc94e93e3333908ca158433c5.tar.gz
brdo-029c48c68d7f4f2bc94e93e3333908ca158433c5.tar.bz2
- Patch #306151 by agentrickard, David_Rothstein, Dave Reid, dbabbage, moshe weitzman: automatically install/uninstall schema.
-rw-r--r--includes/common.inc3
-rw-r--r--includes/database/database.inc4
-rw-r--r--includes/install.inc5
-rw-r--r--modules/aggregator/aggregator.install11
-rw-r--r--modules/block/block.install8
-rw-r--r--modules/book/book.install4
-rw-r--r--modules/comment/comment.install11
-rw-r--r--modules/contact/contact.install11
-rw-r--r--modules/dblog/dblog.install16
-rw-r--r--modules/field/field.install7
-rw-r--r--modules/field/modules/field_sql_storage/field_sql_storage.install14
-rw-r--r--modules/forum/forum.install3
-rw-r--r--modules/image/image.install4
-rw-r--r--modules/locale/locale.install5
-rw-r--r--modules/menu/menu.install4
-rw-r--r--modules/openid/openid.install16
-rw-r--r--modules/poll/poll.install16
-rw-r--r--modules/profile/profile.install11
-rw-r--r--modules/search/search.install11
-rw-r--r--modules/simpletest/simpletest.install4
-rw-r--r--modules/simpletest/tests/database_test.install14
-rw-r--r--modules/simpletest/tests/field_test.install14
-rw-r--r--modules/simpletest/tests/taxonomy_test.install15
-rw-r--r--modules/statistics/statistics.install11
-rw-r--r--modules/system/system.admin.inc4
-rw-r--r--modules/system/system.api.php32
-rw-r--r--modules/system/system.install3
-rw-r--r--modules/taxonomy/taxonomy.install11
-rw-r--r--modules/trigger/trigger.install11
-rw-r--r--modules/update/update.install10
-rw-r--r--modules/upload/upload.install20
31 files changed, 39 insertions, 274 deletions
diff --git a/includes/common.inc b/includes/common.inc
index 75f6f820b..781e27a9c 100644
--- a/includes/common.inc
+++ b/includes/common.inc
@@ -4798,9 +4798,10 @@ function drupal_get_schema_unprocessed($module, $table = NULL) {
if (!is_null($table) && isset($schema[$table])) {
return $schema[$table];
}
- else {
+ else if (!empty($schema)) {
return $schema;
}
+ return array();
}
/**
diff --git a/includes/database/database.inc b/includes/database/database.inc
index 22bd8fe2e..f298376ff 100644
--- a/includes/database/database.inc
+++ b/includes/database/database.inc
@@ -2130,7 +2130,9 @@ function db_close(array $options = array()) {
* A Schema API table definition array.
*/
function db_create_table(&$ret, $name, $table) {
- return Database::getConnection()->schema()->createTable($ret, $name, $table);
+ if (!db_table_exists($name)) {
+ return Database::getConnection()->schema()->createTable($ret, $name, $table);
+ }
}
/**
diff --git a/includes/install.inc b/includes/install.inc
index 0e68a1b06..e8efe4b07 100644
--- a/includes/install.inc
+++ b/includes/install.inc
@@ -586,8 +586,9 @@ function drupal_install_modules($module_list = array(), $disable_modules_install
*/
function _drupal_install_module($module) {
if (drupal_get_installed_schema_version($module, TRUE) == SCHEMA_UNINSTALLED) {
- module_load_install($module);
drupal_load('module', $module);
+ drupal_install_schema($module);
+ // Now allow the module to perform install tasks.
module_invoke($module, 'install');
$versions = drupal_get_schema_versions($module);
drupal_set_installed_schema_version($module, $versions ? max($versions) : SCHEMA_INSTALLED);
@@ -663,6 +664,8 @@ function drupal_uninstall_modules($module_list = array()) {
// Uninstall the module.
module_load_install($module);
module_invoke($module, 'uninstall');
+ drupal_uninstall_schema($module);
+
watchdog('system', '%module module uninstalled.', array('%module' => $module), WATCHDOG_INFO);
// Now remove the menu links for all paths declared by this module.
diff --git a/modules/aggregator/aggregator.install b/modules/aggregator/aggregator.install
index e992e70d3..cc4d2258a 100644
--- a/modules/aggregator/aggregator.install
+++ b/modules/aggregator/aggregator.install
@@ -7,20 +7,9 @@
*/
/**
- * Implement hook_install().
- */
-function aggregator_install() {
- // Create tables.
- drupal_install_schema('aggregator');
-}
-
-/**
* Implement hook_uninstall().
*/
function aggregator_uninstall() {
- // Remove tables.
- drupal_uninstall_schema('aggregator');
-
variable_del('aggregator_allowed_html_tags');
variable_del('aggregator_summary_items');
variable_del('aggregator_clear');
diff --git a/modules/block/block.install b/modules/block/block.install
index 0363d682f..f1b2b3e7a 100644
--- a/modules/block/block.install
+++ b/modules/block/block.install
@@ -205,7 +205,6 @@ function block_schema() {
* Implement hook_install().
*/
function block_install() {
- drupal_install_schema('block');
// Block should go first so that other modules can alter its output
// during hook_page_alter(). Almost everything on the page is a block,
@@ -217,13 +216,6 @@ function block_install() {
}
/**
- * Implement hook_uninstall().
- */
-function block_uninstall() {
- drupal_uninstall_schema('block');
-}
-
-/**
* Set system.weight to a low value for block module.
*
* Block should go first so that other modules can alter its output
diff --git a/modules/book/book.install b/modules/book/book.install
index 1948d6d11..e93518e24 100644
--- a/modules/book/book.install
+++ b/modules/book/book.install
@@ -10,8 +10,6 @@
* Implement hook_install().
*/
function book_install() {
- // Create tables.
- drupal_install_schema('book');
// Add the node type.
_book_install_type_create();
}
@@ -23,8 +21,6 @@ function book_uninstall() {
// Delete menu links.
db_query("DELETE FROM {menu_links} WHERE module = 'book'");
menu_cache_clear_all();
- // Remove tables.
- drupal_uninstall_schema('book');
}
function _book_install_type_create() {
diff --git a/modules/comment/comment.install b/modules/comment/comment.install
index 725793099..84111ce1e 100644
--- a/modules/comment/comment.install
+++ b/modules/comment/comment.install
@@ -7,20 +7,9 @@
*/
/**
- * Implement hook_install().
- */
-function comment_install() {
- // Create tables.
- drupal_install_schema('comment');
-}
-
-/**
* Implement hook_uninstall().
*/
function comment_uninstall() {
- // Remove tables.
- drupal_uninstall_schema('comment');
-
// Remove variables.
variable_del('comment_block_count');
$node_types = array_keys(node_type_get_types());
diff --git a/modules/contact/contact.install b/modules/contact/contact.install
index 929cc54fa..3e22f41bb 100644
--- a/modules/contact/contact.install
+++ b/modules/contact/contact.install
@@ -7,20 +7,9 @@
*/
/**
- * Implement hook_install().
- */
-function contact_install() {
- // Create tables.
- drupal_install_schema('contact');
-}
-
-/**
* Implement hook_uninstall().
*/
function contact_uninstall() {
- // Remove tables.
- drupal_uninstall_schema('contact');
-
variable_del('contact_default_status');
variable_del('contact_form_information');
variable_del('contact_hourly_threshold');
diff --git a/modules/dblog/dblog.install b/modules/dblog/dblog.install
index 717be592c..fef784fb7 100644
--- a/modules/dblog/dblog.install
+++ b/modules/dblog/dblog.install
@@ -7,22 +7,6 @@
*/
/**
- * Implement hook_install().
- */
-function dblog_install() {
- // Create tables.
- drupal_install_schema('dblog');
-}
-
-/**
- * Implement hook_uninstall().
- */
-function dblog_uninstall() {
- // Remove tables.
- drupal_uninstall_schema('dblog');
-}
-
-/**
* Implement hook_schema().
*/
function dblog_schema() {
diff --git a/modules/field/field.install b/modules/field/field.install
index a7b9df27b..ba3db1df5 100644
--- a/modules/field/field.install
+++ b/modules/field/field.install
@@ -7,13 +7,6 @@
*/
/**
- * Implement hook_install().
- */
-function field_install() {
- drupal_install_schema('field');
-}
-
-/**
* Implement hook_schema.
*/
function field_schema() {
diff --git a/modules/field/modules/field_sql_storage/field_sql_storage.install b/modules/field/modules/field_sql_storage/field_sql_storage.install
index 450029e4b..67b7e4afc 100644
--- a/modules/field/modules/field_sql_storage/field_sql_storage.install
+++ b/modules/field/modules/field_sql_storage/field_sql_storage.install
@@ -7,20 +7,6 @@
*/
/**
- * Implement hook_install().
- */
-function field_sql_storage_install() {
- drupal_install_schema('field_sql_storage');
-}
-
-/**
- * Implement hook_uninstall().
- */
-function field_sql_storage_uninstall() {
- drupal_uninstall_schema('field_sql_storage');
-}
-
-/**
* Implement hook_schema().
*/
function field_sql_storage_schema() {
diff --git a/modules/forum/forum.install b/modules/forum/forum.install
index 6ad9ee9b7..c42490e2e 100644
--- a/modules/forum/forum.install
+++ b/modules/forum/forum.install
@@ -10,8 +10,6 @@
* Implement hook_install().
*/
function forum_install() {
- // Create tables.
- drupal_install_schema('forum');
// Set the weight of the forum.module to 1 so it is loaded after the taxonomy.module.
db_update('system')
->fields(array('weight' => 1))
@@ -61,7 +59,6 @@ function forum_uninstall() {
$vid = variable_get('forum_nav_vocabulary', 0);
taxonomy_vocabulary_delete($vid);
- drupal_uninstall_schema('forum');
variable_del('forum_containers');
variable_del('forum_nav_vocabulary');
variable_del('forum_hot_topic');
diff --git a/modules/image/image.install b/modules/image/image.install
index b963605dc..8cd205e19 100644
--- a/modules/image/image.install
+++ b/modules/image/image.install
@@ -10,8 +10,6 @@
* Implement hook_install().
*/
function image_install() {
- drupal_install_schema('image');
-
// Create the styles directory and ensure it's writable.
$path = file_directory_path() . '/styles';
file_prepare_directory($path, FILE_CREATE_DIRECTORY | FILE_MODIFY_PERMISSIONS);
@@ -21,8 +19,6 @@ function image_install() {
* Implement hook_uninstall().
*/
function image_uninstall() {
- drupal_uninstall_schema('image');
-
// Remove the styles directory and generated images.
$path = file_directory_path() . '/styles';
file_unmanaged_delete_recursive($path);
diff --git a/modules/locale/locale.install b/modules/locale/locale.install
index f08b75d44..d487803c1 100644
--- a/modules/locale/locale.install
+++ b/modules/locale/locale.install
@@ -14,9 +14,6 @@ function locale_install() {
// fields; non-MySQL database servers need to ensure the field type is text
// and that LIKE produces a case-sensitive comparison.
- // Create tables.
- drupal_install_schema('locale');
-
db_insert('languages')
->fields(array(
'language' => 'en',
@@ -83,8 +80,6 @@ function locale_uninstall() {
// try to query the unexisting {locales_source} and {locales_target} tables.
drupal_language_initialize();
- // Remove tables.
- drupal_uninstall_schema('locale');
}
/**
diff --git a/modules/menu/menu.install b/modules/menu/menu.install
index 1ff901a09..aca5835ee 100644
--- a/modules/menu/menu.install
+++ b/modules/menu/menu.install
@@ -10,8 +10,6 @@
* Implement hook_install().
*/
function menu_install() {
- // Create tables.
- drupal_install_schema('menu');
$system_menus = menu_list_system_menus();
$descriptions = array(
'navigation' => 'The <em>Navigation</em> menu contains links such as Recent posts (if the Tracker module is enabled). Non-administrative links are added to this menu by default by modules.',
@@ -31,8 +29,6 @@ function menu_install() {
* Implement hook_uninstall().
*/
function menu_uninstall() {
- // Remove tables.
- drupal_uninstall_schema('menu');
menu_rebuild();
}
diff --git a/modules/openid/openid.install b/modules/openid/openid.install
index 6dd056bcd..62955ad2b 100644
--- a/modules/openid/openid.install
+++ b/modules/openid/openid.install
@@ -7,22 +7,6 @@
*/
/**
- * Implement hook_install().
- */
-function openid_install() {
- // Create table.
- drupal_install_schema('openid');
-}
-
-/**
- * Implement hook_uninstall().
- */
-function openid_uninstall() {
- // Remove table.
- drupal_uninstall_schema('openid');
-}
-
-/**
* Implement hook_schema().
*/
function openid_schema() {
diff --git a/modules/poll/poll.install b/modules/poll/poll.install
index 5ad698082..880b317fc 100644
--- a/modules/poll/poll.install
+++ b/modules/poll/poll.install
@@ -7,22 +7,6 @@
*/
/**
- * Implement hook_install().
- */
-function poll_install() {
- // Create tables.
- drupal_install_schema('poll');
-}
-
-/**
- * Implement hook_uninstall().
- */
-function poll_uninstall() {
- // Remove tables.
- drupal_uninstall_schema('poll');
-}
-
-/**
* Implement hook_schema().
*/
function poll_schema() {
diff --git a/modules/profile/profile.install b/modules/profile/profile.install
index b07a6b8b3..b07780671 100644
--- a/modules/profile/profile.install
+++ b/modules/profile/profile.install
@@ -7,20 +7,9 @@
*/
/**
- * Implement hook_install().
- */
-function profile_install() {
- // Create tables.
- drupal_install_schema('profile');
-}
-
-/**
* Implement hook_uninstall().
*/
function profile_uninstall() {
- // Remove tables
- drupal_uninstall_schema('profile');
-
variable_del('profile_block_author_fields');
}
diff --git a/modules/search/search.install b/modules/search/search.install
index 239edb484..5cb6f887b 100644
--- a/modules/search/search.install
+++ b/modules/search/search.install
@@ -7,20 +7,9 @@
*/
/**
- * Implement hook_install().
- */
-function search_install() {
- // Create tables.
- drupal_install_schema('search');
-}
-
-/**
* Implement hook_uninstall().
*/
function search_uninstall() {
- // Remove tables.
- drupal_uninstall_schema('search');
-
variable_del('minimum_word_size');
variable_del('overlap_cjk');
variable_del('search_cron_limit');
diff --git a/modules/simpletest/simpletest.install b/modules/simpletest/simpletest.install
index 1ca0bae18..d12d5befd 100644
--- a/modules/simpletest/simpletest.install
+++ b/modules/simpletest/simpletest.install
@@ -10,7 +10,6 @@
* Implement hook_install().
*/
function simpletest_install() {
- drupal_install_schema('simpletest');
// Check for files directory.
$path = 'public://simpletest';
if (file_prepare_directory($path, FILE_CREATE_DIRECTORY)) {
@@ -110,9 +109,6 @@ function simpletest_uninstall() {
variable_del('simpletest_clear_results');
variable_del('simpletest_verbose');
- // Uninstall schema.
- drupal_uninstall_schema('simpletest');
-
// Remove generated files.
$path = file_directory_path() . '/simpletest';
$files = file_scan_directory($path, '/.*/');
diff --git a/modules/simpletest/tests/database_test.install b/modules/simpletest/tests/database_test.install
index 6b9607775..b9fe61ab4 100644
--- a/modules/simpletest/tests/database_test.install
+++ b/modules/simpletest/tests/database_test.install
@@ -204,17 +204,3 @@ function database_test_schema() {
return $schema;
}
-
-/**
- * Implement hook_install().
- */
-function database_test_install() {
- drupal_install_schema('database_test');
-}
-
-/**
- * Implement hook_uninstall().
- */
-function database_test_uninstall() {
- drupal_uninstall_schema('database_test');
-}
diff --git a/modules/simpletest/tests/field_test.install b/modules/simpletest/tests/field_test.install
index 1fa0eeb11..83beb5e42 100644
--- a/modules/simpletest/tests/field_test.install
+++ b/modules/simpletest/tests/field_test.install
@@ -64,17 +64,3 @@ function field_test_schema() {
return $schema;
}
-
-/**
- * Implement hook_install().
- */
-function field_test_install() {
- drupal_install_schema('field_test');
-}
-
-/**
- * Implement hook_uninstall().
- */
-function field_test_uninstall() {
- drupal_uninstall_schema('field_test');
-}
diff --git a/modules/simpletest/tests/taxonomy_test.install b/modules/simpletest/tests/taxonomy_test.install
index 2d771d0e2..c4a568da4 100644
--- a/modules/simpletest/tests/taxonomy_test.install
+++ b/modules/simpletest/tests/taxonomy_test.install
@@ -33,18 +33,3 @@ function taxonomy_test_schema() {
return $schema;
}
-
-/**
- * Implement hook_install().
- */
-function taxonomy_test_install() {
- drupal_install_schema('taxonomy_test');
-}
-
-/**
- * Implement hook_uninstall().
- */
-function taxonomy_test_uninstall() {
- drupal_uninstall_schema('taxonomy_test');
-}
-
diff --git a/modules/statistics/statistics.install b/modules/statistics/statistics.install
index aca554790..396faab80 100644
--- a/modules/statistics/statistics.install
+++ b/modules/statistics/statistics.install
@@ -7,20 +7,9 @@
*/
/**
- * Implement hook_install().
- */
-function statistics_install() {
- // Create tables.
- drupal_install_schema('statistics');
-}
-
-/**
* Implement hook_uninstall().
*/
function statistics_uninstall() {
- // Remove tables.
- drupal_uninstall_schema('statistics');
-
// Remove variables.
variable_del('statistics_count_content_views');
variable_del('statistics_enable_access_log');
diff --git a/modules/system/system.admin.inc b/modules/system/system.admin.inc
index 37d1fc2a0..2d1875e74 100644
--- a/modules/system/system.admin.inc
+++ b/modules/system/system.admin.inc
@@ -1051,10 +1051,10 @@ function system_modules_uninstall($form_state = NULL) {
// Grab the module info
$info = unserialize($module->info);
- // Load the .install file, and check for an uninstall hook.
+ // Load the .install file, and check for an uninstall or schema hook.
// If the hook exists, the module can be uninstalled.
module_load_install($module->name);
- if (module_hook($module->name, 'uninstall')) {
+ if (module_hook($module->name, 'uninstall') || module_hook($module->name, 'schema')) {
$form['modules'][$module->name]['name'] = array('#markup' => $info['name'] ? $info['name'] : $module->name);
$form['modules'][$module->name]['description'] = array('#markup' => t($info['description']));
$options[$module->name] = '';
diff --git a/modules/system/system.api.php b/modules/system/system.api.php
index 2c5bcbd27..da3d489ee 100644
--- a/modules/system/system.api.php
+++ b/modules/system/system.api.php
@@ -1797,7 +1797,10 @@ function hook_query_TAG_alter(QueryAlterableInterface $query) {
}
/**
- * Install the current version of the database schema, and any other setup tasks.
+ * 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
@@ -1807,7 +1810,7 @@ function hook_query_TAG_alter(QueryAlterableInterface $query) {
*
* See the Schema API documentation at
* @link http://drupal.org/node/146843 http://drupal.org/node/146843 @endlink
- * for details on hook_schema, where a database tables are defined.
+ * 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
@@ -1818,9 +1821,20 @@ function hook_query_TAG_alter(QueryAlterableInterface $query) {
* be removed during uninstall should be removed with hook_uninstall().
*
* @see hook_uninstall()
+ * @see hook_schema()
*/
function hook_install() {
- drupal_install_schema('upload');
+ // 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();
}
/**
@@ -1949,15 +1963,19 @@ function hook_update_last_removed() {
*
* The information that the module should remove includes:
* - variables that the module has set using variable_set() or system_settings_form()
- * - tables the module has created, using drupal_uninstall_schema()
* - modifications to existing tables
*
- * The module should not remove its entry from the {system} table.
+ * 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.
+ * 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() {
- drupal_uninstall_schema('upload');
variable_del('upload_file_types');
}
diff --git a/modules/system/system.install b/modules/system/system.install
index 4757d9b75..380d679fc 100644
--- a/modules/system/system.install
+++ b/modules/system/system.install
@@ -338,6 +338,9 @@ function system_install() {
$modules = array('system', 'filter', 'user', 'node');
foreach ($modules as $module) {
drupal_install_schema($module);
+ $versions = drupal_get_schema_versions($module);
+ $version = $versions ? max($versions) : SCHEMA_INSTALLED;
+ drupal_set_installed_schema_version($module, $version);
}
// Load system theme data appropriately.
diff --git a/modules/taxonomy/taxonomy.install b/modules/taxonomy/taxonomy.install
index 807c93375..c4c2a542c 100644
--- a/modules/taxonomy/taxonomy.install
+++ b/modules/taxonomy/taxonomy.install
@@ -6,21 +6,10 @@
* Install, update and uninstall functions for the taxonomy module.
*/
- /**
- * Implement hook_install().
- */
-function taxonomy_install() {
- // Create tables.
- drupal_install_schema('taxonomy');
-}
-
/**
* Implement hook_uninstall().
*/
function taxonomy_uninstall() {
- // Remove tables.
- drupal_uninstall_schema('taxonomy');
-
// Remove variables.
variable_del('taxonomy_override_selector');
variable_del('taxonomy_terms_per_page_admin');
diff --git a/modules/trigger/trigger.install b/modules/trigger/trigger.install
index 631efd18b..2e014d071 100644
--- a/modules/trigger/trigger.install
+++ b/modules/trigger/trigger.install
@@ -10,22 +10,11 @@
* Implement hook_install().
*/
function trigger_install() {
- // Create tables.
- drupal_install_schema('trigger');
-
// Do initial synchronization of actions in code and the database.
actions_synchronize();
}
/**
- * Implement hook_uninstall().
- */
-function trigger_uninstall() {
- // Remove tables.
- drupal_uninstall_schema('trigger');
-}
-
-/**
* Implement hook_schema().
*/
function trigger_schema() {
diff --git a/modules/update/update.install b/modules/update/update.install
index f8a6e3ab6..0c2713149 100644
--- a/modules/update/update.install
+++ b/modules/update/update.install
@@ -7,19 +7,9 @@
*/
/**
- * Implement hook_install().
- */
-function update_install() {
- // Create cache table.
- drupal_install_schema('update');
-}
-
-/**
* Implement hook_uninstall().
*/
function update_uninstall() {
- // Remove cache table.
- drupal_uninstall_schema('update');
// Clear any variables that might be in use
$variables = array(
'update_check_frequency',
diff --git a/modules/upload/upload.install b/modules/upload/upload.install
index 395abfebf..62acef717 100644
--- a/modules/upload/upload.install
+++ b/modules/upload/upload.install
@@ -12,26 +12,6 @@
*/
/**
- * Implement hook_install().
- */
-function upload_install() {
- // Create table. The upload table might have been created in the Drupal 5
- // to Drupal 6 upgrade, and was migrated from the file_revisions table. So
- // in this case, there is no need to create the table, it is already there.
- if (!db_table_exists('upload')) {
- drupal_install_schema('upload');
- }
-}
-
-/**
- * Implement hook_uninstall().
- */
-function upload_uninstall() {
- // Remove tables.
- drupal_uninstall_schema('upload');
-}
-
-/**
* Implement hook_schema().
*/
function upload_schema() {