system.install 144 KB
Newer Older
Dries's avatar
 
Dries committed
1
<?php
2
// $Id$
3

4
5
6
7
8
9
/**
 * Test and report Drupal installation requirements.
 */
function system_requirements($phase) {
  $requirements = array();
  // Ensure translations don't break at install time
10
  $t = get_t();
11
12
13
14
15
16

  // Report Drupal version
  if ($phase == 'runtime') {
    $requirements['drupal'] = array(
      'title' => $t('Drupal'),
      'value' => VERSION,
Steven Wittens's avatar
Steven Wittens committed
17
18
      'severity' => REQUIREMENT_INFO,
      'weight' => -10,
19
20
21
22
    );
  }

  // Test web server
Steven Wittens's avatar
Steven Wittens committed
23
  $software = $_SERVER['SERVER_SOFTWARE'];
24
25
  $requirements['webserver'] = array(
    'title' => $t('Web server'),
Steven Wittens's avatar
Steven Wittens committed
26
    'value' => $software,
27
28
  );
  // Use server info string, if present.
Steven Wittens's avatar
Steven Wittens committed
29
30
  if ($software && preg_match('![0-9]!', $software)) {
    list($server, $version) = split('[ /]', $software);
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
    switch ($server) {
      case 'Apache':
        if (version_compare($version, DRUPAL_MINIMUM_APACHE) < 0) {
          $requirements['webserver']['description'] = $t('Your Apache server is too old. Drupal requires at least Apache %version.', array('%version' => DRUPAL_MINIMUM_APACHE));
          $requirements['webserver']['severity'] = REQUIREMENT_ERROR;
        }
        break;

      default:
        $requirements['webserver']['description'] = $t('The web server you\'re using has not been tested with Drupal and might not work properly.');
        $requirements['webserver']['severity'] = REQUIREMENT_WARNING;
        break;
    }
  }
  else {
Steven Wittens's avatar
Steven Wittens committed
46
47
    $requirements['webserver']['value'] = $software ? $software : $t('Unknown');
    $requirements['webserver']['description'] = $t('Unable to determine your web server type and version. Drupal might not work properly.');
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
    $requirements['webserver']['severity'] = REQUIREMENT_WARNING;
  }

  // Test PHP version
  $requirements['php'] = array(
    'title' => $t('PHP'),
    'value' => ($phase == 'runtime') ? l(phpversion(), 'admin/logs/status/php') : phpversion(),
  );
  if (version_compare(phpversion(), DRUPAL_MINIMUM_PHP) < 0) {
    $requirements['php']['description'] = $t('Your PHP installation is too old. Drupal requires at least PHP %version.', array('%version' => DRUPAL_MINIMUM_PHP));
    $requirements['php']['severity'] = REQUIREMENT_ERROR;
  }

  // Test DB version
  global $db_type;
  if (function_exists('db_status_report')) {
    $requirements += db_status_report($phase);
  }

  // Test settings.php file writability
  if ($phase == 'runtime') {
    if (!drupal_verify_install_file(conf_path() .'/settings.php', FILE_EXIST|FILE_READABLE|FILE_NOT_WRITABLE)) {
      $requirements['settings.php'] = array(
        'value' => $t('Not protected'),
        'severity' => REQUIREMENT_ERROR,
        'description' => $t('The file %file is not protected from modifications and poses a security risk. You must change the file\'s permissions to be non-writable.', array('%file' => conf_path() .'/settings.php')),
      );
    }
    else {
      $requirements['settings.php'] = array(
        'value' => $t('Protected'),
      );
    }
    $requirements['settings.php']['title'] = $t('Configuration file');
  }

  // Report cron status
  if ($phase == 'runtime') {
    $cron_last = variable_get('cron_last', NULL);

    if (is_numeric($cron_last)) {
      $requirements['cron']['value'] = $t('Last run !time ago', array('!time' => format_interval(time() - $cron_last)));
    }
    else {
      $requirements['cron'] = array(
        'description' => $t('Cron has not run. It appears cron jobs have not been setup on your system. Please check the help pages for <a href="@url">configuring cron jobs</a>.', array('@url' => 'http://drupal.org/cron')),
        'severity' => REQUIREMENT_ERROR,
        'value' => $t('Never run'),
      );
    }
98
    $requirements['cron'] += array('description' => '');
99
100
101
102
103
104

    $requirements['cron']['description'] .= ' '. t('You can <a href="@cron">run cron manually</a>.', array('@cron' => url('admin/logs/status/run-cron')));

    $requirements['cron']['title'] = $t('Cron maintenance tasks');
  }

105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
  // Test files directory
  if ($phase == 'runtime') {
    $directory = file_directory_path();
    $is_writable = is_writable($directory);
    $is_directory = is_dir($directory);
    if (!$is_writable || !$is_directory) {
      if (!$is_directory) {
        $error = $t('The directory %directory does not exist.', array('%directory' => $directory));
      }
      else {
        $error = $t('The directory %directory is not writable.', array('%directory' => $directory));
      }
      $requirements['file system'] = array(
        'value' => $t('Not writable'),
        'severity' => REQUIREMENT_ERROR,
        'description' => $error .' '. $t('You may need to set the correct directory at the <a href="@admin-file-system">file system settings page</a> or change the current directory\'s permissions so that it is writable.', array('@admin-file-system' => url('admin/settings/file-system'))),
      );
    }
    else {
      if (variable_get('file_downloads', FILE_DOWNLOADS_PUBLIC) == FILE_DOWNLOADS_PUBLIC) {
        $requirements['file system'] = array(
          'value' => $t('Writable (<em>public</em> download method)'),
        );
      }
      else {
        $requirements['file system'] = array(
          'value' => $t('Writable (<em>private</em> download method)'),
        );
      }
    }
    $requirements['file system']['title'] = $t('File system');
  }

138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
  // See if updates are available in update.php.
  if ($phase == 'runtime') {
    $requirements['update'] = array(
      'title' => $t('Database schema'),
      'severity' => REQUIREMENT_OK,
      'value' => $t('Up to date'),
    );

    // Check installed modules.
    foreach (module_list() as $module) {
      $updates = drupal_get_schema_versions($module);
      if ($updates !== FALSE) {
        $default = drupal_get_installed_schema_version($module);
        if (max($updates) > $default) {
          $requirements['update']['severity'] = REQUIREMENT_ERROR;
          $requirements['update']['value'] = $t('Out of date');
          $requirements['update']['description'] = $t('Some modules have database schema updates to install. You should run the <a href="@update">database update script</a> immediately.', array('@update' => base_path() .'update.php'));
          break;
        }
      }
    }
  }

161
162
163
164
165
166
167
168
  // Test Unicode library
  include_once './includes/unicode.inc';
  $requirements = array_merge($requirements, unicode_requirements());

  return $requirements;
}


169
170
171
/**
 * Implementation of hook_install().
 */
172
173
174
175
176
function system_install() {
  switch ($GLOBALS['db_type']) {
    case 'mysql':
    case 'mysqli':
      db_query("CREATE TABLE {access} (
177
        aid int NOT NULL auto_increment,
178
179
        mask varchar(255) NOT NULL default '',
        type varchar(255) NOT NULL default '',
180
        status tinyint NOT NULL default '0',
181
182
183
184
        PRIMARY KEY (aid)
      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");

      db_query("CREATE TABLE {authmap} (
185
186
        aid int unsigned NOT NULL auto_increment,
        uid int NOT NULL default '0',
187
188
189
190
191
192
        authname varchar(128) NOT NULL default '',
        module varchar(128) NOT NULL default '',
        PRIMARY KEY (aid),
        UNIQUE KEY authname (authname)
      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");

193
194
      db_query("CREATE TABLE {batch} (
        bid int(11) NOT NULL,
195
        token varchar(64) NOT NULL,
196
197
198
        timestamp int(11) NOT NULL,
        batch longtext,
        PRIMARY KEY  (bid),
199
        KEY token (token)
200
201
      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");

202
      db_query("CREATE TABLE {blocks} (
203
        bid int NOT NULL AUTO_INCREMENT,
204
205
206
        module varchar(64) DEFAULT '' NOT NULL,
        delta varchar(32) NOT NULL default '0',
        theme varchar(255) NOT NULL default '',
207
208
        status tinyint DEFAULT '0' NOT NULL,
        weight tinyint DEFAULT '0' NOT NULL,
209
        region varchar(64) DEFAULT 'left' NOT NULL,
210
211
212
        custom tinyint DEFAULT '0' NOT NULL,
        throttle tinyint DEFAULT '0' NOT NULL,
        visibility tinyint DEFAULT '0' NOT NULL,
Dries's avatar
Dries committed
213
        pages text NOT NULL,
214
215
        title varchar(64) DEFAULT '' NOT NULL,
        PRIMARY KEY (bid)
216
217
218
      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");

      db_query("CREATE TABLE {boxes} (
219
        bid int NOT NULL,
220
221
        body longtext,
        info varchar(128) NOT NULL default '',
222
        format int NOT NULL default '0',
223
224
225
226
227
228
229
        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,
230
231
        expire int NOT NULL default '0',
        created int NOT NULL default '0',
232
        headers text,
233
        serialized int(1) NOT NULL default '0',
234
235
236
        PRIMARY KEY (cid),
        INDEX expire (expire)
      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");
237
238
239
240
241
242
      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,
243
        serialized int(1) NOT NULL default '0',
244
245
246
247
        PRIMARY KEY (cid),
        INDEX expire (expire)
      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");
      db_query("CREATE TABLE {cache_page} (
248
        cid varchar(255) BINARY NOT NULL default '',
249
250
251
252
        data longblob,
        expire int NOT NULL default '0',
        created int NOT NULL default '0',
        headers text,
253
        serialized int(1) NOT NULL default '0',
254
255
256
        PRIMARY KEY (cid),
        INDEX expire (expire)
      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");
257
258
259
260
261
262
263
264
265
266
      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 */ ");
267
268

      db_query("CREATE TABLE {comments} (
269
270
271
272
        cid int NOT NULL auto_increment,
        pid int NOT NULL default '0',
        nid int NOT NULL default '0',
        uid int NOT NULL default '0',
273
274
275
        subject varchar(64) NOT NULL default '',
        comment longtext NOT NULL,
        hostname varchar(128) NOT NULL default '',
276
277
278
279
        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',
280
281
282
283
284
285
        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),
286
287
        KEY lid (nid),
        KEY status (status)
288
289
290
      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");

      db_query("CREATE TABLE {node_comment_statistics} (
291
292
        nid int unsigned NOT NULL auto_increment,
        last_comment_timestamp int NOT NULL default '0',
293
        last_comment_name varchar(60) default NULL,
294
295
        last_comment_uid int NOT NULL default '0',
        comment_count int unsigned NOT NULL default '0',
296
297
298
299
300
        PRIMARY KEY (nid),
        KEY node_comment_timestamp (last_comment_timestamp)
      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");

      db_query("CREATE TABLE {files} (
301
302
        fid int unsigned NOT NULL default 0,
        nid int unsigned NOT NULL default 0,
303
304
305
        filename varchar(255) NOT NULL default '',
        filepath varchar(255) NOT NULL default '',
        filemime varchar(255) NOT NULL default '',
306
        filesize int unsigned NOT NULL default 0,
307
308
        PRIMARY KEY (fid),
        KEY nid (nid)
309
310
311
      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");

      db_query("CREATE TABLE {file_revisions} (
312
313
        fid int unsigned NOT NULL default 0,
        vid int unsigned NOT NULL default 0,
314
        description varchar(255) NOT NULL default '',
315
        list tinyint unsigned NOT NULL default 0,
316
317
        PRIMARY KEY (fid, vid),
        KEY (vid)
318
319
320
      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");

      db_query("CREATE TABLE {filter_formats} (
321
        format int NOT NULL auto_increment,
322
323
        name varchar(255) NOT NULL default '',
        roles varchar(255) NOT NULL default '',
324
        cache tinyint NOT NULL default '0',
325
326
327
328
329
        PRIMARY KEY (format),
        UNIQUE KEY (name)
      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");

      db_query("CREATE TABLE {filters} (
330
        fid int NOT NULL AUTO_INCREMENT,
331
        format int NOT NULL default '0',
332
        module varchar(64) NOT NULL default '',
333
334
        delta tinyint DEFAULT '0' NOT NULL,
        weight tinyint DEFAULT '0' NOT NULL,
335
        PRIMARY KEY (fid),
336
337
338
339
        INDEX (weight)
      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");

      db_query("CREATE TABLE {flood} (
340
        fid int NOT NULL AUTO_INCREMENT,
341
342
        event varchar(64) NOT NULL default '',
        hostname varchar(128) NOT NULL default '',
343
344
        timestamp int NOT NULL default '0',
        PRIMARY KEY (fid)
345
346
347
      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");

      db_query("CREATE TABLE {history} (
348
349
350
        uid int NOT NULL default '0',
        nid int NOT NULL default '0',
        timestamp int NOT NULL default '0',
351
352
353
        PRIMARY KEY (uid,nid)
      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");

354
      db_query("CREATE TABLE {menu_router} (
355
        path varchar(255) NOT NULL default '',
356
357
        load_functions varchar(255) NOT NULL default '',
        to_arg_functions varchar(255) NOT NULL default '',
358
359
360
361
        access_callback varchar(255) NOT NULL default '',
        access_arguments text,
        page_callback varchar(255) NOT NULL default '',
        page_arguments text,
362
363
        fit int NOT NULL default 0,
        number_parts int NOT NULL default 0,
364
365
        tab_parent varchar(255) NOT NULL default '',
        tab_root varchar(255) NOT NULL default '',
366
        title varchar(255) NOT NULL default '',
367
368
        title_callback varchar(255) NOT NULL default '',
        title_arguments varchar(255) NOT NULL default '',
369
        type int NOT NULL default 0,
370
        block_callback varchar(255) NOT NULL default '',
371
        description TEXT,
372
        position varchar(255) NOT NULL default '',
373
        weight int NOT NULL default 0,
374
        file mediumtext,
375
376
        PRIMARY KEY  (path),
        KEY fit (fit),
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
        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)
405
406
407
      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");

      db_query("CREATE TABLE {node} (
408
409
        nid int unsigned NOT NULL auto_increment,
        vid int unsigned NOT NULL default '0',
410
        type varchar(32) NOT NULL default '',
411
        language varchar(12) NOT NULL default '',
412
        title varchar(128) NOT NULL default '',
413
414
415
416
417
418
419
420
        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',
421
422
        PRIMARY KEY  (nid),
        UNIQUE KEY nid_vid (nid, vid),
423
424
425
426
427
428
429
430
431
432
433
434
435
436
        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} (
437
438
        nid int unsigned NOT NULL default '0',
        gid int unsigned NOT NULL default '0',
439
        realm varchar(255) NOT NULL default '',
440
441
442
        grant_view tinyint unsigned NOT NULL default '0',
        grant_update tinyint unsigned NOT NULL default '0',
        grant_delete tinyint unsigned NOT NULL default '0',
443
444
445
446
        PRIMARY KEY (nid,gid,realm)
      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");

      db_query("CREATE TABLE {node_revisions} (
447
448
449
        nid int unsigned NOT NULL,
        vid int unsigned NOT NULL,
        uid int NOT NULL default '0',
450
        title varchar(128) NOT NULL default '',
Dries's avatar
Dries committed
451
452
453
        body longtext NOT NULL,
        teaser longtext NOT NULL,
        log longtext NOT NULL,
454
455
        timestamp int NOT NULL default '0',
        format int NOT NULL default '0',
456
457
458
459
460
        PRIMARY KEY  (vid),
        KEY nid (nid),
        KEY uid (uid)
      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");

461
462
463
464
465
466
      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,
467
        has_title tinyint unsigned NOT NULL,
468
        title_label varchar(255) NOT NULL default '',
469
        has_body tinyint unsigned NOT NULL,
470
        body_label varchar(255) NOT NULL default '',
471
472
473
474
        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',
475
476
477
478
        orig_type varchar(255) NOT NULL default '',
        PRIMARY KEY (type)
      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");

479
      db_query("CREATE TABLE {url_alias} (
480
        pid int unsigned NOT NULL auto_increment,
481
482
        src varchar(128) NOT NULL default '',
        dst varchar(128) NOT NULL default '',
483
        language varchar(12) NOT NULL default '',
484
        PRIMARY KEY (pid),
485
        UNIQUE KEY dst_language (dst, language),
486
487
488
489
        KEY src (src)
      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");

      db_query("CREATE TABLE {permission} (
490
        pid int NOT NULL AUTO_INCREMENT,
491
        rid int unsigned NOT NULL default '0',
492
        perm longtext,
493
        tid int unsigned NOT NULL default '0',
494
        PRIMARY KEY (pid),
495
496
497
498
        KEY rid (rid)
      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");

      db_query("CREATE TABLE {role} (
499
        rid int unsigned NOT NULL auto_increment,
500
        name varchar(64) NOT NULL default '',
501
502
503
504
505
506
507
        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,
508
        rid int unsigned NOT NULL,
509
510
511
512
        PRIMARY KEY (module, delta, rid)
      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");

      db_query("CREATE TABLE {sessions} (
513
        uid int unsigned NOT NULL,
514
        sid varchar(64) NOT NULL default '',
515
        hostname varchar(128) NOT NULL default '',
516
517
        timestamp int NOT NULL default '0',
        cache int NOT NULL default '0',
518
519
520
521
522
523
524
525
        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 '',
526
        id int unsigned NOT NULL default '0',
527
528
529
530
        PRIMARY KEY (name)
      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");

      db_query("CREATE TABLE {node_counter} (
531
532
533
534
        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',
535
        PRIMARY KEY (nid)
536
537
538
539
540
541
      ) /*!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 '',
542
        owner varchar(255) NOT NULL default '',
543
544
545
546
547
        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',
548
        info text,
549
550
551
552
553
        PRIMARY KEY (filename),
        KEY (weight)
      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");

      db_query("CREATE TABLE {term_data} (
554
555
        tid int unsigned NOT NULL auto_increment,
        vid int unsigned NOT NULL default '0',
556
557
        name varchar(255) NOT NULL default '',
        description longtext,
558
        weight tinyint NOT NULL default '0',
559
560
561
562
563
        PRIMARY KEY (tid),
        KEY vid (vid)
      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");

      db_query("CREATE TABLE {term_hierarchy} (
564
565
        tid int unsigned NOT NULL default '0',
        parent int unsigned NOT NULL default '0',
566
567
568
569
570
571
        KEY tid (tid),
        KEY parent (parent),
        PRIMARY KEY (tid, parent)
      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");

      db_query("CREATE TABLE {term_node} (
572
        nid int unsigned NOT NULL default '0',
573
        vid int unsigned NOT NULL default '0',
574
        tid int unsigned NOT NULL default '0',
575
        KEY nid (nid),
576
        KEY vid (vid),
577
        KEY tid (tid),
578
        PRIMARY KEY (vid,tid,nid)
579
580
581
      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");

      db_query("CREATE TABLE {term_relation} (
582
        trid int NOT NULL AUTO_INCREMENT,
583
584
        tid1 int unsigned NOT NULL default '0',
        tid2 int unsigned NOT NULL default '0',
585
        PRIMARY KEY (trid),
586
587
588
589
590
        KEY tid1 (tid1),
        KEY tid2 (tid2)
      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");

      db_query("CREATE TABLE {term_synonym} (
591
        tsid int NOT NULL AUTO_INCREMENT,
592
        tid int unsigned NOT NULL default '0',
593
        name varchar(255) NOT NULL default '',
594
        PRIMARY KEY (tsid),
595
596
597
598
599
        KEY tid (tid),
        KEY name (name(3))
      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");

      db_query("CREATE TABLE {users} (
600
        uid int unsigned NOT NULL default '0',
601
602
603
        name varchar(60) NOT NULL default '',
        pass varchar(32) NOT NULL default '',
        mail varchar(64) default '',
604
605
606
        mode tinyint NOT NULL default '0',
        sort tinyint default '0',
        threshold tinyint default '0',
607
608
        theme varchar(255) NOT NULL default '',
        signature varchar(255) NOT NULL default '',
609
610
611
612
        created int NOT NULL default '0',
        access int NOT NULL default '0',
        login int NOT NULL default '0',
        status tinyint NOT NULL default '0',
613
614
615
616
617
618
619
        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),
620
        KEY created (created),
621
622
623
624
        KEY access (access)
      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");

      db_query("CREATE TABLE {users_roles} (
625
626
        uid int unsigned NOT NULL default '0',
        rid int unsigned NOT NULL default '0',
627
628
629
630
        PRIMARY KEY (uid, rid)
      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");

      db_query("CREATE TABLE {variable} (
631
        name varchar(128) NOT NULL default '',
632
        value longtext NOT NULL,
633
634
        language varchar(12) NOT NULL default '',
        PRIMARY KEY (name, language)
635
636
637
      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");

      db_query("CREATE TABLE {vocabulary} (
638
        vid int unsigned NOT NULL auto_increment,
639
640
641
        name varchar(255) NOT NULL default '',
        description longtext,
        help varchar(255) NOT NULL default '',
642
643
644
645
646
        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',
647
        module varchar(255) NOT NULL default '',
648
        weight tinyint NOT NULL default '0',
649
650
651
652
        PRIMARY KEY (vid)
      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");

      db_query("CREATE TABLE {vocabulary_node_types} (
653
        vid int unsigned NOT NULL DEFAULT '0',
654
655
656
657
658
659
        type varchar(32) NOT NULL DEFAULT '',
        PRIMARY KEY (vid, type)
      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");

      break;
    case 'pgsql':
660
      /* create unsigned types */
661
662
663
      db_query("CREATE DOMAIN int_unsigned integer CHECK (VALUE >= 0)");
      db_query("CREATE DOMAIN smallint_unsigned smallint CHECK (VALUE >= 0)");
      db_query("CREATE DOMAIN bigint_unsigned bigint CHECK (VALUE >= 0)");
664

665
666
667
668
669
670
671
672
673
      /* create functions */
      db_query('CREATE OR REPLACE FUNCTION "greatest"(numeric, numeric) RETURNS numeric AS
        \'SELECT CASE WHEN (($1 > $2) OR ($2 IS NULL)) THEN $1 ELSE $2 END;\'
        LANGUAGE \'sql\''
      );
      db_query('CREATE OR REPLACE FUNCTION "greatest"(numeric, numeric, numeric) RETURNS numeric AS
        \'SELECT greatest($1, greatest($2, $3));\'
        LANGUAGE \'sql\''
      );
674
      if (!db_result(db_query("SELECT COUNT(*) FROM pg_proc WHERE proname = 'rand'"))) {
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
        db_query('CREATE OR REPLACE FUNCTION "rand"() RETURNS float AS
          \'SELECT random();\'
          LANGUAGE \'sql\''
        );
      }

      if (!db_result(db_query("SELECT COUNT(*) FROM pg_proc WHERE proname = 'concat'"))) {
        db_query('CREATE OR REPLACE FUNCTION "concat"(text, text) RETURNS text AS
          \'SELECT $1 || $2;\'
          LANGUAGE \'sql\''
        );
      }
      db_query('CREATE OR REPLACE FUNCTION "if"(boolean, text, text) RETURNS text AS
        \'SELECT CASE WHEN $1 THEN $2 ELSE $3 END;\'
        LANGUAGE \'sql\''
      );
      db_query('CREATE OR REPLACE FUNCTION "if"(boolean, integer, integer) RETURNS integer AS
        \'SELECT CASE WHEN $1 THEN $2 ELSE $3 END;\'
        LANGUAGE \'sql\''
      );

      /* create tables */
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
      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)
      )");

714
      db_query("CREATE TABLE {batch} (
715
716
        bid serial CHECK (bid >= 0),
        token varchar(64) NOT NULL default '',
717
718
        timestamp int NOT NULL default '0',
        batch text,
719
        PRIMARY KEY (bid)
720
      )");
721
      db_query("CREATE INDEX {batch}_token_idx ON {batch} (token)");
722

723
      db_query("CREATE TABLE {blocks} (
724
        bid serial,
725
726
727
728
729
730
731
732
733
        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,
734
        pages text DEFAULT '' NOT NULL,
735
736
        title varchar(64) DEFAULT '' NOT NULL,
        PRIMARY KEY (bid)
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
      )");

      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,
754
        serialized smallint NOT NULL default '0',
755
756
        PRIMARY KEY (cid)
      )");
757
758
759
760
761
762
      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,
763
        serialized smallint NOT NULL default '0',
764
765
766
767
768
769
770
771
        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,
772
        serialized smallint NOT NULL default '0',
773
774
        PRIMARY KEY (cid)
      )");
775
776
777
778
779
780
      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,
781
        serialized smallint NOT NULL default '0',
782
783
        PRIMARY KEY (cid)
      )");
784
      db_query("CREATE INDEX {cache}_expire_idx ON {cache} (expire)");
785
786
      db_query("CREATE INDEX {cache_filter}_expire_idx ON {cache_filter} (expire)");
      db_query("CREATE INDEX {cache_page}_expire_idx ON {cache_page} (expire)");
787
      db_query("CREATE INDEX {cache_form}_expire_idx ON {cache_form} (expire)");
788
789
790
791
792
793
794
795
796
797
798

      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',
799
        status smallint_unsigned NOT NULL default '0',
800
801
802
803
804
805
806
807
808
        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)");
809
      db_query("CREATE INDEX {comments}_status_idx ON {comments} (status)");
810
811
812
813
814
815

      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',
816
        comment_count int_unsigned NOT NULL default '0',
817
818
819
820
821
        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} (
822
        fid serial CHECK (fid >= 0),
823
        nid int_unsigned NOT NULL default 0,
824
825
826
        filename varchar(255) NOT NULL default '',
        filepath varchar(255) NOT NULL default '',
        filemime varchar(255) NOT NULL default '',
827
        filesize int_unsigned NOT NULL default 0,
828
829
        PRIMARY KEY (fid)
      )");
830
      db_query("CREATE INDEX {files}_nid_idx ON {files} (nid)");
831

832
      db_query("CREATE TABLE {file_revisions} (
833
834
        fid int_unsigned NOT NULL default 0,
        vid int_unsigned NOT NULL default 0,
835
        description varchar(255) NOT NULL default '',
836
        list smallint_unsigned NOT NULL default 0,
837
838
        PRIMARY KEY (fid, vid)
      )");
839
      db_query("CREATE INDEX {file_revisions}_vid_idx ON {file_revisions} (vid)");
840
841
842
843
844
845
846
847
848
849
850

      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} (
851
        fid serial,
852
853
854
        format int NOT NULL default '0',
        module varchar(64) NOT NULL default '',
        delta smallint DEFAULT '0' NOT NULL,
855
856
        weight smallint DEFAULT '0' NOT NULL,
        PRIMARY KEY (fid)
857
858
859
860
      )");
      db_query("CREATE INDEX {filters}_weight_idx ON {filters} (weight)");

      db_query("CREATE TABLE {flood} (
861
        fid serial,
862
863
        event varchar(64) NOT NULL default '',
        hostname varchar(128) NOT NULL default '',
864
865
        timestamp int NOT NULL default '0',
        PRIMARY KEY (fid)
866
867
868
869
870
871
872
873
874
      )");

      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)
      )");

875
      db_query("CREATE TABLE {menu_router} (
876
        path varchar(255) NOT NULL default '',
877
878
        load_functions varchar(255) NOT NULL default '',
        to_arg_functions varchar(255) NOT NULL default '',
879
880
881
882
        access_callback varchar(255) NOT NULL default '',
        access_arguments text,
        page_callback varchar(255) NOT NULL default '',
        page_arguments text,
883
884
        fit int NOT NULL default 0,
        number_parts int NOT NULL default 0,
885
886
        tab_parent varchar(255) NOT NULL default '',
        tab_root varchar(255) NOT NULL default '',
887
        title varchar(255) NOT NULL default '',
888
889
        title_callback varchar(255) NOT NULL default '',
        title_arguments varchar(255) NOT NULL default '',
890
        type int NOT NULL default 0,
891
        block_callback varchar(255) NOT NULL default '',
892
        description TEXT,
893
        position varchar(255) NOT NULL default '',
894
        weight int NOT NULL default 0,
895
        file text,
896
        PRIMARY KEY (path)
897
      )");
898
899
900
      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)");

901
      db_query("CREATE TABLE {menu_links} (
902
        menu_name varchar(64) NOT NULL default '',
903
        mlid serial,
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
        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)
      )");
924
925
926
      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)");
927
928
929

      db_query("CREATE TABLE {node} (
        nid serial CHECK (nid >= 0),
930
        vid int_unsigned NOT NULL default '0',
931
        type varchar(32) NOT NULL default '',
932
        language varchar(12) NOT NULL default '',
933
934
935
936
937
938
939
940
941
        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',
942
943
        PRIMARY KEY (nid),
        UNIQUE (nid, vid),
944
945
946
947
948
949
950
951
952
953
954
955
956
957
        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} (
958
959
        nid int_unsigned NOT NULL default '0',
        gid int_unsigned NOT NULL default '0',
960
        realm varchar(255) NOT NULL default '',
961
962
963
        grant_view smallint_unsigned NOT NULL default '0',
        grant_update smallint_unsigned NOT NULL default '0',
        grant_delete smallint_unsigned NOT NULL default '0',
964
965
966
967
        PRIMARY KEY (nid,gid,realm)
      )");

      db_query("CREATE TABLE {node_revisions} (
968
        nid int_unsigned NOT NULL,
969
        vid serial CHECK (vid >= 0),
970
971
972
973
974
975
976
977
978
979
980
981
        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)");

982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
      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)
      )");

1000
      db_query("CREATE TABLE {url_alias} (