PluginProbe
Redirection / 2.9
Redirection v2.9
5.10.0 5.9.0 5.8.1 5.8.0 3.7.2 3.7.3 4.0 4.0.1 4.1 4.1.1 4.2 4.2.1 4.2.2 4.2.3 4.3 4.3.1 4.3.2 4.3.3 4.4 4.4.1 4.4.2 4.5 4.5.1 4.6.2 4.7.1 All 130 releases
redirection / models / database.php

database.php in Redirection 2.9, at models/database.php

283 lines 8.9 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 class RE_Database {
4 public function get_charset() {
5 global $wpdb;
6
7 $charset_collate = '';
8 if ( ! empty( $wpdb->charset ) ) {
9 $charset_collate = "DEFAULT CHARACTER SET $wpdb->charset";
10 }
11
12 if ( ! empty( $wpdb->collate ) ) {
13 $charset_collate .= " COLLATE=$wpdb->collate";
14 }
15
16 return $charset_collate;
17 }
18
19 private function create_items_sql( $prefix, $charset_collate ) {
20 return "CREATE TABLE IF NOT EXISTS `{$prefix}redirection_items` (
21 `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
22 `url` mediumtext NOT NULL,
23 `regex` int(11) unsigned NOT NULL DEFAULT '0',
24 `position` int(11) unsigned NOT NULL DEFAULT '0',
25 `last_count` int(10) unsigned NOT NULL DEFAULT '0',
26 `last_access` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
27 `group_id` int(11) NOT NULL DEFAULT '0',
28 `status` enum('enabled','disabled') NOT NULL DEFAULT 'enabled',
29 `action_type` varchar(20) NOT NULL,
30 `action_code` int(11) unsigned NOT NULL,
31 `action_data` mediumtext,
32 `match_type` varchar(20) NOT NULL,
33 `title` varchar(50) DEFAULT NULL,
34 PRIMARY KEY (`id`),
35 KEY `url` (`url`(191)),
36 KEY `status` (`status`),
37 KEY `regex` (`regex`),
38 KEY `group_idpos` (`group_id`,`position`),
39 KEY `group` (`group_id`)
40 ) $charset_collate";
41 }
42
43 private function create_groups_sql( $prefix, $charset_collate ) {
44 return "CREATE TABLE IF NOT EXISTS `{$prefix}redirection_groups` (
45 `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
46 `name` varchar(50) NOT NULL,
47 `tracking` int(11) NOT NULL DEFAULT '1',
48 `module_id` int(11) unsigned NOT NULL DEFAULT '0',
49 `status` enum('enabled','disabled') NOT NULL DEFAULT 'enabled',
50 `position` int(11) unsigned NOT NULL DEFAULT '0',
51 PRIMARY KEY (`id`),
52 KEY `module_id` (`module_id`),
53 KEY `status` (`status`)
54 ) $charset_collate";
55 }
56
57 private function create_log_sql( $prefix, $charset_collate ) {
58 return "CREATE TABLE IF NOT EXISTS `{$prefix}redirection_logs` (
59 `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
60 `created` datetime NOT NULL,
61 `url` mediumtext NOT NULL,
62 `sent_to` mediumtext,
63 `agent` mediumtext NOT NULL,
64 `referrer` mediumtext,
65 `redirection_id` int(11) unsigned DEFAULT NULL,
66 `ip` varchar(17) NOT NULL DEFAULT '',
67 `module_id` int(11) unsigned NOT NULL,
68 `group_id` int(11) unsigned DEFAULT NULL,
69 PRIMARY KEY (`id`),
70 KEY `created` (`created`),
71 KEY `redirection_id` (`redirection_id`),
72 KEY `ip` (`ip`),
73 KEY `group_id` (`group_id`),
74 KEY `module_id` (`module_id`)
75 ) $charset_collate";
76 }
77
78 private function create_404_sql( $prefix, $charset_collate ) {
79 return "CREATE TABLE IF NOT EXISTS `{$prefix}redirection_404` (
80 `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
81 `created` datetime NOT NULL,
82 `url` varchar(255) NOT NULL DEFAULT '',
83 `agent` varchar(255) DEFAULT NULL,
84 `referrer` varchar(255) DEFAULT NULL,
85 `ip` int(10) unsigned NOT NULL,
86 PRIMARY KEY (`id`),
87 KEY `created` (`created`),
88 KEY `url` (`url`(191)),
89 KEY `ip` (`ip`),
90 KEY `referrer` (`referrer`(191))
91 ) $charset_collate";
92 }
93
94 public function get_all_tables() {
95 global $wpdb;
96
97 $charset_collate = $this->get_charset();
98
99 return array(
100 "{$wpdb->prefix}redirection_items" => $this->create_items_sql( $wpdb->prefix, $charset_collate ),
101 "{$wpdb->prefix}redirection_groups" => $this->create_groups_sql( $wpdb->prefix, $charset_collate ),
102 "{$wpdb->prefix}redirection_logs" => $this->create_log_sql( $wpdb->prefix, $charset_collate ),
103 "{$wpdb->prefix}redirection_404" => $this->create_404_sql( $wpdb->prefix, $charset_collate ),
104 );
105 }
106
107 public function create_tables() {
108 global $wpdb;
109
110 foreach ( $this->get_all_tables() as $sql ) {
111 if ( $wpdb->query( $sql ) === false ) {
112 throw new Exception( 'There was a database error installing Redirection - please post these details to https://github.com/johngodley/redirection/issues - '.$sql.' = '.$wpdb->print_error() );
113 return false;
114 }
115 }
116 }
117
118 public function createDefaults() {
119 $this->createDefaultGroups();
120
121 update_option( 'redirection_version', REDIRECTION_DB_VERSION );
122 }
123
124 private function createDefaultGroups() {
125 global $wpdb;
126
127 $existing_groups = $wpdb->get_var( "SELECT COUNT(*) FROM {$wpdb->prefix}redirection_groups" );
128
129 // Default groups
130 if ( intval( $existing_groups, 10 ) === 0 ) {
131 $wpdb->insert( $wpdb->prefix.'redirection_groups', array( 'name' => __( 'Redirections', 'redirection' ), 'module_id' => 1, 'position' => 0 ) );
132 $wpdb->insert( $wpdb->prefix.'redirection_groups', array( 'name' => __( 'Modified Posts', 'redirection' ), 'module_id' => 1, 'position' => 1 ) );
133 }
134 }
135
136 public function install() {
137 global $wpdb;
138
139 $wpdb->show_errors();
140 $this->create_tables();
141 $this->createDefaults();
142 $wpdb->hide_errors();
143
144 return true;
145 }
146
147 public function upgrade( $current, $target ) {
148 global $wpdb;
149
150 $wpdb->show_errors();
151
152 if ( $current !== false ) {
153 $versions = array(
154 '2.0.1' => 'upgrade_to_201',
155 '2.1.16' => 'upgrade_to_216',
156 '2.2' => 'upgrade_to_220',
157 '2.3.1' => 'upgrade_to_231',
158 '2.3.2' => 'upgrade_to_232',
159 '2.3.3' => 'upgrade_to_233',
160 );
161
162 foreach ( $versions AS $vers => $upgrade ) {
163 if ( version_compare( $current, $vers ) === -1 ) {
164 $this->$upgrade();
165 }
166 }
167
168 update_option( 'redirection_version', $target );
169 }
170
171 $wpdb->hide_errors();
172 }
173
174 /**
175 * 2.32 => 2.3.3
176 * Migrate any groups with incorrect module_ids
177 * Create a group if none exists
178 */
179 private function upgrade_to_233() {
180 global $wpdb;
181
182 $wpdb->query( "UPDATE {$wpdb->prefix}redirection_groups SET module_id=1 WHERE module_id > 2" );
183 $this->createDefaultGroups();
184 }
185
186 /**
187 * 2.3.1 => 2.3.2
188 * Delete the redirection_modules table
189 */
190 private function upgrade_to_232() {
191 global $wpdb;
192
193 $wpdb->query( "DROP TABLE IF EXISTS {$wpdb->prefix}redirection_modules;" );
194 }
195
196 /**
197 * 2.2 => 2.3.1
198 * Update any group referring to 404 module to WordPress module
199 * Create 404 log table
200 */
201 private function upgrade_to_231() {
202 global $wpdb;
203
204 $wpdb->query( "UPDATE {$wpdb->prefix}redirection_groups SET module_id=1 WHERE module_id=3" );
205 $wpdb->query( $this->create_404_sql( $wpdb->prefix, $this->get_charset() ) );
206 }
207
208 /**
209 * 2.1.6 => 2.2.0
210 * Add indices to redirection items and logs
211 */
212 private function upgrade_to_220() {
213 global $wpdb;
214
215 $wpdb->query( "ALTER TABLE `{$wpdb->prefix}redirection_items` ADD INDEX `group_idpos` (`group_id`,`position`)" );
216 $wpdb->query( "ALTER TABLE `{$wpdb->prefix}redirection_items` ADD INDEX `group` (`group_id`)" );
217 $wpdb->query( "ALTER TABLE `{$wpdb->prefix}redirection_logs` ADD INDEX `created` (`created`)" );
218 $wpdb->query( "ALTER TABLE `{$wpdb->prefix}redirection_logs` ADD INDEX `redirection_id` (`redirection_id`)" );
219 $wpdb->query( "ALTER TABLE `{$wpdb->prefix}redirection_logs` ADD INDEX `ip` (`ip`)" );
220 $wpdb->query( "ALTER TABLE `{$wpdb->prefix}redirection_logs` ADD INDEX `group_id` (`group_id`)" );
221 $wpdb->query( "ALTER TABLE `{$wpdb->prefix}redirection_logs` ADD INDEX `module_id` (`module_id`)" );
222 }
223
224 /**
225 * 2.0.1 => 2.1.6
226 * Update any group referring to 404 module to WordPress module
227 * Create 404 log table
228 */
229 private function upgrade_to_216() {
230 global $wpdb;
231
232 $wpdb->query( "ALTER TABLE `{$wpdb->prefix}redirection_groups` ADD INDEX(module_id)" );
233 $wpdb->query( "ALTER TABLE `{$wpdb->prefix}redirection_groups` ADD INDEX(status)" );
234 $wpdb->query( "ALTER TABLE `{$wpdb->prefix}redirection_items` ADD INDEX(url(191))" );
235 $wpdb->query( "ALTER TABLE `{$wpdb->prefix}redirection_items` ADD INDEX(status)" );
236 $wpdb->query( "ALTER TABLE `{$wpdb->prefix}redirection_items` ADD INDEX(regex)" );
237 }
238
239 /**
240 * <2.0.1 => 2.0.1
241 */
242 private function upgrade_to_201() {
243 global $wpdb;
244
245 $wpdb->query( "ALTER TABLE `{$wpdb->prefix}redirection_items` ADD `title` varchar(50) NULL" );
246 }
247
248 public function remove() {
249 global $wpdb;
250
251 $wpdb->query( "DROP TABLE IF EXISTS {$wpdb->prefix}redirection_items" );
252 $wpdb->query( "DROP TABLE IF EXISTS {$wpdb->prefix}redirection_logs" );
253 $wpdb->query( "DROP TABLE IF EXISTS {$wpdb->prefix}redirection_groups" );
254 $wpdb->query( "DROP TABLE IF EXISTS {$wpdb->prefix}redirection_modules" );
255 $wpdb->query( "DROP TABLE IF EXISTS {$wpdb->prefix}redirection_404" );
256
257 delete_option( 'redirection_lookup' );
258 delete_option( 'redirection_post' );
259 delete_option( 'redirection_root' );
260 delete_option( 'redirection_index' );
261 delete_option( 'redirection_version' );
262 }
263
264 public function get_status() {
265 global $wpdb;
266
267 $missing = array();
268
269 foreach ( $this->get_all_tables() as $table => $sql ) {
270 $result = $wpdb->query( $wpdb->prepare( 'SHOW TABLES LIKE %s', $table ) );
271
272 if ( intval( $result, 10 ) !== 1 ) {
273 $missing[] = $table;
274 }
275 }
276
277 return array(
278 'status' => count( $missing ) === 0 ? 'good' : 'error',
279 'message' => count( $missing ) === 0 ? __( 'All tables present', 'redirection' ) : __( 'The following tables are missing:', 'redirection' ).' '.join( ',', $missing ),
280 );
281 }
282 }
283