Index: install.php
===================================================================
RCS file: /cvs/drupal/drupal/install.php,v
retrieving revision 1.52
diff -u -F^f -r1.52 install.php
--- install.php	17 May 2007 06:35:05 -0000	1.52
+++ install.php	17 May 2007 16:18:04 -0000
@@ -50,12 +50,24 @@ function install_main() {
   }
 
   // Load module basics (needed for hook invokes).
+  // We load all modules that either are required during installation time
+  // or have schemas that need to be created.
   include_once './includes/module.inc';
   $module_list['system']['filename'] = 'modules/system/system.module';
   $module_list['filter']['filename'] = 'modules/filter/filter.module';
+  $module_list['block']['filename'] = 'modules/block/block.module';
+  $module_list['user']['filename'] = 'modules/user/user.module';
+  $module_list['node']['filename'] = 'modules/node/node.module';
+  $module_list['comment']['filename'] = 'modules/comment/comment.module';
+  $module_list['taxonomy']['filename'] = 'modules/taxonomy/taxonomy.module';
   module_list(TRUE, FALSE, FALSE, $module_list);
   drupal_load('module', 'system');
   drupal_load('module', 'filter');
+  drupal_load('module', 'block');
+  drupal_load('module', 'user');
+  drupal_load('module', 'node');
+  drupal_load('module', 'comment');
+  drupal_load('module', 'taxonomy');
 
   // Decide which profile to use.
   if (!empty($_GET['profile'])) {
Index: update.php
===================================================================
RCS file: /cvs/drupal/drupal/update.php,v
retrieving revision 1.222
diff -u -F^f -r1.222 update.php
--- update.php	16 May 2007 07:56:19 -0000	1.222
+++ update.php	17 May 2007 16:18:05 -0000
@@ -17,12 +17,6 @@
 // Enforce access checking?
 $access_check = TRUE;
 
-
-function update_sql($sql) {
-  $result = db_query($sql);
-  return array('success' => $result !== FALSE, 'query' => check_plain($sql));
-}
-
 /**
  * Add a column to a database using syntax appropriate for PostgreSQL.
  * Save result of SQL commands in $ret array.
Index: includes/common.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/common.inc,v
retrieving revision 1.641
diff -u -F^f -r1.641 common.inc
--- includes/common.inc	15 May 2007 20:19:47 -0000	1.641
+++ includes/common.inc	17 May 2007 16:18:06 -0000
@@ -2514,6 +2514,155 @@ function drupal_common_themes() {
 }
 
 /**
+ * Get a schema defintion.
+ *
+ * A drupal schema definition a data structure representing one or
+ * more tables and their related keys and indexes.  Schemas are
+ * defined by hook_schema().
+ * 
+ * TODO: This is slight out of date and should be replaced by a handbook
+ * page.
+ *
+ * The following keys are processed during table creation:
+ *  - 'table': The table name. Defaults to the schema's name.
+ *  - 'fields': An associative array ('fieldname' => details) that describes the schema's fields.
+ *     The following keys are available:
+ *       - 'type': The generic datatype: 'varchar', 'int', 'float', 'numeric', 'text', 'blob' or 'datetime'.
+ *       - 'size': The data size: 'tiny', 'small', 'medium', 'normal', 'big'.
+ *         This decides which engine-specific datatype is used (e.g. TINYINT vs. INT). 
+ *         If not set, 'normal' is used (which would expand to INT resp. TEXT resp. BLOB). 
+ *         Not all sizes are available for all data types. See db_type_map() for possible combinations.
+ *       - 'not null': If true, no NULL values will be allowed. Defaults to false.
+ *       - 'default': The default value.
+ *     The following keys are only available for some types:
+ *       - 'length': The max. length (character types only)
+ *       - 'disp_width': The display width ('int' only, not supported by all database engines)
+ *       - 'unsigned': 'int', 'float' and 'numeric' only
+ *       - 'auto_increment': 'int' only
+ *       - 'precision', 'scale': 'numeric' only. They can only be used together.
+ *       All options apart from 'type' are optional.
+ *  - 'primary key': An array of (one or more) field names that form the primary key
+ *  - 'unique key': An array of the form 'key_name' => array('field1' [, 'field2' [, 'field3']])
+ *  - 'indexes': An array of the form 'index_name' => array('field1' [, 'field2' [, 'field3']])
+ * 
+ * @param $name The name of the schema.
+ */
+ 
+function drupal_get_schema($name = NULL) {
+  $schema = drupal_load_schema();
+  
+  if (! isset($name)) {
+    return $schema;
+  } 
+  else if (isset($schema[$name])) { 
+    return $schema[$name];
+  }
+  else {
+    return FALSE;
+  }
+}
+
+/**
+ * Load all schema definitions.
+ * 
+ * @param $rebuild
+ *   If true, the schema will be rebuilt instead of retreived from the cache.
+ * @return
+ *   An array containing all schema definitions (processed and altered).
+ */
+function drupal_load_schema($rebuild = FALSE) {
+  static $schema = array();
+  
+  if (!$rebuild && !empty($schema)) {
+    return $schema;
+  }
+  
+  if (!$rebuild && $cached = cache_get('schema')) {
+    $schema = $cached->data;
+    return $schema;
+  }
+  
+  // Rebuild the schema cache
+  // Load the .schema files
+  module_load_all_includes('schema');
+
+  // Invoke hook_schema for all modules
+  foreach (module_implements('schema') as $module) {
+    $current = module_invoke($module, 'schema');
+    drupal_process_schema($module, $current);
+    $schema = array_merge($current, $schema);
+  }
+  
+  drupal_alter('schema', $schema);
+  
+  // cache_set() is not available during installation.
+  if (function_exists('cache_set')) {
+    cache_set('schema', $schema);
+  }
+  
+  return $schema;
+}
+
+/**
+ * Create all tables for a module
+ *
+ * This will invoke hook_schema for the module and create all tables.
+ * Note: The schema won't be passed through drupal_alter()!
+ *
+ * @param $module The module for which the tables will be created
+ */
+function drupal_install_schema($module) {
+  // Load the .schema file
+  module_load_include('schema', $module);
+  $schema = module_invoke($module, 'schema');
+  drupal_process_schema($module, $schema);
+  
+  $ret = array();
+  foreach ($schema as $table) {
+    db_create_table($ret, $table);
+  }
+}
+
+/**
+ * Remove all tables that a module defines in its schema file
+ *
+ * This will invoke hook_schema for the module and drop all of its
+ * tables.  Note: The schemas won't be passed through drupal_alter()!
+ *
+ * @param $module The module for which the tables will be removed
+ */
+function drupal_uninstall_schema($module) {
+  // Load the .schema file
+  module_load_include('schema', $module);
+  $schema = module_invoke($module, 'schema');
+  drupal_process_schema($module, $schema);
+  
+  $ret = array();
+  foreach ($schema as $table) {
+    db_drop_table($ret, $table['name']);
+  }
+}
+
+/**
+ * Fill in default values for table definitions.
+ *
+ * @param $module The module whose hook_schema returned $schema.
+ * @param $schema $module's schema.
+ * @returns Nothing.  $schema is modified in place.
+ */
+function drupal_process_schema($module, &$schema) {
+  // Set the name and module key for all tables
+  foreach($schema as $name => $table) {
+    if (empty($table['module'])) {
+      $schema[$name]['module'] = $module;
+    }
+    if (!isset($table['name'])) {
+      $schema[$name]['name'] = $name;
+    }
+  }
+}
+
+/**
  * Parse Drupal info file format.
  *
  * Files should use an ini-like format to specify values.
Index: includes/database.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/database.inc,v
retrieving revision 1.68
diff -u -F^f -r1.68 database.inc
--- includes/database.inc	8 May 2007 16:36:55 -0000	1.68
+++ includes/database.inc	17 May 2007 16:18:06 -0000
@@ -44,6 +44,22 @@
  */
 
 /**
+ * Perform an SQL query and return success or failure.
+ *
+ * @param $sql
+ *   A string containing a complete SQL query.  %-substitution
+ *   parameters are not supported.
+ * @return
+ *   An array containing the keys:
+ *      success: a boolean indicating whether the query succeeded
+ *      query: the SQL query executed, passed through check_plain()
+ */
+function update_sql($sql) {
+  $result = db_query($sql, true);
+  return array('success' => $result !== FALSE, 'query' => check_plain($sql));
+}
+
+/**
  * Append a database prefix to all tables in a query.
  *
  * Queries sent to Drupal should wrap all table names in curly brackets. This
@@ -313,6 +329,46 @@ function db_escape_table($string) {
   return preg_replace('/[^A-Za-z0-9_]+/', '', $string);
 }
 
+/**********************************************************************
+ Database schema API
+**********************************************************************/
+
+/**
+ * Create a new table from a drupal schema definition.  Save result of
+ * SQL commands in $ret array. 
+ *
+ * @param $schema A valid drupal schema definition array
+ * @param $execute If false the SQL query string is returned instead of executed (defaults to true)
+ * @return Nothing.  Updates the $ret array.
+ */
+function db_create_table(&$ret, $table) {
+  $stmts = db_create_table_sql($table);
+  foreach ($stmts as $stmt) {
+    $ret[] = update_sql($stmt);
+  }
+}
+
+/**
+ * Return an array of field names from an array of key/index column
+ * specifiers.  This is usually an identity function but if a
+ * key/index uses a column prefix specification, this function
+ * extracts just the name.
+ *
+ * @param $cols An array of key/index column specifiers
+ * @return An array of field names.
+ */
+function db_field_names($cols) {
+  $ret = array();
+  foreach ($cols as $col) {
+    if (is_array($col)) {
+      $ret[] = $col[0];
+    } else {
+      $ret[] = $col;
+    }
+  }
+  return $ret;
+}
+
 /**
  * @} End of "defgroup database".
  */
Index: includes/database.mysql-common.inc
===================================================================
RCS file: includes/database.mysql-common.inc
diff -N includes/database.mysql-common.inc
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ includes/database.mysql-common.inc	17 May 2007 16:18:06 -0000
@@ -0,0 +1,376 @@
+<?php
+
+/**
+ * Create a new table from a drupal schema definition.
+ *
+ * @param $table A valid drupal table definition array
+ * @param $execute If false the SQL query string is returned instead of executed (defaults to true)
+ * @return An array of SQL statements to create the table.
+ */
+function db_create_table_sql($table) {
+
+  if (empty($table['mysql_suffix'])) {
+    $table['mysql_suffix'] = "/*!40100 DEFAULT CHARACTER SET UTF8 */";
+  }
+
+  $sql = "CREATE TABLE {" . $table['name'] . "} (\n";
+
+  // Add the SQL statement for each field.
+  foreach ($table['fields'] as $name => $field) {
+    $sql .= _db_create_field_sql($name, _db_process_field($field)) . ", \n";
+  }
+
+  // Process keys & indexes.
+  if (!empty($table['primary key']))
+    $sql .= " PRIMARY KEY (" . _db_create_key_sql($table['primary key']) . "), \n";
+
+  if (!empty($table['unique keys'])) {
+    foreach ($table['unique keys'] as $key => $fields)
+      $sql .= " UNIQUE KEY $key (". _db_create_key_sql($fields) . "), \n";
+  }
+
+  if (!empty($table['indexes'])) {
+    foreach ($table['indexes'] as $index => $fields)
+      $sql .= " INDEX $index (" . _db_create_key_sql($fields) . "), \n";
+  }
+
+  $sql = substr($sql, 0, -3) . "\n) ";
+
+  $sql .= $table['mysql_suffix'];
+
+  return array($sql);
+}
+
+function _db_create_key_sql($fields) {
+  $ret = array();
+  foreach ($fields as $field) {
+    if (is_array($field)) {
+      $ret[] = $field[0] .'('. $field[1] .')';
+    } else {
+      $ret[] = $field;
+    }
+  }
+  return implode(', ', $ret);
+}
+
+/**
+ * Set database-engine specific properties for a field.
+ *
+ * @param $field
+ *   A field description array, as specified in the schema documentation.
+ */
+function _db_process_field($field) {
+
+  if (!isset($field['size'])) {
+    $field['size'] = 'normal';
+  }
+
+  // Set the correct database-engine specific datatype.
+  if (!isset($field['mysql_type'])) {
+    $map = db_type_map();
+    $field['mysql_type'] = $map[$field['type'] .":". $field['size']];
+  }
+
+  if ($field['type'] == 'serial') {
+    $field['auto_increment'] = true;
+  }
+
+  return $field;
+}
+
+/**
+ * Create a SQL string for a field to be used in table creation or alteration.
+ *
+ * Before passing a field out of a schema definition into this function it has
+ * to be processed by db_process_field.
+ *
+ * @param $name
+ *    Name of the field
+ * @param $details
+ *    The field properties. At least $details['dbtype'] has to be set by now.
+ *    Aditional properties are 'length', 'unsigned', 'not null', 'auto_increment', 'default'
+ */
+function _db_create_field_sql($name, $spec) {
+  $sql = "`" . $name . "` " . $spec['mysql_type'];
+
+  if (isset($spec['length']) || isset($spec['disp_width'])) {
+    $value = isset($spec['length']) ? $spec['length'] : $spec['disp_width'];
+    $sql .= "($value) ";
+  }
+  elseif (isset($spec['precision']) && isset($spec['scale'])) {
+    $sql .= "(". $spec['scale'] .", ". $spec['precision'] . ")";
+  }
+
+  if (!empty($spec['unsigned'])) {
+    $sql .= " unsigned ";
+  }
+
+  if (!empty($spec['not null'])) {
+    $sql .= " NOT NULL ";
+  }
+
+  if (!empty($spec['auto_increment'])) {
+    $sql .= " auto_increment ";
+  }
+
+  if (isset($spec['default'])) {
+    if (is_string($spec['default'])) {
+      $spec['default'] = "'".$spec['default']."'";
+    }
+    $sql .= " DEFAULT " . $spec['default'] . " ";
+  }
+
+  if (empty($spec['not null']) && !isset($spec['default'])) {
+    $sql .= " DEFAULT NULL ";
+  }
+
+  return substr($sql, 0, -1);
+}
+
+/**
+ * This maps a generic data type in combination with its data size
+ * to the engine-specific data type.
+ */
+function db_type_map() {
+  $map = array(
+    'varchar:normal'  => 'VARCHAR',
+
+    'text:tiny'       => 'SMALLTEXT',
+    'text:small'      => 'SMALLTEXT',
+    'text:medium'     => 'MEDIUMTEXT',
+    'text:big'        => 'LONGTEXT',
+    'text:normal'     => 'TEXT',
+
+    'serial:tiny'     => 'TINYINT',
+    'serial:small'    => 'SMALLINT',
+    'serial:medium'   => 'MEDIUMINT',
+    'serial:big'      => 'BIGINT',
+    'serial:normal'   => 'INT',
+
+    'int:tiny'        => 'TINYINT',
+    'int:small'       => 'SMALLINT',
+    'int:medium'      => 'MEDIUMINT',
+    'int:big'         => 'BIGINT',
+    'int:normal'      => 'INT',
+
+    'float:tiny'      => 'FLOAT',
+    'float:small'     => 'FLOAT',
+    'float:medium'    => 'FLOAT',
+    'float:big'       => 'DOUBLE',
+    'float:normal'    => 'FLOAT',
+
+    'numeric:normal'  => 'NUMERIC',
+
+    'blob:normal'     => 'BLOB',
+    'blob:big'        => 'LONGBLOB',
+
+    'datetime:normal' => 'DATETIME',
+  );
+  return $map;
+}
+
+/**
+* Drop table.
+*
+* @param string $table
+*   The table to be dropped.
+*/
+function db_drop_table(&$ret, $table) {
+  $ret[] = update_sql("DROP TABLE {". $table ."}");
+}
+
+/**
+* Adds a new field to a table.
+*
+* @param $table
+*   Name of the table to be altered.
+* @param $field
+*   Name of the field to be added.
+* @param $info
+*   The field information array, as taken from a schema definition
+*/
+function db_add_field(&$ret, $table, $field, $info) {
+  $query = 'ALTER TABLE {'. $table .'} ADD '. $field .' ';
+  $query .= _db_create_field_sql($field, _db_process_field($info));
+  $ret[] = update_sql($query);
+}
+
+/**
+* Drop field.
+*
+* @param string $table
+*   The table to be altered.
+* @param string $field
+*   The field to be dropped.
+*/
+function db_drop_field(&$ret, $table, $field) {
+  $ret[] = update_sql('ALTER TABLE {'. $table .'} DROP '. $field);
+}
+
+/**
+ * Set default value for $column.
+ *
+ * @param $table
+ * @param $field
+ *   The field to be altered.
+ * @param $default
+ *   Default value to be set.
+ */
+function db_field_set_default(&$ret, $table, $field, $default) {
+  if ($default == NUll) {
+    $default = 'NULL';
+  }
+  else {
+    $default = is_string($default) ? "'$default'" : $default;
+  }
+
+  $ret[] = update_sql("ALTER TABLE {". $table ."} ALTER COLUMN ". $field ." SET DEFAULT ". $default);
+}
+
+/**
+ * Set $column to have no default value.
+ *
+ * @param $table
+ * @param $field
+ *   The field to be altered.
+ */
+function db_field_set_no_default(&$ret, $table, $field) {
+  $ret[] = update_sql("ALTER TABLE {". $table ."} ALTER COLUMN ". $field ." DROP DEFAULT");
+}
+
+/**
+* Add primary key.  Save result of SQL commands in $ret array.
+*
+* @param string $table
+*   The table to be altered.
+* @param array $fields
+*   Columns for the primary key.
+* @return Nothing.  Updates the $ret array.
+*/
+function db_add_primary_key(&$ret, $table, $fields) {
+  $ret[] = update_sql('ALTER TABLE {'. $table .'} ADD PRIMARY KEY ('.
+    _db_create_key_sql($fields) .')');
+}
+
+/**
+ * Drop primary key.  Save result of SQL commands in $ret array.
+ *
+ * @param $table
+ *   The table to be altered.
+ * @return Nothing.  Updates the $ret array.
+ */
+function db_drop_primary_key(&$ret, $table) {
+  $ret[] = update_sql('ALTER TABLE {'. $table .'} DROP PRIMARY KEY');
+}
+
+/**
+ * Add unique key.  Save result of SQL commands in $ret array.
+ *
+ * @param $table
+ *   The table to be altered.
+ * @param $name
+ *   The name of the index.
+ * @param $fields
+ *   An array of field names.
+ * @return Nothing.  Updates the $ret array.
+ */
+function db_add_unique_key(&$ret, $table, $name, $cols) {
+  $ret[] = update_sql('ALTER TABLE {'. $table .'} ADD UNIQUE KEY '.
+    $name .' ('._db_create_key_sql($cols) .')');
+}
+
+/**
+* Drop unique key.  Save result of SQL commands in $ret array.
+ *
+ * @param $table
+ *   The table to be altered.
+ * @param $name
+ *   The name of the index.
+ * @return Nothing.  Updates the $ret array.
+ */
+function db_drop_unique_key(&$ret, $table, $name) {
+  $ret[] = update_sql('ALTER TABLE {'. $table .'} DROP KEY '. $name);
+}
+
+/**
+ * Add index.  Save result of SQL commands in $ret array.
+ *
+ * @param $table
+ *   The table to be altered.
+ * @param $name
+ *   The name of the index.
+ * @param $fields
+ *   An array of field names.
+ * @return Nothing.  Updates the $ret array.
+ */
+function db_add_index(&$ret, $table, $name, $fields) {
+  $query = 'ALTER TABLE {'. $table .'} ADD INDEX '. $name .' (';
+
+  foreach ($fields as $current) {
+    $query .= $current . ', ';
+  }
+
+  $query = substr($query, 0, -2) . ')';
+
+  $ret[] = update_sql($query);
+}
+
+/**
+ * Drop index. Save result of SQL commands in $ret array.
+ *
+ * @param $table
+ *   The table to be altered.
+ * @param $name
+ *   The name of the index.
+* @return Nothing.  Updates the $ret array.
+*/
+function db_drop_index(&$ret, $table, $name) {
+  $ret[] = update_sql('ALTER TABLE {'. $table .'} DROP INDEX '. $name);
+}
+
+/**
+ * Change a column definition.  Save result of SQL commands in $ret array.
+ *
+ * Remember that changing a column definition involves adding a new column
+ * and dropping an old one. This means that any indices, primary keys and
+ * sequences from serial-type columns are dropped and might need to be
+ * recreated.
+ *
+ * @param $ret
+ *   Array to which results will be added.
+ * @param $table
+ *   Name of the table, without {}
+ * @param $field
+ *   Name of the column to change
+ * @param $field_new
+ *   New name for the field (set to the same as $field if you don't want to change the name)
+ * @param $spec
+ *   Column specification for the new field.
+ * @return
+ *   nothing, but modifies $ret parameter.
+ */
+function db_change_field(&$ret, $table, $field, $field_new, $spec) {
+  $ret[] = update_sql("ALTER TABLE {". $table ."} CHANGE $field ".
+    _db_create_field_sql($field_new, _db_process_field($spec)));
+}
+
+/**
+ * Update a column definition to match its schema. If the column is
+ * involved in any keys or indexes, recreate them. Save result of SQL
+ * commands in $ret array.
+ *
+ * @param $ret
+ *   Array to which results will be added.
+ * @param $table
+ *   Name of the table, without {}
+ * @param $field
+ *   Name of the field to update
+ * @return
+ *   nothing, but modifies $ret parameter.
+ */
+function db_update_field(&$ret, $table, $field) {
+  $spec = drupal_get_schema($table);
+  db_change_field($ret, $table, $field, $field, $spec['fields'][$field]);
+}
+
+?>
\ No newline at end of file
Index: includes/database.mysql.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/database.mysql.inc,v
retrieving revision 1.71
diff -u -F^f -r1.71 database.mysql.inc
--- includes/database.mysql.inc	8 May 2007 16:36:55 -0000	1.71
+++ includes/database.mysql.inc	17 May 2007 16:18:06 -0000
@@ -434,8 +434,8 @@ function db_distinct_field($table, $fiel
   return preg_replace('/(SELECT.*)(?:'. $table .'\.|\s)(?<!DISTINCT\()(?<!DISTINCT\('. $table .'\.)'. $field .'(.*FROM )/AUsi', '\1 '. $field_to_select .'\2', $query);
 }
 
+include_once './includes/database.mysql-common.inc';
+
 /**
  * @} End of "ingroup database".
  */
-
-
Index: includes/database.mysqli.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/database.mysqli.inc,v
retrieving revision 1.35
diff -u -F^f -r1.35 database.mysqli.inc
--- includes/database.mysqli.inc	21 Apr 2007 18:08:41 -0000	1.35
+++ includes/database.mysqli.inc	17 May 2007 16:18:07 -0000
@@ -425,6 +425,8 @@ function db_distinct_field($table, $fiel
   return preg_replace('/(SELECT.*)(?:'. $table .'\.|\s)(?<!DISTINCT\()(?<!DISTINCT\('. $table .'\.)'. $field .'(.*FROM )/AUsi', '\1 '. $field_to_select .'\2', $query);
 }
 
+include_once './includes/database.mysql-common.inc';
+
 /**
  * @} End of "ingroup database".
  */
Index: includes/database.pgsql.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/database.pgsql.inc,v
retrieving revision 1.45
diff -u -F^f -r1.45 database.pgsql.inc
--- includes/database.pgsql.inc	21 Apr 2007 18:08:41 -0000	1.45
+++ includes/database.pgsql.inc	17 May 2007 16:18:07 -0000
@@ -432,6 +432,390 @@ function db_distinct_field($table, $fiel
   return $query;
 }
 
+function db_type_map() {
+  // put :normal last so it gets preserved by array_flip
+  $map = array(
+    'varchar:normal' => 'varchar',
+    
+    'text:small' => 'text',
+    'text:medium' => 'text',
+    'text:big' => 'text',
+    'text:normal' => 'text',
+    
+    'int:tiny' => 'smallint',
+    'int:small' => 'smallint',
+    'int:medium' => 'int',
+    'int:big' => 'bigint',
+    'int:normal' => 'int',
+    
+    'float:tiny' => 'real',
+    'float:small' => 'real',
+    'float:medium' => 'real',
+    'float:big' => 'double precision',
+    'float:normal' => 'real',
+    
+    'numeric:normal'  => 'numeric',
+
+    'blob:big' => 'bytea',
+    'blob:normal' => 'bytea',
+
+    'datetime:normal' => 'timestamp',
+
+    'serial:normal' => 'serial',
+    'serial:big' => 'bigserial',
+  );
+  return $map;
+}
+
+/**
+ * Generate SQL to create a new table from a drupal schema definition.
+ *
+ * @param $table A valid drupal table definition array
+ * @return An array of SQL statements to create the table.
+ */
+function db_create_table_sql($table) {
+  $sql_fields = array();
+  foreach ($table['fields'] as $name => $field) {
+    $sql_fields[] = _db_create_field_sql($name, _db_process_field($field));
+  }
+
+  $sql_keys = array();
+  if (isset($table['primary key']) && is_array($table['primary key'])) {
+    $sql_keys[] = 'PRIMARY KEY ('.implode(', ', $table['primary key']).')';
+  }
+  if (isset($table['unique keys']) && is_array($table['unique keys'])) {
+    foreach ($table['unique keys'] as $keyname => $key) {
+      $sql_keys[] = 'CONSTRAINT {'. $table['name'] .'}_'. $keyname .'_key UNIQUE ('.implode(', ', $key).')';
+    }
+  }
+
+  $sql = "CREATE TABLE {".$table['name']."} (\n\t";
+  $sql .= implode(",\n\t", $sql_fields);
+  if (count($sql_keys) > 0) {
+    $sql .= ",\n\t";
+  }
+  $sql .= implode(",\n\t", $sql_keys);
+  $sql .= "\n)";
+  $statements[] = $sql;
+
+  if (isset($table['indexes']) && is_array($table['indexes'])) {
+    foreach ($table['indexes'] as $keyname => $key) {
+      $statements[] = _db_create_index_sql($table['name'], $keyname, $key);
+    }
+  }
+
+  return $statements;
+}
+
+function _db_create_index_sql($table, $name, $fields) {
+  $query = 'CREATE INDEX {'. $table .'}_'. $name .'_idx ON {'. $table .'} (';
+  $query .= _db_create_key_sql($fields) .')';
+  return $query;
+}
+
+function _db_create_key_sql($fields) {
+  $ret = array();
+  foreach ($fields as $field) {
+    if (is_array($field)) {
+      $ret[] = 'substr('. $field[0] .', 1, '. $field[1] .')';
+    } else {
+      $ret[] = $field;
+    }
+  }
+  return implode(', ', $ret);
+}
+
+/**
+ * Set database-engine specific properties for a field.
+ *
+ * @param $field
+ *   A field description array, as specified in the schema documentation.
+ */
+function _db_process_field($field) {
+  if (!isset($field['size'])) {
+    $field['size'] = 'normal';
+  }
+  // Set the correct database-engine specific datatype.
+  if (!isset($field['pgsql_type'])) {
+    $map = db_type_map();
+    $field['pgsql_type'] = $map[$field['type'] .":". $field['size']];
+  }
+  if ($field['type'] == 'serial') {
+    unset($field['not null']);
+  }
+  return $field;
+}
+
+/**
+ * Create a SQL string for a field to be used in table creation or alteration.
+ *
+ * @param $name
+ *    Name of the field
+ * @param $spec
+ *    The field specification, as per the schema data structure format, that has also been processed by _db_process_field().
+ * @return SQL for creating the column.
+ */
+function _db_create_field_sql($name, $spec) {
+  $sql = $name .' '. $spec['pgsql_type'];
+  
+  if ($spec['type'] == 'serial') {
+    unset($spec['not null']);
+  }
+  if (!empty($spec['unsigned'])) {
+    if ($spec['type'] == 'serial') {
+      $sql .= " CHECK ($name >= 0)";
+    } else {
+      $sql .= '_unsigned';
+    }
+  }
+
+  if (!empty($spec['length'])) {
+    $sql .= '('.$spec['length'].')';
+  }
+  elseif (isset($spec['precision']) && isset($spec['scale'])) {
+    $sql .= '('. $spec['scale'] .', '. $spec['precision'] . ')';
+  }
+  
+  if (isset($spec['not null']) && $spec['not null']) {
+   $sql .= ' NOT NULL';
+  }
+  if (isset($spec['default'])) {
+    $default = is_string($spec['default']) ? "'". $spec['default'] ."'" : $spec['default'];
+    $sql .= " default $default";
+  }
+
+  return $sql;
+}
+
+/**
+* Drop table.  Save result of SQL commands in $ret array.
+*
+* @param string $table
+*   The table to be dropped.
+* @return Nothing.  Updates the $ret array.
+*/
+function db_drop_table(&$ret, $table) {
+  $ret[] = update_sql("DROP TABLE {". $table ."}");
+}
+
+/**
+* Adds a new field to a table.  Save result of SQL commands in $ret array.
+*
+* @param $table
+*   Name of the table to be altered.
+* @param $field
+*   Name of the field to be added.
+* @param $spec
+*   The field information array, as taken from a schema definition
+* @return Nothing.  Updates the $ret array.
+*/
+function db_add_field(&$ret, $table, $field, $spec) {
+  $query = 'ALTER TABLE {'. $table .'} ADD COLUMN ';
+  $query .= _db_create_field_sql($field, _db_process_field($spec));
+  $ret[] = update_sql($query);
+}
+
+/**
+* Drop field.  Save result of SQL commands in $ret array.
+*
+* @param $table
+*   The table to be altered.
+* @param $field
+*   The field to be dropped.
+* @return Nothing.  Updates the $ret array.
+*/
+function db_drop_field(&$ret, $table, $field) {
+  $ret[] = update_sql('ALTER TABLE {'. $table .'} DROP COLUMN '. $field);
+}
+
+/**
+* Add primary key.  Save result of SQL commands in $ret array.
+*
+* @param $table
+*   The table to be altered.
+* @param $fields
+*   Fields for the primary key.
+* @return Nothing.  Updates the $ret array.
+*/
+function db_add_primary_key(&$ret, $table, $fields) {
+  $ret[] = update_sql('ALTER TABLE {'. $table .'} ADD PRIMARY KEY ('.
+    implode(',', $fields) .')');
+}
+
+/**
+ * Drop primary key.  Save result of SQL commands in $ret array.
+ *
+ * @param $table
+ *   The table to be altered.
+ * @return Nothing.  Updates the $ret array.
+ */
+function db_drop_primary_key(&$ret, $table) {
+  $ret[] = update_sql('ALTER TABLE {'. $table .'} DROP CONSTRAINT {'. $table .'}_pkey');
+}
+
+/**
+ * Add unique key.  Save result of SQL commands in $ret array.
+ *
+ * @param $table
+ *   The table to be altered.
+ * @param $name
+ *   The name of the index.
+ * @param $fields
+ *   An array of field names.
+ * @return Nothing.  Updates the $ret array.
+ */
+function db_add_unique_key(&$ret, $table, $name, $fields) {
+  $name = '{'. $table .'}_'. $name .'_key';
+  $ret[] = update_sql('ALTER TABLE {'. $table .'} ADD CONSTRAINT '.
+    $name .' UNIQUE ('.implode(',', $fields) .')');
+}
+
+/**
+ * Drop unique key.  Save result of SQL commands in $ret array.
+ *
+ * @param $table
+ *   The table to be altered.
+ * @param $name
+ *   The name of the index.
+ * @return Nothing.  Updates the $ret array.
+ */
+function db_drop_unique_key(&$ret, $table, $name) {
+  $name = '{'. $table .'}_'. $name .'_key';
+  $ret[] = update_sql('ALTER TABLE {'. $table .'} DROP CONSTRAINT '. $name);
+}
+
+/**
+ * Create index.  Save result of SQL commands in $ret array.
+ *
+ * @param $table
+ *   The table to be altered.
+ * @param $name
+ *   The name of the index.
+ * @param $fields
+ *   An array of field names.
+ * @return Nothing.  Updates the $ret array.
+ */
+function db_add_index(&$ret, $table, $name, $fields) {
+  $ret[] = update_sql(_db_create_index_sql($table, $name, $fields));
+}
+
+/**
+ * Drop index.  Save result of SQL commands in $ret array.
+ *
+ * @param $table
+ *   The table to be altered.
+ * @param $name
+ *   The name of the index.
+* @return Nothing.  Updates the $ret array.
+*/
+function db_drop_index(&$ret, $table, $name) {
+  $name = '{'. $table .'}_'. $name .'_idx';
+  $ret[] = update_sql('DROP INDEX '. $name);
+}
+
+/**
+ * Set default value for $column.
+ *
+ * @param $table
+ * @param $field
+ *   The field to be altered.
+ * @param $default
+ *   Default value to be set.
+ */
+function db_field_set_default(&$ret, $table, $field, $default) {
+  if ($default == NULL) {
+    $default = 'NULL';
+  }
+  else {
+    $default = is_string($default) ? "'$default'" : $default;
+  }
+
+  $ret[] = update_sql("ALTER TABLE {". $table ."} ALTER COLUMN ". $field ." SET DEFAULT ". $default);
+}
+
+/**
+ * Set $column to have no default value.
+ *
+ * @param $table
+ * @param $field
+ *   The field to be altered.
+ */
+function db_field_set_no_default(&$ret, $table, $field) {
+  $ret[] = update_sql("ALTER TABLE {". $table ."} ALTER COLUMN ". $field ." DROP DEFAULT");
+}
+
+/**
+ * Change a field definition.  Save result of SQL commands in $ret array.
+ *
+ * Remember that changing a field definition involves adding a new field
+ * and dropping an old one. This means that any indices, primary keys and
+ * sequences from serial-type columns are dropped and might need to be
+ * recreated.
+ *
+ * @param $ret
+ *   Array to which results will be added.
+ * @param $table
+ *   Name of the table, without {}
+ * @param $field
+ *   Name of the column to change
+ * @param $field_new
+ *   New name for the field (set to the same as $field if you don't want to change the name)
+ * @param $spec
+ *   Column specification for the new field.
+ * @return
+ *   Nothing, but modifies $ret parameter.
+ */
+function db_change_field(&$ret, $table, $field, $field_new, $spec) {
+  $ret[] = update_sql("ALTER TABLE {". $table ."} RENAME $field TO ". $field ."_old");
+  $not_null = isset($spec['not null']) ? $spec['not null'] : FALSE;
+  unset($spec['not null']);
+  db_add_field($ret, $table, "$field_new", $spec);
+  $ret[] = update_sql("UPDATE {". $table ."} SET $field_new = ". $field ."_old");
+  if ($not_null) {
+    $ret[] = update_sql("ALTER TABLE {". $table ."} ALTER $field_new SET NOT NULL");  
+  }
+  db_drop_field($ret, $table, $field ."_old");
+}
+
+/**
+ * Update a field definition to match its schema.  If the field is
+ * involved in any keys or indexes, recreate them.  Save result of SQL
+ * commands in $ret array.
+ *
+ * @param $ret
+ *   Array to which results will be added.
+ * @param $table
+ *   Name of the table, without {}
+ * @param $field
+ *   Name of the field to update
+ * @return
+ *   Nothing, but modifies $ret parameter.
+ */
+function db_update_field(&$ret, $table, $field) {
+  $spec = drupal_get_schema($table);
+
+  db_change_field($ret, $table, $field, $field, $spec['fields'][$field]);
+  if (isset($spec['primary key'])) {
+    if (array_search($field, db_field_names($spec['primary key'])) !== FALSE) {
+      db_add_primary_key($ret, $table, $spec['primary key']);
+    }
+  }
+  if (isset($spec['unique keys'])) {
+    foreach ($spec['unique keys'] as $name => $fields) {
+      if (array_search($field, db_field_names($fields)) !== FALSE) {
+        db_add_unique_key($ret, $table, $fields);
+      }
+    }
+  }
+  if (isset($spec['indexes'])) {
+    foreach ($spec['indexes'] as $name => $fields) {
+      if (array_search($field, db_field_names($fields)) !== FALSE) {
+        db_add_index($ret, $table, $fields);
+      }
+    }
+  }
+}
+
 /**
  * @} End of "ingroup database".
  */
Index: includes/module.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/module.inc,v
retrieving revision 1.101
diff -u -F^f -r1.101 module.inc
--- includes/module.inc	7 May 2007 11:59:40 -0000	1.101
+++ includes/module.inc	17 May 2007 16:18:07 -0000
@@ -188,10 +188,36 @@ function module_exists($module) {
 function module_load_install($module) {
   // Make sure the installation API is available
   include_once './includes/install.inc';
+  
+  module_load_include('install', $module);
+}
+
+/**
+ * Load a module include file
+ */
+function module_load_include($type, $module, $name = NULL) {
+  if (empty($name)) {
+    $name = $module;
+  }
+  
+  $file = './'. drupal_get_path('module', $module) ."/$name.$type";
+  
+  if (is_file($file)) {
+    include_once $file;
+  }
+  else {
+    return FALSE;
+  }
+}
 
-  $install_file = './'. drupal_get_path('module', $module) .'/'. $module .'.install';
-  if (is_file($install_file)) {
-    include_once $install_file;
+/**
+ * Load an include file for each of the modules that have been enabled in
+ * the system table.
+ */
+function module_load_all_includes($type, $name = NULL) {
+  $modules = module_list(TRUE, FALSE);
+  foreach ($modules as $module) {
+    module_load_include($type, $module, $name);
   }
 }
 
Index: modules/aggregator/aggregator.install
===================================================================
RCS file: /cvs/drupal/drupal/modules/aggregator/aggregator.install,v
retrieving revision 1.8
diff -u -F^f -r1.8 aggregator.install
--- modules/aggregator/aggregator.install	26 Sep 2006 14:19:00 -0000	1.8
+++ modules/aggregator/aggregator.install	17 May 2007 16:18:07 -0000
@@ -5,126 +5,17 @@
  * Implementation of hook_install().
  */
 function aggregator_install() {
-  switch ($GLOBALS['db_type']) {
-    case 'mysql':
-    case 'mysqli':
-      db_query("CREATE TABLE {aggregator_category} (
-        cid int NOT NULL auto_increment,
-        title varchar(255) NOT NULL default '',
-        description longtext NOT NULL,
-        block tinyint NOT NULL default '0',
-        PRIMARY KEY (cid),
-        UNIQUE KEY title (title)
-      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");
-
-      db_query("CREATE TABLE {aggregator_category_feed} (
-        fid int NOT NULL default '0',
-        cid int NOT NULL default '0',
-        PRIMARY KEY (fid,cid)
-      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");
-
-      db_query("CREATE TABLE {aggregator_category_item} (
-        iid int NOT NULL default '0',
-        cid int NOT NULL default '0',
-        PRIMARY KEY (iid,cid)
-      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");
-
-      db_query("CREATE TABLE {aggregator_feed} (
-        fid int NOT NULL auto_increment,
-        title varchar(255) NOT NULL default '',
-        url varchar(255) NOT NULL default '',
-        refresh int NOT NULL default '0',
-        checked int NOT NULL default '0',
-        link varchar(255) NOT NULL default '',
-        description longtext NOT NULL,
-        image longtext NOT NULL,
-        etag varchar(255) NOT NULL default '',
-        modified int NOT NULL default '0',
-        block tinyint NOT NULL default '0',
-        PRIMARY KEY (fid),
-        UNIQUE KEY link (url),
-        UNIQUE KEY title (title)
-      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");
-
-      db_query("CREATE TABLE {aggregator_item} (
-        iid int NOT NULL auto_increment,
-        fid int NOT NULL default '0',
-        title varchar(255) NOT NULL default '',
-        link varchar(255) NOT NULL default '',
-        author varchar(255) NOT NULL default '',
-        description longtext NOT NULL,
-        timestamp int default NULL,
-        guid varchar(255),
-        PRIMARY KEY (iid),
-        KEY fid (fid)
-      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");
-
-      break;
-    case 'pgsql':
-      db_query("CREATE TABLE {aggregator_category} (
-        cid serial,
-        title varchar(255) NOT NULL default '',
-        description text NOT NULL,
-        block smallint NOT NULL default '0',
-        PRIMARY KEY (cid),
-        UNIQUE (title)
-      )");
-
-      db_query("CREATE TABLE {aggregator_category_feed} (
-        fid int NOT NULL default '0',
-        cid int NOT NULL default '0',
-        PRIMARY KEY (fid,cid)
-      )");
-
-      db_query("CREATE TABLE {aggregator_category_item} (
-        iid int NOT NULL default '0',
-        cid int NOT NULL default '0',
-        PRIMARY KEY (iid,cid)
-      )");
-
-      db_query("CREATE TABLE {aggregator_feed} (
-        fid serial,
-        title varchar(255) NOT NULL default '',
-        url varchar(255) NOT NULL default '',
-        refresh int NOT NULL default '0',
-        checked int NOT NULL default '0',
-        link varchar(255) NOT NULL default '',
-        description text NOT NULL default '',
-        image text NOT NULL default '',
-        etag varchar(255) NOT NULL default '',
-        modified int NOT NULL default '0',
-        block smallint NOT NULL default '0',
-        PRIMARY KEY (fid),
-        UNIQUE (url),
-        UNIQUE (title)
-      )");
-
-      db_query("CREATE TABLE {aggregator_item} (
-        iid serial,
-        fid int NOT NULL default '0',
-        title varchar(255) NOT NULL default '',
-        link varchar(255) NOT NULL default '',
-        author varchar(255) NOT NULL default '',
-        description text NOT NULL,
-        timestamp int default NULL,
-        guid varchar(255),
-        PRIMARY KEY (iid)
-      )");
-      db_query("CREATE INDEX {aggregator_item}_fid_idx ON {aggregator_item} (fid)");
-
-      break;
-  }
+  // Create tables.
+  drupal_install_schema('aggregator');
 }
 
 /**
  * Implementation of hook_uninstall().
  */
 function aggregator_uninstall() {
-  db_query('DROP TABLE {aggregator_category}');
-  db_query('DROP TABLE {aggregator_category_feed}');
-  db_query('DROP TABLE {aggregator_category_item}');
-  db_query('DROP TABLE {aggregator_feed}');
-  db_query('DROP TABLE {aggregator_item}');
+  // Remove tables
+  drupal_uninstall_schema('aggregator');
+  
   variable_del('aggregator_allowed_html_tags');
   variable_del('aggregator_summary_items');
   variable_del('aggregator_clear');
Index: modules/aggregator/aggregator.schema
===================================================================
RCS file: modules/aggregator/aggregator.schema
diff -N modules/aggregator/aggregator.schema
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ modules/aggregator/aggregator.schema	17 May 2007 16:18:07 -0000
@@ -0,0 +1,70 @@
+<?php
+// $Id: $
+
+function aggregator_schema() {
+  $schema['aggregator_category'] = array(
+    'fields' => array(
+      'cid'         => array('type' => 'serial', 'not null' => TRUE),
+      'title'       => array('type' => 'varchar', 'length' => 255, 'not null' => TRUE, 'default' => ''),
+      'description' => array('type' => 'text', 'not null' => TRUE, 'size' => 'big'),
+      'block'       => array('type' => 'int', 'disp_width' => 4, 'not null' => TRUE, 'default' => 0, 'size' => 'tiny')
+    ),
+    'primary key' => array('cid'),
+    'unique keys' => array('title' => array('title')),
+  );
+
+  $schema['aggregator_category_feed'] = array(
+    'fields' => array(
+      'fid' => array('type' => 'int', 'not null' => TRUE, 'default' => 0),
+      'cid' => array('type' => 'int', 'not null' => TRUE, 'default' => 0)
+    ),
+    'primary key' => array('fid', 'cid'),
+  );
+
+  $schema['aggregator_category_item'] = array(
+    'fields' => array(
+      'iid' => array('type' => 'int', 'not null' => TRUE, 'default' => 0),
+      'cid' => array('type' => 'int', 'not null' => TRUE, 'default' => 0)
+    ),
+    'primary key' => array('iid', 'cid'),
+  );
+
+  $schema['aggregator_feed'] = array(
+    'fields' => array(
+      'fid'         => array('type' => 'serial', 'not null' => TRUE),
+      'title'       => array('type' => 'varchar', 'length' => 255, 'not null' => TRUE, 'default' => ''),
+      'url'         => array('type' => 'varchar', 'length' => 255, 'not null' => TRUE, 'default' => ''),
+      'refresh'     => array('type' => 'int', 'not null' => TRUE, 'default' => 0),
+      'checked'     => array('type' => 'int', 'not null' => TRUE, 'default' => 0),
+      'link'        => array('type' => 'varchar', 'length' => 255, 'not null' => TRUE, 'default' => ''),
+      'description' => array('type' => 'text', 'not null' => TRUE, 'size' => 'big'),
+      'image'       => array('type' => 'text', 'not null' => TRUE, 'size' => 'big'),
+      'etag'        => array('type' => 'varchar', 'length' => 255, 'not null' => TRUE, 'default' => ''),
+      'modified'    => array('type' => 'int', 'not null' => TRUE, 'default' => 0),
+      'block'       => array('type' => 'int', 'disp_width' => 4, 'not null' => TRUE, 'default' => 0, 'size' => 'tiny')
+    ),
+    'unique keys' => array(
+      'url'  => array('url'),
+      'title' => array('title')
+    ),
+    'primary key' => array('fid'),
+  );
+
+  $schema['aggregator_item'] = array(
+    'fields' => array(
+      'iid'         => array('type' => 'serial', 'not null' => TRUE),
+      'fid'         => array('type' => 'int', 'not null' => TRUE, 'default' => 0),
+      'title'       => array('type' => 'varchar', 'length' => 255, 'not null' => TRUE, 'default' => ''),
+      'link'        => array('type' => 'varchar', 'length' => 255, 'not null' => TRUE, 'default' => ''),
+      'author'      => array('type' => 'varchar', 'length' => 255, 'not null' => TRUE, 'default' => ''),
+      'description' => array('type' => 'text', 'not null' => TRUE, 'size' => 'big'),
+      'timestamp'   => array('type' => 'int', 'not null' => FALSE),
+      'guid'        => array('type' => 'varchar', 'length' => 255, 'not null' => FALSE)
+    ),
+    'indexes' => array('fid' => array('fid')),
+    'primary key' => array('iid'),
+  );
+
+  return $schema;
+}
+
Index: modules/book/book.install
===================================================================
RCS file: /cvs/drupal/drupal/modules/book/book.install,v
retrieving revision 1.6
diff -u -F^f -r1.6 book.install
--- modules/book/book.install	1 Sep 2006 07:40:08 -0000	1.6
+++ modules/book/book.install	17 May 2007 16:18:07 -0000
@@ -5,36 +5,14 @@
  * Implementation of hook_install().
  */
 function book_install() {
-  switch ($GLOBALS['db_type']) {
-    case 'mysql':
-    case 'mysqli':
-      db_query("CREATE TABLE {book} (
-        vid int unsigned NOT NULL default '0',
-        nid int unsigned NOT NULL default '0',
-        parent int NOT NULL default '0',
-        weight tinyint NOT NULL default '0',
-        PRIMARY KEY (vid),
-        KEY nid (nid),
-        KEY parent (parent)
-      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");
-      break;
-    case 'pgsql':
-      db_query("CREATE TABLE {book} (
-        vid int_unsigned NOT NULL default '0',
-        nid int_unsigned NOT NULL default '0',
-        parent int NOT NULL default '0',
-        weight smallint NOT NULL default '0',
-        PRIMARY KEY (vid)
-      )");
-      db_query("CREATE INDEX {book}_nid_idx ON {book} (nid)");
-      db_query("CREATE INDEX {book}_parent_idx ON {book} (parent)");
-      break;
-  }
+  // Create tables.
+  drupal_install_schema('book');
 }
 
 /**
  * Implementation of hook_uninstall().
  */
 function book_uninstall() {
-  db_query('DROP TABLE {book}');
+  // Remove tables
+  drupal_uninstall_schema('book');
 }
Index: modules/book/book.schema
===================================================================
RCS file: modules/book/book.schema
diff -N modules/book/book.schema
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ modules/book/book.schema	17 May 2007 16:18:07 -0000
@@ -0,0 +1,21 @@
+<?php
+// $Id: $
+
+function book_schema() {
+  $schema['book'] = array(
+    'fields' => array(
+      'vid'    => array('type' => 'int', 'disp_width' => 10, 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0),
+      'nid'    => array('type' => 'int', 'disp_width' => 10, 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0),
+      'parent' => array('type' => 'int', 'not null' => TRUE, 'default' => 0),
+      'weight' => array('type' => 'int', 'disp_width' => 4, 'not null' => TRUE, 'default' => 0, 'size' => 'tiny')
+    ),
+    'indexes' => array(
+      'nid'    => array('nid'),
+      'parent' => array('parent')
+    ),
+    'primary key' => array('vid'),
+  );
+
+  return $schema;
+}
+
Index: modules/comment/comment.schema
===================================================================
RCS file: modules/comment/comment.schema
diff -N modules/comment/comment.schema
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ modules/comment/comment.schema	17 May 2007 16:18:07 -0000
@@ -0,0 +1,45 @@
+<?php
+// $Id: $
+
+function comment_schema() {
+  $schema['comments'] = array(
+    'fields' => array(
+      'cid'       => array('type' => 'serial', 'not null' => TRUE),
+      'pid'       => array('type' => 'int', 'not null' => TRUE, 'default' => 0),
+      'nid'       => array('type' => 'int', 'not null' => TRUE, 'default' => 0),
+      'uid'       => array('type' => 'int', 'not null' => TRUE, 'default' => 0),
+      'subject'   => array('type' => 'varchar', 'length' => 64, 'not null' => TRUE, 'default' => ''),
+      'comment'   => array('type' => 'text', 'not null' => TRUE, 'size' => 'big'),
+      'hostname'  => array('type' => 'varchar', 'length' => 128, 'not null' => TRUE, 'default' => ''),
+      'timestamp' => array('type' => 'int', 'not null' => TRUE, 'default' => 0),
+      'score'     => array('type' => 'int', 'disp_width' => 9, 'not null' => TRUE, 'default' => 0, 'size' => 'medium'),
+      'status'    => array('type' => 'int', 'disp_width' => 3, 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0, 'size' => 'tiny'),
+      'format'    => array('type' => 'int', 'size' => 'small', 'not null' => TRUE, 'default' => 0),
+      'thread'    => array('type' => 'varchar', 'length' => 255, 'not null' => TRUE),
+      'users'     => array('type' => 'text', 'not null' => FALSE, 'size' => 'big'),
+      'name'      => array('type' => 'varchar', 'length' => 60, 'not null' => FALSE),
+      'mail'      => array('type' => 'varchar', 'length' => 64, 'not null' => FALSE),
+      'homepage'  => array('type' => 'varchar', 'length' => 255, 'not null' => FALSE)
+    ),
+    'indexes' => array(
+      'nid'    => array('nid'),
+      'status' => array('status')
+    ),
+    'primary key' => array('cid'),
+  );
+
+  $schema['node_comment_statistics'] = array(
+    'fields' => array(
+      'nid'                    => array('type' => 'serial', 'disp_width' => 10, 'unsigned' => TRUE, 'not null' => TRUE),
+      'last_comment_timestamp' => array('type' => 'int', 'not null' => TRUE, 'default' => 0),
+      'last_comment_name'      => array('type' => 'varchar', 'length' => 60, 'not null' => FALSE),
+      'last_comment_uid'       => array('type' => 'int', 'not null' => TRUE, 'default' => 0),
+      'comment_count'          => array('type' => 'int', 'disp_width' => 10, 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0)
+    ),
+    'indexes' => array('node_comment_timestamp' => array('last_comment_timestamp')),
+    'primary key' => array('nid'),
+  );
+
+  return $schema;
+}
+
Index: modules/contact/contact.install
===================================================================
RCS file: /cvs/drupal/drupal/modules/contact/contact.install,v
retrieving revision 1.6
diff -u -F^f -r1.6 contact.install
--- modules/contact/contact.install	2 Jan 2007 05:30:29 -0000	1.6
+++ modules/contact/contact.install	17 May 2007 16:18:07 -0000
@@ -5,40 +5,17 @@
  * Implementation of hook_install().
  */
 function contact_install() {
-  switch ($GLOBALS['db_type']) {
-    case 'mysql':
-    case 'mysqli':
-      db_query("CREATE TABLE {contact} (
-        cid int unsigned NOT NULL auto_increment,
-        category varchar(255) NOT NULL default '',
-        recipients longtext NOT NULL,
-        reply longtext NOT NULL,
-        weight tinyint NOT NULL default '0',
-        selected tinyint NOT NULL default '0',
-        PRIMARY KEY (cid),
-        UNIQUE KEY category (category)
-      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");
-      break;
-    case 'pgsql':
-      db_query("CREATE TABLE {contact} (
-        cid serial CHECK (cid >= 0),
-        category varchar(255) NOT NULL default '',
-        recipients text NOT NULL default '',
-        reply text NOT NULL default '',
-        weight smallint NOT NULL default '0',
-        selected smallint NOT NULL default '0',
-        PRIMARY KEY (cid),
-        UNIQUE (category)
-      )");
-      break;
-  }
+  // Create tables.
+  drupal_install_schema('contact');
 }
 
 /**
  * Implementation of hook_uninstall().
  */
 function contact_uninstall() {
-  db_query('DROP TABLE {contact}');
+  // Remove tables
+  drupal_uninstall_schema('contact');
+  
   variable_del('contact_default_status');
   variable_del('contact_form_information');
   variable_del('contact_hourly_threshold');
Index: modules/contact/contact.schema
===================================================================
RCS file: modules/contact/contact.schema
diff -N modules/contact/contact.schema
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ modules/contact/contact.schema	17 May 2007 16:18:07 -0000
@@ -0,0 +1,20 @@
+<?php
+// $Id: $
+
+function contact_schema() {
+  $schema['contact'] = array(
+    'fields' => array(
+      'cid'        => array('type' => 'serial', 'disp_width' => 10, 'unsigned' => TRUE, 'not null' => TRUE),
+      'category'   => array('type' => 'varchar', 'length' => 255, 'not null' => TRUE, 'default' => ''),
+      'recipients' => array('type' => 'text', 'not null' => TRUE, 'size' => 'big'),
+      'reply'      => array('type' => 'text', 'not null' => TRUE, 'size' => 'big'),
+      'weight'     => array('type' => 'int', 'disp_width' => 4, 'not null' => TRUE, 'default' => 0, 'size' => 'tiny'),
+      'selected'   => array('type' => 'int', 'disp_width' => 4, 'not null' => TRUE, 'default' => 0, 'size' => 'tiny')
+    ),
+    'unique keys' => array('category' => array('category')),
+    'primary key' => array('cid'),
+  );
+
+  return $schema;
+}
+
Index: modules/dblog/dblog.install
===================================================================
RCS file: /cvs/drupal/drupal/modules/dblog/dblog.install,v
retrieving revision 1.2
diff -u -F^f -r1.2 dblog.install
--- modules/dblog/dblog.install	24 Apr 2007 13:53:11 -0000	1.2
+++ modules/dblog/dblog.install	17 May 2007 16:18:07 -0000
@@ -5,51 +5,14 @@
  * Implementation of hook_install().
  */
 function dblog_install() {
-  switch ($GLOBALS['db_type']) {
-    case 'mysql':
-    case 'mysqli':
-      db_query("CREATE TABLE {watchdog} (
-        wid int NOT NULL auto_increment,
-        uid int NOT NULL default '0',
-        type varchar(16) NOT NULL default '',
-        message longtext NOT NULL,
-        variables longtext NOT NULL,
-        severity tinyint unsigned NOT NULL default '0',
-        link varchar(255) NOT NULL default '',
-        location text NOT NULL,
-        referer varchar(128) NOT NULL default '',
-        hostname varchar(128) NOT NULL default '',
-        timestamp int NOT NULL default '0',
-        PRIMARY KEY (wid),
-        KEY (type)
-      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");
-      break;
-
-    case 'pgsql':
-      db_query("CREATE TABLE {watchdog} (
-        wid serial,
-        uid int NOT NULL default '0',
-        type varchar(16) NOT NULL default '',
-        message text NOT NULL,
-        variables text NOT NULL,
-        severity smallint_unsigned NOT NULL default '0',
-        link varchar(255) NOT NULL default '',
-        location text NOT NULL default '',
-        referer varchar(128) NOT NULL default '',
-        hostname varchar(128) NOT NULL default '',
-        timestamp int NOT NULL default '0',
-        PRIMARY KEY (wid)
-      )");
-      db_query("CREATE INDEX {watchdog}_type_idx ON {watchdog} (type)");
-
-
-      break;
-  }
+  // Create tables.
+  drupal_install_schema('dblog');
 }
 
 /**
  * Implementation of hook_uninstall().
  */
 function dblog_uninstall() {
-  db_query('DROP TABLE {watchdog}');
+  // Remove tables
+  drupal_uninstall_schema('dblog');
 }
Index: modules/dblog/dblog.schema
===================================================================
RCS file: modules/dblog/dblog.schema
diff -N modules/dblog/dblog.schema
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ modules/dblog/dblog.schema	17 May 2007 16:18:07 -0000
@@ -0,0 +1,25 @@
+<?php
+// $Id: $
+
+function dblog_schema() {
+  $schema['watchdog'] = array(
+    'fields' => array(
+      'wid'       => array('type' => 'serial', 'not null' => TRUE),
+      'uid'       => array('type' => 'int', 'not null' => TRUE, 'default' => 0),
+      'type'      => array('type' => 'varchar', 'length' => 16, 'not null' => TRUE, 'default' => ''),
+      'message'   => array('type' => 'text', 'not null' => TRUE, 'size' => 'big'),
+      'variables' => array('type' => 'text', 'not null' => TRUE, 'size' => 'big'),
+      'severity'  => array('type' => 'int', 'disp_width' => 3, 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0, 'size' => 'tiny'),
+      'link'      => array('type' => 'varchar', 'length' => 255, 'not null' => TRUE, 'default' => ''),
+      'location'  => array('type' => 'text', 'not null' => TRUE),
+      'referer'   => array('type' => 'varchar', 'length' => 128, 'not null' => TRUE, 'default' => ''),
+      'hostname'  => array('type' => 'varchar', 'length' => 128, 'not null' => TRUE, 'default' => ''),
+      'timestamp' => array('type' => 'int', 'not null' => TRUE, 'default' => 0)
+    ),
+    'primary key' => array('wid'),
+    'indexes' => array('type' => array('type')),
+  );
+
+  return $schema;
+}
+
Index: modules/drupal/drupal.install
===================================================================
RCS file: /cvs/drupal/drupal/modules/drupal/drupal.install,v
retrieving revision 1.5
diff -u -F^f -r1.5 drupal.install
--- modules/drupal/drupal.install	1 Sep 2006 07:40:08 -0000	1.5
+++ modules/drupal/drupal.install	17 May 2007 16:18:07 -0000
@@ -5,63 +5,17 @@
  * Implementation of hook_install().
  */
 function drupal_install() {
-  switch ($GLOBALS['db_type']) {
-    case 'mysql':
-    case 'mysqli':
-      db_query("CREATE TABLE {client} (
-        cid int unsigned NOT NULL auto_increment,
-        link varchar(255) NOT NULL default '',
-        name varchar(128) NOT NULL default '',
-        mail varchar(128) NOT NULL default '',
-        slogan longtext NOT NULL,
-        mission longtext NOT NULL,
-        users int NOT NULL default '0',
-        nodes int NOT NULL default '0',
-        version varchar(35) NOT NULL default'',
-        created int NOT NULL default '0',
-        changed int NOT NULL default '0',
-        PRIMARY KEY (cid)
-      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");
-
-      db_query("CREATE TABLE {client_system} (
-        cid int NOT NULL default '0',
-        name varchar(255) NOT NULL default '',
-        type varchar(255) NOT NULL default '',
-        PRIMARY KEY (cid,name)
-      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");
-      break;
-    case 'pgsql':
-      db_query("CREATE TABLE {client} (
-        cid serial CHECK (cid >= 0),
-        link varchar(255) NOT NULL default '',
-        name varchar(128) NOT NULL default '',
-        mail varchar(128) NOT NULL default '',
-        slogan text NOT NULL,
-        mission text NOT NULL,
-        users int NOT NULL default '0',
-        nodes int NOT NULL default '0',
-        version varchar(35) NOT NULL default'',
-        created int NOT NULL default '0',
-        changed int NOT NULL default '0',
-        PRIMARY KEY (cid)
-      )");
-
-      db_query("CREATE TABLE {client_system} (
-        cid int NOT NULL default '0',
-        name varchar(255) NOT NULL default '',
-        type varchar(255) NOT NULL default '',
-        PRIMARY KEY (cid,name)
-      )");
-      break;
-  }
+  // Create tables.
+  drupal_install_schema('drupal');
 }
 
 /**
  * Implementation of hook_uninstall().
  */
 function drupal_uninstall() {
-  db_query('DROP TABLE {client}');
-  db_query('DROP TABLE {client_system}');
+  // Remove tables
+  drupal_uninstall_schema('drupal');
+  
   variable_del('drupal_authentication_service');
   variable_del('drupal_directory');
   variable_del('drupal_register');
Index: modules/drupal/drupal.schema
===================================================================
RCS file: modules/drupal/drupal.schema
diff -N modules/drupal/drupal.schema
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ modules/drupal/drupal.schema	17 May 2007 16:18:07 -0000
@@ -0,0 +1,33 @@
+<?php
+// $Id: $
+
+function drupal_schema() {
+  $schema['client'] = array(
+    'fields' => array(
+      'cid'     => array('type' => 'serial', 'disp_width' => 10, 'unsigned' => TRUE, 'not null' => TRUE),
+      'link'    => array('type' => 'varchar', 'length' => 255, 'not null' => TRUE, 'default' => ''),
+      'name'    => array('type' => 'varchar', 'length' => 128, 'not null' => TRUE, 'default' => ''),
+      'mail'    => array('type' => 'varchar', 'length' => 128, 'not null' => TRUE, 'default' => ''),
+      'slogan'  => array('type' => 'text', 'not null' => TRUE, 'size' => 'big'),
+      'mission' => array('type' => 'text', 'not null' => TRUE, 'size' => 'big'),
+      'users'   => array('type' => 'int', 'not null' => TRUE, 'default' => 0),
+      'nodes'   => array('type' => 'int', 'not null' => TRUE, 'default' => 0),
+      'version' => array('type' => 'varchar', 'length' => 35, 'not null' => TRUE, 'default' => ''),
+      'created' => array('type' => 'int', 'not null' => TRUE, 'default' => 0),
+      'changed' => array('type' => 'int', 'not null' => TRUE, 'default' => 0)
+    ),
+    'primary key' => array('cid'),
+  );
+
+  $schema['client_system'] = array(
+    'fields' => array(
+      'cid'  => array('type' => 'int', 'not null' => TRUE, 'default' => 0),
+      'name' => array('type' => 'varchar', 'length' => 255, 'not null' => TRUE, 'default' => ''),
+      'type' => array('type' => 'varchar', 'length' => 255, 'not null' => TRUE, 'default' => '')
+    ),
+    'primary key' => array('cid', 'name'),
+  );
+
+  return $schema;
+}
+
Index: modules/forum/forum.install
===================================================================
RCS file: /cvs/drupal/drupal/modules/forum/forum.install,v
retrieving revision 1.6
diff -u -F^f -r1.6 forum.install
--- modules/forum/forum.install	1 Sep 2006 07:40:08 -0000	1.6
+++ modules/forum/forum.install	17 May 2007 16:18:07 -0000
@@ -5,36 +5,17 @@
  * Implementation of hook_install().
  */
 function forum_install() {
-  switch ($GLOBALS['db_type']) {
-    case 'mysql':
-    case 'mysqli':
-      db_query("CREATE TABLE {forum} (
-        nid int unsigned NOT NULL default '0',
-        vid int unsigned NOT NULL default '0',
-        tid int unsigned NOT NULL default '0',
-        PRIMARY KEY (vid),
-        KEY nid (nid),
-        KEY tid (tid)
-      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");
-      break;
-    case 'pgsql':
-      db_query("CREATE TABLE {forum} (
-        nid int_unsigned NOT NULL default '0',
-        vid int_unsigned NOT NULL default '0',
-        tid int_unsigned NOT NULL default '0',
-        PRIMARY KEY (vid)
-      )");
-      db_query("CREATE INDEX {forum}_nid_idx ON {forum} (nid)");
-      db_query("CREATE INDEX {forum}_tid_idx ON {forum} (tid)");
-      break;
-  }
+  // Create tables.
+  drupal_install_schema('forum');
 }
 
 /**
  * Implementation of hook_uninstall().
  */
 function forum_uninstall() {
-  db_query('DROP TABLE {forum}');
+  // Remove tables
+  drupal_uninstall_schema('forum');
+  
   db_query("DELETE FROM {node} WHERE type = 'forum'");
   variable_del('forum_containers');
   variable_del('forum_nav_vocabulary');
Index: modules/forum/forum.schema
===================================================================
RCS file: modules/forum/forum.schema
diff -N modules/forum/forum.schema
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ modules/forum/forum.schema	17 May 2007 16:18:07 -0000
@@ -0,0 +1,20 @@
+<?php
+// $Id: $
+
+function forum_schema() {
+  $schema['forum'] = array(
+    'fields' => array(
+      'nid' => array('type' => 'int', 'disp_width' => 10, 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0),
+      'vid' => array('type' => 'int', 'disp_width' => 10, 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0),
+      'tid' => array('type' => 'int', 'disp_width' => 10, 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0)
+    ),
+    'indexes' => array(
+      'nid' => array('nid'),
+      'tid' => array('tid')
+    ),
+    'primary key' => array('vid'),
+  );
+
+  return $schema;
+}
+
Index: modules/locale/locale.install
===================================================================
RCS file: /cvs/drupal/drupal/modules/locale/locale.install,v
retrieving revision 1.9
diff -u -F^f -r1.9 locale.install
--- modules/locale/locale.install	3 May 2007 09:51:08 -0000	1.9
+++ modules/locale/locale.install	17 May 2007 16:18:07 -0000
@@ -8,82 +8,10 @@ function locale_install() {
   // locales_source.source and locales_target.target are not used as binary
   // fields; non-MySQL database servers need to ensure the field type is text
   // and that LIKE produces a case-sensitive comparison.
-  switch ($GLOBALS['db_type']) {
-    case 'mysql':
-    case 'mysqli':
-      db_query("CREATE TABLE {languages} (
-        language varchar(12) NOT NULL default '',
-        name varchar(64) NOT NULL default '',
-        native varchar(64) NOT NULL default '',
-        direction int NOT NULL default '0',
-        enabled int NOT NULL default '0',
-        plurals int NOT NULL default '0',
-        formula varchar(128) NOT NULL default '',
-        domain varchar(128) NOT NULL default '',
-        prefix varchar(128) NOT NULL default '',
-        weight int NOT NULL default '0',
-        PRIMARY KEY (language)
-      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");
-
-      db_query("CREATE TABLE {locales_source} (
-        lid int NOT NULL auto_increment,
-        location varchar(255) NOT NULL default '',
-        textgroup varchar(255) NOT NULL default '',
-        source blob NOT NULL,
-        PRIMARY KEY (lid),
-        KEY source (source(30))
-      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");
-
-      db_query("CREATE TABLE {locales_target} (
-        lid int NOT NULL default '0',
-        translation blob NOT NULL,
-        language varchar(12) NOT NULL default '',
-        plid int NOT NULL default '0',
-        plural int NOT NULL default '0',
-        KEY lid (lid),
-        KEY lang (language),
-        KEY plid (plid),
-        KEY plural (plural)
-      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");
-      break;
-
-    case 'pgsql':
-      db_query("CREATE TABLE {languages} (
-        language varchar(12) NOT NULL default '',
-        name varchar(64) NOT NULL default '',
-        native varchar(64) NOT NULL default '',
-        direction int NOT NULL default '0',
-        enabled int NOT NULL default '0',
-        plurals int NOT NULL default '0',
-        formula varchar(128) NOT NULL default '',
-        domain varchar(128) NOT NULL default '',
-        prefix varchar(128) NOT NULL default '',
-        weight int NOT NULL default '0',
-        PRIMARY KEY (language)
-      )");
 
-      db_query("CREATE TABLE {locales_source} (
-        lid serial,
-        location varchar(255) NOT NULL default '',
-        textgroup varchar(255) NOT NULL default '',
-        source text NOT NULL,
-        PRIMARY KEY (lid)
-      )");
+  // Create tables.
+  drupal_install_schema('locale');
 
-      db_query("CREATE TABLE {locales_target} (
-        lid int NOT NULL default '0',
-        translation text NOT NULL,
-        language varchar(12) NOT NULL default '',
-        plid int NOT NULL default '0',
-        plural int NOT NULL default '0'
-      )");
-      db_query("CREATE INDEX {locales_target}_lid_idx ON {locales_target} (lid)");
-      db_query("CREATE INDEX {locales_target}_language_idx ON {locales_target} (language)");
-      db_query("CREATE INDEX {locales_target}_plid_idx ON {locales_target} (plid)");
-      db_query("CREATE INDEX {locales_target}_plural_idx ON {locales_target} (plural)");
-      db_query("CREATE INDEX {locales_source}_source_idx ON {locales_source} (source)");
-      break;
-  }
   db_query("INSERT INTO {languages} (language, name, native, direction, enabled, weight) VALUES ('en', 'English', 'English', '0', '1', '0')");
 }
 
@@ -171,7 +99,6 @@ function locale_update_6002() {
  * Implementation of hook_uninstall().
  */
 function locale_uninstall() {
-  db_query('DROP TABLE {languages}');
-  db_query('DROP TABLE {locales_source}');
-  db_query('DROP TABLE {locales_target}');
+  // Remove tables
+  drupal_uninstall_schema('locale');
 }
Index: modules/locale/locale.schema
===================================================================
RCS file: modules/locale/locale.schema
diff -N modules/locale/locale.schema
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ modules/locale/locale.schema	17 May 2007 16:18:07 -0000
@@ -0,0 +1,51 @@
+<?php
+// $Id: $
+
+function locale_schema() {
+  $schema['languages'] = array(
+    'fields' => array(
+      'language'  => array('type' => 'varchar', 'length' => 12, 'not null' => TRUE, 'default' => ''),
+      'name'      => array('type' => 'varchar', 'length' => 64, 'not null' => TRUE, 'default' => ''),
+      'native'    => array('type' => 'varchar', 'length' => 64, 'not null' => TRUE, 'default' => ''),
+      'direction' => array('type' => 'int', 'not null' => TRUE, 'default' => 0),
+      'enabled'   => array('type' => 'int', 'not null' => TRUE, 'default' => 0),
+      'plurals'   => array('type' => 'int', 'not null' => TRUE, 'default' => 0),
+      'formula'   => array('type' => 'varchar', 'length' => 128, 'not null' => TRUE, 'default' => ''),
+      'domain'    => array('type' => 'varchar', 'length' => 128, 'not null' => TRUE, 'default' => ''),
+      'prefix'    => array('type' => 'varchar', 'length' => 128, 'not null' => TRUE, 'default' => ''),
+      'weight'    => array('type' => 'int', 'not null' => TRUE, 'default' => 0)
+    ),
+    'primary key' => array('language'),
+  );
+  
+  $schema['locales_source'] = array(
+    'fields' => array(
+      'lid'       => array('type' => 'serial', 'not null' => TRUE),
+      'location'  => array('type' => 'varchar', 'length' => 255, 'not null' => TRUE, 'default' => ''),
+      'textgroup' => array('type' => 'varchar', 'length' => 255, 'not null' => TRUE, 'default' => ''),
+      'source'    => array('type' => 'text', 'mysql_type' => 'blob', 'not null' => TRUE),
+    ),
+    'primary key' => array('lid'),
+    'indexes' => array
+        ('source' => array(array('source', 30))),
+  );
+  
+  $schema['locales_target'] = array(
+    'fields' => array(
+      'lid'         => array('type' => 'int', 'not null' => TRUE, 'default' => 0),
+      'translation' => array('type' => 'text', 'mysql_type' => 'blob', 'not null' => TRUE),
+      'language'    => array('type' => 'varchar', 'length' => 12, 'not null' => TRUE, 'default' => ''),
+      'plid'        => array('type' => 'int', 'not null' => TRUE, 'default' => 0),
+      'plural'      => array('type' => 'int', 'not null' => TRUE, 'default' => 0)
+    ),
+    'indexes' => array(
+      'language'   => array('language'),
+      'lid'    => array('lid'),
+      'plid'   => array('plid'),
+      'plural' => array('plural')
+    ),
+  );
+
+  return $schema;
+}
+
Index: modules/menu/menu.install
===================================================================
RCS file: /cvs/drupal/drupal/modules/menu/menu.install,v
retrieving revision 1.2
diff -u -F^f -r1.2 menu.install
--- modules/menu/menu.install	15 Apr 2007 14:38:16 -0000	1.2
+++ modules/menu/menu.install	17 May 2007 16:18:07 -0000
@@ -5,41 +5,15 @@
  * Implementation of hook_install().
  */
 function menu_install() {
-  switch ($GLOBALS['db_type']) {
-    case 'mysql':
-    case 'mysqli':
-      db_query("CREATE TABLE {menu_custom} (
-        path varchar(255) NOT NULL default '' ,
-        disabled int NOT NULL default 0,
-        title varchar(255) NOT NULL default '',
-        description varchar(255) NOT NULL default '',
-        weight int NOT NULL default 0 ,
-        type int NOT NULL default 0 ,
-        admin int NOT NULL default 0,
-        parent varchar(255) NOT NULL default '',
-        PRIMARY KEY (path)
-      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");
-      break;
-    case 'pgsql':
-      db_query("CREATE TABLE {menu_custom} (
-        path varchar(255) NOT NULL default '' ,
-        disabled int NOT NULL default 0,
-        title varchar(255) NOT NULL default '',
-        description varchar(255) NOT NULL default '',
-        weight int NOT NULL default 0 ,
-        type int NOT NULL default 0 ,
-        admin int NOT NULL default 0,
-        parent varchar(255) NOT NULL default '',
-        PRIMARY KEY (path)
-      )");
-      break;
-  }
+  // Create tables.
+  drupal_install_schema('menu');
 }
 
 /**
  * Implementation of hook_uninstall().
  */
 function menu_uninstall() {
-  db_query('DROP TABLE {menu_custom}');
+  // Remove tables
+  drupal_uninstall_schema('menu');
   menu_rebuild();
 }
Index: modules/menu/menu.schema
===================================================================
RCS file: modules/menu/menu.schema
diff -N modules/menu/menu.schema
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ modules/menu/menu.schema	17 May 2007 16:18:07 -0000
@@ -0,0 +1,10 @@
+<?php
+// $Id: $
+
+function menu_schema() {
+
+  return $schema;
+}
+
+
+
Index: modules/poll/poll.install
===================================================================
RCS file: /cvs/drupal/drupal/modules/poll/poll.install,v
retrieving revision 1.7
diff -u -F^f -r1.7 poll.install
--- modules/poll/poll.install	1 Sep 2006 07:40:08 -0000	1.7
+++ modules/poll/poll.install	17 May 2007 16:18:07 -0000
@@ -5,73 +5,14 @@
  * Implementation of hook_install().
  */
 function poll_install() {
-  switch ($GLOBALS['db_type']) {
-    case 'mysql':
-    case 'mysqli':
-      db_query("CREATE TABLE {poll} (
-        nid int unsigned NOT NULL default '0',
-        runtime int NOT NULL default '0',
-        active int unsigned NOT NULL default '0',
-        PRIMARY KEY (nid)
-      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");
-
-      db_query("CREATE TABLE {poll_votes} (
-        nid int unsigned NOT NULL,
-        uid int unsigned NOT NULL default 0,
-        chorder int NOT NULL default -1,
-        hostname varchar(128) NOT NULL default '',
-        INDEX (nid),
-        INDEX (uid),
-        INDEX (hostname)
-      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");
-
-      db_query("CREATE TABLE {poll_choices} (
-        chid int unsigned NOT NULL auto_increment,
-        nid int unsigned NOT NULL default '0',
-        chtext varchar(128) NOT NULL default '',
-        chvotes int NOT NULL default '0',
-        chorder int NOT NULL default '0',
-        PRIMARY KEY (chid),
-        KEY nid (nid)
-      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");
-      break;
-
-    case 'pgsql':
-      db_query("CREATE TABLE {poll} (
-        nid int_unsigned NOT NULL default '0',
-        runtime int NOT NULL default '0',
-        active int_unsigned NOT NULL default '0',
-        PRIMARY KEY (nid)
-      )");
-
-      db_query("CREATE TABLE {poll_votes} (
-        nid int_unsigned NOT NULL,
-        uid int_unsigned NOT NULL default 0,
-        chorder int NOT NULL default -1,
-        hostname varchar(128) NOT NULL default ''
-      )");
-      db_query("CREATE INDEX {poll_votes}_nid_idx ON {poll_votes} (nid)");
-      db_query("CREATE INDEX {poll_votes}_uid_idx ON {poll_votes} (uid)");
-      db_query("CREATE INDEX {poll_votes}_hostname_idx ON {poll_votes} (hostname)");
-
-      db_query("CREATE TABLE {poll_choices} (
-        chid serial CHECK (chid >= 0),
-        nid int_unsigned NOT NULL default '0',
-        chtext varchar(128) NOT NULL default '',
-        chvotes int NOT NULL default '0',
-        chorder int NOT NULL default '0',
-        PRIMARY KEY (chid)
-      )");
-      db_query("CREATE INDEX {poll_choices}_nid_idx ON {poll_choices} (nid)");
-      break;
-  }
+  // Create tables.
+  drupal_install_schema('poll');
 }
 
 /**
  * Implementation of hook_uninstall().
  */
 function poll_uninstall() {
-  db_query('DROP TABLE {poll}');
-  db_query('DROP TABLE {poll_votes}');
-  db_query('DROP TABLE {poll_choices}');
+  // Remove tables
+  drupal_uninstall_schema('poll');
 }
Index: modules/poll/poll.schema
===================================================================
RCS file: modules/poll/poll.schema
diff -N modules/poll/poll.schema
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ modules/poll/poll.schema	17 May 2007 16:18:07 -0000
@@ -0,0 +1,42 @@
+<?php
+// $Id: $
+
+function poll_schema() {
+  $schema['poll'] = array(
+    'fields' => array(
+      'nid'     => array('type' => 'int', 'disp_width' => 10, 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0),
+      'runtime' => array('type' => 'int', 'not null' => TRUE, 'default' => 0),
+      'active'  => array('type' => 'int', 'disp_width' => 10, 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0)
+    ),
+    'primary key' => array('nid'),
+  );
+
+  $schema['poll_choices'] = array(
+    'fields' => array(
+      'chid'    => array('type' => 'serial', 'disp_width' => 10, 'unsigned' => TRUE, 'not null' => TRUE),
+      'nid'     => array('type' => 'int', 'disp_width' => 10, 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0),
+      'chtext'  => array('type' => 'varchar', 'length' => 128, 'not null' => TRUE, 'default' => ''),
+      'chvotes' => array('type' => 'int', 'not null' => TRUE, 'default' => 0),
+      'chorder' => array('type' => 'int', 'not null' => TRUE, 'default' => 0)
+    ),
+    'indexes' => array('nid' => array('nid')),
+    'primary key' => array('chid'),
+  );
+
+  $schema['poll_votes'] = array(
+    'fields' => array(
+      'nid'      => array('type' => 'int', 'disp_width' => 10, 'unsigned' => TRUE, 'not null' => TRUE),
+      'uid'      => array('type' => 'int', 'disp_width' => 10, 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0),
+      'chorder'  => array('type' => 'int', 'not null' => TRUE, 'default' => -1),
+      'hostname' => array('type' => 'varchar', 'length' => 128, 'not null' => TRUE, 'default' => '')
+    ),
+    'indexes' => array(
+      'hostname' => array('hostname'),
+      'nid'      => array('nid'),
+      'uid'      => array('uid')
+    ),
+  );
+
+  return $schema;
+}
+
Index: modules/profile/profile.install
===================================================================
RCS file: /cvs/drupal/drupal/modules/profile/profile.install,v
retrieving revision 1.8
diff -u -F^f -r1.8 profile.install
--- modules/profile/profile.install	28 Nov 2006 14:37:44 -0000	1.8
+++ modules/profile/profile.install	17 May 2007 16:18:07 -0000
@@ -5,73 +5,16 @@
  * Implementation of hook_install().
  */
 function profile_install() {
-  switch ($GLOBALS['db_type']) {
-    case 'mysql':
-    case 'mysqli':
-      db_query("CREATE TABLE {profile_fields} (
-        fid int NOT NULL auto_increment,
-        title varchar(255) default NULL,
-        name varchar(128) default NULL,
-        explanation TEXT,
-        category varchar(255) default NULL,
-        page varchar(255) default NULL,
-        type varchar(128) default NULL,
-        weight tinyint DEFAULT '0' NOT NULL,
-        required tinyint DEFAULT '0' NOT NULL,
-        register tinyint DEFAULT '0' NOT NULL,
-        visibility tinyint DEFAULT '0' NOT NULL,
-        autocomplete tinyint DEFAULT '0' NOT NULL,
-        options text,
-        KEY category (category),
-        UNIQUE KEY name (name),
-        PRIMARY KEY (fid)
-      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");
-
-      db_query("CREATE TABLE {profile_values} (
-        fid int unsigned default '0',
-        uid int unsigned default '0',
-        value text,
-        KEY uid (uid),
-        KEY fid (fid)
-      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");
-      break;
-
-    case 'pgsql':
-      db_query("CREATE TABLE {profile_fields} (
-        fid serial,
-        title varchar(255) default NULL,
-        name varchar(128) default NULL,
-        explanation TEXT default NULL,
-        category varchar(255) default NULL,
-        page varchar(255) default NULL,
-        type varchar(128) default NULL,
-        weight smallint DEFAULT '0' NOT NULL,
-        required smallint DEFAULT '0' NOT NULL,
-        register smallint DEFAULT '0' NOT NULL,
-        visibility smallint DEFAULT '0' NOT NULL,
-        autocomplete smallint DEFAULT '0' NOT NULL,
-        options text,
-        UNIQUE (name),
-        PRIMARY KEY (fid)
-      )");
-      db_query("CREATE INDEX {profile_fields}_category_idx ON {profile_fields} (category)");
-
-      db_query("CREATE TABLE {profile_values} (
-        fid int_unsigned default '0',
-        uid int_unsigned default '0',
-        value text
-      )");
-      db_query("CREATE INDEX {profile_values}_uid_idx ON {profile_values} (uid)");
-      db_query("CREATE INDEX {profile_values}_fid_idx ON {profile_values} (fid)");
-      break;
-  }
+  // Create tables.
+  drupal_install_schema('profile');
 }
 
 /**
  * Implementation of hook_uninstall().
  */
 function profile_uninstall() {
-  db_query('DROP TABLE {profile_fields}');
-  db_query('DROP TABLE {profile_values}');
+  // Remove tables
+  drupal_uninstall_schema('profile');
+  
   variable_del('profile_block_author_fields');
 }
Index: modules/profile/profile.schema
===================================================================
RCS file: modules/profile/profile.schema
diff -N modules/profile/profile.schema
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ modules/profile/profile.schema	17 May 2007 16:18:07 -0000
@@ -0,0 +1,40 @@
+<?php
+// $Id: $
+
+function profile_schema() {
+  $schema['profile_fields'] = array(
+    'fields' => array(
+      'fid'          => array('type' => 'serial', 'not null' => TRUE),
+      'title'        => array('type' => 'varchar', 'length' => 255, 'not null' => FALSE),
+      'name'         => array('type' => 'varchar', 'length' => 128, 'not null' => FALSE),
+      'explanation'  => array('type' => 'text', 'not null' => FALSE),
+      'category'     => array('type' => 'varchar', 'length' => 255, 'not null' => FALSE),
+      'page'         => array('type' => 'varchar', 'length' => 255, 'not null' => FALSE),
+      'type'         => array('type' => 'varchar', 'length' => 128, 'not null' => FALSE),
+      'weight'       => array('type' => 'int', 'disp_width' => 4, 'not null' => TRUE, 'default' => 0, 'size' => 'tiny'),
+      'required'     => array('type' => 'int', 'disp_width' => 4, 'not null' => TRUE, 'default' => 0, 'size' => 'tiny'),
+      'register'     => array('type' => 'int', 'disp_width' => 4, 'not null' => TRUE, 'default' => 0, 'size' => 'tiny'),
+      'visibility'   => array('type' => 'int', 'disp_width' => 4, 'not null' => TRUE, 'default' => 0, 'size' => 'tiny'),
+      'autocomplete' => array('type' => 'int', 'disp_width' => 4, 'not null' => TRUE, 'default' => 0, 'size' => 'tiny'),
+      'options'      => array('type' => 'text', 'not null' => FALSE)
+    ),
+    'indexes' => array('category' => array('category')),
+    'unique keys' => array('name' => array('name')),
+    'primary key' => array('fid'),
+  );
+
+  $schema['profile_values'] = array(
+    'fields' => array(
+      'fid'   => array('type' => 'int', 'disp_width' => 10, 'unsigned' => TRUE, 'not null' => FALSE, 'default' => 0),
+      'uid'   => array('type' => 'int', 'disp_width' => 10, 'unsigned' => TRUE, 'not null' => FALSE, 'default' => 0),
+      'value' => array('type' => 'text', 'not null' => FALSE)
+    ),
+    'indexes' => array(
+      'fid' => array('fid'),
+      'uid' => array('uid')
+    ),
+  );
+
+  return $schema;
+}
+
Index: modules/search/search.install
===================================================================
RCS file: /cvs/drupal/drupal/modules/search/search.install,v
retrieving revision 1.6
diff -u -F^f -r1.6 search.install
--- modules/search/search.install	1 Sep 2006 07:40:08 -0000	1.6
+++ modules/search/search.install	17 May 2007 16:18:07 -0000
@@ -5,70 +5,17 @@
  * Implementation of hook_install().
  */
 function search_install() {
-  switch ($GLOBALS['db_type']) {
-    case 'mysql':
-    case 'mysqli':
-      db_query("CREATE TABLE {search_dataset} (
-        sid int unsigned NOT NULL default '0',
-        type varchar(16) default NULL,
-        data longtext NOT NULL,
-        KEY sid_type (sid, type)
-      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");
-
-      db_query("CREATE TABLE {search_index} (
-        word varchar(50) NOT NULL default '',
-        sid int unsigned NOT NULL default '0',
-        type varchar(16) default NULL,
-        fromsid int unsigned NOT NULL default '0',
-        fromtype varchar(16) default NULL,
-        score float default NULL,
-        KEY sid_type (sid, type),
-        KEY from_sid_type (fromsid, fromtype),
-        KEY word (word)
-      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");
-
-      db_query("CREATE TABLE {search_total} (
-        word varchar(50) NOT NULL default '',
-        count float default NULL,
-        PRIMARY KEY (word)
-      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");
-      break;
-    case 'pgsql':
-      db_query("CREATE TABLE {search_dataset} (
-        sid int_unsigned NOT NULL default '0',
-        type varchar(16) default NULL,
-        data text NOT NULL
-      )");
-      db_query("CREATE INDEX {search_dataset}_sid_type_idx ON {search_dataset} (sid, type)");
-
-      db_query("CREATE TABLE {search_index} (
-        word varchar(50) NOT NULL default '',
-        sid int_unsigned NOT NULL default '0',
-        type varchar(16) default NULL,
-        fromsid int_unsigned NOT NULL default '0',
-        fromtype varchar(16) default NULL,
-        score float default NULL
-      )");
-      db_query("CREATE INDEX {search_index}_sid_type_idx ON {search_index} (sid, type)");
-      db_query("CREATE INDEX {search_index}_from_sid_type_idx ON {search_index} (fromsid, fromtype)");
-      db_query("CREATE INDEX {search_index}_word_idx ON {search_index} (word)");
-
-      db_query("CREATE TABLE {search_total} (
-        word varchar(50) NOT NULL default '',
-        count float default NULL,
-        PRIMARY KEY (word)
-      )");
-      break;
-  }
+  // Create tables.
+  drupal_install_schema('search');
 }
 
 /**
  * Implementation of hook_uninstall().
  */
 function search_uninstall() {
-  db_query('DROP TABLE {search_dataset}');
-  db_query('DROP TABLE {search_index}');
-  db_query('DROP TABLE {search_total}');
+  // Remove tables
+  drupal_uninstall_schema('search');
+  
   variable_del('minimum_word_size');
   variable_del('overlap_cjk');
 }
Index: modules/search/search.schema
===================================================================
RCS file: modules/search/search.schema
diff -N modules/search/search.schema
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ modules/search/search.schema	17 May 2007 16:18:07 -0000
@@ -0,0 +1,40 @@
+<?php
+// $Id: $
+
+function search_schema() {
+  $schema['search_dataset'] = array(
+    'fields' => array(
+      'sid'  => array('type' => 'int', 'disp_width' => 10, 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0),
+      'type' => array('type' => 'varchar', 'length' => 16, 'not null' => FALSE),
+      'data' => array('type' => 'text', 'not null' => TRUE, 'size' => 'big')
+    ),
+    'indexes' => array('sid_type' => array('sid', 'type')),
+  );
+
+  $schema['search_index'] = array(
+    'fields' => array(
+      'word'     => array('type' => 'varchar', 'length' => 50, 'not null' => TRUE, 'default' => ''),
+      'sid'      => array('type' => 'int', 'disp_width' => 10, 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0),
+      'type'     => array('type' => 'varchar', 'length' => 16, 'not null' => FALSE),
+      'fromsid'  => array('type' => 'int', 'disp_width' => 10, 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0),
+      'fromtype' => array('type' => 'varchar', 'length' => 16, 'not null' => FALSE),
+      'score'    => array('type' => 'float', 'not null' => FALSE)
+    ),
+    'indexes' => array(
+      'from_sid_type' => array('fromsid', 'fromtype'),
+      'sid_type'      => array('sid', 'type'),
+      'word'          => array('word')
+    ),
+  );
+
+  $schema['search_total'] = array(
+    'fields' => array(
+      'word'  => array('type' => 'varchar', 'length' => 50, 'not null' => TRUE, 'default' => ''),
+      'count' => array('type' => 'float', 'not null' => FALSE)
+    ),
+    'primary key' => array('word'),
+  );
+
+  return $schema;
+}
+
Index: modules/statistics/statistics.install
===================================================================
RCS file: /cvs/drupal/drupal/modules/statistics/statistics.install,v
retrieving revision 1.7
diff -u -F^f -r1.7 statistics.install
--- modules/statistics/statistics.install	7 Nov 2006 22:27:07 -0000	1.7
+++ modules/statistics/statistics.install	17 May 2007 16:18:07 -0000
@@ -5,39 +5,8 @@
  * Implementation of hook_install().
  */
 function statistics_install() {
-  switch ($GLOBALS['db_type']) {
-    case 'mysql':
-    case 'mysqli':
-      db_query("CREATE TABLE {accesslog} (
-        aid int NOT NULL auto_increment,
-        sid varchar(64) NOT NULL default '',
-        title varchar(255) default NULL,
-        path varchar(255) default NULL,
-        url varchar(255) default NULL,
-        hostname varchar(128) default NULL,
-        uid int unsigned default '0',
-        timer int unsigned NOT NULL default '0',
-        timestamp int unsigned NOT NULL default '0',
-        KEY accesslog_timestamp (timestamp),
-        PRIMARY KEY (aid)
-      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");
-      break;
-    case 'pgsql':
-      db_query("CREATE TABLE {accesslog} (
-        aid serial,
-        sid varchar(64) NOT NULL default '',
-        title varchar(255) default NULL,
-        path varchar(255) default NULL,
-        url varchar(255) default NULL,
-        hostname varchar(128) default NULL,
-        uid int_unsigned default '0',
-        timer int_unsigned NOT NULL default '0',
-        timestamp int_unsigned NOT NULL default '0',
-        PRIMARY KEY (aid)
-      )");
-      db_query("CREATE INDEX {accesslog}_accesslog_timestamp_idx ON {accesslog} (timestamp)");
-      break;
-  }
+  // Create tables.
+  drupal_install_schema('statistics');
 }
 
 /**
@@ -63,7 +32,9 @@ function statistics_update_1000() {
  * Implementation of hook_uninstall().
  */
 function statistics_uninstall() {
-  db_query('DROP TABLE {accesslog}');
+  // Remove tables
+  drupal_uninstall_schema('statistics');
+  
   variable_del('statistics_count_content_views');
   variable_del('statistics_enable_access_log');
   variable_del('statistics_flush_accesslog_timer');
Index: modules/statistics/statistics.schema
===================================================================
RCS file: modules/statistics/statistics.schema
diff -N modules/statistics/statistics.schema
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ modules/statistics/statistics.schema	17 May 2007 16:18:07 -0000
@@ -0,0 +1,23 @@
+<?php
+// $Id: $
+
+function statistics_schema() {
+  $schema['accesslog'] = array(
+    'fields' => array(
+      'aid'       => array('type' => 'serial', 'not null' => TRUE),
+      'sid'       => array('type' => 'varchar', 'length' => 64, 'not null' => TRUE, 'default' => ''),
+      'title'     => array('type' => 'varchar', 'length' => 255, 'not null' => FALSE),
+      'path'      => array('type' => 'varchar', 'length' => 255, 'not null' => FALSE),
+      'url'       => array('type' => 'varchar', 'length' => 255, 'not null' => FALSE),
+      'hostname'  => array('type' => 'varchar', 'length' => 128, 'not null' => FALSE),
+      'uid'       => array('type' => 'int', 'disp_width' => 10, 'unsigned' => TRUE, 'not null' => FALSE, 'default' => 0),
+      'timer'     => array('type' => 'int', 'disp_width' => 10, 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0),
+      'timestamp' => array('type' => 'int', 'disp_width' => 10, 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0)
+    ),
+    'indexes' => array('accesslog_timestamp' => array('timestamp')),
+    'primary key' => array('aid'),
+  );
+
+  return $schema;
+}
+
Index: modules/system/system.install
===================================================================
RCS file: /cvs/drupal/drupal/modules/system/system.install,v
retrieving revision 1.111
diff -u -F^f -r1.111 system.install
--- modules/system/system.install	17 May 2007 07:28:42 -0000	1.111
+++ modules/system/system.install	17 May 2007 16:18:09 -0000
@@ -173,488 +173,21 @@ function system_install() {
   switch ($GLOBALS['db_type']) {
     case 'mysql':
     case 'mysqli':
-      db_query("CREATE TABLE {access} (
-        aid int NOT NULL auto_increment,
-        mask varchar(255) NOT NULL default '',
-        type varchar(255) NOT NULL default '',
-        status tinyint NOT NULL default '0',
-        PRIMARY KEY (aid)
-      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");
-
-      db_query("CREATE TABLE {authmap} (
-        aid int unsigned NOT NULL auto_increment,
-        uid int NOT NULL default '0',
-        authname varchar(128) NOT NULL default '',
-        module varchar(128) NOT NULL default '',
-        PRIMARY KEY (aid),
-        UNIQUE KEY authname (authname)
-      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");
-
-      db_query("CREATE TABLE {batch} (
-        bid int(11) NOT NULL,
-        token varchar(64) NOT NULL,
-        timestamp int(11) NOT NULL,
-        batch longtext,
-        PRIMARY KEY  (bid),
-        KEY token (token)
-      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");
-
-      db_query("CREATE TABLE {blocks} (
-        bid int NOT NULL AUTO_INCREMENT,
-        module varchar(64) DEFAULT '' NOT NULL,
-        delta varchar(32) NOT NULL default '0',
-        theme varchar(255) NOT NULL default '',
-        status tinyint DEFAULT '0' NOT NULL,
-        weight tinyint DEFAULT '0' NOT NULL,
-        region varchar(64) DEFAULT 'left' NOT NULL,
-        custom tinyint DEFAULT '0' NOT NULL,
-        throttle tinyint DEFAULT '0' NOT NULL,
-        visibility tinyint DEFAULT '0' NOT NULL,
-        pages text NOT NULL,
-        title varchar(64) DEFAULT '' NOT NULL,
-        PRIMARY KEY (bid)
-      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");
-
-      db_query("CREATE TABLE {boxes} (
-        bid int NOT NULL,
-        body longtext,
-        info varchar(128) NOT NULL default '',
-        format int NOT NULL default '0',
-        PRIMARY KEY (bid),
-        UNIQUE KEY info (info)
-      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");
-
-      db_query("CREATE TABLE {cache} (
-        cid varchar(255) NOT NULL default '',
-        data longblob,
-        expire int NOT NULL default '0',
-        created int NOT NULL default '0',
-        headers text,
-        serialized int(1) NOT NULL default '0',
-        PRIMARY KEY (cid),
-        INDEX expire (expire)
-      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");
-      db_query("CREATE TABLE {cache_filter} (
-        cid varchar(255) NOT NULL default '',
-        data longblob,
-        expire int NOT NULL default '0',
-        created int NOT NULL default '0',
-        headers text,
-        serialized int(1) NOT NULL default '0',
-        PRIMARY KEY (cid),
-        INDEX expire (expire)
-      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");
-      db_query("CREATE TABLE {cache_page} (
-        cid varchar(255) BINARY NOT NULL default '',
-        data longblob,
-        expire int NOT NULL default '0',
-        created int NOT NULL default '0',
-        headers text,
-        serialized int(1) NOT NULL default '0',
-        PRIMARY KEY (cid),
-        INDEX expire (expire)
-      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");
-      db_query("CREATE TABLE {cache_form} (
-        cid varchar(255) BINARY NOT NULL default '',
-        data longblob,
-        expire int NOT NULL default '0',
-        created int NOT NULL default '0',
-        headers text,
-        serialized int(1) NOT NULL default '0',
-        PRIMARY KEY (cid),
-        INDEX expire (expire)
-      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");
-
-      db_query("CREATE TABLE {comments} (
-        cid int NOT NULL auto_increment,
-        pid int NOT NULL default '0',
-        nid int NOT NULL default '0',
-        uid int NOT NULL default '0',
-        subject varchar(64) NOT NULL default '',
-        comment longtext NOT NULL,
-        hostname varchar(128) NOT NULL default '',
-        timestamp int NOT NULL default '0',
-        score mediumint NOT NULL default '0',
-        status tinyint unsigned NOT NULL default '0',
-        format int NOT NULL default '0',
-        thread varchar(255) NOT NULL,
-        users longtext,
-        name varchar(60) default NULL,
-        mail varchar(64) default NULL,
-        homepage varchar(255) default NULL,
-        PRIMARY KEY (cid),
-        KEY lid (nid),
-        KEY status (status)
-      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");
-
-      db_query("CREATE TABLE {node_comment_statistics} (
-        nid int unsigned NOT NULL auto_increment,
-        last_comment_timestamp int NOT NULL default '0',
-        last_comment_name varchar(60) default NULL,
-        last_comment_uid int NOT NULL default '0',
-        comment_count int unsigned NOT NULL default '0',
-        PRIMARY KEY (nid),
-        KEY node_comment_timestamp (last_comment_timestamp)
-      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");
-
-      db_query("CREATE TABLE {files} (
-        fid int unsigned NOT NULL default 0,
-        nid int unsigned NOT NULL default 0,
-        filename varchar(255) NOT NULL default '',
-        filepath varchar(255) NOT NULL default '',
-        filemime varchar(255) NOT NULL default '',
-        filesize int unsigned NOT NULL default 0,
-        PRIMARY KEY (fid),
-        KEY nid (nid)
-      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");
-
-      db_query("CREATE TABLE {file_revisions} (
-        fid int unsigned NOT NULL default 0,
-        vid int unsigned NOT NULL default 0,
-        description varchar(255) NOT NULL default '',
-        list tinyint unsigned NOT NULL default 0,
-        PRIMARY KEY (fid, vid),
-        KEY (vid)
-      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");
-
-      db_query("CREATE TABLE {filter_formats} (
-        format int NOT NULL auto_increment,
-        name varchar(255) NOT NULL default '',
-        roles varchar(255) NOT NULL default '',
-        cache tinyint NOT NULL default '0',
-        PRIMARY KEY (format),
-        UNIQUE KEY (name)
-      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");
-
-      db_query("CREATE TABLE {filters} (
-        fid int NOT NULL AUTO_INCREMENT,
-        format int NOT NULL default '0',
-        module varchar(64) NOT NULL default '',
-        delta tinyint DEFAULT '0' NOT NULL,
-        weight tinyint DEFAULT '0' NOT NULL,
-        PRIMARY KEY (fid),
-        INDEX (weight)
-      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");
-
-      db_query("CREATE TABLE {flood} (
-        fid int NOT NULL AUTO_INCREMENT,
-        event varchar(64) NOT NULL default '',
-        hostname varchar(128) NOT NULL default '',
-        timestamp int NOT NULL default '0',
-        PRIMARY KEY (fid)
-      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");
-
-      db_query("CREATE TABLE {history} (
-        uid int NOT NULL default '0',
-        nid int NOT NULL default '0',
-        timestamp int NOT NULL default '0',
-        PRIMARY KEY (uid,nid)
-      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");
-
-      db_query("CREATE TABLE {menu_router} (
-        path varchar(255) NOT NULL default '',
-        load_functions varchar(255) NOT NULL default '',
-        to_arg_functions varchar(255) NOT NULL default '',
-        access_callback varchar(255) NOT NULL default '',
-        access_arguments text,
-        page_callback varchar(255) NOT NULL default '',
-        page_arguments text,
-        fit int NOT NULL default 0,
-        number_parts int NOT NULL default 0,
-        tab_parent varchar(255) NOT NULL default '',
-        tab_root varchar(255) NOT NULL default '',
-        title varchar(255) NOT NULL default '',
-        title_callback varchar(255) NOT NULL default '',
-        title_arguments varchar(255) NOT NULL default '',
-        type int NOT NULL default 0,
-        block_callback varchar(255) NOT NULL default '',
-        description varchar(255) NOT NULL default '',
-        position varchar(255) NOT NULL default '',
-        weight int NOT NULL default 0,
-        PRIMARY KEY  (path),
-        KEY fit (fit),
-        KEY tab_parent (tab_parent)
-      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");
-
-      db_query("CREATE TABLE {menu_links} (
-        menu_name varchar(64) NOT NULL default '',
-        mlid int NOT NULL default '0',
-        plid int NOT NULL default '0',
-        href varchar(255) NOT NULL default '',
-        router_path varchar(255) NOT NULL default '',
-        hidden smallint NOT NULL default '0',
-        external smallint NOT NULL default '0',
-        has_children int NOT NULL default '0',
-        expanded smallint NOT NULL default '0',
-        weight int NOT NULL default '0',
-        depth int NOT NULL default '0',
-        p1 int NOT NULL default '0',
-        p2 int NOT NULL default '0',
-        p3 int NOT NULL default '0',
-        p4 int NOT NULL default '0',
-        p5 int NOT NULL default '0',
-        p6 int NOT NULL default '0',
-        module varchar(255) NOT NULL default 'system',
-        link_title varchar(255) NOT NULL default '',
-        options text,
-        PRIMARY KEY (mlid),
-        KEY parents (plid, p1, p2, p3, p4, p5),
-        KEY menu_name_path (menu_name, href),
-        KEY menu_expanded_children (expanded, has_children)
-      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");
-
-      db_query("CREATE TABLE {node} (
-        nid int unsigned NOT NULL auto_increment,
-        vid int unsigned NOT NULL default '0',
-        type varchar(32) NOT NULL default '',
-        language varchar(12) NOT NULL default '',
-        title varchar(128) NOT NULL default '',
-        uid int NOT NULL default '0',
-        status int NOT NULL default '1',
-        created int NOT NULL default '0',
-        changed int NOT NULL default '0',
-        comment int NOT NULL default '0',
-        promote int NOT NULL default '0',
-        moderate int NOT NULL default '0',
-        sticky int NOT NULL default '0',
-        PRIMARY KEY  (nid),
-        UNIQUE KEY nid_vid (nid, vid),
-        UNIQUE KEY vid (vid),
-        KEY node_type (type(4)),
-        KEY node_title_type (title, type(4)),
-        KEY status (status),
-        KEY uid (uid),
-        KEY node_moderate (moderate),
-        KEY node_promote_status (promote, status),
-        KEY node_created (created),
-        KEY node_changed (changed),
-        KEY node_status_type (status, type, nid),
-        KEY nid (nid)
-      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");
-
-      db_query("CREATE TABLE {node_access} (
-        nid int unsigned NOT NULL default '0',
-        gid int unsigned NOT NULL default '0',
-        realm varchar(255) NOT NULL default '',
-        grant_view tinyint unsigned NOT NULL default '0',
-        grant_update tinyint unsigned NOT NULL default '0',
-        grant_delete tinyint unsigned NOT NULL default '0',
-        PRIMARY KEY (nid,gid,realm)
-      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");
-
-      db_query("CREATE TABLE {node_revisions} (
-        nid int unsigned NOT NULL,
-        vid int unsigned NOT NULL,
-        uid int NOT NULL default '0',
-        title varchar(128) NOT NULL default '',
-        body longtext NOT NULL,
-        teaser longtext NOT NULL,
-        log longtext NOT NULL,
-        timestamp int NOT NULL default '0',
-        format int NOT NULL default '0',
-        PRIMARY KEY  (vid),
-        KEY nid (nid),
-        KEY uid (uid)
-      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");
-
-      db_query("CREATE TABLE {node_type} (
-        type varchar(32) NOT NULL,
-        name varchar(255) NOT NULL default '',
-        module varchar(255) NOT NULL,
-        description mediumtext NOT NULL,
-        help mediumtext NOT NULL,
-        has_title tinyint unsigned NOT NULL,
-        title_label varchar(255) NOT NULL default '',
-        has_body tinyint unsigned NOT NULL,
-        body_label varchar(255) NOT NULL default '',
-        min_word_count smallint unsigned NOT NULL,
-        custom tinyint NOT NULL DEFAULT '0',
-        modified tinyint NOT NULL DEFAULT '0',
-        locked tinyint NOT NULL DEFAULT '0',
-        orig_type varchar(255) NOT NULL default '',
-        PRIMARY KEY (type)
-      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");
-
-      db_query("CREATE TABLE {url_alias} (
-        pid int unsigned NOT NULL auto_increment,
-        src varchar(128) NOT NULL default '',
-        dst varchar(128) NOT NULL default '',
-        language varchar(12) NOT NULL default '',
-        PRIMARY KEY (pid),
-        UNIQUE KEY dst_language (dst, language),
-        KEY src (src)
-      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");
-
-      db_query("CREATE TABLE {permission} (
-        pid int NOT NULL AUTO_INCREMENT,
-        rid int unsigned NOT NULL default '0',
-        perm longtext,
-        tid int unsigned NOT NULL default '0',
-        PRIMARY KEY (pid),
-        KEY rid (rid)
-      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");
-
-      db_query("CREATE TABLE {role} (
-        rid int unsigned NOT NULL auto_increment,
-        name varchar(64) NOT NULL default '',
-        PRIMARY KEY (rid),
-        UNIQUE KEY name (name)
-      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");
-
-      db_query("CREATE TABLE {blocks_roles} (
-        module varchar(64) NOT NULL,
-        delta varchar(32) NOT NULL,
-        rid int unsigned NOT NULL,
-        PRIMARY KEY (module, delta, rid)
-      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");
-
-      db_query("CREATE TABLE {sessions} (
-        uid int unsigned NOT NULL,
-        sid varchar(64) NOT NULL default '',
-        hostname varchar(128) NOT NULL default '',
-        timestamp int NOT NULL default '0',
-        cache int NOT NULL default '0',
-        session longtext,
-        KEY uid (uid),
-        PRIMARY KEY (sid),
-        KEY timestamp (timestamp)
-      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");
-
-      db_query("CREATE TABLE {sequences} (
-        name varchar(255) NOT NULL default '',
-        id int unsigned NOT NULL default '0',
-        PRIMARY KEY (name)
-      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");
-
-      db_query("CREATE TABLE {node_counter} (
-        nid int NOT NULL default '0',
-        totalcount bigint unsigned NOT NULL default '0',
-        daycount mediumint unsigned NOT NULL default '0',
-        timestamp int unsigned NOT NULL default '0',
-        PRIMARY KEY (nid)
-      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");
-
-      db_query("CREATE TABLE {system} (
-        filename varchar(255) NOT NULL default '',
-        name varchar(255) NOT NULL default '',
-        type varchar(255) NOT NULL default '',
-        owner varchar(255) NOT NULL default '',
-        status int NOT NULL default '0',
-        throttle tinyint DEFAULT '0' NOT NULL,
-        bootstrap int NOT NULL default '0',
-        schema_version smallint NOT NULL default -1,
-        weight int NOT NULL default '0',
-        info text,
-        PRIMARY KEY (filename),
-        KEY (weight)
-      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");
-
-      db_query("CREATE TABLE {term_data} (
-        tid int unsigned NOT NULL auto_increment,
-        vid int unsigned NOT NULL default '0',
-        name varchar(255) NOT NULL default '',
-        description longtext,
-        weight tinyint NOT NULL default '0',
-        PRIMARY KEY (tid),
-        KEY vid (vid)
-      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");
-
-      db_query("CREATE TABLE {term_hierarchy} (
-        tid int unsigned NOT NULL default '0',
-        parent int unsigned NOT NULL default '0',
-        KEY tid (tid),
-        KEY parent (parent),
-        PRIMARY KEY (tid, parent)
-      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");
-
-      db_query("CREATE TABLE {term_node} (
-        nid int unsigned NOT NULL default '0',
-        vid int unsigned NOT NULL default '0',
-        tid int unsigned NOT NULL default '0',
-        KEY nid (nid),
-        KEY vid (vid),
-        KEY tid (tid),
-        PRIMARY KEY (vid,tid,nid)
-      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");
-
-      db_query("CREATE TABLE {term_relation} (
-        trid int NOT NULL AUTO_INCREMENT,
-        tid1 int unsigned NOT NULL default '0',
-        tid2 int unsigned NOT NULL default '0',
-        PRIMARY KEY (trid),
-        KEY tid1 (tid1),
-        KEY tid2 (tid2)
-      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");
-
-      db_query("CREATE TABLE {term_synonym} (
-        tsid int NOT NULL AUTO_INCREMENT,
-        tid int unsigned NOT NULL default '0',
-        name varchar(255) NOT NULL default '',
-        PRIMARY KEY (tsid),
-        KEY tid (tid),
-        KEY name (name(3))
-      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");
-
-      db_query("CREATE TABLE {users} (
-        uid int unsigned NOT NULL default '0',
-        name varchar(60) NOT NULL default '',
-        pass varchar(32) NOT NULL default '',
-        mail varchar(64) default '',
-        mode tinyint NOT NULL default '0',
-        sort tinyint default '0',
-        threshold tinyint default '0',
-        theme varchar(255) NOT NULL default '',
-        signature varchar(255) NOT NULL default '',
-        created int NOT NULL default '0',
-        access int NOT NULL default '0',
-        login int NOT NULL default '0',
-        status tinyint NOT NULL default '0',
-        timezone varchar(8) default NULL,
-        language varchar(12) NOT NULL default '',
-        picture varchar(255) NOT NULL DEFAULT '',
-        init varchar(64) default '',
-        data longtext,
-        PRIMARY KEY (uid),
-        UNIQUE KEY name (name),
-        KEY created (created),
-        KEY access (access)
-      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");
-
-      db_query("CREATE TABLE {users_roles} (
-        uid int unsigned NOT NULL default '0',
-        rid int unsigned NOT NULL default '0',
-        PRIMARY KEY (uid, rid)
-      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");
-
-      db_query("CREATE TABLE {variable} (
-        name varchar(128) NOT NULL default '',
-        value longtext NOT NULL,
-        language varchar(12) NOT NULL default '',
-        PRIMARY KEY (name, language)
-      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");
-
-      db_query("CREATE TABLE {vocabulary} (
-        vid int unsigned NOT NULL auto_increment,
-        name varchar(255) NOT NULL default '',
-        description longtext,
-        help varchar(255) NOT NULL default '',
-        relations tinyint unsigned NOT NULL default '0',
-        hierarchy tinyint unsigned NOT NULL default '0',
-        multiple tinyint unsigned NOT NULL default '0',
-        required tinyint unsigned NOT NULL default '0',
-        tags tinyint unsigned NOT NULL default '0',
-        module varchar(255) NOT NULL default '',
-        weight tinyint NOT NULL default '0',
-        PRIMARY KEY (vid)
-      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");
-
-      db_query("CREATE TABLE {vocabulary_node_types} (
-        vid int unsigned NOT NULL DEFAULT '0',
-        type varchar(32) NOT NULL DEFAULT '',
-        PRIMARY KEY (vid, type)
-      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");
-
+      // As of Drupal 6, users.uid is an auto-incrementing column, but
+      // previously it was not.  Below, we insert a row with uid 0 to
+      // represent user anonymous.  By default, mysql treats that as
+      // requesting the next sequence value which, of course, is uid
+      // 1!  This statement turns off that behavior for the duration
+      // of the current request, which is all we need.
+      //
+      // Note that this statement must be run any time the uid column
+      // is inserted or altered.  That includes loading mysqldump
+      // backups, but mysqldump put this statement in all backups for
+      // this exact reason.  It also includes any Schema API
+      // table-altering operations on the users table.
+      db_query("SET sql_mode = 'NO_AUTO_VALUE_ON_ZERO'");
       break;
+
     case 'pgsql':
       /* create unsigned types */
       db_query("CREATE DOMAIN int_unsigned integer CHECK (VALUE >= 0)");
@@ -692,492 +225,15 @@ function system_install() {
         LANGUAGE \'sql\''
       );
 
-      /* create tables */
-      db_query("CREATE TABLE {access} (
-        aid serial,
-        mask varchar(255) NOT NULL default '',
-        type varchar(255) NOT NULL default '',
-        status smallint NOT NULL default '0',
-        PRIMARY KEY (aid)
-      )");
-
-      db_query("CREATE TABLE {authmap} (
-        aid serial CHECK (aid >= 0),
-        uid int NOT NULL default '0',
-        authname varchar(128) NOT NULL default '',
-        module varchar(128) NOT NULL default '',
-        PRIMARY KEY (aid),
-        UNIQUE (authname)
-      )");
-
-      db_query("CREATE TABLE {batch} (
-        bid serial CHECK (bid >= 0),
-        token varchar(64) NOT NULL default '',
-        timestamp int NOT NULL default '0',
-        batch text,
-        PRIMARY KEY (bid)
-      )");
-      db_query("CREATE INDEX {batch}_token_idx ON {batch} (token)");
-
-      db_query("CREATE TABLE {blocks} (
-        bid serial,
-        module varchar(64) DEFAULT '' NOT NULL,
-        delta varchar(32) NOT NULL default '0',
-        theme varchar(255) NOT NULL default '',
-        status smallint DEFAULT '0' NOT NULL,
-        weight smallint DEFAULT '0' NOT NULL,
-        region varchar(64) DEFAULT 'left' NOT NULL,
-        custom smallint DEFAULT '0' NOT NULL,
-        throttle smallint DEFAULT '0' NOT NULL,
-        visibility smallint DEFAULT '0' NOT NULL,
-        pages text DEFAULT '' NOT NULL,
-        title varchar(64) DEFAULT '' NOT NULL,
-        PRIMARY KEY (bid)
-      )");
-
-      db_query("CREATE TABLE {boxes} (
-        bid serial,
-        body text,
-        info varchar(128) NOT NULL default '',
-        format smallint NOT NULL default '0',
-        PRIMARY KEY (bid),
-        UNIQUE (info)
-      )");
-
-      db_query("CREATE TABLE {cache} (
-        cid varchar(255) NOT NULL default '',
-        data bytea,
-        expire int NOT NULL default '0',
-        created int NOT NULL default '0',
-        headers text,
-        serialized smallint NOT NULL default '0',
-        PRIMARY KEY (cid)
-      )");
-      db_query("CREATE TABLE {cache_filter} (
-        cid varchar(255) NOT NULL default '',
-        data bytea,
-        expire int NOT NULL default '0',
-        created int NOT NULL default '0',
-        headers text,
-        serialized smallint NOT NULL default '0',
-        PRIMARY KEY (cid)
-      )");
-      db_query("CREATE TABLE {cache_page} (
-        cid varchar(255) NOT NULL default '',
-        data bytea,
-        expire int NOT NULL default '0',
-        created int NOT NULL default '0',
-        headers text,
-        serialized smallint NOT NULL default '0',
-        PRIMARY KEY (cid)
-      )");
-      db_query("CREATE TABLE {cache_form} (
-        cid varchar(255) NOT NULL default '',
-        data bytea,
-        expire int NOT NULL default '0',
-        created int NOT NULL default '0',
-        headers text,
-        serialized smallint NOT NULL default '0',
-        PRIMARY KEY (cid)
-      )");
-      db_query("CREATE INDEX {cache}_expire_idx ON {cache} (expire)");
-      db_query("CREATE INDEX {cache_filter}_expire_idx ON {cache_filter} (expire)");
-      db_query("CREATE INDEX {cache_page}_expire_idx ON {cache_page} (expire)");
-      db_query("CREATE INDEX {cache_form}_expire_idx ON {cache_form} (expire)");
-
-      db_query("CREATE TABLE {comments} (
-        cid serial,
-        pid int NOT NULL default '0',
-        nid int NOT NULL default '0',
-        uid int NOT NULL default '0',
-        subject varchar(64) NOT NULL default '',
-        comment text NOT NULL,
-        hostname varchar(128) NOT NULL default '',
-        timestamp int NOT NULL default '0',
-        score int NOT NULL default '0',
-        status smallint_unsigned NOT NULL default '0',
-        format smallint NOT NULL default '0',
-        thread varchar(255) NOT NULL,
-        users text,
-        name varchar(60) default NULL,
-        mail varchar(64) default NULL,
-        homepage varchar(255) default NULL,
-        PRIMARY KEY (cid)
-      )");
-      db_query("CREATE INDEX {comments}_nid_idx ON {comments} (nid)");
-      db_query("CREATE INDEX {comments}_status_idx ON {comments} (status)");
-
-      db_query("CREATE TABLE {node_comment_statistics} (
-        nid serial CHECK (nid >= 0),
-        last_comment_timestamp int NOT NULL default '0',
-        last_comment_name varchar(60) default NULL,
-        last_comment_uid int NOT NULL default '0',
-        comment_count int_unsigned NOT NULL default '0',
-        PRIMARY KEY (nid)
-      )");
-      db_query("CREATE INDEX {node_comment_statistics}_node_comment_timestamp_idx ON {node_comment_statistics} (last_comment_timestamp)");
-
-      db_query("CREATE TABLE {files} (
-        fid serial CHECK (fid >= 0),
-        nid int_unsigned NOT NULL default 0,
-        filename varchar(255) NOT NULL default '',
-        filepath varchar(255) NOT NULL default '',
-        filemime varchar(255) NOT NULL default '',
-        filesize int_unsigned NOT NULL default 0,
-        PRIMARY KEY (fid)
-      )");
-      db_query("CREATE INDEX {files}_nid_idx ON {files} (nid)");
-
-      db_query("CREATE TABLE {file_revisions} (
-        fid int_unsigned NOT NULL default 0,
-        vid int_unsigned NOT NULL default 0,
-        description varchar(255) NOT NULL default '',
-        list smallint_unsigned NOT NULL default 0,
-        PRIMARY KEY (fid, vid)
-      )");
-      db_query("CREATE INDEX {file_revisions}_vid_idx ON {file_revisions} (vid)");
-
-      db_query("CREATE TABLE {filter_formats} (
-        format serial,
-        name varchar(255) NOT NULL default '',
-        roles varchar(255) NOT NULL default '',
-        cache smallint NOT NULL default '0',
-        PRIMARY KEY (format),
-        UNIQUE (name)
-      )");
-
-      db_query("CREATE TABLE {filters} (
-        fid serial,
-        format int NOT NULL default '0',
-        module varchar(64) NOT NULL default '',
-        delta smallint DEFAULT '0' NOT NULL,
-        weight smallint DEFAULT '0' NOT NULL,
-        PRIMARY KEY (fid)
-      )");
-      db_query("CREATE INDEX {filters}_weight_idx ON {filters} (weight)");
-
-      db_query("CREATE TABLE {flood} (
-        fid serial,
-        event varchar(64) NOT NULL default '',
-        hostname varchar(128) NOT NULL default '',
-        timestamp int NOT NULL default '0',
-        PRIMARY KEY (fid)
-      )");
-
-      db_query("CREATE TABLE {history} (
-        uid int NOT NULL default '0',
-        nid int NOT NULL default '0',
-        timestamp int NOT NULL default '0',
-        PRIMARY KEY (uid,nid)
-      )");
-
-      db_query("CREATE TABLE {menu_router} (
-        path varchar(255) NOT NULL default '',
-        load_functions varchar(255) NOT NULL default '',
-        to_arg_functions varchar(255) NOT NULL default '',
-        access_callback varchar(255) NOT NULL default '',
-        access_arguments text,
-        page_callback varchar(255) NOT NULL default '',
-        page_arguments text,
-        fit int NOT NULL default 0,
-        number_parts int NOT NULL default 0,
-        tab_parent varchar(255) NOT NULL default '',
-        tab_root varchar(255) NOT NULL default '',
-        title varchar(255) NOT NULL default '',
-        title_callback varchar(255) NOT NULL default '',
-        title_arguments varchar(255) NOT NULL default '',
-        type int NOT NULL default 0,
-        block_callback varchar(255) NOT NULL default '',
-        description varchar(255) NOT NULL default '',
-        position varchar(255) NOT NULL default '',
-        weight int NOT NULL default 0,
-        PRIMARY KEY (path)
-      )");
-      db_query("CREATE INDEX {menu_router}_fit_idx ON {menu_router} (fit)");
-      db_query("CREATE INDEX {menu_router}_tab_parent_idx ON {menu_router} (tab_parent)");
-
-      db_query("CREATE TABLE {menu_links} (
-        menu_name varchar(64) NOT NULL default '',
-        mlid serial,
-        plid int NOT NULL default '0',
-        href varchar(255) NOT NULL default '',
-        router_path varchar(255) NOT NULL default '',
-        hidden smallint NOT NULL default '0',
-        external smallint NOT NULL default '0',
-        has_children int NOT NULL default '0',
-        expanded smallint NOT NULL default '0',
-        weight int NOT NULL default '0',
-        depth int NOT NULL default '0',
-        p1 int NOT NULL default '0',
-        p2 int NOT NULL default '0',
-        p3 int NOT NULL default '0',
-        p4 int NOT NULL default '0',
-        p5 int NOT NULL default '0',
-        p6 int NOT NULL default '0',
-        module varchar(255) NOT NULL default 'system',
-        link_title varchar(255) NOT NULL default '',
-        options text,
-        PRIMARY KEY (mlid)
-      )");
-      db_query("CREATE INDEX {menu_links}_parents_idx ON {menu_links} (plid, p1, p2, p3, p4, p5)");
-      db_query("CREATE INDEX {menu_links}_menu_name_idx ON {menu_links} (menu_name, href)");
-      db_query("CREATE INDEX {menu_links}_expanded_children_idx ON {menu_links} (expanded, has_children)");
-
-      db_query("CREATE TABLE {node} (
-        nid serial CHECK (nid >= 0),
-        vid int_unsigned NOT NULL default '0',
-        type varchar(32) NOT NULL default '',
-        language varchar(12) NOT NULL default '',
-        title varchar(128) NOT NULL default '',
-        uid int NOT NULL default '0',
-        status int NOT NULL default '1',
-        created int NOT NULL default '0',
-        changed int NOT NULL default '0',
-        comment int NOT NULL default '0',
-        promote int NOT NULL default '0',
-        moderate int NOT NULL default '0',
-        sticky int NOT NULL default '0',
-        PRIMARY KEY (nid),
-        UNIQUE (nid, vid),
-        UNIQUE (vid)
-      )");
-      db_query("CREATE INDEX {node}_node_type_idx ON {node} (substr (type, 1, 4))");
-      db_query("CREATE INDEX {node}_node_title_type_idx ON {node} (title, substr(type, 1, 4))");
-      db_query("CREATE INDEX {node}_status_idx ON {node} (status)");
-      db_query("CREATE INDEX {node}_uid_idx ON {node} (uid)");
-      db_query("CREATE INDEX {node}_node_moderate_idx ON {node} (moderate)");
-      db_query("CREATE INDEX {node}_node_promote_status_idx ON {node} (promote, status)");
-      db_query("CREATE INDEX {node}_node_created_idx ON {node} (created)");
-      db_query("CREATE INDEX {node}_node_changed_idx ON {node} (changed)");
-      db_query("CREATE INDEX {node}_node_status_type_idx ON {node} (status, type, nid)");
-      db_query("CREATE INDEX {node}_nid_idx ON {node} (nid)");
-
-      db_query("CREATE TABLE {node_access} (
-        nid int_unsigned NOT NULL default '0',
-        gid int_unsigned NOT NULL default '0',
-        realm varchar(255) NOT NULL default '',
-        grant_view smallint_unsigned NOT NULL default '0',
-        grant_update smallint_unsigned NOT NULL default '0',
-        grant_delete smallint_unsigned NOT NULL default '0',
-        PRIMARY KEY (nid,gid,realm)
-      )");
-
-      db_query("CREATE TABLE {node_revisions} (
-        nid int_unsigned NOT NULL,
-        vid serial CHECK (vid >= 0),
-        uid int NOT NULL default '0',
-        title varchar(128) NOT NULL default '',
-        body text NOT NULL default '',
-        teaser text NOT NULL default '',
-        log text NOT NULL default '',
-        timestamp int NOT NULL default '0',
-        format int NOT NULL default '0',
-        PRIMARY KEY (vid)
-      )");
-      db_query("CREATE INDEX {node_revisions}_nid_idx ON {node_revisions} (nid)");
-      db_query("CREATE INDEX {node_revisions}_uid_idx ON {node_revisions} (uid)");
-
-      db_query("CREATE TABLE {node_type} (
-        type varchar(32) NOT NULL,
-        name varchar(255) NOT NULL default '',
-        module varchar(255) NOT NULL,
-        description text NOT NULL,
-        help text NOT NULL,
-        has_title smallint_unsigned NOT NULL,
-        title_label varchar(255) NOT NULL default '',
-        has_body smallint_unsigned NOT NULL,
-        body_label varchar(255) NOT NULL default '',
-        min_word_count smallint_unsigned NOT NULL,
-        custom smallint NOT NULL DEFAULT '0',
-        modified smallint NOT NULL DEFAULT '0',
-        locked smallint NOT NULL DEFAULT '0',
-        orig_type varchar(255) NOT NULL default '',
-        PRIMARY KEY (type)
-      )");
-
-      db_query("CREATE TABLE {url_alias} (
-        pid serial CHECK (pid >= 0),
-        src varchar(128) NOT NULL default '',
-        dst varchar(128) NOT NULL default '',
-        language varchar(12) NOT NULL default '',
-        PRIMARY KEY (pid)
-      )");
-      db_query("CREATE INDEX {url_alias}_src_idx ON {url_alias} (src)");
-      db_query("CREATE UNIQUE INDEX {url_alias}_dst_language_idx ON {url_alias} (dst, language)");
-
-      db_query("CREATE TABLE {permission} (
-        pid serial,
-        rid int_unsigned NOT NULL default '0',
-        perm text,
-        tid int_unsigned NOT NULL default '0',
-        PRIMARY KEY (pid)
-      )");
-      db_query("CREATE INDEX {permission}_rid_idx ON {permission} (rid)");
-
-      db_query("CREATE TABLE {role} (
-        rid serial CHECK (rid >= 0),
-        name varchar(64) NOT NULL default '',
-        PRIMARY KEY (rid),
-        UNIQUE (name)
-      )");
-
-      db_query("CREATE TABLE {blocks_roles} (
-        module varchar(64) NOT NULL,
-        delta varchar(32) NOT NULL,
-        rid int_unsigned NOT NULL,
-        PRIMARY KEY (module, delta, rid)
-      )");
-
-      db_query("CREATE TABLE {sessions} (
-        uid int_unsigned NOT NULL,
-        sid varchar(64) NOT NULL default '',
-        hostname varchar(128) NOT NULL default '',
-        timestamp int NOT NULL default '0',
-        cache int NOT NULL default '0',
-        session text,
-        PRIMARY KEY (sid)
-      )");
-      db_query("CREATE INDEX {sessions}_uid_idx ON {sessions} (uid)");
-      db_query("CREATE INDEX {sessions}_timestamp_idx ON {sessions} (timestamp)");
-
-/* Only used for MySQL
-      db_query("CREATE TABLE {sequences} (
-        name varchar(255) NOT NULL default '',
-        id int_unsigned NOT NULL default '0',
-        PRIMARY KEY (name)
-      )"); */
-
-      db_query("CREATE TABLE {node_counter} (
-        nid int NOT NULL default '0',
-        totalcount bigint_unsigned NOT NULL default '0',
-        daycount int_unsigned NOT NULL default '0',
-        timestamp int_unsigned NOT NULL default '0',
-        PRIMARY KEY (nid)
-      )");
-
-      db_query("CREATE TABLE {system} (
-        filename varchar(255) NOT NULL default '',
-        name varchar(255) NOT NULL default '',
-        type varchar(255) NOT NULL default '',
-        owner varchar(255) NOT NULL default '',
-        status int NOT NULL default '0',
-        throttle smallint DEFAULT '0' NOT NULL,
-        bootstrap int NOT NULL default '0',
-        schema_version smallint NOT NULL default -1,
-        weight int NOT NULL default '0',
-        info text,
-        PRIMARY KEY (filename)
-      )");
-      db_query("CREATE INDEX {system}_weight_idx ON {system} (weight)");
-
-      db_query("CREATE TABLE {term_data} (
-        tid serial CHECK (tid >= 0),
-        vid int_unsigned NOT NULL default '0',
-        name varchar(255) NOT NULL default '',
-        description text,
-        weight smallint NOT NULL default '0',
-        PRIMARY KEY (tid)
-      )");
-      db_query("CREATE INDEX {term_data}_vid_idx ON {term_data} (vid)");
-
-      db_query("CREATE TABLE {term_hierarchy} (
-        tid int_unsigned NOT NULL default '0',
-        parent int_unsigned NOT NULL default '0',
-        PRIMARY KEY (tid, parent)
-      )");
-      db_query("CREATE INDEX {term_hierarchy}_tid_idx ON {term_hierarchy} (tid)");
-      db_query("CREATE INDEX {term_hierarchy}_parent_idx ON {term_hierarchy} (parent)");
-
-      db_query("CREATE TABLE {term_node} (
-        nid int_unsigned NOT NULL default '0',
-        vid int_unsigned NOT NULL default '0',
-        tid int_unsigned NOT NULL default '0',
-        PRIMARY KEY (tid,nid,vid)
-      )");
-      db_query("CREATE INDEX {term_node}_nid_idx ON {term_node} (nid)");
-      db_query("CREATE INDEX {term_node}_vid_idx ON {term_node} (vid)");
-      db_query("CREATE INDEX {term_node}_tid_idx ON {term_node} (tid)");
-
-      db_query("CREATE TABLE {term_relation} (
-        trid serial,
-        tid1 int_unsigned NOT NULL default '0',
-        tid2 int_unsigned NOT NULL default '0',
-        PRIMARY KEY (trid)
-      )");
-      db_query("CREATE INDEX {term_relation}_tid1_idx ON {term_relation} (tid1)");
-      db_query("CREATE INDEX {term_relation}_tid2_idx ON {term_relation} (tid2)");
-
-      db_query("CREATE TABLE {term_synonym} (
-        tsid serial,
-        tid int_unsigned NOT NULL default '0',
-        name varchar(255) NOT NULL default '',
-        PRIMARY KEY (tsid)
-      )");
-      db_query("CREATE INDEX {term_synonym}_tid_idx ON {term_synonym} (tid)");
-      db_query("CREATE INDEX {term_synonym}_name_idx ON {term_synonym} (substr(name, 1, 3))");
-
-      db_query("CREATE TABLE {users} (
-        uid serial CHECK (uid >= 0),
-        name varchar(60) NOT NULL default '',
-        pass varchar(32) NOT NULL default '',
-        mail varchar(64) default '',
-        mode smallint NOT NULL default '0',
-        sort smallint default '0',
-        threshold smallint default '0',
-        theme varchar(255) NOT NULL default '',
-        signature varchar(255) NOT NULL default '',
-        created int NOT NULL default '0',
-        access int NOT NULL default '0',
-        login int NOT NULL default '0',
-        status smallint NOT NULL default '0',
-        timezone varchar(8) default NULL,
-        language varchar(12) NOT NULL default '',
-        picture varchar(255) NOT NULL DEFAULT '',
-        init varchar(64) default '',
-        data text,
-        PRIMARY KEY (uid),
-        UNIQUE (name)
-      )");
-      db_query("CREATE INDEX {users}_access_idx ON {users} (access)");
-      db_query("CREATE INDEX {users}_created_idx ON {users} (created)");
-
-      db_query("CREATE TABLE {users_roles} (
-        uid int_unsigned NOT NULL default '0',
-        rid int_unsigned NOT NULL default '0',
-        PRIMARY KEY (uid, rid)
-      )");
-
-      db_query("CREATE TABLE {variable} (
-        name varchar(128) NOT NULL default '',
-        value text NOT NULL,
-        language varchar(12) NOT NULL default '',
-        PRIMARY KEY (name, language)
-      )");
-
-      db_query("CREATE TABLE {vocabulary} (
-        vid serial CHECK (vid >= 0),
-        name varchar(255) NOT NULL default '',
-        description text,
-        help varchar(255) NOT NULL default '',
-        relations smallint_unsigned NOT NULL default '0',
-        hierarchy smallint_unsigned NOT NULL default '0',
-        multiple smallint_unsigned NOT NULL default '0',
-        required smallint_unsigned NOT NULL default '0',
-        tags smallint_unsigned NOT NULL default '0',
-        module varchar(255) NOT NULL default '',
-        weight smallint NOT NULL default '0',
-        PRIMARY KEY (vid)
-      )");
-
-      db_query("CREATE TABLE {vocabulary_node_types} (
-        vid int_unsigned NOT NULL DEFAULT '0',
-        type varchar(32) NOT NULL DEFAULT '',
-        PRIMARY KEY (vid, type)
-      )");
-
       break;
   }
 
+  // Create tables.
+  $modules = array('system', 'filter', 'block', 'user', 'node', 'comment', 'taxonomy');
+  foreach ($modules as $module) {
+    drupal_install_schema($module);
+  }
+
   // Load system theme data appropriately.
   system_theme_data();
 
@@ -4033,6 +3089,162 @@ function system_update_6016() {
 }
 
 /**
+ * Reconcile small differences in the previous, manually created mysql
+ * and pgsql schemas so the are the same and can be represented by a
+ * single schema structure.
+ *
+ * Note that the mysql and pgsql cases make different changes.  This
+ * is because each schema needs to be tweaked in different ways to
+ * comform to the new schema structure.  Also, since they operate on
+ * tables defined by many optional core modules which may not ever
+ * have been installed, they must test each table for existence.  If
+ * the modules are first installed after this update exists the tables
+ * will be created from the schema structure and will start out
+ * correct.
+ */
+function system_update_6017() {
+  $ret = array();
+
+  switch ($GLOBALS['db_type']) {
+    case 'pgsql':
+      // remove default ''
+      if (db_table_exists('aggregator_feed')) {
+        db_field_set_no_default($ret, 'aggregator_feed', 'description');
+        db_field_set_no_default($ret, 'aggregator_feed', 'image');
+      }
+      db_field_set_no_default($ret, 'blocks', 'pages');
+      if (db_table_exists('contact')) {
+        db_field_set_no_default($ret, 'contact', 'recipients');
+        db_field_set_no_default($ret, 'contact', 'reply');
+      }
+      db_field_set_no_default($ret, 'watchdog', 'location');
+      db_field_set_no_default($ret, 'node_revisions', 'body');
+      db_field_set_no_default($ret, 'node_revisions', 'teaser');
+      db_field_set_no_default($ret, 'node_revisions', 'log');
+
+      // update from pgsql 'float' (which means 'double precision') to
+      // schema 'float' (which in pgsql means 'real')
+      if (db_table_exists('search_index')) {
+        db_update_field($ret, 'search_index', 'score');
+      }
+      if (db_table_exists('search_total')) {
+        db_update_field($ret, 'search_total', 'count');
+      }
+      
+      // fix index menu.pid: pgsql code incorrectly had it on parent, not pid
+      if (db_table_exists('menu')) {
+        db_drop_index($ret, 'menu', 'pid');
+        db_add_index($ret, 'menu', 'pid', array('pid'));
+      }
+
+      // Replace unique index dst_language with a unique constraint.  The
+      // result is the same but the unique key fits our current schema
+      // structure.  Also, the postgres documentation implies that
+      // unique constraints are preferable to unique indexes.  See
+      // http://www.postgresql.org/docs/8.2/interactive/indexes-unique.html.
+      if (db_table_exists('url_alias')) {
+        db_drop_index($ret, 'url_alias', 'dst_language');
+        db_add_unique_key($ret, 'url_alias', 'dst_language',
+          array('dst', 'language'));
+      }
+
+      // fix term_node pkey: mysql and pgsql code had different orders
+      if (db_table_exists('term_node')) {
+        db_drop_primary_key($ret, 'term_node');
+        db_add_primary_key($ret, 'term_node', array('vid', 'tid', 'nid'));
+      }
+
+      // remove defaults on batch columns
+      if (db_table_exists('batch')) {
+        db_field_set_no_default($ret, 'batch', 'token');
+        db_field_set_no_default($ret, 'batch', 'timestamp');
+      }
+
+      // fix index locales_source.source
+      if (db_table_exists('locales_source')) {
+        db_drop_index($ret, 'locales_source', 'source');
+        db_add_index($ret, 'locales_source', 'source',
+          array(array('source', 30)));
+      }
+
+      // rename index menu_name to menu_name_path
+      if (db_table_exists('menu_links')) {
+        db_drop_index($ret, 'menu_links', 'menu_name');
+        db_add_index($ret, 'menu_links', 'menu_name_path', 
+          array('menu_name', 'href'));
+      }
+
+      // rename unique key node.nid to node.nid_vid
+      db_drop_unique_key($ret, 'node', 'nid');
+      db_add_unique_key($ret, 'node', 'nid_vid', array('nid', 'vid'));
+
+      break;
+
+    case 'mysql':
+    case 'mysqli':
+      // rename key 'link' to 'url'
+      if (db_table_exists('aggregator_feed')) {
+        db_drop_unique_key($ret, 'aggregator_feed', 'link');
+        db_add_unique_key($ret, 'aggregator_feed', 'url', array('url'));
+      }
+
+      // change to size => small
+      if (db_table_exists('boxes')) {
+        db_update_field($ret, 'boxes', 'format');
+      }
+      
+      // change to size => small
+      // rename index 'lid' to 'nid'
+      if (db_table_exists('comments')) {
+        db_update_field($ret, 'comments', 'format');
+        db_drop_index($ret, 'comments', 'lid');
+        db_add_index($ret, 'comments', 'nid', array('nid'));
+      }
+
+      // rename index 'lang' to 'language'
+      if (db_table_exists('locales_target')) {
+        db_drop_index($ret, 'locales_target', 'lang');
+        db_add_index($ret, 'locales_target', 'language', array('language'));
+      }
+
+      // change to size => small
+      db_update_field($ret, 'cache', 'serialized');
+      db_update_field($ret, 'cache_filter', 'serialized');
+      db_update_field($ret, 'cache_page', 'serialized');
+      db_update_field($ret, 'cache_form', 'serialized');
+      
+      // remove default => 0, set auto increment
+      db_update_field($ret, 'files', 'fid');
+      
+      // remove default => 0, set auto increment
+      $ret[] = update_sql("SET sql_mode = 'NO_AUTO_VALUE_ON_ZERO'");
+      db_update_field($ret, 'users', 'uid');
+
+      // set auto increment
+      db_update_field($ret, 'node_revisions', 'vid');
+
+      // set auto increment
+      db_update_field($ret, 'boxes', 'bid');
+      
+      // set auto increment
+      db_update_field($ret, 'menu_links', 'mlid');
+
+      // set auto increment, unsigned
+      db_update_field($ret, 'batch', 'bid');
+
+      // rename index menu_expanded_children to expanded_children
+      db_drop_index($ret, 'menu_links', 'menu_expanded_children');
+      db_add_index($ret, 'menu_links', 'expanded_children', 
+        array('expanded', 'has_children'));
+      
+      break;
+  }
+
+  return $ret;
+}
+
+
+/**
  * @} End of "defgroup updates-5.x-to-6.x"
  * The next series of updates should start at 7000.
  */
Index: modules/system/system.schema
===================================================================
RCS file: modules/system/system.schema
diff -N modules/system/system.schema
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ modules/system/system.schema	17 May 2007 16:18:09 -0000
@@ -0,0 +1,213 @@
+<?php
+// $Id: $
+
+function system_schema() {
+  $schema['authmap'] = array(
+    'fields' => array(
+      'aid'      => array('type' => 'serial', 'disp_width' => 10, 'unsigned' => TRUE, 'not null' => TRUE),
+      'uid'      => array('type' => 'int', 'not null' => TRUE, 'default' => 0),
+      'authname' => array('type' => 'varchar', 'length' => 128, 'not null' => TRUE, 'default' => ''),
+      'module'   => array('type' => 'varchar', 'length' => 128, 'not null' => TRUE, 'default' => '')
+    ),
+    'unique keys' => array('authname' => array('authname')),
+    'primary key' => array('aid'),
+  );
+
+  $schema['batch'] = array(
+    'fields' => array(
+      'bid'       => array('type' => 'serial', 'unsigned' => TRUE, 'not null' => TRUE),
+      'token'     => array('type' => 'varchar', 'length' => 64, 'not null' => TRUE),
+      'timestamp' => array('type' => 'int', 'not null' => TRUE),
+      'batch'     => array('type' => 'text', 'not null' => FALSE, 'size' => 'big')
+    ),
+    'primary key' => array('bid'),
+    'indexes' => array('token' => array('token')),
+  );
+
+  $schema['cache'] = array(
+    'fields' => array(
+      'cid'        => array('type' => 'varchar', 'length' => 255, 'not null' => TRUE, 'default' => ''),
+      'data'       => array('type' => 'blob', 'not null' => FALSE, 'size' => 'big'),
+      'expire'     => array('type' => 'int', 'not null' => TRUE, 'default' => 0),
+      'created'    => array('type' => 'int', 'not null' => TRUE, 'default' => 0),
+      'headers'    => array('type' => 'text', 'not null' => FALSE),
+      'serialized' => array('type' => 'int', 'size' => 'small', 'disp_width' => 1, 'not null' => TRUE, 'default' => 0)
+    ),
+    'indexes' => array('expire' => array('expire')),
+    'primary key' => array('cid'),
+  );
+  
+
+  $schema['cache_filter'] = $schema['cache'];
+  $schema['cache_form'] = $schema['cache'];
+  $schema['cache_menu'] = $schema['cache'];
+  $schema['cache_page'] = $schema['cache'];
+
+  $schema['files'] = array(
+    'fields' => array(
+      'fid'      => array('type' => 'serial', 'disp_width' => 10, 'unsigned' => TRUE, 'not null' => TRUE),
+      'nid'      => array('type' => 'int', 'disp_width' => 10, 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0),
+      'filename' => array('type' => 'varchar', 'length' => 255, 'not null' => TRUE, 'default' => ''),
+      'filepath' => array('type' => 'varchar', 'length' => 255, 'not null' => TRUE, 'default' => ''),
+      'filemime' => array('type' => 'varchar', 'length' => 255, 'not null' => TRUE, 'default' => ''),
+      'filesize' => array('type' => 'int', 'disp_width' => 10, 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0)
+    ),
+    'indexes' => array('nid' => array('nid')),
+    'primary key' => array('fid'),
+  );
+
+  $schema['file_revisions'] = array(
+    'fields' => array(
+      'fid'         => array('type' => 'int', 'disp_width' => 10, 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0),
+      'vid'         => array('type' => 'int', 'disp_width' => 10, 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0),
+      'description' => array('type' => 'varchar', 'length' => 255, 'not null' => TRUE, 'default' => ''),
+      'list'        => array('type' => 'int', 'disp_width' => 3, 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0, 'size' => 'tiny')
+    ),
+    'primary key' => array('fid', 'vid'),
+    'indexes' => array('vid' => array('vid')),
+  );
+
+  $schema['flood'] = array(
+    'fields' => array(
+      'fid'       => array('type' => 'serial', 'not null' => TRUE),
+      'event'     => array('type' => 'varchar', 'length' => 64, 'not null' => TRUE, 'default' => ''),
+      'hostname'  => array('type' => 'varchar', 'length' => 128, 'not null' => TRUE, 'default' => ''),
+      'timestamp' => array('type' => 'int', 'not null' => TRUE, 'default' => 0)
+    ),
+    'primary key' => array('fid'),
+  );
+
+  $schema['history'] = array(
+    'fields' => array(
+      'uid'       => array('type' => 'int', 'not null' => TRUE, 'default' => 0),
+      'nid'       => array('type' => 'int', 'not null' => TRUE, 'default' => 0),
+      'timestamp' => array('type' => 'int', 'not null' => TRUE, 'default' => 0)
+    ),
+    'primary key' => array('uid', 'nid'),
+  );
+  
+  $schema['menu_router'] = array(
+    'fields' => array(
+      'path'             => array('type' => 'varchar', 'length' => 255, 'not null' => TRUE, 'default' => ''),
+      'load_functions'   => array('type' => 'varchar', 'length' => 255, 'not null' => TRUE, 'default' => ''),
+      'to_arg_functions' => array('type' => 'varchar', 'length' => 255, 'not null' => TRUE, 'default' => ''),
+      'access_callback'  => array('type' => 'varchar', 'length' => 255, 'not null' => TRUE, 'default' => ''),
+      'access_arguments' => array('type' => 'text', 'not null' => FALSE),
+      'page_callback'    => array('type' => 'varchar', 'length' => 255, 'not null' => TRUE, 'default' => ''),
+      'page_arguments'   => array('type' => 'text', 'not null' => FALSE),
+      'fit'              => array('type' => 'int', 'not null' => TRUE, 'default' => 0),
+      'number_parts'     => array('type' => 'int', 'not null' => TRUE, 'default' => 0),
+      'tab_parent'       => array('type' => 'varchar', 'length' => 255, 'not null' => TRUE, 'default' => ''),
+      'tab_root'         => array('type' => 'varchar', 'length' => 255, 'not null' => TRUE, 'default' => ''),
+      'title'            => array('type' => 'varchar', 'length' => 255, 'not null' => TRUE, 'default' => ''),
+      'title_callback'   => array('type' => 'varchar', 'length' => 255, 'not null' => TRUE, 'default' => ''),
+      'title_arguments'  => array('type' => 'varchar', 'length' => 255, 'not null' => TRUE, 'default' => ''),
+      'type'             => array('type' => 'int', 'not null' => TRUE, 'default' => 0),
+      'block_callback'   => array('type' => 'varchar', 'length' => 255, 'not null' => TRUE, 'default' => ''),
+      'description'      => array('type' => 'varchar', 'length' => 255, 'not null' => TRUE, 'default' => ''),
+      'position'         => array('type' => 'varchar', 'length' => 255, 'not null' => TRUE, 'default' => ''),
+      'weight'           => array('type' => 'int', 'not null' => TRUE, 'default' => 0)
+    ),
+    'indexes' => array(
+      'fit'        => array('fit'),
+      'tab_parent' => array('tab_parent')
+    ),
+    'primary key' => array('path'),
+  );
+
+  $schema['menu_links'] = array(
+    'fields' => array(
+      'menu_name'    => array('type' => 'varchar', 'length' => 64, 'not null' => TRUE, 'default' => ''),
+      'mlid'         => array('type' => 'serial', 'not null' => TRUE),
+      'plid'         => array('type' => 'int', 'not null' => TRUE, 'default' => 0),
+      'href'         => array('type' => 'varchar', 'length' => 255, 'not null' => TRUE, 'default' => ''),
+      'router_path'  => array('type' => 'varchar', 'length' => 255, 'not null' => TRUE, 'default' => ''),
+      'hidden'       => array('type' => 'int', 'disp_width' => 6, 'not null' => TRUE, 'default' => 0, 'size' => 'small'),
+      'external'     => array('type' => 'int', 'disp_width' => 6, 'not null' => TRUE, 'default' => 0, 'size' => 'small'),
+      'has_children' => array('type' => 'int', 'not null' => TRUE, 'default' => 0),
+      'expanded'     => array('type' => 'int', 'disp_width' => 6, 'not null' => TRUE, 'default' => 0, 'size' => 'small'),
+      'weight'       => array('type' => 'int', 'not null' => TRUE, 'default' => 0),
+      'depth'        => array('type' => 'int', 'not null' => TRUE, 'default' => 0),
+      'p1'           => array('type' => 'int', 'not null' => TRUE, 'default' => 0),
+      'p2'           => array('type' => 'int', 'not null' => TRUE, 'default' => 0),
+      'p3'           => array('type' => 'int', 'not null' => TRUE, 'default' => 0),
+      'p4'           => array('type' => 'int', 'not null' => TRUE, 'default' => 0),
+      'p5'           => array('type' => 'int', 'not null' => TRUE, 'default' => 0),
+      'p6'           => array('type' => 'int', 'not null' => TRUE, 'default' => 0),
+      'module'       => array('type' => 'varchar', 'length' => 255, 'not null' => TRUE, 'default' => 'system'),
+      'link_title'   => array('type' => 'varchar', 'length' => 255, 'not null' => TRUE, 'default' => ''),
+      'options'      => array('type' => 'text', 'not null' => FALSE)
+    ),
+    'indexes' => array(
+      'expanded_children' => array('expanded', 'has_children'),
+      'menu_name_path' => array('menu_name', 'href'),
+      'parents' => array('plid', 'p1', 'p2', 'p3', 'p4', 'p5')
+    ),
+    'primary key' => array('mlid'),
+  );
+  
+  $schema['sequences'] = array(
+    'fields' => array(
+      'name' => array('type' => 'varchar', 'length' => 255, 'not null' => TRUE, 'default' => ''),
+      'id'   => array('type' => 'int', 'disp_width' => 10, 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0)
+    ),
+    'primary key' => array('name'),
+  );
+
+  $schema['sessions'] = array(
+    'fields' => array(
+      'uid'       => array('type' => 'int', 'disp_width' => 10, 'unsigned' => TRUE, 'not null' => TRUE),
+      'sid'       => array('type' => 'varchar', 'length' => 64, 'not null' => TRUE, 'default' => ''),
+      'hostname'  => array('type' => 'varchar', 'length' => 128, 'not null' => TRUE, 'default' => ''),
+      'timestamp' => array('type' => 'int', 'not null' => TRUE, 'default' => 0),
+      'cache'     => array('type' => 'int', 'not null' => TRUE, 'default' => 0),
+      'session'   => array('type' => 'text', 'not null' => FALSE, 'size' => 'big')
+    ),
+    'primary key' => array('sid'),
+    'indexes' => array(
+      'timestamp' => array('timestamp'),
+      'uid'       => array('uid')
+    ),
+  );
+
+  $schema['system'] = array(
+    'fields' => array(
+      'filename'       => array('type' => 'varchar', 'length' => 255, 'not null' => TRUE, 'default' => ''),
+      'name'           => array('type' => 'varchar', 'length' => 255, 'not null' => TRUE, 'default' => ''),
+      'type'           => array('type' => 'varchar', 'length' => 255, 'not null' => TRUE, 'default' => ''),
+      'owner'          => array('type' => 'varchar', 'length' => 255, 'not null' => TRUE, 'default' => ''),
+      'status'         => array('type' => 'int', 'not null' => TRUE, 'default' => 0),
+      'throttle'       => array('type' => 'int', 'disp_width' => 4, 'not null' => TRUE, 'default' => 0, 'size' => 'tiny'),
+      'bootstrap'      => array('type' => 'int', 'not null' => TRUE, 'default' => 0),
+      'schema_version' => array('type' => 'int', 'disp_width' => 6, 'not null' => TRUE, 'default' => -1, 'size' => 'small'),
+      'weight'         => array('type' => 'int', 'not null' => TRUE, 'default' => 0),
+      'info'           => array('type' => 'text', 'not null' => FALSE)
+    ),
+    'primary key' => array('filename'),
+    'indexes' => array('weight' => array('weight')),
+  );
+  
+  $schema['url_alias'] = array(
+    'fields' => array(
+      'pid'      => array('type' => 'serial', 'disp_width' => 10, 'unsigned' => TRUE, 'not null' => TRUE),
+      'src'      => array('type' => 'varchar', 'length' => 128, 'not null' => TRUE, 'default' => ''),
+      'dst'      => array('type' => 'varchar', 'length' => 128, 'not null' => TRUE, 'default' => ''),
+      'language' => array('type' => 'varchar', 'length' => 12, 'not null' => TRUE, 'default' => '')
+    ),
+    'unique keys' => array('dst_language' => array('dst', 'language')),
+    'primary key' => array('pid'),
+    'indexes' => array('src' => array('src')),
+  );
+
+  $schema['variable'] = array(
+    'fields' => array(
+      'name'     => array('type' => 'varchar', 'length' => 128, 'not null' => TRUE, 'default' => ''),
+      'value'    => array('type' => 'text', 'not null' => TRUE, 'size' => 'big'),
+      'language' => array('type' => 'varchar', 'length' => 12, 'not null' => TRUE, 'default' => '')
+    ),
+    'primary key' => array('name', 'language'),
+  );
+
+  return $schema;
+}
+
Index: modules/block/block.schema
===================================================================
RCS file: modules/block/block.schema
diff -N modules/block/block.schema
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ modules/block/block.schema	17 May 2007 16:18:09 -0000
@@ -0,0 +1,49 @@
+<?php
+// $Id: $
+
+function block_schema() {
+  $schema['blocks'] = array(
+    'fields' => array(
+      'bid'        => array('type' => 'serial', 'not null' => TRUE),
+      'module'     => array('type' => 'varchar', 'length' => 64, 'not null' => TRUE, 'default' => ''),
+      'delta'      => array('type' => 'varchar', 'length' => 32, 'not null' => TRUE, 'default' => '0'),
+      'theme'      => array('type' => 'varchar', 'length' => 255, 'not null' => TRUE, 'default' => ''),
+      'status'     => array('type' => 'int', 'disp_width' => 4, 'not null' => TRUE, 'default' => 0, 'size' => 'tiny'),
+      'weight'     => array('type' => 'int', 'disp_width' => 4, 'not null' => TRUE, 'default' => 0, 'size' => 'tiny'),
+      'region'     => array('type' => 'varchar', 'length' => 64, 'not null' => TRUE, 'default' => 'left'),
+      'custom'     => array('type' => 'int', 'disp_width' => 4, 'not null' => TRUE, 'default' => 0, 'size' => 'tiny'),
+      'throttle'   => array('type' => 'int', 'disp_width' => 4, 'not null' => TRUE, 'default' => 0, 'size' => 'tiny'),
+      'visibility' => array('type' => 'int', 'disp_width' => 4, 'not null' => TRUE, 'default' => 0, 'size' => 'tiny'),
+      'pages'      => array('type' => 'text', 'not null' => TRUE),
+      'title'      => array('type' => 'varchar', 'length' => 64, 'not null' => TRUE, 'default' => '')
+    ),
+    'primary key' => array('bid'),
+  );
+
+  $schema['blocks_roles'] = array(
+    'fields' => array(
+      'module' => array('type' => 'varchar', 'length' => 64, 'not null' => TRUE),
+      'delta'  => array('type' => 'varchar', 'length' => 32, 'not null' => TRUE),
+      'rid'    => array('type' => 'int', 'disp_width' => 10, 'unsigned' => TRUE, 'not null' => TRUE)
+    ),
+    'primary key' => array(
+      'module',
+      'delta',
+      'rid'
+    ),
+  );
+
+  $schema['boxes'] = array(
+    'fields' => array(
+      'bid'    => array('type' => 'serial', 'not null' => TRUE),
+      'body'   => array('type' => 'text', 'not null' => FALSE, 'size' => 'big'),
+      'info'   => array('type' => 'varchar', 'length' => 128, 'not null' => TRUE, 'default' => ''),
+      'format' => array('type' => 'int', 'size' => 'small', 'not null' => TRUE, 'default' => 0)
+    ),
+    'unique keys' => array('info' => array('info')),
+    'primary key' => array('bid'),
+  );
+
+  return $schema;
+}
+
Index: modules/filter/filter.schema
===================================================================
RCS file: modules/filter/filter.schema
diff -N modules/filter/filter.schema
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ modules/filter/filter.schema	17 May 2007 16:18:09 -0000
@@ -0,0 +1,29 @@
+<?php
+// $Id: $
+
+function filter_schema() {
+  $schema['filters'] = array(
+    'fields' => array(
+      'fid'    => array('type' => 'serial', 'not null' => TRUE),
+      'format' => array('type' => 'int', 'not null' => TRUE, 'default' => 0),
+      'module' => array('type' => 'varchar', 'length' => 64, 'not null' => TRUE, 'default' => ''),
+      'delta'  => array('type' => 'int', 'disp_width' => 4, 'not null' => TRUE, 'default' => 0, 'size' => 'tiny'),
+      'weight' => array('type' => 'int', 'disp_width' => 4, 'not null' => TRUE, 'default' => 0, 'size' => 'tiny')
+    ),
+    'primary key' => array('fid'),
+    'indexes' => array('weight' => array('weight')),
+  );
+  $schema['filter_formats'] = array(
+    'fields' => array(
+      'format' => array('type' => 'serial', 'not null' => TRUE),
+      'name'   => array('type' => 'varchar', 'length' => 255, 'not null' => TRUE, 'default' => ''),
+      'roles'  => array('type' => 'varchar', 'length' => 255, 'not null' => TRUE, 'default' => ''),
+      'cache'  => array('type' => 'int', 'disp_width' => 4, 'not null' => TRUE, 'default' => 0, 'size' => 'tiny')
+    ),
+    'unique keys' => array('name' => array('name')),
+    'primary key' => array('format'),
+  );
+
+  return $schema;
+}
+
Index: modules/node/node.schema
===================================================================
RCS file: modules/node/node.schema
diff -N modules/node/node.schema
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ modules/node/node.schema	17 May 2007 16:18:09 -0000
@@ -0,0 +1,107 @@
+<?php
+// $Id: $
+
+function node_schema() {
+  $schema['node'] = array(
+    'fields' => array(
+      'nid'      => array('type' => 'serial', 'disp_width' => 10, 'unsigned' => TRUE, 'not null' => TRUE),
+      'vid'      => array('type' => 'int', 'disp_width' => 10, 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0),
+      'type'     => array('type' => 'varchar', 'length' => 32, 'not null' => TRUE, 'default' => ''),
+      'language' => array('type' => 'varchar', 'length' => 12, 'not null' => TRUE, 'default' => ''),
+      'title'    => array('type' => 'varchar', 'length' => 128, 'not null' => TRUE, 'default' => ''),
+      'uid'      => array('type' => 'int', 'not null' => TRUE, 'default' => 0),
+      'status'   => array('type' => 'int', 'not null' => TRUE, 'default' => 1),
+      'created'  => array('type' => 'int', 'not null' => TRUE, 'default' => 0),
+      'changed'  => array('type' => 'int', 'not null' => TRUE, 'default' => 0),
+      'comment'  => array('type' => 'int', 'not null' => TRUE, 'default' => 0),
+      'promote'  => array('type' => 'int', 'not null' => TRUE, 'default' => 0),
+      'moderate' => array('type' => 'int', 'not null' => TRUE, 'default' => 0),
+      'sticky'   => array('type' => 'int', 'not null' => TRUE, 'default' => 0)
+    ),
+    'indexes' => array(
+      'nid'                 => array('nid'),
+      'node_changed'        => array('changed'),
+      'node_created'        => array('created'),
+      'node_moderate'       => array('moderate'),
+      'node_promote_status' => array('promote', 'status'),
+      'node_status_type'    => array('status', 'type', 'nid'),
+      'node_title_type'     => array('title', array('type', 4)),
+      'node_type'           => array(array('type', 4)),
+      'status'              => array('status'),
+      'uid'                 => array('uid')
+    ),
+    'unique keys' => array(
+      'nid_vid' => array('nid', 'vid'),
+      'vid'     => array('vid')
+    ),
+    'primary key' => array('nid'),
+  );
+
+  $schema['node_access'] = array(
+    'fields' => array(
+      'nid'          => array('type' => 'int', 'disp_width' => 10, 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0),
+      'gid'          => array('type' => 'int', 'disp_width' => 10, 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0),
+      'realm'        => array('type' => 'varchar', 'length' => 255, 'not null' => TRUE, 'default' => ''),
+      'grant_view'   => array('type' => 'int', 'disp_width' => 3, 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0, 'size' => 'tiny'),
+      'grant_update' => array('type' => 'int', 'disp_width' => 3, 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0, 'size' => 'tiny'),
+      'grant_delete' => array('type' => 'int', 'disp_width' => 3, 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0, 'size' => 'tiny')
+    ),
+    'primary key' => array(
+      'nid',
+      'gid',
+      'realm'
+    ),
+  );
+
+  $schema['node_counter'] = array(
+    'fields' => array(
+      'nid'        => array('type' => 'int', 'not null' => TRUE, 'default' => 0),
+      'totalcount' => array('type' => 'int', 'disp_width' => 20, 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0, 'size' => 'big'),
+      'daycount'   => array('type' => 'int', 'disp_width' => 8, 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0, 'size' => 'medium'),
+      'timestamp'  => array('type' => 'int', 'disp_width' => 10, 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0)
+    ),
+    'primary key' => array('nid'),
+  );
+
+  $schema['node_revisions'] = array(
+    'fields' => array(
+      'nid'       => array('type' => 'int', 'disp_width' => 10, 'unsigned' => TRUE, 'not null' => TRUE),
+      'vid'       => array('type' => 'serial', 'disp_width' => 10, 'unsigned' => TRUE, 'not null' => TRUE),
+      'uid'       => array('type' => 'int', 'not null' => TRUE, 'default' => 0),
+      'title'     => array('type' => 'varchar', 'length' => 128, 'not null' => TRUE, 'default' => ''),
+      'body'      => array('type' => 'text', 'not null' => TRUE, 'size' => 'big'),
+      'teaser'    => array('type' => 'text', 'not null' => TRUE, 'size' => 'big'),
+      'log'       => array('type' => 'text', 'not null' => TRUE, 'size' => 'big'),
+      'timestamp' => array('type' => 'int', 'not null' => TRUE, 'default' => 0),
+      'format'    => array('type' => 'int', 'not null' => TRUE, 'default' => 0)
+    ),
+    'indexes' => array(
+      'nid' => array('nid'),
+      'uid' => array('uid')
+    ),
+    'primary key' => array('vid'),
+  );
+
+  $schema['node_type'] = array(
+    'fields' => array(
+      'type'           => array('type' => 'varchar', 'length' => 32, 'not null' => TRUE),
+      'name'           => array('type' => 'varchar', 'length' => 255, 'not null' => TRUE, 'default' => ''),
+      'module'         => array('type' => 'varchar', 'length' => 255, 'not null' => TRUE),
+      'description'    => array('type' => 'text', 'not null' => TRUE, 'size' => 'medium'),
+      'help'           => array('type' => 'text', 'not null' => TRUE, 'size' => 'medium'),
+      'has_title'      => array('type' => 'int', 'disp_width' => 3, 'unsigned' => TRUE, 'not null' => TRUE, 'size' => 'tiny'),
+      'title_label'    => array('type' => 'varchar', 'length' => 255, 'not null' => TRUE, 'default' => ''),
+      'has_body'       => array('type' => 'int', 'disp_width' => 3, 'unsigned' => TRUE, 'not null' => TRUE, 'size' => 'tiny'),
+      'body_label'     => array('type' => 'varchar', 'length' => 255, 'not null' => TRUE, 'default' => ''),
+      'min_word_count' => array('type' => 'int', 'disp_width' => 5, 'unsigned' => TRUE, 'not null' => TRUE, 'size' => 'small'),
+      'custom'         => array('type' => 'int', 'disp_width' => 4, 'not null' => TRUE, 'default' => 0, 'size' => 'tiny'),
+      'modified'       => array('type' => 'int', 'disp_width' => 4, 'not null' => TRUE, 'default' => 0, 'size' => 'tiny'),
+      'locked'         => array('type' => 'int', 'disp_width' => 4, 'not null' => TRUE, 'default' => 0, 'size' => 'tiny'),
+      'orig_type'      => array('type' => 'varchar', 'length' => 255, 'not null' => TRUE, 'default' => '')
+    ),
+    'primary key' => array('type'),
+  );
+
+  return $schema;
+}
+
Index: modules/taxonomy/taxonomy.schema
===================================================================
RCS file: modules/taxonomy/taxonomy.schema
diff -N modules/taxonomy/taxonomy.schema
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ modules/taxonomy/taxonomy.schema	17 May 2007 16:18:09 -0000
@@ -0,0 +1,100 @@
+<?php
+// $Id: $
+
+function taxonomy_schema() {
+  $schema['term_data'] = array(
+    'fields' => array(
+      'tid'         => array('type' => 'serial', 'disp_width' => 10, 'unsigned' => TRUE, 'not null' => TRUE),
+      'vid'         => array('type' => 'int', 'disp_width' => 10, 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0),
+      'name'        => array('type' => 'varchar', 'length' => 255, 'not null' => TRUE, 'default' => ''),
+      'description' => array('type' => 'text', 'not null' => FALSE, 'size' => 'big'),
+      'weight'      => array('type' => 'int', 'disp_width' => 4, 'not null' => TRUE, 'default' => 0, 'size' => 'tiny')
+    ),
+    'primary key' => array('tid'),
+    'indexes' => array('vid' => array('vid')),
+  );
+
+  $schema['term_hierarchy'] = array(
+    'fields' => array(
+      'tid'    => array('type' => 'int', 'disp_width' => 10, 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0),
+      'parent' => array('type' => 'int', 'disp_width' => 10, 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0)
+    ),
+    'indexes' => array(
+      'parent' => array('parent'),
+      'tid'    => array('tid')
+    ),
+    'primary key' => array('tid', 'parent'),
+  );
+
+  $schema['term_node'] = array(
+    'fields' => array(
+      'nid' => array('type' => 'int', 'disp_width' => 10, 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0),
+      'vid' => array('type' => 'int', 'disp_width' => 10, 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0),
+      'tid' => array('type' => 'int', 'disp_width' => 10, 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0)
+    ),
+    'indexes' => array(
+      'nid' => array('nid'),
+      'tid' => array('tid'),
+      'vid' => array('vid')
+    ),
+    'primary key' => array(
+      'vid',
+      'tid',
+      'nid'
+    ),
+  );
+
+  $schema['term_relation'] = array(
+    'fields' => array(
+      'trid' => array('type' => 'serial', 'not null' => TRUE),
+      'tid1' => array('type' => 'int', 'disp_width' => 10, 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0),
+      'tid2' => array('type' => 'int', 'disp_width' => 10, 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0)
+    ),
+    'indexes' => array(
+      'tid1' => array('tid1'),
+      'tid2' => array('tid2')
+    ),
+    'primary key' => array('trid'),
+  );
+
+  $schema['term_synonym'] = array(
+    'fields' => array(
+      'tsid' => array('type' => 'serial', 'not null' => TRUE),
+      'tid'  => array('type' => 'int', 'disp_width' => 10, 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0),
+      'name' => array('type' => 'varchar', 'length' => 255, 'not null' => TRUE, 'default' => '')
+    ),
+    'indexes' => array(
+      'name' => array(array('name', 3)),
+      'tid'  => array('tid')
+    ),
+    'primary key' => array('tsid'),
+  );
+
+  $schema['vocabulary'] = array(
+    'fields' => array(
+      'vid'         => array('type' => 'serial', 'disp_width' => 10, 'unsigned' => TRUE, 'not null' => TRUE),
+      'name'        => array('type' => 'varchar', 'length' => 255, 'not null' => TRUE, 'default' => ''),
+      'description' => array('type' => 'text', 'not null' => FALSE, 'size' => 'big'),
+      'help'        => array('type' => 'varchar', 'length' => 255, 'not null' => TRUE, 'default' => ''),
+      'relations'   => array('type' => 'int', 'disp_width' => 3, 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0, 'size' => 'tiny'),
+      'hierarchy'   => array('type' => 'int', 'disp_width' => 3, 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0, 'size' => 'tiny'),
+      'multiple'    => array('type' => 'int', 'disp_width' => 3, 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0, 'size' => 'tiny'),
+      'required'    => array('type' => 'int', 'disp_width' => 3, 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0, 'size' => 'tiny'),
+      'tags'        => array('type' => 'int', 'disp_width' => 3, 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0, 'size' => 'tiny'),
+      'module'      => array('type' => 'varchar', 'length' => 255, 'not null' => TRUE, 'default' => ''),
+      'weight'      => array('type' => 'int', 'disp_width' => 4, 'not null' => TRUE, 'default' => 0, 'size' => 'tiny')
+    ),
+    'primary key' => array('vid'),
+  );
+
+  $schema['vocabulary_node_types'] = array(
+    'fields' => array(
+      'vid'  => array('type' => 'int', 'disp_width' => 10, 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0),
+      'type' => array('type' => 'varchar', 'length' => 32, 'not null' => TRUE, 'default' => '')
+    ),
+    'primary key' => array('vid', 'type'),
+  );
+
+  return $schema;
+}
+
Index: modules/user/user.schema
===================================================================
RCS file: modules/user/user.schema
diff -N modules/user/user.schema
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ modules/user/user.schema	17 May 2007 16:18:09 -0000
@@ -0,0 +1,74 @@
+<?php
+// $Id: $
+
+function user_schema() {
+  $schema['access'] = array(
+    'fields' => array(
+      'aid'    => array('type' => 'serial', 'not null' => TRUE),
+      'mask'   => array('type' => 'varchar', 'length' => 255, 'not null' => TRUE, 'default' => ''),
+      'type'   => array('type' => 'varchar', 'length' => 255, 'not null' => TRUE, 'default' => ''),
+      'status' => array('type' => 'int', 'disp_width' => 4, 'not null' => TRUE, 'default' => 0, 'size' => 'tiny')
+    ),
+    'primary key' => array('aid'),
+  );
+
+  $schema['permission'] = array(
+    'fields' => array(
+      'pid'  => array('type' => 'serial', 'not null' => TRUE),
+      'rid'  => array('type' => 'int', 'disp_width' => 10, 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0),
+      'perm' => array('type' => 'text', 'not null' => FALSE, 'size' => 'big'),
+      'tid'  => array('type' => 'int', 'disp_width' => 10, 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0)
+    ),
+    'primary key' => array('pid'),
+    'indexes' => array('rid' => array('rid')),
+  );
+
+  $schema['role'] = array(
+    'fields' => array(
+      'rid'  => array('type' => 'serial', 'disp_width' => 10, 'unsigned' => TRUE, 'not null' => TRUE),
+      'name' => array('type' => 'varchar', 'length' => 64, 'not null' => TRUE, 'default' => '')
+    ),
+    'unique keys' => array('name' => array('name')),
+    'primary key' => array('rid'),
+  );
+
+  $schema['users'] = array(
+    'fields' => array(
+      'uid'       => array('type' => 'serial', 'disp_width' => 10, 'unsigned' => TRUE, 'not null' => TRUE),
+      'name'      => array('type' => 'varchar', 'length' => 60, 'not null' => TRUE, 'default' => ''),
+      'pass'      => array('type' => 'varchar', 'length' => 32, 'not null' => TRUE, 'default' => ''),
+      'mail'      => array('type' => 'varchar', 'length' => 64, 'not null' => FALSE, 'default' => ''),
+      'mode'      => array('type' => 'int', 'disp_width' => 4, 'not null' => TRUE, 'default' => 0, 'size' => 'tiny'),
+      'sort'      => array('type' => 'int', 'disp_width' => 4, 'not null' => FALSE, 'default' => 0, 'size' => 'tiny'),
+      'threshold' => array('type' => 'int', 'disp_width' => 4, 'not null' => FALSE, 'default' => 0, 'size' => 'tiny'),
+      'theme'     => array('type' => 'varchar', 'length' => 255, 'not null' => TRUE, 'default' => ''),
+      'signature' => array('type' => 'varchar', 'length' => 255, 'not null' => TRUE, 'default' => ''),
+      'created'   => array('type' => 'int', 'not null' => TRUE, 'default' => 0),
+      'access'    => array('type' => 'int', 'not null' => TRUE, 'default' => 0),
+      'login'     => array('type' => 'int', 'not null' => TRUE, 'default' => 0),
+      'status'    => array('type' => 'int', 'disp_width' => 4, 'not null' => TRUE, 'default' => 0, 'size' => 'tiny'),
+      'timezone'  => array('type' => 'varchar', 'length' => 8, 'not null' => FALSE),
+      'language'  => array('type' => 'varchar', 'length' => 12, 'not null' => TRUE, 'default' => ''),
+      'picture'   => array('type' => 'varchar', 'length' => 255, 'not null' => TRUE, 'default' => ''),
+      'init'      => array('type' => 'varchar', 'length' => 64, 'not null' => FALSE, 'default' => ''),
+      'data'      => array('type' => 'text', 'not null' => FALSE, 'size' => 'big')
+    ),
+    'indexes' => array(
+      'access'  => array('access'),
+      'created' => array('created')
+    ),
+    'unique keys' => array('name' => array('name')),
+    'primary key' => array('uid'),
+  );
+
+  $schema['users_roles'] = array(
+    'fields' => array(
+      'uid' => array('type' => 'int', 'disp_width' => 10, 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0),
+      'rid' => array('type' => 'int', 'disp_width' => 10, 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0)
+    ),
+    'primary key' => array('uid', 'rid'),
+  );
+
+  return $schema;
+}
+
