mailpoet
/
vendor
/
woocommerce
/
action-scheduler
/
classes
/
data-stores
/
ActionScheduler_HybridStore.php
ActionScheduler_DBLogger.php
1 year ago
ActionScheduler_DBStore.php
1 year ago
ActionScheduler_HybridStore.php
1 year ago
ActionScheduler_wpCommentLogger.php
1 year ago
ActionScheduler_wpPostStore.php
1 year ago
ActionScheduler_wpPostStore_PostStatusRegistrar.php
4 years ago
ActionScheduler_wpPostStore_PostTypeRegistrar.php
1 year ago
ActionScheduler_wpPostStore_TaxonomyRegistrar.php
1 year ago
index.php
3 years ago
ActionScheduler_HybridStore.php
206 lines
| 1 | <?php |
| 2 | if (!defined('ABSPATH')) exit; |
| 3 | use ActionScheduler_Store as Store; |
| 4 | use Action_Scheduler\Migration\Runner; |
| 5 | use Action_Scheduler\Migration\Config; |
| 6 | use Action_Scheduler\Migration\Controller; |
| 7 | class ActionScheduler_HybridStore extends Store { |
| 8 | const DEMARKATION_OPTION = 'action_scheduler_hybrid_store_demarkation'; |
| 9 | private $primary_store; |
| 10 | private $secondary_store; |
| 11 | private $migration_runner; |
| 12 | private $demarkation_id = 0; |
| 13 | public function __construct( ?Config $config = null ) { |
| 14 | $this->demarkation_id = (int) get_option( self::DEMARKATION_OPTION, 0 ); |
| 15 | if ( empty( $config ) ) { |
| 16 | $config = Controller::instance()->get_migration_config_object(); |
| 17 | } |
| 18 | $this->primary_store = $config->get_destination_store(); |
| 19 | $this->secondary_store = $config->get_source_store(); |
| 20 | $this->migration_runner = new Runner( $config ); |
| 21 | } |
| 22 | public function init() { |
| 23 | add_action( 'action_scheduler/created_table', array( $this, 'set_autoincrement' ), 10, 2 ); |
| 24 | $this->primary_store->init(); |
| 25 | $this->secondary_store->init(); |
| 26 | remove_action( 'action_scheduler/created_table', array( $this, 'set_autoincrement' ), 10 ); |
| 27 | } |
| 28 | public function set_autoincrement( $table_name, $table_suffix ) { |
| 29 | if ( ActionScheduler_StoreSchema::ACTIONS_TABLE === $table_suffix ) { |
| 30 | if ( empty( $this->demarkation_id ) ) { |
| 31 | $this->demarkation_id = $this->set_demarkation_id(); |
| 32 | } |
| 33 | global $wpdb; |
| 34 | $default_date = new DateTime( 'tomorrow' ); |
| 35 | $null_action = new ActionScheduler_NullAction(); |
| 36 | $date_gmt = $this->get_scheduled_date_string( $null_action, $default_date ); |
| 37 | $date_local = $this->get_scheduled_date_string_local( $null_action, $default_date ); |
| 38 | $row_count = $wpdb->insert( |
| 39 | $wpdb->{ActionScheduler_StoreSchema::ACTIONS_TABLE}, |
| 40 | array( |
| 41 | 'action_id' => $this->demarkation_id, |
| 42 | 'hook' => '', |
| 43 | 'status' => '', |
| 44 | 'scheduled_date_gmt' => $date_gmt, |
| 45 | 'scheduled_date_local' => $date_local, |
| 46 | 'last_attempt_gmt' => $date_gmt, |
| 47 | 'last_attempt_local' => $date_local, |
| 48 | ) |
| 49 | ); |
| 50 | if ( $row_count > 0 ) { |
| 51 | $wpdb->delete( |
| 52 | $wpdb->{ActionScheduler_StoreSchema::ACTIONS_TABLE}, |
| 53 | array( 'action_id' => $this->demarkation_id ) |
| 54 | ); |
| 55 | } |
| 56 | } |
| 57 | } |
| 58 | private function set_demarkation_id( $id = null ) { |
| 59 | if ( empty( $id ) ) { |
| 60 | global $wpdb; |
| 61 | $id = (int) $wpdb->get_var( "SELECT MAX(ID) FROM $wpdb->posts" ); |
| 62 | $id++; |
| 63 | } |
| 64 | update_option( self::DEMARKATION_OPTION, $id ); |
| 65 | return $id; |
| 66 | } |
| 67 | public function find_action( $hook, $params = array() ) { |
| 68 | $found_unmigrated_action = $this->secondary_store->find_action( $hook, $params ); |
| 69 | if ( ! empty( $found_unmigrated_action ) ) { |
| 70 | $this->migrate( array( $found_unmigrated_action ) ); |
| 71 | } |
| 72 | return $this->primary_store->find_action( $hook, $params ); |
| 73 | } |
| 74 | public function query_actions( $query = array(), $query_type = 'select' ) { |
| 75 | $found_unmigrated_actions = $this->secondary_store->query_actions( $query, 'select' ); |
| 76 | if ( ! empty( $found_unmigrated_actions ) ) { |
| 77 | $this->migrate( $found_unmigrated_actions ); |
| 78 | } |
| 79 | return $this->primary_store->query_actions( $query, $query_type ); |
| 80 | } |
| 81 | public function action_counts() { |
| 82 | $unmigrated_actions_count = $this->secondary_store->action_counts(); |
| 83 | $migrated_actions_count = $this->primary_store->action_counts(); |
| 84 | $actions_count_by_status = array(); |
| 85 | foreach ( $this->get_status_labels() as $status_key => $status_label ) { |
| 86 | $count = 0; |
| 87 | if ( isset( $unmigrated_actions_count[ $status_key ] ) ) { |
| 88 | $count += $unmigrated_actions_count[ $status_key ]; |
| 89 | } |
| 90 | if ( isset( $migrated_actions_count[ $status_key ] ) ) { |
| 91 | $count += $migrated_actions_count[ $status_key ]; |
| 92 | } |
| 93 | $actions_count_by_status[ $status_key ] = $count; |
| 94 | } |
| 95 | $actions_count_by_status = array_filter( $actions_count_by_status ); |
| 96 | return $actions_count_by_status; |
| 97 | } |
| 98 | public function stake_claim( $max_actions = 10, ?DateTime $before_date = null, $hooks = array(), $group = '' ) { |
| 99 | $claim = $this->secondary_store->stake_claim( $max_actions, $before_date, $hooks, $group ); |
| 100 | $claimed_actions = $claim->get_actions(); |
| 101 | if ( ! empty( $claimed_actions ) ) { |
| 102 | $this->migrate( $claimed_actions ); |
| 103 | } |
| 104 | $this->secondary_store->release_claim( $claim ); |
| 105 | return $this->primary_store->stake_claim( $max_actions, $before_date, $hooks, $group ); |
| 106 | } |
| 107 | private function migrate( $action_ids ) { |
| 108 | $this->migration_runner->migrate_actions( $action_ids ); |
| 109 | } |
| 110 | public function save_action( ActionScheduler_Action $action, ?DateTime $date = null ) { |
| 111 | return $this->primary_store->save_action( $action, $date ); |
| 112 | } |
| 113 | public function fetch_action( $action_id ) { |
| 114 | $store = $this->get_store_from_action_id( $action_id, true ); |
| 115 | if ( $store ) { |
| 116 | return $store->fetch_action( $action_id ); |
| 117 | } else { |
| 118 | return new ActionScheduler_NullAction(); |
| 119 | } |
| 120 | } |
| 121 | public function cancel_action( $action_id ) { |
| 122 | $store = $this->get_store_from_action_id( $action_id ); |
| 123 | if ( $store ) { |
| 124 | $store->cancel_action( $action_id ); |
| 125 | } |
| 126 | } |
| 127 | public function delete_action( $action_id ) { |
| 128 | $store = $this->get_store_from_action_id( $action_id ); |
| 129 | if ( $store ) { |
| 130 | $store->delete_action( $action_id ); |
| 131 | } |
| 132 | } |
| 133 | public function get_date( $action_id ) { |
| 134 | $store = $this->get_store_from_action_id( $action_id ); |
| 135 | if ( $store ) { |
| 136 | return $store->get_date( $action_id ); |
| 137 | } else { |
| 138 | return null; |
| 139 | } |
| 140 | } |
| 141 | public function mark_failure( $action_id ) { |
| 142 | $store = $this->get_store_from_action_id( $action_id ); |
| 143 | if ( $store ) { |
| 144 | $store->mark_failure( $action_id ); |
| 145 | } |
| 146 | } |
| 147 | public function log_execution( $action_id ) { |
| 148 | $store = $this->get_store_from_action_id( $action_id ); |
| 149 | if ( $store ) { |
| 150 | $store->log_execution( $action_id ); |
| 151 | } |
| 152 | } |
| 153 | public function mark_complete( $action_id ) { |
| 154 | $store = $this->get_store_from_action_id( $action_id ); |
| 155 | if ( $store ) { |
| 156 | $store->mark_complete( $action_id ); |
| 157 | } |
| 158 | } |
| 159 | public function get_status( $action_id ) { |
| 160 | $store = $this->get_store_from_action_id( $action_id ); |
| 161 | if ( $store ) { |
| 162 | return $store->get_status( $action_id ); |
| 163 | } |
| 164 | return null; |
| 165 | } |
| 166 | protected function get_store_from_action_id( $action_id, $primary_first = false ) { |
| 167 | if ( $primary_first ) { |
| 168 | $stores = array( |
| 169 | $this->primary_store, |
| 170 | $this->secondary_store, |
| 171 | ); |
| 172 | } elseif ( $action_id < $this->demarkation_id ) { |
| 173 | $stores = array( |
| 174 | $this->secondary_store, |
| 175 | $this->primary_store, |
| 176 | ); |
| 177 | } else { |
| 178 | $stores = array( |
| 179 | $this->primary_store, |
| 180 | ); |
| 181 | } |
| 182 | foreach ( $stores as $store ) { |
| 183 | $action = $store->fetch_action( $action_id ); |
| 184 | if ( ! is_a( $action, 'ActionScheduler_NullAction' ) ) { |
| 185 | return $store; |
| 186 | } |
| 187 | } |
| 188 | return null; |
| 189 | } |
| 190 | public function get_claim_count() { |
| 191 | return $this->primary_store->get_claim_count(); |
| 192 | } |
| 193 | public function get_claim_id( $action_id ) { |
| 194 | return $this->primary_store->get_claim_id( $action_id ); |
| 195 | } |
| 196 | public function release_claim( ActionScheduler_ActionClaim $claim ) { |
| 197 | $this->primary_store->release_claim( $claim ); |
| 198 | } |
| 199 | public function unclaim_action( $action_id ) { |
| 200 | $this->primary_store->unclaim_action( $action_id ); |
| 201 | } |
| 202 | public function find_actions_by_claim_id( $claim_id ) { |
| 203 | return $this->primary_store->find_actions_by_claim_id( $claim_id ); |
| 204 | } |
| 205 | } |
| 206 |