system.install 135 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
195
196
197
198
199
200
201
      db_query("CREATE TABLE {batch} (
        bid int(11) NOT NULL,
        sid varchar(64) NOT NULL,
        timestamp int(11) NOT NULL,
        batch longtext,
        PRIMARY KEY  (bid),
        KEY sid (sid)
      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");

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

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

      db_query("CREATE TABLE {comments} (
257
258
259
260
        cid int NOT NULL auto_increment,
        pid int NOT NULL default '0',
        nid int NOT NULL default '0',
        uid int NOT NULL default '0',
261
262
263
        subject varchar(64) NOT NULL default '',
        comment longtext NOT NULL,
        hostname varchar(128) NOT NULL default '',
264
265
266
267
        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',
268
269
270
271
272
273
        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),
274
275
        KEY lid (nid),
        KEY status (status)
276
277
278
      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");

      db_query("CREATE TABLE {node_comment_statistics} (
279
280
        nid int unsigned NOT NULL auto_increment,
        last_comment_timestamp int NOT NULL default '0',
281
        last_comment_name varchar(60) default NULL,
282
283
        last_comment_uid int NOT NULL default '0',
        comment_count int unsigned NOT NULL default '0',
284
285
286
287
288
        PRIMARY KEY (nid),
        KEY node_comment_timestamp (last_comment_timestamp)
      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");

      db_query("CREATE TABLE {files} (
289
290
        fid int unsigned NOT NULL default 0,
        nid int unsigned NOT NULL default 0,
291
292
293
        filename varchar(255) NOT NULL default '',
        filepath varchar(255) NOT NULL default '',
        filemime varchar(255) NOT NULL default '',
294
        filesize int unsigned NOT NULL default 0,
295
296
        PRIMARY KEY (fid),
        KEY nid (nid)
297
298
299
      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");

      db_query("CREATE TABLE {file_revisions} (
300
301
        fid int unsigned NOT NULL default 0,
        vid int unsigned NOT NULL default 0,
302
        description varchar(255) NOT NULL default '',
303
        list tinyint unsigned NOT NULL default 0,
304
305
        PRIMARY KEY (fid, vid),
        KEY (vid)
306
307
308
      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");

      db_query("CREATE TABLE {filter_formats} (
309
        format int NOT NULL auto_increment,
310
311
        name varchar(255) NOT NULL default '',
        roles varchar(255) NOT NULL default '',
312
        cache tinyint NOT NULL default '0',
313
314
315
316
317
        PRIMARY KEY (format),
        UNIQUE KEY (name)
      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");

      db_query("CREATE TABLE {filters} (
318
        format int NOT NULL default '0',
319
        module varchar(64) NOT NULL default '',
320
321
        delta tinyint DEFAULT '0' NOT NULL,
        weight tinyint DEFAULT '0' NOT NULL,
322
323
324
325
326
327
        INDEX (weight)
      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");

      db_query("CREATE TABLE {flood} (
        event varchar(64) NOT NULL default '',
        hostname varchar(128) NOT NULL default '',
328
        timestamp int NOT NULL default '0'
329
330
331
      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");

      db_query("CREATE TABLE {history} (
332
333
334
        uid int NOT NULL default '0',
        nid int NOT NULL default '0',
        timestamp int NOT NULL default '0',
335
336
337
338
        PRIMARY KEY (uid,nid)
      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");

      db_query("CREATE TABLE {menu} (
339
340
        mid int NOT NULL default 0,
        pid int NOT NULL default 0,
341
        path varchar(255) NOT NULL default '',
342
343
        load_functions varchar(255) NOT NULL default '',
        to_arg_functions varchar(255) NOT NULL default '',
344
345
346
347
        access_callback varchar(255) NOT NULL default '',
        access_arguments text,
        page_callback varchar(255) NOT NULL default '',
        page_arguments text,
348
349
350
351
352
        fit int NOT NULL default 0,
        number_parts int NOT NULL default 0,
        mleft int NOT NULL default 0,
        mright int NOT NULL default 0,
        visible int NOT NULL default 0,
353
        parents varchar(255) NOT NULL default '',
354
355
        depth int NOT NULL default 0,
        has_children int NOT NULL default 0,
356
357
        tab int NOT NULL default 0,
        title varchar(255) NOT NULL default '',
358
359
        title_callback varchar(255) NOT NULL default '',
        title_arguments varchar(255) NOT NULL default '',
360
        parent varchar(255) NOT NULL default '',
361
        type int NOT NULL default 0,
362
363
        block_callback varchar(255) NOT NULL default '',
        description varchar(255) NOT NULL default '',
364
        position varchar(255) NOT NULL default '',
365
366
367
368
369
370
        link_path varchar(255) NOT NULL default '',
        attributes varchar(255) NOT NULL default '',
        query varchar(255) NOT NULL default '',
        fragment varchar(255) NOT NULL default '',
        absolute INT NOT NULL default 0,
        html INT NOT NULL default 0,
371
372
        PRIMARY KEY  (path),
        KEY fit (fit),
373
374
375
        KEY visible (visible),
        KEY pid (pid),
        KEY parent (parent)
376
377
378
      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");

      db_query("CREATE TABLE {node} (
379
380
        nid int unsigned NOT NULL auto_increment,
        vid int unsigned NOT NULL default '0',
381
        type varchar(32) NOT NULL default '',
382
        language varchar(12) NOT NULL default '',
383
        title varchar(128) NOT NULL default '',
384
385
386
387
388
389
390
391
        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',
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
        PRIMARY KEY  (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} (
407
408
        nid int unsigned NOT NULL default '0',
        gid int unsigned NOT NULL default '0',
409
        realm varchar(255) NOT NULL default '',
410
411
412
        grant_view tinyint unsigned NOT NULL default '0',
        grant_update tinyint unsigned NOT NULL default '0',
        grant_delete tinyint unsigned NOT NULL default '0',
413
414
415
416
        PRIMARY KEY (nid,gid,realm)
      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");

      db_query("CREATE TABLE {node_revisions} (
417
418
419
        nid int unsigned NOT NULL,
        vid int unsigned NOT NULL,
        uid int NOT NULL default '0',
420
        title varchar(128) NOT NULL default '',
Dries's avatar
Dries committed
421
422
423
        body longtext NOT NULL,
        teaser longtext NOT NULL,
        log longtext NOT NULL,
424
425
        timestamp int NOT NULL default '0',
        format int NOT NULL default '0',
426
427
428
429
430
        PRIMARY KEY  (vid),
        KEY nid (nid),
        KEY uid (uid)
      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");

431
432
433
434
435
436
      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,
437
        has_title tinyint unsigned NOT NULL,
438
        title_label varchar(255) NOT NULL default '',
439
        has_body tinyint unsigned NOT NULL,
440
        body_label varchar(255) NOT NULL default '',
441
442
443
444
        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',
445
446
447
448
        orig_type varchar(255) NOT NULL default '',
        PRIMARY KEY (type)
      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");

449
      db_query("CREATE TABLE {url_alias} (
450
        pid int unsigned NOT NULL auto_increment,
451
452
        src varchar(128) NOT NULL default '',
        dst varchar(128) NOT NULL default '',
453
        language varchar(12) NOT NULL default '',
454
        PRIMARY KEY (pid),
455
        UNIQUE KEY dst_language (dst, language),
456
457
458
459
        KEY src (src)
      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");

      db_query("CREATE TABLE {permission} (
460
        rid int unsigned NOT NULL default '0',
461
        perm longtext,
462
        tid int unsigned NOT NULL default '0',
463
464
465
466
        KEY rid (rid)
      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");

      db_query("CREATE TABLE {role} (
467
        rid int unsigned NOT NULL auto_increment,
468
        name varchar(64) NOT NULL default '',
469
470
471
472
473
474
475
        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,
476
        rid int unsigned NOT NULL,
477
478
479
480
        PRIMARY KEY (module, delta, rid)
      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");

      db_query("CREATE TABLE {sessions} (
481
        uid int unsigned NOT NULL,
482
        sid varchar(64) NOT NULL default '',
483
        hostname varchar(128) NOT NULL default '',
484
485
        timestamp int NOT NULL default '0',
        cache int NOT NULL default '0',
486
487
488
489
490
491
492
493
        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 '',
494
        id int unsigned NOT NULL default '0',
495
496
497
498
        PRIMARY KEY (name)
      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");

      db_query("CREATE TABLE {node_counter} (
499
500
501
502
        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',
503
        PRIMARY KEY (nid)
504
505
506
507
508
509
      ) /*!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 '',
510
        owner varchar(255) NOT NULL default '',
511
512
513
514
515
        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',
516
        info text,
517
518
519
520
521
        PRIMARY KEY (filename),
        KEY (weight)
      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");

      db_query("CREATE TABLE {term_data} (
522
523
        tid int unsigned NOT NULL auto_increment,
        vid int unsigned NOT NULL default '0',
524
525
        name varchar(255) NOT NULL default '',
        description longtext,
526
        weight tinyint NOT NULL default '0',
527
528
529
530
531
        PRIMARY KEY (tid),
        KEY vid (vid)
      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");

      db_query("CREATE TABLE {term_hierarchy} (
532
533
        tid int unsigned NOT NULL default '0',
        parent int unsigned NOT NULL default '0',
534
535
536
537
538
539
        KEY tid (tid),
        KEY parent (parent),
        PRIMARY KEY (tid, parent)
      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");

      db_query("CREATE TABLE {term_node} (
540
        nid int unsigned NOT NULL default '0',
541
        vid int unsigned NOT NULL default '0',
542
        tid int unsigned NOT NULL default '0',
543
        KEY nid (nid),
544
        KEY vid (vid),
545
        KEY tid (tid),
546
        PRIMARY KEY (vid,tid,nid)
547
548
549
      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");

      db_query("CREATE TABLE {term_relation} (
550
551
        tid1 int unsigned NOT NULL default '0',
        tid2 int unsigned NOT NULL default '0',
552
553
554
555
556
        KEY tid1 (tid1),
        KEY tid2 (tid2)
      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");

      db_query("CREATE TABLE {term_synonym} (
557
        tid int unsigned NOT NULL default '0',
558
559
560
561
562
563
        name varchar(255) NOT NULL default '',
        KEY tid (tid),
        KEY name (name(3))
      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");

      db_query("CREATE TABLE {users} (
564
        uid int unsigned NOT NULL default '0',
565
566
567
        name varchar(60) NOT NULL default '',
        pass varchar(32) NOT NULL default '',
        mail varchar(64) default '',
568
569
570
        mode tinyint NOT NULL default '0',
        sort tinyint default '0',
        threshold tinyint default '0',
571
572
        theme varchar(255) NOT NULL default '',
        signature varchar(255) NOT NULL default '',
573
574
575
576
        created int NOT NULL default '0',
        access int NOT NULL default '0',
        login int NOT NULL default '0',
        status tinyint NOT NULL default '0',
577
578
579
580
581
582
583
        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),
584
        KEY created (created),
585
586
587
588
        KEY access (access)
      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");

      db_query("CREATE TABLE {users_roles} (
589
590
        uid int unsigned NOT NULL default '0',
        rid int unsigned NOT NULL default '0',
591
592
593
594
        PRIMARY KEY (uid, rid)
      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");

      db_query("CREATE TABLE {variable} (
595
        name varchar(128) NOT NULL default '',
596
        value longtext NOT NULL,
597
598
        language varchar(12) NOT NULL default '',
        PRIMARY KEY (name, language)
599
600
601
      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");

      db_query("CREATE TABLE {vocabulary} (
602
        vid int unsigned NOT NULL auto_increment,
603
604
605
        name varchar(255) NOT NULL default '',
        description longtext,
        help varchar(255) NOT NULL default '',
606
607
608
609
610
        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',
611
        module varchar(255) NOT NULL default '',
612
        weight tinyint NOT NULL default '0',
613
614
615
616
        PRIMARY KEY (vid)
      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");

      db_query("CREATE TABLE {vocabulary_node_types} (
617
        vid int unsigned NOT NULL DEFAULT '0',
618
619
620
621
622
623
        type varchar(32) NOT NULL DEFAULT '',
        PRIMARY KEY (vid, type)
      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");

      break;
    case 'pgsql':
624
      /* create unsigned types */
625
626
627
      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)");
628

629
630
631
632
633
634
635
636
637
      /* 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\''
      );
638
      if (!db_result(db_query("SELECT COUNT(*) FROM pg_proc WHERE proname = 'rand'"))) {
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
        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 */
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
      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)
      )");

678
679
680
681
682
683
684
685
686
      db_query("CREATE TABLE {batch} (
        bid int NOT NULL default '0',
        sid varchar(64) NOT NULL default '',
        timestamp int NOT NULL default '0',
        batch text,
        PRIMARY KEY (bid),
      )");
      db_query("CREATE INDEX {batch}_sid_idx ON {batch} (sid)");

687
688
689
690
691
692
693
694
695
696
      db_query("CREATE TABLE {blocks} (
        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,
697
698
        pages text DEFAULT '' NOT NULL,
        title varchar(64) DEFAULT '' NOT NULL
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
      )");

      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,
716
        serialized int(1) NOT NULL default '0',
717
718
        PRIMARY KEY (cid)
      )");
719
720
721
722
723
724
      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,
725
        serialized int(1) NOT NULL default '0',
726
727
728
729
730
731
732
733
        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,
734
        serialized int(1) NOT NULL default '0',
735
736
        PRIMARY KEY (cid)
      )");
737
      db_query("CREATE INDEX {cache}_expire_idx ON {cache} (expire)");
738
739
      db_query("CREATE INDEX {cache_filter}_expire_idx ON {cache_filter} (expire)");
      db_query("CREATE INDEX {cache_page}_expire_idx ON {cache_page} (expire)");
740
741
742
743
744
745
746
747
748
749
750

      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',
751
        status smallint_unsigned NOT NULL default '0',
752
753
754
755
756
757
758
759
760
        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)");
761
      db_query("CREATE INDEX {comments}_status_idx ON {comments} (status)");
762
763
764
765
766
767

      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',
768
        comment_count int_unsigned NOT NULL default '0',
769
770
771
772
773
        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} (
774
        fid serial CHECK (fid >= 0),
775
        nid int_unsigned NOT NULL default 0,
776
777
778
        filename varchar(255) NOT NULL default '',
        filepath varchar(255) NOT NULL default '',
        filemime varchar(255) NOT NULL default '',
779
        filesize int_unsigned NOT NULL default 0,
780
781
        PRIMARY KEY (fid)
      )");
782
      db_query("CREATE INDEX {files}_nid_idx ON {files} (nid)");
783

784
      db_query("CREATE TABLE {file_revisions} (
785
786
        fid int_unsigned NOT NULL default 0,
        vid int_unsigned NOT NULL default 0,
787
        description varchar(255) NOT NULL default '',
788
        list smallint_unsigned NOT NULL default 0,
789
790
        PRIMARY KEY (fid, vid)
      )");
791
      db_query("CREATE INDEX {file_revisions}_vid_idx ON {file_revisions} (vid)");
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823

      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} (
        format int NOT NULL default '0',
        module varchar(64) NOT NULL default '',
        delta smallint DEFAULT '0' NOT NULL,
        weight smallint DEFAULT '0' NOT NULL
      )");
      db_query("CREATE INDEX {filters}_weight_idx ON {filters} (weight)");

      db_query("CREATE TABLE {flood} (
        event varchar(64) NOT NULL default '',
        hostname varchar(128) NOT NULL default '',
        timestamp int NOT NULL default '0'
      )");

      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} (
824
825
        mid int NOT NULL default 0,
        pid int NOT NULL default 0,
826
        path varchar(255) NOT NULL default '',
827
828
        load_functions varchar(255) NOT NULL default '',
        to_arg_functions varchar(255) NOT NULL default '',
829
830
831
832
        access_callback varchar(255) NOT NULL default '',
        access_arguments text,
        page_callback varchar(255) NOT NULL default '',
        page_arguments text,
833
834
835
836
837
        fit int NOT NULL default 0,
        number_parts int NOT NULL default 0,
        mleft int NOT NULL default 0,
        mright int NOT NULL default 0,
        visible int NOT NULL default 0,
838
        parents varchar(255) NOT NULL default '',
839
840
        depth int NOT NULL default 0,
        has_children int NOT NULL default 0,
841
        tab int NOT NULL default 0,
842
        title varchar(255) NOT NULL default '',
843
844
        title_callback varchar(255) NOT NULL default '',
        title_arguments varchar(255) NOT NULL default '',
845
        parent varchar(255) NOT NULL default '',
846
        type int NOT NULL default 0,
847
848
        block_callback varchar(255) NOT NULL default '',
        description varchar(255) NOT NULL default '',
849
        position varchar(255) NOT NULL default '',
850
851
852
853
854
855
        link_path varchar(255) NOT NULL default '',
        attributes varchar(255) NOT NULL default '',
        query varchar(255) NOT NULL default '',
        fragment varchar(255) NOT NULL default '',
        absolute INT NOT NULL default 0,
        html INT NOT NULL default 0,
856
        PRIMARY KEY (path)
857
      )");
858
859
860

      db_query("CREATE INDEX {menu}_fit_idx ON {menu} (fit)");
      db_query("CREATE INDEX {menu}_visible_idx ON {menu} (visible)");
861
862
      db_query("CREATE INDEX {menu}_parent_idx ON {menu} (parent)");
      db_query("CREATE INDEX {menu}_pid_idx ON {menu} (parent)");
863
864
865

      db_query("CREATE TABLE {node} (
        nid serial CHECK (nid >= 0),
866
        vid int_unsigned NOT NULL default '0',
867
        type varchar(32) NOT NULL default '',
868
        language varchar(12) NOT NULL default '',
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
        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, 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} (
893
894
        nid int_unsigned NOT NULL default '0',
        gid int_unsigned NOT NULL default '0',
895
        realm varchar(255) NOT NULL default '',
896
897
898
        grant_view smallint_unsigned NOT NULL default '0',
        grant_update smallint_unsigned NOT NULL default '0',
        grant_delete smallint_unsigned NOT NULL default '0',
899
900
901
902
        PRIMARY KEY (nid,gid,realm)
      )");

      db_query("CREATE TABLE {node_revisions} (
903
        nid int_unsigned NOT NULL,
904
        vid serial CHECK (vid >= 0),
905
906
907
908
909
910
911
912
913
914
915
916
        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)");

917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
      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)
      )");

935
936
937
938
      db_query("CREATE TABLE {url_alias} (
        pid serial CHECK (pid >= 0),
        src varchar(128) NOT NULL default '',
        dst varchar(128) NOT NULL default '',
939
940
        language varchar(12) NOT NULL default '',
        PRIMARY KEY (pid)
941
942
      )");
      db_query("CREATE INDEX {url_alias}_src_idx ON {url_alias} (src)");
943
      db_query("CREATE UNIQUE INDEX {url_alias}_dst_language_idx ON {url_alias} (dst, language)");
944
945

      db_query("CREATE TABLE {permission} (
946
        rid int_unsigned NOT NULL default '0',
947
        perm text,
948
        tid int_unsigned NOT NULL default '0'
949
950
951
952
953
      )");
      db_query("CREATE INDEX {permission}_rid_idx ON {permission} (rid)");

      db_query("CREATE TABLE {role} (
        rid serial CHECK (rid >= 0),
954
        name varchar(64) NOT NULL default '',
955
956
957
958
959
960
961
        PRIMARY KEY (rid),
        UNIQUE (name)
      )");

      db_query("CREATE TABLE {blocks_roles} (
        module varchar(64) NOT NULL,
        delta varchar(32) NOT NULL,
962
        rid int_unsigned NOT NULL,
963
964
965
966
        PRIMARY KEY (module, delta, rid)
      )");

      db_query("CREATE TABLE {sessions} (
967
        uid int_unsigned NOT NULL,
968
        sid varchar(64) NOT NULL default '',
969
970
971
972
973
974
975
976
977
978
979
980
        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 '',
981
        id int_unsigned NOT NULL default '0',
982
983
984
985
986
        PRIMARY KEY (name)
      )"); */

      db_query("CREATE TABLE {node_counter} (
        nid int NOT NULL default '0',
987
988
989
        totalcount bigint_unsigned NOT NULL default '0',
        daycount int_unsigned NOT NULL default '0',
        timestamp int_unsigned NOT NULL default '0',
990
991
992
993
994
995
996
        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 '',
997
        owner varchar(255) NOT NULL default '',
998
999
1000
        status int NOT NULL default '0',
        throttle smallint DEFAULT '0' NOT NULL,
        bootstrap int NOT NULL default '0',