Your IP : 216.73.216.1


Current Path : /home/fotouserdopd8j/www/wp-content/plugins/rvg-optimize-database/
Upload File :
Current File : /home/fotouserdopd8j/www/wp-content/plugins/rvg-optimize-database/rvg-optimize-database.php

<?php
/*
Plugin Name: Optimize Database after Deleting Revisions
Description: One-click database optimization with precise revision cleanup and flexible scheduling.
Author: NerdPress
Author URI: https://www.nerdpress.net
Network: True
Version: 5.3.0
*/

/********************************************************************************************
 *
 *	MAIN CLASS
 *
 ********************************************************************************************/

add_action( 'plugins_loaded', function() {
	//v5.0.10
	$action = '';
	if(isset($_REQUEST['action']) && isset($_REQUEST['page']) && 'rvg-optimize-database' === $_REQUEST['page']) {
		$action = $_REQUEST['action'];
	}
	if (
		! empty( $action )
		&& isset( $_GET['_wpnonce'] )
		&& current_user_can( 'manage_options' )
		&& wp_verify_nonce( $_GET['_wpnonce'], 'rvg-optimize-database' )
	) {
		if ($action == 'analyze_summary' ||
			$action == 'analyze_detail' ||
			$action == 'run_summary' ||
			$action == 'run_detail') {
			@set_time_limit(4*3600);
		} else {
			// GET DEFAULT VALUE FROM PHP.INI
			$max = ini_get('max_execution_time');
			@set_time_limit($max);
		}
	} else {
		// Possibly invalid nonce; assume NO action.
		$action = '';
	}

	class OptimizeDatabase {
		// VERSION
		var $odb_version           = '5.3.0';

		// PLUGIN OPTIONS
		var $odb_rvg_options       = array();

		// EXCLUDED TABLES
		var $odb_rvg_excluded_tabs = array();

		// MULTISITE STRUCTURE
		var $odb_ms_prefixes       = array();

		// DATABASE TABLES
		var $odb_tables            = array();

		// MINIFYING?
		var $odb_minify;

		// MAIN PLUGIN FILE
		var $odb_main_file         = 'rvg-optimize-database/rvg-optimize-database.php';

		// LOCALIZATION
		var $odb_txt_domain        = 'rvg-optimize-database';

		// CURRENT SITE DATE (yyyymmddHHiiss) AND UNIX TIMESTAMP, BASED ON TIMEZONE OF THE SITE
		// v4.4.3
		var $odb_current_date;
		var $odb_timestamp;
		var $odb_last_run_seconds;

		// PLUGIN
		var $odb_plugin_url;
		var $odb_plugin_path;
		var $odb_logfile_debug_path;

		// DATABASE TABLE FOR LOGGING
		// v4.6
		var $odb_logtable_name;

		// OBJECTS
		var $odb_cleaner_obj;
		var $odb_displayer_obj;
		var $odb_logger_obj;
		var $odb_multisite_obj;
		var $odb_scheduler_obj;
		var $odb_utilities_obj;

		// PAGE TIMER
		var	$odb_start_time;

		var $log_arr;

		/*******************************************************************************
		 *
		 * 	CONSTRUCTOR
		 *
		 *******************************************************************************/
		function __construct() {
			// INITIALIZE PLUGIN
			add_action('init', array(&$this, 'odb_init'));
		} // __construct()


		/*******************************************************************************
		 * 	INITIALIZE PLUGIN
		 *******************************************************************************/
		function odb_init() {
			// LOAD CLASSES
			$this->odb_classes();

			// URLS AND DIRECTORIES
			$this->odb_urls_dirs();

			// 5.0.8 THIS MAY NOT THIS MAY NOT EVEN BE NECESSARY ANYMORE
			if ($this->odb_is_relevant_page()) {
				$this->odb_create_log_table();
			}

			// GET (MULTI-SITE) NETWORK INFORMATION
			$this->odb_multisite_obj->odb_ms_network_info();

			// LOAD OPTIONS
			$this->odb_load_options();

			// INITIALIZE WORDPRESS HOOKS
			$this->odb_init_hooks();

			// GET EXCLUDED TABLES FROM SETTINGS
			$this->odb_rvg_excluded_tabs = $this->odb_multisite_obj->odb_ms_get_option('odb_rvg_excluded_tabs');

			// USE THE NON-MINIFIED VERSION OF SCRIPTS AND STYLE SHEETS WHILE DEBUGGING
			$this->odb_minify = (defined('WP_DEBUG') && WP_DEBUG) ? '' : '.min';

			// LOAD STYLE SHEET (ONLY ON RELEVANT PAGES)
			// v4.0.3
			if($this->odb_is_relevant_page()) {
				wp_register_style(
					'odb-style'.$this->odb_version,
					plugins_url('css/style.css', __FILE__),
					array(),
					$this->odb_version
				);
				wp_enqueue_style('odb-style'.$this->odb_version);
			} // if($this->odb_is_relevant_page())

			if(defined('RUN_OPTIMIZE_DATABASE') && RUN_OPTIMIZE_DATABASE == 1) $this->odb_start(true);
		} // odb_init()


		/*******************************************************************************
		 *
		 * 	LOAD AND INITIALIZE CLASSES
		 *
		 *******************************************************************************/
		function odb_classes() {
			// LOAD CLASSES
			include_once('classes/odb-cleaner.php');
			include_once('classes/odb-displayer.php');
			include_once('classes/odb-logger.php');
			include_once('classes/odb-multisite.php');
			include_once('classes/odb-scheduler.php');
			include_once('classes/odb-utilities.php');

			// CREATE INSTANCES
			$this->odb_cleaner_obj   = new ODB_Cleaner();
			$this->odb_displayer_obj = new ODB_Displayer();
			$this->odb_logger_obj    = new ODB_Logger();
			$this->odb_multisite_obj = new ODB_MultiSite();
			$this->odb_scheduler_obj = new ODB_Scheduler();
			$this->odb_utilities_obj = new ODB_Utilities();
		} // odb_classes()


		/*******************************************************************************
		 *
		 * 	INITIALIZE URLS AND DIRECTORIES
		 *
		 *******************************************************************************/
		function odb_urls_dirs() {
			$this->odb_plugin_url         = plugins_url( '/', __FILE__ );
			$this->odb_plugin_path        = plugin_dir_path(__FILE__);
			$this->odb_logfile_debug_path = $this->odb_plugin_path.'logs/rvg-optimize-db-log.txt';
		} // odb_urls_dirs()


		/*******************************************************************************
		 *
		 * 	LOAD OPTIONS
		 *
		 *******************************************************************************/
		function odb_load_options() {
			// GET OPTIONS
			$this->odb_rvg_options = $this->odb_multisite_obj->odb_ms_get_option('odb_rvg_options', array());

			if(!isset($this->odb_rvg_options['version']))
				// THIS VERSION IS FROM BEFORE 4.0: CONVERT OPTIONS
				$this->odb_convert_options();

			if(!isset($this->odb_rvg_options['adminbar']))
				$this->odb_rvg_options['adminbar']         = 'N';
			if(!isset($this->odb_rvg_options['adminmenu']))
				$this->odb_rvg_options['adminmenu']        = 'N';
			if(!isset($this->odb_rvg_options['clear_pingbacks']))
				$this->odb_rvg_options['clear_pingbacks']  = 'N';
			if(!isset($this->odb_rvg_options['clear_oembed']))
				$this->odb_rvg_options['clear_oembed']  = 'N';
			if(!isset($this->odb_rvg_options['clear_orphans']))
				$this->odb_rvg_options['clear_orphans']  = 'N';
			if(!isset($this->odb_rvg_options['clear_spam']))
				$this->odb_rvg_options['clear_spam']       = 'N';
			if(!isset($this->odb_rvg_options['clear_tags']))
				$this->odb_rvg_options['clear_tags']       = 'N';
			if(!isset($this->odb_rvg_options['clear_transients']))
				$this->odb_rvg_options['clear_transients'] = 'N';
			if(!isset($this->odb_rvg_options['clear_trash']))
				$this->odb_rvg_options['clear_trash']      = 'N';
			if(!isset($this->odb_rvg_options['delete_older']))
				$this->odb_rvg_options['delete_older']     = 'N';
			if(!isset($this->odb_rvg_options['rvg_revisions']))
				$this->odb_rvg_options['rvg_revisions']     = 'N';

			if(!isset($this->odb_rvg_options['last_run']))
				$this->odb_rvg_options['last_run']         = '';
			// v4.5.1
			if(!isset($this->odb_rvg_options['last_run_seconds']))
				$this->odb_rvg_options['last_run_seconds'] = '';
			if(!isset($this->odb_rvg_options['logging_on']))
				$this->odb_rvg_options['logging_on']       = 'N';
			if(!isset($this->odb_rvg_options['nr_of_revisions']))
				$this->odb_rvg_options['nr_of_revisions']  = '';
			// v4.1
			if(!isset($this->odb_rvg_options['older_than']))
				$this->odb_rvg_options['older_than']       = '';
			if(!isset($this->odb_rvg_options['optimize_innodb']))
				$this->odb_rvg_options['optimize_innodb']  = 'N';
			if(!isset($this->odb_rvg_options['schedule_type']))
				$this->odb_rvg_options['schedule_type']    = '';
			if(!isset($this->odb_rvg_options['schedule_hour']))
				$this->odb_rvg_options['schedule_hour']    = '';
			if(!isset($this->odb_rvg_options['total_savings']))
				$this->odb_rvg_options['total_savings']    = (int)0;
			if(!isset($this->odb_rvg_options['version']))
				$this->odb_rvg_options['version']          = $this->odb_version;

			// CUSTOM POST TYPES (from v4.4)
			if(!isset($this->odb_rvg_options['post_types'])) {
				$this->odb_rvg_options['post_types'] = array();
				$relevant_pts = $this->odb_utilities_obj->odb_get_relevant_post_types();
				// (CUSTOM) POST TYPES ARE PER DEFAULT ENABLED
				foreach($relevant_pts as $posttype) {
					$this->odb_rvg_options['post_types'][$posttype] = "Y";
				} // foreach($relevant_pts as $posttype)

				if (isset($this->odb_rvg_options['rev_post_type'])) {
					// UPGRADE FROM A VERSION < 4.4
					if ($this->odb_rvg_options['rev_post_type'] == 'page') {
						// PAGES ONLY: DISABLE 'post'
						$this->odb_rvg_options['post_types']['post'] = "N";
					} else if ($this->odb_rvg_options['rev_post_type'] == 'post') {
						// POSTS ONLY: DISABLE 'page'
						$this->odb_rvg_options['post_types']['page'] = "N";
					}
					unset($this->odb_rvg_options['rev_post_type']);
				} // if (isset($this->odb_rvg_options['rev_post_type']))
			} // if(!isset($this->odb_rvg_options['post_types']))

			// UPDATE OPTIONS
			$this->odb_multisite_obj->odb_ms_update_option('odb_rvg_options', $this->odb_rvg_options);

			// UPDATE SCHEDULER (IF NEEDED)
			$this->odb_scheduler_obj->odb_update_scheduler();
		} // odb_load_options()


		/*******************************************************************************
		 *
		 * 	COPY AND DELETE OPTIONS FROM PREVIOUS VERSIONS (BEFORE 4.0)
		 *
		 *******************************************************************************/
		function odb_convert_options() {
			global $wpdb;

			// STOP OLD SCHEDULER
			wp_clear_scheduled_hook('rvg_optimize_database');

			$setting = $this->odb_multisite_obj->odb_ms_get_option('rvg_odb_total_savings');
			if($setting) {
				$this->odb_rvg_options['total_savings'] = $this->odb_multisite_obj->odb_ms_get_option('rvg_odb_total_savings');
				$this->odb_multisite_obj->odb_ms_delete_option('rvg_odb_total_savings');
			}

			$setting = $this->odb_multisite_obj->odb_ms_get_option('rvg_clear_pingbacks');
			if($setting) {
				$this->odb_rvg_options['clear_pingbacks'] = $this->odb_multisite_obj->odb_ms_get_option('rvg_clear_pingbacks');
				$this->odb_multisite_obj->odb_ms_delete_option('rvg_clear_pingbacks');
			}

			$setting = $this->odb_multisite_obj->odb_ms_get_option('rvg_clear_oembed');
			if($setting) {
				$this->odb_rvg_options['rvg_clear_oembed'] = $this->odb_multisite_obj->odb_ms_get_option('rvg_clear_oembed');
				$this->odb_multisite_obj->odb_ms_delete_option('rvg_clear_oembed');
			}

			$setting = $this->odb_multisite_obj->odb_ms_get_option('rvg_clear_orphans');
			if($setting) {
				$this->odb_rvg_options['rvg_clear_orphans'] = $this->odb_multisite_obj->odb_ms_get_option('rvg_clear_orphans');
				$this->odb_multisite_obj->odb_ms_delete_option('rvg_clear_orphans');
			}

			$setting = $this->odb_multisite_obj->odb_ms_get_option('rvg_clear_spam');
			if($setting) {
				$this->odb_rvg_options['clear_spam'] = $this->odb_multisite_obj->odb_ms_get_option('rvg_clear_spam');
				$this->odb_multisite_obj->odb_ms_delete_option('rvg_clear_spam');
			}

			$setting = $this->odb_multisite_obj->odb_ms_get_option('rvg_clear_tags');
			if($setting) {
				$this->odb_rvg_options['clear_tags'] = $this->odb_multisite_obj->odb_ms_get_option('rvg_clear_tags');
				$this->odb_multisite_obj->odb_ms_delete_option('rvg_clear_tags');
			}

			$setting = $this->odb_multisite_obj->odb_ms_get_option('rvg_clear_transients');
			if($setting) {
				$this->odb_rvg_options['clear_transients'] = $this->odb_multisite_obj->odb_ms_get_option('rvg_clear_transients');
				$this->odb_multisite_obj->odb_ms_delete_option('rvg_clear_transients');
			}

			$setting = $this->odb_multisite_obj->odb_ms_get_option('rvg_clear_trash');
			if($setting)
			{	$this->odb_rvg_options['clear_trash'] = $this->odb_multisite_obj->odb_ms_get_option('rvg_clear_trash');
				$this->odb_multisite_obj->odb_ms_delete_option('rvg_clear_trash');
			}

			$setting = $this->odb_multisite_obj->odb_ms_get_option('rvg_odb_adminbar');
			if($setting) {
				$this->odb_rvg_options['adminbar'] = $this->odb_multisite_obj->odb_ms_get_option('rvg_odb_adminbar');
				$this->odb_multisite_obj->odb_ms_delete_option('rvg_odb_adminbar');
			}

			$setting = $this->odb_multisite_obj->odb_ms_get_option('rvg_odb_adminmenu');
			if($setting) {
				$this->odb_rvg_options['adminmenu'] = $this->odb_multisite_obj->odb_ms_get_option('rvg_odb_adminmenu');
				$this->odb_multisite_obj->odb_ms_delete_option('rvg_odb_adminmenu');
			}

			$setting = $this->odb_multisite_obj->odb_ms_get_option('rvg_odb_logging_on');
			if($setting) {
				$this->odb_rvg_options['logging_on'] = $this->odb_multisite_obj->odb_ms_get_option('rvg_odb_logging_on');
				$this->odb_multisite_obj->odb_ms_delete_option('rvg_odb_logging_on');
			}

			$setting = $this->odb_multisite_obj->odb_ms_get_option('rvg_odb_number');
			if($setting)
				$this->odb_rvg_options['nr_of_revisions'] = $this->odb_multisite_obj->odb_ms_get_option('rvg_odb_number');
			$this->odb_multisite_obj->odb_ms_delete_option('rvg_odb_number');

			$setting = $this->odb_multisite_obj->odb_ms_get_option('rvg_odb_schedule');
			if($setting)
				$this->odb_rvg_options['schedule_type'] = $this->odb_multisite_obj->odb_ms_get_option('rvg_odb_schedule');
			$this->odb_multisite_obj->odb_ms_delete_option('rvg_odb_schedule');

			$setting = $this->odb_multisite_obj->odb_ms_get_option('rvg_odb_schedulehour');
			if($setting)
				$this->odb_rvg_options['schedule_hour'] = $this->odb_multisite_obj->odb_ms_get_option('rvg_odb_schedulehour');
			$this->odb_multisite_obj->odb_ms_delete_option('rvg_odb_schedulehour');

			// COPY EXCLUDED TABLES
			for($i = 0; $i < count($this->odb_ms_prefixes); $i++) {
				$sql = "
				SELECT `option_name`
					FROM ".$this->odb_ms_prefixes[$i]."options
				WHERE `option_name` LIKE 'rvg_ex_%'
				";

				$res = $wpdb->get_results($sql, ARRAY_A);
				for($j=0; $j<count($res); $j++) {
					$option_name = $res[$j]['option_name'];
					$option_name_new = substr($option_name, 7);
					$this->odb_rvg_excluded_tabs[$option_name_new] = 'Y';
					$this->odb_multisite_obj->odb_ms_delete_option($option_name);
				} // for($j=0; $j<count($res); $j++)
			} // for($i = 0; $i < count($this->odb_ms_prefixes); $i++)

			// UPDATE EXCLUDED TABLES
			$this->odb_multisite_obj->odb_ms_update_option('odb_rvg_excluded_tabs', $this->odb_rvg_excluded_tabs);
		} // odb_convert_options()


		/*******************************************************************************
		 *
		 * 	INITIALIZE WORDPRESS HOOKS
		 *
		 *******************************************************************************/
		function odb_init_hooks() {
			global $blog_id;

			// ADD ENTRY TO ADMIN TOOLS MENU
			if (is_multisite()) {
				if ($blog_id == 1) {
					// v4.1: PLUGIN ONLY CAN BE USED ON THE MAIN SITE (NOT ON THE SUB SITES)
					add_action('admin_menu', array(&$this, 'odb_admin_tools'));
					add_action('admin_menu', array(&$this, 'odb_admin_settings'));
					// ADD 'SETTINGS' LINK TO THE MAIN PLUGIN PAGE
					add_filter('plugin_action_links_'.plugin_basename(__FILE__), array(&$this, 'odb_settings_link'));
				} // if ($blog_id == 1)
			} else {
				add_action('admin_menu', array(&$this, 'odb_admin_tools'));
				add_action('admin_menu', array(&$this, 'odb_admin_settings'));
				// ADD 'SETTINGS' LINK TO THE MAIN PLUGIN PAGE
				add_filter('plugin_action_links_'.plugin_basename(__FILE__), array(&$this, 'odb_settings_link'));
			} // if (is_multisite())

			// ICON MODE: ADD ICON TO ADMIN MENU
			if (! empty( $this->odb_rvg_options['adminmenu'] ) && $this->odb_rvg_options['adminmenu'] == "Y") {
				add_action('admin_menu', array(&$this, 'odb_admin_icon'));
				add_action('admin_menu', array(&$this, 'odb_register_options'));
			}

			// ADD THE '1 CLICK OPTIMIZE DATABASE' ITEM TO THE ADMIN BAR (IF ACTIVATED)
			if(! empty( $this->odb_rvg_options['adminbar'] ) && $this->odb_rvg_options['adminbar'] == 'Y')
				add_action('wp_before_admin_bar_render', array(&$this, 'odb_admin_bar'));

			// INITIALIZE LOCALIZATION
			add_action('admin_menu', array(&$this, 'odb_i18n'));
		} // odb_init_hooks()


		/*******************************************************************************
		 *
		 * 	ADD ENTRY TO THE ADMIN TOOLS MENU
		 *
		 *******************************************************************************/
		function odb_admin_tools() {
			if (function_exists('add_management_page')) {
				add_management_page(
					__('Optimize Database',$this->odb_txt_domain),	// page title
					__('Optimize Database',$this->odb_txt_domain),	// menu title
					'manage_options',								// capability
					'rvg-optimize-database',						// menu slug
					array(&$this, 'odb_start_manually'));			// function
			} // if (function_exists('add_management_page'))
		} // odb_admin_tools()


		/*******************************************************************************
		 *
		 * 	ADD ENTRY TO THE ADMIN SETTINGS MENU
		 *
		 *******************************************************************************/
		function odb_admin_settings() {
			if (function_exists('add_options_page'))
				add_options_page(
					__('Optimize Database', $this->odb_txt_domain),	// page title
					__('Optimize Database', $this->odb_txt_domain),	// menu title
					'manage_options',								// capability
					'odb_settings_page',							// menu slug
					array(&$this, 'odb_settings_page')				// function
				);
		} // odb_admin_settings()


		/*******************************************************************************
		 *
		 * 	ADD 'SETTINGS' LINK TO THE MAIN PLUGIN PAGE
		 *
		 *******************************************************************************/
		function odb_settings_link($links) {
			array_unshift($links, '<a href="options-general.php?page=odb_settings_page">'.__('Settings', $this->odb_txt_domain).'</a>');
			return $links;
		} // odb_settings_link()


		/********************************************************************************************
		 *
		 *	ADD THE '1 CLICK OPTIMIZE DATABASE' ITEM TO THE ADMIN BAR (IF ACTIVATED)
		*
		********************************************************************************************/
		function odb_admin_bar() {
			global $wp_admin_bar;

			if (!is_super_admin() || !is_admin_bar_showing()) return;

			$siteurl = site_url('/');
			$nonce   = wp_create_nonce( 'rvg-optimize-database' );

			$wp_admin_bar->add_menu(
				array(
				'id'    => 'optimize',
				'title' => __('Optimize DB (1 click)', $this->odb_txt_domain),
				'href'  => $siteurl . 'wp-admin/tools.php?page=rvg-optimize-database&action=run_detail&_wpnonce=' . $nonce ));
		} // odb_admin_bar()


		/********************************************************************************************
		 *
		 *	'ICON MODE': ADD A LINK TO THE ADMIN MENU
		*
		********************************************************************************************/
		function odb_admin_icon() {
			if (function_exists('add_menu_page')) {
				add_menu_page(
					__('Optimize Database', $this->odb_txt_domain),			// page title
					__('Optimize Database', $this->odb_txt_domain), 		// menu title
					'administrator',										// capability
					'rvg-optimize-database',								// menu slug
					array(&$this, 'odb_start_manually'),					// function
					$this->odb_plugin_url.'images/icon.png'					// icon url
				);
			}
		} // odb_admin_icon()


		/********************************************************************************************
		 *
		 *	'ICON MODE': REGISTER OPTION PAGE BUT HIDE IT FROM THE ADMIN MENU
		*
		********************************************************************************************/
		function odb_register_options() {
			if (function_exists('add_submenu_page')) {
				add_submenu_page(
					'',											// parent slug (NULL is hide from menu)
					__('Optimize Database', $this->odb_txt_domain),	// page title
					__('Optimize Database', $this->odb_txt_domain),	// menu title
					'manage_options',								// capability
					'rvg_odb_admin',								// menu slug
					array(&$this, 'odb_settings_page')				// function
				);
			} // if (function_exists('add_submenu_page'))
		} // odb_register_options()


		/*******************************************************************************
		 *
		 * 	LOAD TEXT DOMAIN
		 *
		 *******************************************************************************/
		function odb_i18n() {
			load_plugin_textdomain(
				$this->odb_txt_domain,								// domain
				false,												// abs rel path
				dirname(plugin_basename( __FILE__ )).'/language/'	// plugin rel path
			);
		} // odb_i18n()


		/*******************************************************************************
		 *
		 * 	ARE WE ON A, FOR THIS PLUGIN, RELEVANT PAGE?
		 *	Since v4.0.3
		*
		*******************************************************************************/
		function odb_is_relevant_page() {
			$this_page = '';
			if(isset($_GET['page'])) {
				$this_page = $_GET['page'];
				return ($this_page == 'odb_settings_page' || $this_page == 'rvg-optimize-database');
			}
			return false;
		} // odb_is_relevant_page()


		/*******************************************************************************
		 *
		 * 	LOAD SETTINGS (OPTIONS) PAGE
		 *
		 *******************************************************************************/
		function odb_settings_page() {
			global $wpdb, $odb_rvg_excluded_tabs, $odb_ms_prefixes;

			include_once(trailingslashit(dirname(__FILE__)).'/includes/settings-page.php');
		} // odb_settings_page()


		/*******************************************************************************
		 *
		 * 	START CLEANING / OPTIMIZATION (INITIATED BY THE USER, NOT FROM WP-CRON)
		 *
		 *******************************************************************************/
		function odb_start_manually() {
			$this->odb_start(false);
		} // odb_start_manually()


		/*******************************************************************************
		 *
		 * 	START CLEANING / OPTIMIZATION (FROM WP-CRON)
		 *
		 *******************************************************************************/
		function odb_start_scheduler() {
			$this->odb_start(true);
		} // odb_start_scheduler()


		/*******************************************************************************
		 *
		 * CREATE THE LOG TABLE (IF NOT EXISTS)
		 *
		 *******************************************************************************/
		function odb_create_log_table() {
			global $wpdb;

			// PLUGIN RUNNING (v5.0.5)
			$this->odb_tables = $this->odb_utilities_obj->odb_get_tables();

			// CREATE LOG TABLE (IF NOT EXISTS) - v4.6
			$this->odb_logtable_name = $wpdb->base_prefix . 'odb_logs';

			$found = false;
			for($i = 0; $i < count($this->odb_tables); $i++) {
				if ($this->odb_tables[$i][0] == $this->odb_logtable_name) {
					$found = true;
				}
			} // for($i = 0; $i < count($this->odb_tables); $i++)

			// v5.0.3
			if (!$found) {
				$sql = '
					CREATE TABLE IF NOT EXISTS `' . $this->odb_logtable_name . '` (
					`odb_id`			int(11) NOT NULL AUTO_INCREMENT,
					`odb_timestamp`	varchar(20) NOT NULL,
					`odb_revisions`	int(11) NOT NULL,
					`odb_trash`		int(11) NOT NULL,
					`odb_spam`		int(11) NOT NULL,
					`odb_tags`		int(11) NOT NULL,
					`odb_transients`	int(11) NOT NULL,
					`odb_pingbacks`	int(11) NOT NULL,
					`odb_oembeds`		int(11) NOT NULL,
					`odb_orphans`		int(11) NOT NULL,
					`odb_tables`		int(11) NOT NULL,
					`odb_before`		varchar(20) NOT NULL,
					`odb_after`		varchar(20) NOT NULL,
					`odb_savings`		varchar(20) NOT NULL,
					PRIMARY KEY (`odb_id`)
					) DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;
					';

				// CREATE TABLE
				$wpdb->query($sql);
			} // if (!$found)
		} // odb_create_log_table()


		/*******************************************************************************
		 *
		 * 	MAIN METHOD FOR CLEANING / OPTIMIZING
		 *
		 *******************************************************************************/
		function odb_start($scheduler) {
			$this->odb_create_log_table();

			// Ensure current user (if applicable) can view this page.
			if(!$scheduler) {
				if ( ! is_user_logged_in() || ! current_user_can( 'manage_options' ) ) {
					return;
				}
			}

			// PAGE LOAD TIMER
			$time  = microtime();
			$time  = explode(' ', $time);
			$time  = $time[1] + $time[0];
			$this->odb_start_time = $time;

			$action = '';
			if(isset($_REQUEST['action']) && isset($_REQUEST['page']) && 'rvg-optimize-database' === $_REQUEST['page']) {
				$action = $_REQUEST['action'];
			}
			if (
				! empty( $action )
				&& isset( $_GET['_wpnonce'] )
				&& wp_verify_nonce( $_GET['_wpnonce'], 'rvg-optimize-database' )
			) {
				// v4.6
				if($action == 'view_log') {
					// SHOW THE LOGS
					$this->odb_logger_obj->odb_view_log();
					// v4.6.1
					return;
				} else if($action == "clear_log") {
					// CLEAR THE LOG TABLE
					$this->odb_logger_obj->odb_clear_log();

					// UPDATED MESSAGE
					// v4.6
					echo "<script>jQuery('#odb-running').hide();</script>";
					echo "<div class='updated odb-bold'><p>".
						__('Optimize Database after Deleting Revisions LOGS HAVE BEEN CLEARED', $this->odb_txt_domain);
					echo "</p></div>";
				} // if($action == "clear_log")
			} // if(isset($_REQUEST['action']))
			else {
				// Assume there is no action or the nonce failed verification.
				$action = '';
			}

			if(!$scheduler) {
				// SHOW PAGE HEADER
				$this->odb_displayer_obj->display_header();
				// v4.1.9: STARTING: SHOW RUNNING INDICATOR
				echo "<script>jQuery('#odb-running').show();</script>";
				// SHOW CURRENT SETTINGS
				$this->odb_displayer_obj->display_current_settings();
			} // if(!$scheduler)

			if ($action != 'analyze_summary' &&
				$action != 'analyze_detail' &&
				$action != 'run_summary' &&
				$action != 'run_detail' &&
				!$scheduler) {
				/****************************************************************************************
				 *	START SCREEN (SHOW SETTINGS + BUTTONS)
				****************************************************************************************/
				$this->odb_displayer_obj->display_start_buttons($action);
			} else {
				$analyze = ($action == 'analyze_summary' || $action == 'analyze_detail');
				/****************************************************************************************
				 *	RUN CLEANING AND OPTIMIZATION
				****************************************************************************************/
				$this->odb_displayer_obj->display_start_buttons($action);

				// DELETE REDUNDANT DATA
				$this->odb_cleaner_obj->odb_run_cleaner($scheduler, $action);

				if ($scheduler || $action == 'run_summary' || $action == 'run_detail') {
					// REGISTER THE LAST RUN
					$this->odb_rvg_options['last_run'] = current_time('M j, Y @ H:i', 0);
					// OPTIMIZE DATABASE TABLES
					$this->odb_cleaner_obj->odb_run_optimizer($scheduler, $action);
					// SHOW RESULTS
					$this->odb_cleaner_obj->odb_savings($scheduler, $action);
				} // if (!$analyze)

				// SHOW 'DONE' PARAGRAPH
				if (!$scheduler && !$analyze)
					$this->odb_cleaner_obj->odb_done($analyze);

				if ($analyze && $this->odb_cleaner_obj->grand_total > 0) {
					$msg1 =  __("CLICK ONE OF THE 'OPTIMIZE' BUTTONS TO ACTUALLY DELETE THE FOUND ITEMS", $this->odb_txt_domain);
					$btn1 =  __('Cancel', $this->odb_txt_domain);
					$btn2 =  __('Optimize (summary)', $this->odb_txt_domain);
					$btn3 =  __('Optimize (detail)', $this->odb_txt_domain);
					?>
	<div class="odb-title-bar">
	<h2><?php _e('Analysis Done!', $this->odb_txt_domain)?></h2>
	</div>
	<br><br>
	<div id="odb-start-buttons" class="odb-padding-left">
	<p>
	<h4 class="odb-red odb-bold"><?php echo $msg1?></h4>
	<br>
	<?php $nonce = wp_create_nonce( 'rvg-optimize-database' ); ?>
	<input class="button odb-normal" type="button" name="cancel" value="<?php echo $btn1?>" onclick="self.location='tools.php?page=rvg-optimize-database'">
	&nbsp;
	&nbsp;<input class="button-primary button-large" type="button" name="optimize_summary" value="<?php echo $btn2?>" onclick="self.location='tools.php?page=rvg-optimize-database&action=run_summary&_wpnonce=<?php echo esc_attr( $nonce ); ?>'" class="odb-bold">
	&nbsp;
	&nbsp;<input class="button-primary button-large" type="button" name="optimize_detail" value="<?php echo $btn3?>" onclick="self.location='tools.php?page=rvg-optimize-database&action=run_detail&_wpnonce=<?php echo esc_attr( $nonce ); ?>'" class="odb-bold">

	</p>
	</div><!-- /odb-start-buttons -->
					<?php
				} // if ($analyze)

				$this->odb_rvg_options['last_run_seconds'] = $this->odb_last_run_seconds;

				$this->odb_multisite_obj->odb_ms_update_option('odb_rvg_options', $this->odb_rvg_options);
			}  // if ($action != 'analyze_summary' && ...

			if(!defined('RUN_OPTIMIZE_DATABASE')) {
				// v4.8.0: DONE: HIDE RUNNING INDICATOR
				echo "<script>jQuery('#odb-running').hide();</script>";
			} // if(!defined('RUN_OPTIMIZE_DATABASE'))
		} // odb_start()
	} // OptimizeDatabase

	// CREATE INSTANCE
	global $odb_class;
	$odb_class = new OptimizeDatabase();
} );

/*******************************************************************************
 *
 * 	PLUGIN DE-ACTIVATION
 *
 *******************************************************************************/
if ( ! function_exists( 'odb_deactivation_handler' ) ) {
	function odb_deactivation_handler() {
		// STOP SCHEDULER
		wp_clear_scheduled_hook('odb_scheduler');
	} // odb_deactivation_handler()
}

register_deactivation_hook(__FILE__, 'odb_deactivation_handler');

/*******************************************************************************
 *
 * 	PLUGIN UN-INSTALLATION
 *
 *******************************************************************************/
if ( ! function_exists( 'odb_uninstallation_handler' ) ) {
	function odb_uninstallation_handler() {
		// STOP SCHEDULER
		wp_clear_scheduled_hook('odb_scheduler');

		// DELETE THE OPTIONS
		delete_option('odb_rvg_options');
		delete_option('odb_rvg_excluded_tabs');

		delete_site_option('odb_rvg_options');
		delete_site_option('odb_rvg_excluded_tabs');

		// DROP THE LOG TABLE
		global $wpdb;
		$wpdb->query("DROP TABLE IF EXISTS {$wpdb->prefix}odb_logs");
	} // odb_uninstallation_handler()
}

register_uninstall_hook(__FILE__, 'odb_uninstallation_handler');