1
|
<?php
|
2
|
|
3
|
/**
|
4
|
* @file
|
5
|
* Install, update and uninstall functions for the uuid module.
|
6
|
*/
|
7
|
|
8
|
define('UUID_UPGRADE_VAR', 'uuid_upgrade_in_progress');
|
9
|
|
10
|
/**
|
11
|
* Include some helper functions for the Entity API.
|
12
|
*/
|
13
|
module_load_include('inc', 'uuid', 'uuid.entity');
|
14
|
|
15
|
/**
|
16
|
* Helper function that returns a schema field definition for UUID fields.
|
17
|
*
|
18
|
* @see uuid_schema_alter()
|
19
|
* @see uuid_install()
|
20
|
*/
|
21
|
function uuid_schema_field_definition() {
|
22
|
return array(
|
23
|
'type' => 'char',
|
24
|
'length' => 36,
|
25
|
'not null' => TRUE,
|
26
|
'default' => '',
|
27
|
'description' => 'The Universally Unique Identifier.',
|
28
|
);
|
29
|
}
|
30
|
|
31
|
/**
|
32
|
* Implements of hook_schema_alter().
|
33
|
*/
|
34
|
function uuid_schema_alter(&$schema = array()) {
|
35
|
$field = uuid_schema_field_definition();
|
36
|
foreach (uuid_get_core_entity_info() as $entity_type => $info) {
|
37
|
$schema[$info['base table']]['fields'][$info['entity keys']['uuid']] = $field;
|
38
|
if (!empty($info['revision table']) && !empty($info['entity keys']['revision uuid'])) {
|
39
|
$schema[$info['revision table']]['fields'][$info['entity keys']['revision uuid']] = $field;
|
40
|
}
|
41
|
}
|
42
|
}
|
43
|
|
44
|
/**
|
45
|
* Implements hook_install().
|
46
|
*/
|
47
|
function uuid_install() {
|
48
|
_uuid_install_uuid_fields();
|
49
|
uuid_sync_all();
|
50
|
}
|
51
|
|
52
|
/**
|
53
|
* Install the 'uuid' and 'vuuid' fields into Drupal core entity tables where needed.
|
54
|
*
|
55
|
* IMPORTANT: This function is called both at install and update time. If this method
|
56
|
* is modified to add additional fields in the future, the update strategy must be
|
57
|
* considered. See the comment in uuid_update_7102.
|
58
|
*/
|
59
|
function _uuid_install_uuid_fields() {
|
60
|
$field = uuid_schema_field_definition();
|
61
|
foreach (uuid_get_core_entity_info() as $entity_type => $info) {
|
62
|
if (!db_field_exists($info['base table'], $info['entity keys']['uuid'])) {
|
63
|
db_add_field($info['base table'], $info['entity keys']['uuid'], $field);
|
64
|
db_add_index($info['base table'], $info['entity keys']['uuid'], array($info['entity keys']['uuid']));
|
65
|
}
|
66
|
if (!empty($info['revision table']) && !empty($info['entity keys']['revision uuid'])) {
|
67
|
if (!db_field_exists($info['revision table'], $info['entity keys']['revision uuid'])) {
|
68
|
db_add_field($info['revision table'], $info['entity keys']['revision uuid'], $field);
|
69
|
db_add_index($info['revision table'], $info['entity keys']['revision uuid'], array($info['entity keys']['revision uuid']));
|
70
|
}
|
71
|
}
|
72
|
}
|
73
|
}
|
74
|
|
75
|
/**
|
76
|
* Implements hook_uninstall().
|
77
|
*/
|
78
|
function uuid_uninstall() {
|
79
|
foreach (uuid_get_core_entity_info() as $entity_type => $info) {
|
80
|
if (db_field_exists($info['base table'], $info['entity keys']['uuid'])) {
|
81
|
db_drop_field($info['base table'], $info['entity keys']['uuid']);
|
82
|
db_drop_index($info['base table'], $info['entity keys']['uuid']);
|
83
|
}
|
84
|
if (!empty($info['revision table']) && !empty($info['entity keys']['revision uuid'])) {
|
85
|
if (db_field_exists($info['revision table'], $info['entity keys']['revision uuid'])) {
|
86
|
db_drop_field($info['revision table'], $info['entity keys']['revision uuid']);
|
87
|
db_drop_index($info['revision table'], $info['entity keys']['revision uuid']);
|
88
|
}
|
89
|
}
|
90
|
}
|
91
|
}
|
92
|
|
93
|
/**
|
94
|
* Implements hook_modules_installed().
|
95
|
*/
|
96
|
function uuid_modules_installed($modules) {
|
97
|
// Run the installation hook. This makes sure that the schema for all
|
98
|
// supported core entity types is set correct.
|
99
|
uuid_install();
|
100
|
}
|
101
|
|
102
|
/**
|
103
|
* Create uuid_vocabulary and uuid_term_data tables.
|
104
|
*/
|
105
|
function uuid_update_6001() {
|
106
|
$ret = array();
|
107
|
|
108
|
db_create_table($ret, 'uuid_vocabulary', uuid_table_schema('vocabulary', 'vid'));
|
109
|
db_create_table($ret, 'uuid_term_data', uuid_table_schema('term_data', 'tid'));
|
110
|
|
111
|
return $ret;
|
112
|
}
|
113
|
|
114
|
/**
|
115
|
* For each of out tables, drop the indexe on the UUID column and add a unique
|
116
|
* key on that column.
|
117
|
*/
|
118
|
function uuid_update_6002() {
|
119
|
$ret = array();
|
120
|
|
121
|
foreach (uuid_schema() as $table => $schema) {
|
122
|
db_drop_index($ret, $table, $table . '_uuid_idx');
|
123
|
db_add_unique_key($ret, $table, $table . '_uuid_key', array('uuid'));
|
124
|
}
|
125
|
|
126
|
return $ret;
|
127
|
}
|
128
|
|
129
|
/**
|
130
|
* Create uuid_comment table.
|
131
|
*/
|
132
|
function uuid_update_6003() {
|
133
|
$ret = array();
|
134
|
|
135
|
db_create_table($ret, 'uuid_comments', uuid_table_schema('comments', 'cid'));
|
136
|
|
137
|
return $ret;
|
138
|
}
|
139
|
|
140
|
/**
|
141
|
* Fix the column definitions for uuid columns in all tables
|
142
|
* to use the more efficient char spec.
|
143
|
*/
|
144
|
function uuid_update_6004() {
|
145
|
$ret = array();
|
146
|
|
147
|
// Use what's in uuid_table_schema in order to be consistent.
|
148
|
$tables = uuid_schema();
|
149
|
$spec = $tables['uuid_node']['fields']['uuid'];
|
150
|
|
151
|
foreach ($tables as $tablename => $schema) {
|
152
|
if (db_table_exists($tablename)) {
|
153
|
db_change_field($ret, $tablename, 'uuid', 'uuid', $spec);
|
154
|
}
|
155
|
}
|
156
|
|
157
|
return $ret;
|
158
|
}
|
159
|
|
160
|
/**
|
161
|
* Modify existing uuid_node_revisions table to support revision deletion, and
|
162
|
* add in as much legacy data as possible.
|
163
|
*/
|
164
|
function uuid_update_6005() {
|
165
|
$ret = array();
|
166
|
|
167
|
if (db_table_exists('uuid_node_revisions')) {
|
168
|
// Use what's already defined in uuid schema in order to be consistent.
|
169
|
$schema = uuid_schema();
|
170
|
$spec = $schema['uuid_node_revisions']['fields']['nid'];
|
171
|
db_add_field($ret, 'uuid_node_revisions', 'nid', $spec);
|
172
|
// Add node ids to the new column, for revisions that exist, but now have a
|
173
|
// default value of 0 in uuid_node_revisions.
|
174
|
$result = db_query('SELECT nr.nid, nr.vid FROM {node_revisions} AS nr LEFT JOIN {uuid_node_revisions} AS unr ON unr.vid=nr.vid WHERE unr.nid=%d', 0);
|
175
|
while ($item = db_fetch_object($result)) {
|
176
|
$ret[] = update_sql('UPDATE {uuid_node_revisions} SET nid=' . (int) $item->nid . ' WHERE vid=' . (int) $item->vid);
|
177
|
}
|
178
|
// Add uuid_node_revision rows for rows that don't exist, but should.
|
179
|
$result = db_query('SELECT nr.nid, nr.vid FROM {node_revisions} AS nr LEFT JOIN {uuid_node_revisions} AS unr ON unr.vid=nr.vid WHERE unr.nid IS NULL');
|
180
|
while ($item = db_fetch_object($result)) {
|
181
|
$ret[] = update_sql(sprintf("INSERT INTO {uuid_node_revisions} (vid, uuid, nid) VALUES(%d, '%s', %d)", $item->vid, uuid_uuid(), $item->nid));
|
182
|
}
|
183
|
// Delete any orphaned revision vid, uuid pairs.
|
184
|
$ret[] = update_sql('DELETE FROM {uuid_node_revisions} WHERE nid=0');
|
185
|
}
|
186
|
|
187
|
return $ret;
|
188
|
}
|
189
|
|
190
|
/**
|
191
|
* Remove old variables.
|
192
|
*/
|
193
|
function uuid_update_7100() {
|
194
|
$types = array(
|
195
|
'nodes',
|
196
|
'users',
|
197
|
'taxonomy',
|
198
|
'comments',
|
199
|
);
|
200
|
foreach ($types as $type) {
|
201
|
variable_del('uuid_automatic_for_' . $type);
|
202
|
}
|
203
|
return array();
|
204
|
}
|
205
|
|
206
|
/**
|
207
|
* Clear cache for installations that used alpha1. Modules that previously was
|
208
|
* enabled in uuid_update_7100() doesn't exist anymore.
|
209
|
*/
|
210
|
function uuid_update_7101() {
|
211
|
drupal_flush_all_caches();
|
212
|
}
|
213
|
|
214
|
/**
|
215
|
* Insure that the uuid and vuuid fields are added where needed.
|
216
|
*
|
217
|
* Note that update 7102 calls _uuid_install_uuid_fields(), which is an
|
218
|
* idempotent function. If _uuid_install_uuid_fields() is changed at some
|
219
|
* point in the future (but remains idempotent), then some uuid users
|
220
|
* will have run update 7102, and some will not. A new uuid_update_7103()
|
221
|
* function would would therefore be necessary to update all users to
|
222
|
* the latest schema. At the same time, uuid_update_7102() could become
|
223
|
* an empty function, as it would not be necessary to call _uuid_install_uuid_fields()
|
224
|
* twice.
|
225
|
*/
|
226
|
function uuid_update_7102() {
|
227
|
// If the user have disabled the UUID module during upgrade (as UPGRADE.txt
|
228
|
// instructs), some functions will be missing. So include the module file.
|
229
|
module_load_include('module', 'uuid', 'uuid');
|
230
|
_uuid_install_uuid_fields();
|
231
|
uuid_sync_all();
|
232
|
}
|