Create New Item
Item Type
File
Folder
Item Name
Search file in folder and subfolders...
Are you sure want to rename?
File Manager
/
wp-content
/
plugins
/
wpml-translation-management
/
classes
/
ATE
/
Download
:
Queue.php
Advanced Search
Upload
New Item
Settings
Back
Back Up
Advanced Editor
Save
<?php namespace WPML\TM\ATE\Download; use WPML\Collect\Support\Collection; use WPML\TM\Upgrade\Commands\CreateAteDownloadQueueTable; class Queue { /** @var \wpdb $wpdb */ private $wpdb; public function __construct( \wpdb $wpdb ) { $this->wpdb = $wpdb; } /** * @param Collection $jobs A collection of `Job` */ public function push( Collection $jobs ) { if ( ! $jobs->count() ) { return; } $prepare = function( Job $job ) { return $this->wpdb->prepare( '(%d,%s)', $job->ateJobId, $job->url ); }; $columns = '(editor_job_id, download_url)'; $values = $jobs->map( $prepare )->implode( ',' ); $this->wpdb->query( "INSERT IGNORE INTO {$this->getTableName()} {$columns} VALUES {$values}" ); } /** * @return Collection */ public function getEditorJobIds() { return wpml_collect( $this->wpdb->get_col( "SELECT editor_job_id FROM {$this->getTableName()}" ) ); } /** * @return int */ public function count() { return (int) $this->wpdb->get_var( "SELECT COUNT(*) FROM {$this->getTableName()}" ); } /** @return Job|null */ public function getFirst() { $job = null; $this->wpdb->query( 'START TRANSACTION' ); $row = $this->getFirstUnlockedRow(); if ( $row ) { $job = Job::fromDb( $row ); $this->lockJob( $job ); } $this->wpdb->query( 'COMMIT' ); return $job; } /** * @return \stdClass|null */ private function getFirstUnlockedRow() { $oldLockTimestamp = time() - self::getLockExpiration(); return $this->wpdb->get_row( $this->wpdb->prepare( "SELECT * FROM {$this->getTableName()} WHERE lock_timestamp IS NULL OR lock_timestamp < %d LIMIT 1 FOR UPDATE", $oldLockTimestamp ) ); } public function lockJob( Job $job ) { $this->wpdb->query( $this->wpdb->prepare( "UPDATE {$this->getTableName()} SET lock_timestamp=%d WHERE editor_job_id=%d", time(), $job->ateJobId ) ); } public function remove( Job $job ) { $this->wpdb->delete( $this->getTableName(), [ 'editor_job_id' => $job->ateJobId ], [ '%d' ] ); } /** @return string */ private function getTableName() { return $this->wpdb->prefix . CreateAteDownloadQueueTable::TABLE_NAME; } /** @return int */ public static function getLockExpiration() { return 3 * MINUTE_IN_SECONDS; } }