Files
doitinpoland.com/wp-content/plugins/wpml-string-translation/classes/translations-file-scan/dictionary/class-st-translations-file-dicionary-storage-table.php
2023-09-12 21:41:04 +02:00

137 lines
3.5 KiB
PHP

<?php
class WPML_ST_Translations_File_Dictionary_Storage_Table implements WPML_ST_Translations_File_Dictionary_Storage {
/** @var wpdb */
private $wpdb;
/** @var null|array */
private $data;
/** @var WPML_ST_Translations_File_Entry[] */
private $new_data = array();
/** @var WPML_ST_Translations_File_Entry[] */
private $updated_data = array();
/**
* @param wpdb $wpdb
*/
public function __construct( wpdb $wpdb ) {
$this->wpdb = $wpdb;
}
public function add_hooks() {
add_action( 'shutdown', array( $this, 'persist' ), 11, 0 );
}
public function save( WPML_ST_Translations_File_Entry $file ) {
$this->load_data();
$is_new = ! isset( $this->data[ $file->get_path() ] );
$this->data[ $file->get_path() ] = $file;
if ( $is_new ) {
$this->new_data[] = $file;
} else {
$this->updated_data[] = $file;
}
}
/**
* We have to postpone saving of real data because target table may not be created yet by migration process
*/
public function persist() {
foreach ( $this->new_data as $file ) {
$sql = "INSERT IGNORE INTO {$this->wpdb->prefix}icl_mo_files_domains ( file_path, file_path_md5, domain, status, num_of_strings, last_modified, component_type, component_id ) VALUES ( %s, %s, %s, %s, %d, %d, %s, %s )";
$this->wpdb->query(
$this->wpdb->prepare(
$sql,
array(
$file->get_path(),
$file->get_path_hash(),
$file->get_domain(),
$file->get_status(),
$file->get_imported_strings_count(),
$file->get_last_modified(),
$file->get_component_type(),
$file->get_component_id(),
)
)
);
}
foreach ( $this->updated_data as $file ) {
$this->wpdb->update(
$this->wpdb->prefix . 'icl_mo_files_domains',
$this->file_to_array( $file ),
array(
'file_path_md5' => $file->get_path_hash(),
),
array( '%s', '%s', '%d', '%d' )
);
}
}
/**
* @param WPML_ST_Translations_File_Entry $file
* @param array $data
*
* @return array
*/
private function file_to_array( WPML_ST_Translations_File_Entry $file, array $data = array() ) {
$data['domain'] = $file->get_domain();
$data['status'] = $file->get_status();
$data['num_of_strings'] = $file->get_imported_strings_count();
$data['last_modified'] = $file->get_last_modified();
return $data;
}
public function find( $path = null, $status = null ) {
$this->load_data();
if ( null !== $path ) {
return isset( $this->data[ $path ] ) ? array( $this->data[ $path ] ) : array();
}
if ( null === $status ) {
return array_values( $this->data );
}
if ( ! is_array( $status ) ) {
$status = array( $status );
}
$result = array();
foreach ( $this->data as $file ) {
if ( in_array( $file->get_status(), $status, true ) ) {
$result[] = $file;
}
}
return $result;
}
private function load_data() {
if ( null === $this->data ) {
$this->data = array();
$sql = "SELECT * FROM {$this->wpdb->prefix}icl_mo_files_domains";
$rowset = $this->wpdb->get_results( $sql );
foreach ( $rowset as $row ) {
$file = new WPML_ST_Translations_File_Entry( $row->file_path, $row->domain, $row->status );
$file->set_imported_strings_count( $row->num_of_strings );
$file->set_last_modified( $row->last_modified );
$file->set_component_type( $row->component_type );
$file->set_component_id( $row->component_id );
$this->data[ $file->get_path() ] = $file;
}
}
}
public function reset() {
$this->data = null;
}
}