/** * Function to handle ALTER COLUMN. * * @access private * @param array of string $queries * @return string|array of string */ private function handle_alter_command($queries) { $tokenized_query = $queries; $temp_table = 'temp_' . $tokenized_query['table_name']; if (isset($tokenized_query['default_value'])) { $def_value = $this->convert_field_types($tokenized_query['column_name'], $tokenized_query['default_value']); $def_value = 'DEFAULT ' . $def_value; } else { $def_value = null; } $_wpdb = new PDODB(); $query_obj = $_wpdb->get_results("SELECT sql FROM sqlite_master WHERE tbl_name='{$tokenized_query['table_name']}'"); $_wpdb = null; for ($i = 0; $i < count($query_obj); $i++) { $index_queries[$i] = $query_obj[$i]->sql; } $create_query = array_shift($index_queries); if (stripos($create_query, $tokenized_query['column_name']) === false) { return 'SELECT 1=1'; } if (preg_match("/\\s*({$tokenized_query['column_name']})\\s*(.*)?(DEFAULT\\s*.*)[,)]/im", $create_query, $match)) { $col_name = trim($match[1]); $col_def = trim($match[2]); $col_def_esc = str_replace(array('(', ')'), array('\\(', '\\)'), $col_def); $checked_col_def = $this->convert_field_types($col_name, $col_def); $old_default = trim($match[3]); $pattern = "/{$col_name}\\s*{$col_def_esc}\\s*{$old_default}/im"; if (is_null($def_value)) { $replacement = $col_name . ' ' . $checked_col_def; } else { $replacement = $col_name . ' ' . $checked_col_def . ' ' . $def_value; } $create_query = preg_replace($pattern, $replacement, $create_query); $create_query = str_ireplace($tokenized_query['table_name'], $temp_table, $create_query); } elseif (preg_match("/\\s*({$tokenized_query['column_name']})\\s*(.*)?[,)]/im", $create_query, $match)) { $col_name = trim($match[1]); $col_def = trim($match[2]); $col_def_esc = str_replace(array('(', ')'), array('\\(', '\\)'), $col_def); $checked_col_def = $this->convert_field_types($col_name, $col_def); $pattern = "/{$col_name}\\s*{$col_def_esc}/im"; if (is_null($def_value)) { $replacement = $col_name . ' ' . $checked_col_def; } else { $replacement = $col_name . ' ' . $checked_col_def . ' ' . $def_value; } $create_query = preg_replace($pattern, $replacement, $create_query); $create_query = str_ireplace($tokenized_query['table_name'], $temp_table, $create_query); } else { return 'SELECT 1=1'; } $query[] = $create_query; $query[] = "INSERT INTO {$temp_table} SELECT * FROM {$tokenized_query['table_name']}"; $query[] = "DROP TABLE IF EXISTS {$tokenized_query['table_name']}"; $query[] = "ALTER TABLE {$temp_table} RENAME TO {$tokenized_query['table_name']}"; foreach ($index_queries as $index) { $query[] = $index; } return $query; }
/** * Method to avoid DELETE with JOIN statement. * * wp-admin/includes/upgrade.php contains 'DELETE ... JOIN' statement. * This query can't be replaced with regular expression or udf, so we * replace all the statement with another. But this query was used in * the very old version of WordPress when it was upgraded. So we won't * have no chance that this method should be used. * * @access private */ private function delete_workaround() { global $wpdb; $pattern = "DELETE o1 FROM {$wpdb->options} AS o1 JOIN {$wpdb->options} AS o2"; $pattern2 = "DELETE a, b FROM {$wpdb->sitemeta} AS a, {$wpdb->sitemeta} AS b"; $rewritten = "DELETE FROM {$wpdb->options} WHERE option_id IN (SELECT MIN(option_id) FROM {$wpdb->options} GROUP BY option_name HAVING COUNT(*) > 1)"; if (stripos($this->_query, $pattern) !== false) { $this->_query = $rewritten; } else { if (stripos($this->_query, $pattern2) !== false) { $time = time(); $prep_query = "SELECT a.meta_id AS aid, b.meta_id AS bid FROM {$wpdb->sitemeta} AS a INNER JOIN {$wpdb->sitemeta} AS b ON a.meta_key='_site_transient_timeout_'||substr(b.meta_key, 17) WHERE b.meta_key='_site_transient_'||substr(a.meta_key, 25) AND a.meta_value < {$time}"; $_wpdb = new PDODB(); $ids = $_wpdb->get_results($prep_query); foreach ($ids as $id) { $ids_to_delete[] = $id->aid; $ids_to_delete[] = $id->bid; } $rewritten = "DELETE FROM {$wpdb->sitemeta} WHERE meta_id IN (" . implode(',', $ids_to_delete) . ")"; $this->_query = $rewritten; } } }
/** * Callback method for rewrite_key. * * @param array $matches an array of matches from the Regex * @access private */ private function _rewrite_key($matches) { $index_name = trim($matches[2]); $col_name = trim($matches[3]); if (preg_match('/\\([0-9]+?\\)/', $col_name, $match)) { $col_name = preg_replace_callback('/\\([0-9]+?\\)/', array($this, '_remove_length'), $col_name); } $tbl_name = $this->table_name; $_wpdb = new PDODB(); $results = $_wpdb->get_results("SELECT name FROM sqlite_master WHERE type='index'"); $_wpdb = null; if ($results) { foreach ($results as $result) { if ($result->name == $index_name) { $r = rand(0, 50); $index_name = $index_name . "_{$r}"; break; } } } $this->index_queries[] = 'CREATE INDEX ' . $index_name . ' ON ' . $tbl_name . $col_name; return ''; }