$wpdb->base_prefix . 'relay_jobs', 'events' => $wpdb->base_prefix . 'relay_job_events', 'backups' => $wpdb->base_prefix . 'relay_backups', 'keys' => $wpdb->base_prefix . 'relay_keys', 'nonces' => $wpdb->base_prefix . 'relay_nonces', 'connections' => $wpdb->base_prefix . 'relay_connections', 'profiles' => $wpdb->base_prefix . 'relay_profiles', ]; } public static function install(): void { global $wpdb; if (get_site_option(Paths::FOLDERS_OPTION) === false) { // A new site's folders are named after the plugin's slug; one an earlier version set up keeps its own. update_site_option(Paths::FOLDERS_OPTION, get_site_option('relay_schema_version') === false ? 'siterelay' : 'relay'); } require_once ABSPATH . 'wp-admin/includes/upgrade.php'; $charset = $wpdb->get_charset_collate(); $t = self::tables(); dbDelta("CREATE TABLE {$t['jobs']} ( id char(36) NOT NULL, type varchar(20) NOT NULL, role varchar(10) NOT NULL DEFAULT 'local', status varchar(12) NOT NULL, direction varchar(10) NOT NULL DEFAULT '', peer_url varchar(255) NOT NULL DEFAULT '', key_id varchar(20) NOT NULL DEFAULT '', key_label varchar(100) NOT NULL DEFAULT '', user_id bigint(20) unsigned NOT NULL DEFAULT 0, settings longtext NOT NULL, progress longtext NOT NULL, stats longtext NOT NULL, error longtext NULL, restore_point longtext NULL, created_at datetime NOT NULL, started_at datetime NULL, finished_at datetime NULL, last_tick_at datetime NULL, PRIMARY KEY (id), KEY status (status), KEY created_at (created_at) ) {$charset};"); dbDelta("CREATE TABLE {$t['events']} ( id bigint(20) unsigned NOT NULL AUTO_INCREMENT, job_id char(36) NOT NULL, ts datetime NOT NULL, level varchar(10) NOT NULL, code varchar(60) NOT NULL DEFAULT '', message text NOT NULL, context longtext NULL, PRIMARY KEY (id), KEY job_id (job_id) ) {$charset};"); dbDelta("CREATE TABLE {$t['backups']} ( id char(36) NOT NULL, label varchar(190) NOT NULL DEFAULT '', origin varchar(10) NOT NULL DEFAULT 'local', source_url varchar(255) NOT NULL DEFAULT '', file varchar(64) NOT NULL DEFAULT '', status varchar(12) NOT NULL, size bigint(20) unsigned NOT NULL DEFAULT 0, summary longtext NULL, created_at datetime NOT NULL, added_at datetime NOT NULL, job_id char(36) NULL, PRIMARY KEY (id), KEY status (status) ) {$charset};"); dbDelta("CREATE TABLE {$t['keys']} ( id varchar(12) NOT NULL, label varchar(100) NOT NULL, secret_enc text NOT NULL, permissions varchar(10) NOT NULL, expires_at datetime NULL, max_uses int(10) unsigned NULL, uses int(10) unsigned NOT NULL DEFAULT 0, bound_job char(36) NULL, last_used_at datetime NULL, last_used_by varchar(255) NOT NULL DEFAULT '', revoked_at datetime NULL, created_by bigint(20) unsigned NOT NULL DEFAULT 0, created_at datetime NOT NULL, PRIMARY KEY (id) ) {$charset};"); dbDelta("CREATE TABLE {$t['nonces']} ( nonce char(32) NOT NULL, key_id varchar(12) NOT NULL, expires_at datetime NOT NULL, PRIMARY KEY (nonce), KEY expires_at (expires_at) ) {$charset};"); dbDelta("CREATE TABLE {$t['connections']} ( id char(36) NOT NULL, label varchar(100) NOT NULL DEFAULT '', site_url varchar(255) NOT NULL, key_id varchar(12) NOT NULL, secret_enc text NOT NULL, basic_auth_enc text NULL, allow_insecure tinyint(1) NOT NULL DEFAULT 0, endpoint varchar(20) NOT NULL DEFAULT '', peer longtext NULL, last_used_at datetime NULL, created_at datetime NOT NULL, PRIMARY KEY (id) ) {$charset};"); dbDelta("CREATE TABLE {$t['profiles']} ( id char(36) NOT NULL, name varchar(100) NOT NULL, type varchar(20) NOT NULL, settings longtext NOT NULL, created_at datetime NOT NULL, updated_at datetime NOT NULL, PRIMARY KEY (id) ) {$charset};"); self::forget_updater(); update_site_option('relay_schema_version', self::VERSION); CompatPlugin::remove(); } /** What Relay's GitHub updater (0.9.x) stored; WordPress.org delivers updates since 1.0.0. */ private static function forget_updater(): void { delete_site_option('relay_update_key'); delete_site_option('relay_update_status'); delete_site_transient('relay_update_release'); } public static function maybe_upgrade(): void { if ((int) get_site_option('relay_schema_version', 0) < self::VERSION) { self::install(); } } }