Ejemplo n.º 1
0
 /**
  * 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;
         }
     }
 }
Ejemplo n.º 3
0
 /**
  * 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 '';
 }