Files
roi-theme/wp-content/plugins/thrive-product-manager/thrive-dashboard/inc/db-manager/class-td-db-migration.php
root a22573bf0b Commit inicial - WordPress Análisis de Precios Unitarios
- WordPress core y plugins
- Tema Twenty Twenty-Four configurado
- Plugin allow-unfiltered-html.php simplificado
- .gitignore configurado para excluir wp-config.php y uploads

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-03 21:04:30 -06:00

259 lines
6.1 KiB
PHP
Executable File

<?php
/**
* Thrive Themes - https://thrivethemes.com
*
* @package thrive-dashboard
*/
if ( ! defined( 'ABSPATH' ) ) {
exit; // Silence is golden
}
class TD_DB_Migration {
/**
* @var array
*/
protected $_queries = array();
/**
* @var string
*/
protected $_table_prefix;
/**
* @var wpdb
*/
protected $_wpdb;
/**
* Full path to the migration file
*
* @var string
*/
protected $_file_path;
/**
* TD_DB_Migration constructor.
*
* Each migration works with prefixed tables
*
* @param string $table_prefix plugin's table prefix
* @param string $file_path full absolute path to the migration file
*/
public function __construct( $table_prefix, $file_path = '' ) {
global $wpdb;
$this->_wpdb = $wpdb;
$this->_file_path = $file_path;
$this->_table_prefix = $this->_wpdb->prefix . ( empty( $table_prefix ) ? '' : rtrim( $table_prefix, '_ ' ) . '_' );
}
/**
* Based on the prefix sent on initialization returns the name of the table
* with {wp_prefix}_{plugin_prefix}_{name}
*
* @param $name
*
* @return string
*/
public function get_table_name( $name ) {
$name = preg_replace( '#^' . $this->_table_prefix . '#', '', $name );
return $this->_table_prefix . $name;
}
/**
* Adds and sql query to the queue for later execution
*
* @param string $sql
* @param bool $collate whether or not to add COLLATE specification to the query
*
* @return TD_DB_Migration allows fluent interface
*/
public function add( $sql, $collate = true ) {
return $this->add_query( trim( $sql ) . ( $collate ? ' ' . $this->_wpdb->get_charset_collate() : '' ) );
}
/**
* Adds a raw query to the queue
*
* @param string $query
*
* @return TD_DB_Migration allows fluent interface
*/
public function add_query( $query ) {
$query = preg_replace_callback( '#\{(.+?)\}#', array( $this, 'preg_replace_table_name' ), $query );
$this->_queries [] = $query;
return $this;
}
/**
* Adds a CREATE TABLE query to the queue
*
* @param string $table_name
* @param string $spec full table spec, excluding brackets
* @param bool $add_collate_spec whether to add collate specification
*
* @return TD_DB_Migration allows fluent interface$this
*/
public function create_table( $table_name, $spec, $add_collate_spec = false ) {
$table_name = $this->_prepare_table_name( $table_name );
$this->add_query( "CREATE TABLE IF NOT EXISTS `{$table_name}` ({$spec})" . ( $add_collate_spec ? ( ' ' . $this->_wpdb->get_charset_collate() ) : '' ) );
return $this;
}
/**
* Adds or modifies a column from a table. First, it checks if the column exists
*
* @param string $table_name
* @param string $column_name
* @param string $spec
*
* @return TD_DB_Migration allows fluent interface
*/
public function add_or_modify_column( $table_name, $column_name, $spec ) {
$table_name = $this->_prepare_table_name( $table_name );
$sql = "ALTER TABLE `{$table_name}` ";
$exists = $this->column_exists( $table_name, $column_name ) ? "CHANGE `{$column_name}` " : 'ADD COLUMN ';
$this->add_query( $sql . $exists . "`{$column_name}` {$spec}" );
return $this;
}
/**
* Drops column from table if exists
*
* @param $table_name
* @param $column_name
*
* @return TD_DB_Migration allows fluent interface
*/
public function drop_column( $table_name, $column_name ) {
if ( $this->column_exists( $table_name, $column_name ) ) {
$table_name = $this->_prepare_table_name( $table_name );
$this->add_query( "ALTER TABLE `{$table_name}` DROP COLUMN `{$column_name}`;" );
}
return $this;
}
/**
* Checks if a column exists
*
* @param string $table_name
* @param string $column_name
*
* @return bool
*/
public function column_exists( $table_name, $column_name ) {
$results = $this->_wpdb->get_results( "SHOW FULL COLUMNS FROM `{$this->_prepare_table_name($table_name)}` LIKE '$column_name'" );
return ! empty( $results );
}
/**
* Creates an index on table
*
* @param string $index_name
* @param string $table_name
* @param array|string $columns
*
* @return TD_DB_Migration allows fluent interface
*/
public function create_index( $index_name, $table_name, $columns ) {
$table_name = $this->_prepare_table_name( $table_name );
if ( ! is_array( $columns ) ) {
$columns = array( $columns );
}
$str_columns = implode( ',', $columns );
if ( false === $this->index_exists( $index_name, $table_name ) ) {
$this->add_query( "CREATE INDEX `{$index_name}` ON `{$table_name}` ({$str_columns})" );
}
return $this;
}
/**
* Checks if an index with name exists on the table
*
* @param string $index_name
* @param string $table_name
*
* @return bool
*/
public function index_exists( $index_name, $table_name ) {
$table_name = $this->_prepare_table_name( $table_name );
$index = $this->_wpdb->get_row( "SHOW INDEX FROM `{$table_name}` WHERE Key_name = '{$index_name}'" );
return (bool) $index;
}
/**
* Loops through the queries and executes them
*
* @return bool
*/
public function run() {
$success = true;
if ( defined( 'THRIVE_DB_UPGRADING' ) === false ) {
$this->_wpdb->last_error = 'Cannot run migrations outside of Database Manager';
$success = false;
}
if ( $this->_file_path ) {
$result = require_once $this->_file_path;
/* backwards compat support */
if ( $result instanceof TD_DB_Migration ) {
return $result->run();
}
}
foreach ( $this->_queries as $query ) {
if ( $success && $this->_wpdb->query( $query ) === false ) {
$success = false;
break;
}
}
return $success;
}
/**
* Prepares a table name for using it in queries
*
* @param string $table_name
*
* @return mixed|string
*/
protected function _prepare_table_name( $table_name ) {
return $this->get_table_name( str_replace( '`', '', $table_name ) );
}
/**
* Replaces {table_name} instances with prefixed_table_name
*
* @param array $matches
*
* @return string
*/
protected function preg_replace_table_name( $matches ) {
return $this->get_table_name( $matches[1] );
}
}