plugins-wp/wp-product-importer/includes/models/wpi-config-model.php

155 lines
3.4 KiB
PHP

<?php
class WPI_Config_Model
{
private static function table()
{
global $wpdb;
return $wpdb->prefix . 'wpi_configs';
}
public static function acquire_lock(string $key): bool
{
global $wpdb;
$table = self::table();
return (bool) $wpdb->query(
$wpdb->prepare(
"UPDATE {$table}
SET config_value = 1
WHERE config_key = %s AND config_value = 0",
$key
)
);
}
/**
* Check config exists
*/
private static function exists(string $key): bool
{
global $wpdb;
return (bool) $wpdb->get_var(
$wpdb->prepare(
"SELECT 1 FROM " . self::table() . " WHERE config_key = %s LIMIT 1",
$key
)
);
}
/**
* Insert or update config
*/
public static function set_config(string $key, $value, string $description = null)
{
global $wpdb;
$table = self::table();
$now = current_time('mysql');
$data = [
'config_value' => wp_json_encode($value),
'updated_at' => $now,
];
if ($description !== null) {
$data['description'] = $description;
}
if (self::exists($key)) {
// UPDATE only
$wpdb->update(
$table,
$data,
['config_key' => $key],
['%s', '%s', '%s'],
['%s']
);
} else {
// INSERT new
$wpdb->insert(
$table,
array_merge($data, [
'config_key' => $key,
'created_at' => $now,
]),
['%s', '%s', '%s', '%s']
);
}
}
/**
* Get config (auto json decode)
*/
public static function get_config(string $key, $default = null)
{
global $wpdb;
$value = $wpdb->get_var(
$wpdb->prepare(
"SELECT config_value FROM " . self::table() . " WHERE config_key = %s",
$key
)
);
return $value !== null ? json_decode($value, true) : $default;
}
public static function any_worker_running(): bool
{
global $wpdb;
$table = self::table();
$rows = $wpdb->get_results(
"SELECT config_value
FROM {$table}
WHERE config_key LIKE 'sync_status_%'"
);
if (empty($rows)) {
// Không có worker nào
return false;
}
foreach ($rows as $row) {
$value = json_decode($row->config_value, true);
if ((int) $value !== 1) {
return false;
}
}
return true;
}
public static function claim_next_page(): int
{
global $wpdb;
$table = self::table();
// Atomic increment
$updated = $wpdb->query(
"UPDATE {$table}
SET config_value = config_value + 1
WHERE config_key = 'current_page'"
);
if ($updated === false) {
return 0;
}
// Lấy page vừa claim
$page = (int) $wpdb->get_var(
"SELECT config_value FROM {$table} WHERE config_key = 'current_page'"
);
return $page;
}
}