get_charset_collate(); $jobs = $wpdb->prefix . 'brverify_jobs'; $logs = $wpdb->prefix . 'brverify_logs'; $arts = $wpdb->prefix . 'brverify_artifacts'; $sql_jobs = "CREATE TABLE {$jobs} ( id bigint(20) unsigned NOT NULL AUTO_INCREMENT, type varchar(32) NOT NULL DEFAULT 'backup', status varchar(32) NOT NULL DEFAULT 'pending', phase varchar(64) NOT NULL DEFAULT '', progress_pct tinyint(3) unsigned NOT NULL DEFAULT 0, cursor_json longtext NULL, config_json longtext NULL, result_json longtext NULL, error_message text NULL, attempts smallint(5) unsigned NOT NULL DEFAULT 0, locked_at datetime NULL, locked_by varchar(191) NULL, heartbeat_at datetime NULL, created_at datetime NOT NULL, updated_at datetime NOT NULL, started_at datetime NULL, finished_at datetime NULL, PRIMARY KEY (id), KEY status_heartbeat (status, heartbeat_at), KEY type_status (type, status), KEY created_at (created_at) ) {$charset};"; $sql_logs = "CREATE TABLE {$logs} ( id bigint(20) unsigned NOT NULL AUTO_INCREMENT, job_id bigint(20) unsigned NOT NULL DEFAULT 0, level varchar(16) NOT NULL DEFAULT 'info', message text NOT NULL, context_json longtext NULL, created_at datetime NOT NULL, PRIMARY KEY (id), KEY job_id (job_id), KEY created_at (created_at) ) {$charset};"; $sql_arts = "CREATE TABLE {$arts} ( id bigint(20) unsigned NOT NULL AUTO_INCREMENT, job_id bigint(20) unsigned NOT NULL DEFAULT 0, path text NOT NULL, part_index smallint(5) unsigned NOT NULL DEFAULT 0, bytes bigint(20) unsigned NOT NULL DEFAULT 0, sha256 char(64) NULL, adapter varchar(64) NOT NULL DEFAULT 'local', remote_ref text NULL, meta_json longtext NULL, created_at datetime NOT NULL, PRIMARY KEY (id), KEY job_id (job_id), KEY adapter (adapter) ) {$charset};"; dbDelta( $sql_jobs ); dbDelta( $sql_logs ); dbDelta( $sql_arts ); } /** * Default options. */ private static function create_options(): void { $defaults = Settings::defaults(); if ( false === get_option( Settings::OPTION ) ) { add_option( Settings::OPTION, $defaults, '', false ); } else { // Merge any new Phase D keys into existing installs. $current = get_option( Settings::OPTION, array() ); if ( is_array( $current ) ) { update_option( Settings::OPTION, array_merge( $defaults, $current ), false ); } } if ( false === get_option( 'brverify_db_version' ) ) { add_option( 'brverify_db_version', BRVERIFY_DB_VERSION, '', false ); } } /** * Map manage_brverify → administrators (single-site). */ private static function add_caps(): void { $role = get_role( 'administrator' ); if ( $role && ! $role->has_cap( 'manage_brverify' ) ) { $role->add_cap( 'manage_brverify' ); } } /** * Schedule resume cron. */ private static function schedule_cron(): void { add_filter( 'cron_schedules', static function ( array $schedules ): array { if ( ! isset( $schedules['brverify_five_minutes'] ) ) { $schedules['brverify_five_minutes'] = array( 'interval' => 5 * MINUTE_IN_SECONDS, 'display' => 'Every five minutes (007AJ Backup Restore Verifier)', ); } if ( ! isset( $schedules['weekly'] ) ) { $schedules['weekly'] = array( 'interval' => WEEK_IN_SECONDS, 'display' => 'Once Weekly (007AJ Backup Restore Verifier)', ); } return $schedules; } ); if ( ! wp_next_scheduled( 'brverify_cron_tick' ) ) { wp_schedule_event( time() + MINUTE_IN_SECONDS, 'brverify_five_minutes', 'brverify_cron_tick' ); } ( new Scheduler() )->reschedule(); } }