Completed
Push — fix/refactor-full-sync-status-... ( baeb97...466398 )
by
unknown
63:36 queued 54:01
created

Jetpack_Sync_Module::reset_data()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 1
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 1
c 1
b 0
f 0
nc 1
nop 0
dl 0
loc 1
rs 10
1
<?php
2
3
/**
4
 * Basic methods implemented by Jetpack Sync extensions
5
 */
6
7
abstract class Jetpack_Sync_Module {
8
	const ARRAY_CHUNK_SIZE = 10;
9
10
	abstract public function name();
11
12
	// override these to set up listeners and set/reset data/defaults
13
	public function init_listeners( $callable ) {}
14
	public function init_before_send() {}
15
	public function set_defaults() {}
16
	public function reset_data() {}
17
	public function enqueue_full_sync_actions() {
18
		// in subclasses, return the number of items enqueued
19
		return 0;
20
	}
21
	
22
	public function get_full_sync_actions() {
23
		return array();
24
	}
25
26
	protected function count_actions( $action_names, $actions_to_count ) {
27
		return count( array_intersect( $action_names, $actions_to_count ) );
28
	}
29
30
	final public function full_sync() {
31
		$items_enqueued = $this->enqueue_full_sync_actions();
32
		if ( $items_enqueued !== 0 ) {
33
			$this->update_queue_progress( $this->name(), $items_enqueued );	
34
		}
35
	}
36
37
	protected function get_check_sum( $values ) {
38
		return crc32( json_encode( $values ) );
39
	}
40
41
	protected function still_valid_checksum( $sums_to_check, $name, $new_sum ) {
42
		if ( isset( $sums_to_check[ $name ] ) && $sums_to_check[ $name ] === $new_sum ) {
43
			return true;
44
		}
45
		return false;
46
	}
47
48
	public function update_queue_progress( $module, $data ) {
49
		$full_sync_module = Jetpack_Sync_Modules::get_module( 'full-sync' );
50
		$status = $full_sync_module->get_status();
51
		if ( isset( $status['queue'][ $module ] ) )  {
52
			$status['queue'][ $module ] = $data + $status['queue'][ $module ];
53
		} else {
54
			$status['queue'][ $module ] = $data;
55
		}
56
57
		return $full_sync_module->update_status( $status );
58
	}
59
60
	protected function enqueue_all_ids_as_action( $action_name, $table_name, $id_field, $where_sql ) {
61
		global $wpdb;
62
63
		if ( ! $where_sql ) {
64
			$where_sql = "1 = 1";
65
		}
66
67
		$items_per_page = 500;
68
		$page = 1;
69
		$offset = ( $page * $items_per_page ) - $items_per_page;
70
		$chunk_count = 0;
71
		while( $ids = $wpdb->get_col( "SELECT {$id_field} FROM {$table_name} WHERE {$where_sql} ORDER BY {$id_field} asc LIMIT {$offset}, {$items_per_page}" ) ) {
72
			// Request posts in groups of N for efficiency
73
			$chunked_ids = array_chunk( $ids, self::ARRAY_CHUNK_SIZE );
74
75
			// Send each chunk as an array of objects
76
			foreach ( $chunked_ids as $chunk ) {
77
				/**
78
			 	 * Fires with a chunk of object IDs during full sync.
79
			 	 * These are expanded to full objects before upload
80
			 	 *
81
			 	 * @since 4.2.0
82
			 	 */
83
				do_action( $action_name, $chunk );
84
				$chunk_count++;
85
			}
86
87
			$page += 1;
88
			$offset = ( $page * $items_per_page ) - $items_per_page;
89
		}
90
		return $chunk_count;
91
	}
92
93
	protected function get_metadata( $ids, $meta_type ) {
94
		global $wpdb;
95
		$table = _get_meta_table( $meta_type );
96
		$id    = $meta_type . '_id';
97
		if ( ! $table ) {
98
			return array();
99
		}
100
101
		return $wpdb->get_results( "SELECT $id, meta_key, meta_value, meta_id FROM $table WHERE $id IN ( " . implode( ',', wp_parse_id_list( $ids ) ) . " )", OBJECT );
102
	}
103
104
	protected function get_term_relationships( $ids ) {
105
		global $wpdb;
106
107
		return $wpdb->get_results( "SELECT object_id, term_taxonomy_id FROM $wpdb->term_relationships WHERE object_id IN ( " . implode( ',', wp_parse_id_list( $ids ) ) . " )", OBJECT );
108
	}
109
}
110