get_charset_collate(); $queue = $wpdb->prefix . 'spinxqm_queue'; $audit = $wpdb->prefix . 'spinxqm_audit_log'; $sql_queue = "CREATE TABLE {$queue} ( id bigint(20) unsigned NOT NULL auto_increment, job_id varchar(64) NOT NULL, operation_type varchar(50) NOT NULL, status varchar(20) NOT NULL default 'queued', priority int NOT NULL default 0, payload longtext NOT NULL, result longtext, error_message text, dependencies longtext, dependencies_satisfied tinyint(1) NOT NULL default 1, retries int NOT NULL default 0, max_retries int NOT NULL default 3, started_at datetime, completed_at datetime, created_at datetime NOT NULL default CURRENT_TIMESTAMP, updated_at datetime NOT NULL default CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (id), UNIQUE KEY job_id (job_id), KEY idx_status (status), KEY idx_operation_type (operation_type), KEY idx_created_at (created_at) ) {$charset_collate};"; $sql_audit = "CREATE TABLE {$audit} ( id bigint(20) unsigned NOT NULL auto_increment, user_id bigint(20) unsigned NOT NULL, user_email varchar(255), user_role varchar(100), operation_id varchar(64), operation_type varchar(50), action varchar(100), status varchar(20), description longtext, changes longtext, config longtext, ip_address varchar(45), user_agent text, started_at datetime, completed_at datetime, duration_seconds int, created_at datetime NOT NULL default CURRENT_TIMESTAMP, PRIMARY KEY (id), KEY idx_user_id (user_id), KEY idx_operation_type (operation_type), KEY idx_status (status), KEY idx_created_at (created_at), KEY idx_operation_id (operation_id) ) {$charset_collate};"; dbDelta( $sql_queue ); dbDelta( $sql_audit ); // Autoloaded so the per-request maybe_upgrade() check reads from cache, not a DB hit. update_option( 'spinxqm_db_version', self::VERSION, true ); } /** * Upgrade if stored version is behind. */ public static function maybe_upgrade(): void { $current = (int) get_option( 'spinxqm_db_version', 0 ); if ( $current < self::VERSION ) { self::run(); } } }