mirror of
https://github.com/pelican-dev/panel.git
synced 2025-05-19 21:04:44 +02:00
Fix SQLite foreign keys (#478)
* start migration to fix sqlite foreign keys * add remaining foreign keys * add ".sqlite.backup" files to gitignore
This commit is contained in:
parent
a04937d698
commit
10806d6d6b
1
database/.gitignore
vendored
1
database/.gitignore
vendored
@ -1 +1,2 @@
|
||||
*.sqlite
|
||||
*.sqlite.backup
|
||||
|
@ -0,0 +1,284 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
return new class extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*/
|
||||
public function up(): void
|
||||
{
|
||||
// Only needed for sqlite
|
||||
if (Schema::getConnection()->getDriverName() !== 'sqlite') {
|
||||
return;
|
||||
}
|
||||
|
||||
// Disable foreign checks
|
||||
// legacy_alter_table needs to be 'ON' so existing foreign key table references aren't renamed when renaming the table, see https://www.sqlite.org/lang_altertable.html
|
||||
DB::statement('PRAGMA foreign_keys = OFF');
|
||||
DB::statement('PRAGMA legacy_alter_table = ON');
|
||||
|
||||
DB::transaction(function () {
|
||||
// api_keys_user_id_foreign
|
||||
DB::statement('ALTER TABLE api_keys RENAME TO _api_keys_old');
|
||||
DB::statement('CREATE TABLE api_keys
|
||||
("id" integer primary key autoincrement not null,
|
||||
"token" text not null,
|
||||
"allowed_ips" text not null,
|
||||
"created_at" datetime,
|
||||
"updated_at" datetime,
|
||||
"user_id" integer not null,
|
||||
"memo" text,
|
||||
"r_servers" integer not null default \'0\',
|
||||
"r_nodes" integer not null default \'0\',
|
||||
"r_allocations" integer not null default \'0\',
|
||||
"r_users" integer not null default \'0\',
|
||||
"r_eggs" integer not null default \'0\',
|
||||
"r_database_hosts" integer not null default \'0\',
|
||||
"r_server_databases" integer not null default \'0\',
|
||||
"identifier" varchar,
|
||||
"key_type" integer not null default \'0\',
|
||||
"last_used_at" datetime,
|
||||
"expires_at" datetime,
|
||||
"r_mounts" integer not null default \'0\',
|
||||
foreign key("user_id") references "users"("id") on delete cascade)');
|
||||
DB::statement('INSERT INTO api_keys SELECT * FROM _api_keys_old');
|
||||
DB::statement('DROP TABLE _api_keys_old');
|
||||
DB::statement('CREATE UNIQUE INDEX "api_keys_identifier_unique" on "api_keys" ("identifier")');
|
||||
|
||||
// database_hosts_node_id_foreign
|
||||
DB::statement('ALTER TABLE database_hosts RENAME TO _database_hosts_old');
|
||||
DB::statement('CREATE TABLE database_hosts
|
||||
("id" integer primary key autoincrement not null,
|
||||
"name" varchar not null,
|
||||
"host" varchar not null,
|
||||
"port" integer not null,
|
||||
"username" varchar not null,
|
||||
"password" text not null,
|
||||
"max_databases" integer,
|
||||
"node_id" integer,
|
||||
"created_at" datetime,
|
||||
"updated_at" datetime,
|
||||
foreign key("node_id") references "nodes"("id") on delete set null)');
|
||||
DB::statement('INSERT INTO database_hosts SELECT * FROM _database_hosts_old');
|
||||
DB::statement('DROP TABLE _database_hosts_old');
|
||||
|
||||
// mount_node_node_id_foreign
|
||||
// mount_node_mount_id_foreign
|
||||
DB::statement('ALTER TABLE mount_node RENAME TO _mount_node_old');
|
||||
DB::statement('CREATE TABLE mount_node
|
||||
("node_id" integer not null,
|
||||
"mount_id" integer not null,
|
||||
foreign key("node_id") references "nodes"("id") on delete cascade on update cascade,
|
||||
foreign key("mount_id") references "mounts"("id") on delete cascade on update cascade)');
|
||||
DB::statement('INSERT INTO mount_node SELECT * FROM _mount_node_old');
|
||||
DB::statement('DROP TABLE _mount_node_old');
|
||||
DB::statement('CREATE UNIQUE INDEX "mount_node_node_id_mount_id_unique" on "mount_node" ("node_id", "mount_id")');
|
||||
|
||||
// servers_node_id_foreign
|
||||
// servers_owner_id_foreign
|
||||
// servers_egg_id_foreign
|
||||
// servers_allocation_id_foreign
|
||||
DB::statement('ALTER TABLE servers RENAME TO _servers_old');
|
||||
DB::statement('CREATE TABLE servers
|
||||
("id" integer primary key autoincrement not null,
|
||||
"uuid" varchar not null,
|
||||
"uuid_short" varchar not null,
|
||||
"node_id" integer not null,
|
||||
"name" varchar not null,
|
||||
"owner_id" integer not null,
|
||||
"memory" integer not null,
|
||||
"swap" integer not null,
|
||||
"disk" integer not null,
|
||||
"io" integer not null,
|
||||
"cpu" integer not null,
|
||||
"egg_id" integer not null,
|
||||
"startup" text not null,
|
||||
"created_at" datetime,
|
||||
"updated_at" datetime,
|
||||
"allocation_id" integer not null,
|
||||
"image" varchar not null,
|
||||
"description" text not null,
|
||||
"skip_scripts" tinyint(1) not null default \'0\',
|
||||
"external_id" varchar,
|
||||
"database_limit" integer default \'0\',
|
||||
"allocation_limit" integer,
|
||||
"threads" varchar,
|
||||
"backup_limit" integer not null default \'0\',
|
||||
"status" varchar,
|
||||
"installed_at" datetime,
|
||||
"oom_killer" integer not null default \'0\',
|
||||
"docker_labels" text,
|
||||
foreign key("node_id") references "nodes"("id"),
|
||||
foreign key("owner_id") references "users"("id"),
|
||||
foreign key("egg_id") references "eggs"("id"),
|
||||
foreign key("allocation_id") references "allocations"("id"))');
|
||||
DB::statement('INSERT INTO servers SELECT * FROM _servers_old');
|
||||
DB::statement('DROP TABLE _servers_old');
|
||||
DB::statement('CREATE UNIQUE INDEX "servers_allocation_id_unique" on "servers" ("allocation_id")');
|
||||
DB::statement('CREATE UNIQUE INDEX "servers_external_id_unique" on "servers" ("external_id")');
|
||||
DB::statement('CREATE UNIQUE INDEX "servers_uuid_unique" on "servers" ("uuid")');
|
||||
DB::statement('CREATE UNIQUE INDEX "servers_uuidshort_unique" on "servers" ("uuid_short")');
|
||||
|
||||
// databases_server_id_foreign
|
||||
// databases_database_host_id_foreign
|
||||
DB::statement('ALTER TABLE databases RENAME TO _databases_old');
|
||||
DB::statement('CREATE TABLE databases
|
||||
("id" integer primary key autoincrement not null,
|
||||
"server_id" integer not null,
|
||||
"database_host_id" integer not null,
|
||||
"database" varchar not null,
|
||||
"username" varchar not null,
|
||||
"remote" varchar not null default \'%\',
|
||||
"password" text not null,
|
||||
"created_at" datetime,
|
||||
"updated_at" datetime,
|
||||
"max_connections" integer default \'0\',
|
||||
foreign key("server_id") references "servers"("id"),
|
||||
foreign key("database_host_id") references "database_hosts"("id"))');
|
||||
DB::statement('INSERT INTO databases SELECT * FROM _databases_old');
|
||||
DB::statement('DROP TABLE _databases_old');
|
||||
DB::statement('CREATE UNIQUE INDEX "databases_database_host_id_server_id_database_unique" on "databases" ("database_host_id", "server_id", "database")');
|
||||
DB::statement('CREATE UNIQUE INDEX "databases_database_host_id_username_unique" on "databases" ("database_host_id", "username")');
|
||||
|
||||
// allocations_node_id_foreign
|
||||
// allocations_server_id_foreign
|
||||
DB::statement('ALTER TABLE allocations RENAME TO _allocations_old');
|
||||
DB::statement('CREATE TABLE allocations
|
||||
("id" integer primary key autoincrement not null,
|
||||
"node_id" integer not null,
|
||||
"ip" varchar not null,
|
||||
"port" integer not null,
|
||||
"server_id" integer,
|
||||
"created_at" datetime,
|
||||
"updated_at" datetime,
|
||||
"ip_alias" text,
|
||||
"notes" varchar,
|
||||
foreign key("node_id") references "nodes"("id") on delete cascade,
|
||||
foreign key("server_id") references "servers"("id") on delete cascade on update set null)');
|
||||
DB::statement('INSERT INTO allocations SELECT * FROM _allocations_old');
|
||||
DB::statement('DROP TABLE _allocations_old');
|
||||
DB::statement('CREATE UNIQUE INDEX "allocations_node_id_ip_port_unique" on "allocations" ("node_id", "ip", "port")');
|
||||
|
||||
// eggs_config_from_foreign
|
||||
// eggs_copy_script_from_foreign
|
||||
DB::statement('ALTER TABLE eggs RENAME TO _eggs_old');
|
||||
DB::statement('CREATE TABLE eggs
|
||||
("id" integer primary key autoincrement not null,
|
||||
"name" varchar not null,
|
||||
"description" text,
|
||||
"created_at" datetime,
|
||||
"updated_at" datetime,
|
||||
"startup" text,
|
||||
"config_from" integer,
|
||||
"config_stop" varchar,
|
||||
"config_logs" text,
|
||||
"config_startup" text,
|
||||
"config_files" text,
|
||||
"script_install" text,
|
||||
"script_is_privileged" tinyint(1) not null default \'1\',
|
||||
"script_entry" varchar not null default \'ash\',
|
||||
"script_container" varchar not null default \'alpine:3.4\',
|
||||
"copy_script_from" integer,
|
||||
"uuid" varchar not null,
|
||||
"author" varchar not null,
|
||||
"features" text,
|
||||
"docker_images" text,
|
||||
"update_url" text,
|
||||
"file_denylist" text,
|
||||
"force_outgoing_ip" tinyint(1) not null default \'0\',
|
||||
"tags" text not null,
|
||||
foreign key("config_from") references "eggs"("id") on delete set null,
|
||||
foreign key("copy_script_from") references "eggs"("id") on delete set null)');
|
||||
DB::statement('INSERT INTO eggs SELECT * FROM _eggs_old');
|
||||
DB::statement('DROP TABLE _eggs_old');
|
||||
DB::statement('CREATE UNIQUE INDEX "service_options_uuid_unique" on "eggs" ("uuid")');
|
||||
|
||||
// egg_mount_mount_id_foreign
|
||||
// egg_mount_egg_id_foreign
|
||||
DB::statement('ALTER TABLE egg_mount RENAME TO _egg_mount_old');
|
||||
DB::statement('CREATE TABLE egg_mount
|
||||
("egg_id" integer not null,
|
||||
"mount_id" integer not null,
|
||||
foreign key("egg_id") references "eggs"("id") on delete cascade on update cascade,
|
||||
foreign key("mount_id") references "mounts"("id") on delete cascade on update cascade)');
|
||||
DB::statement('INSERT INTO egg_mount SELECT * FROM _egg_mount_old');
|
||||
DB::statement('DROP TABLE _egg_mount_old');
|
||||
DB::statement('CREATE UNIQUE INDEX "egg_mount_egg_id_mount_id_unique" on "egg_mount" ("egg_id", "mount_id")');
|
||||
|
||||
// service_variables_egg_id_foreign
|
||||
DB::statement('ALTER TABLE egg_variables RENAME TO _egg_variables_old');
|
||||
DB::statement('CREATE TABLE egg_variables
|
||||
("id" integer primary key autoincrement not null,
|
||||
"egg_id" integer not null,
|
||||
"name" varchar not null,
|
||||
"description" text not null,
|
||||
"env_variable" varchar not null,
|
||||
"default_value" text not null,
|
||||
"user_viewable" integer not null,
|
||||
"user_editable" integer not null,
|
||||
"rules" text not null,
|
||||
"created_at" datetime,
|
||||
"updated_at" datetime,
|
||||
"sort" integer,
|
||||
foreign key("egg_id") references "eggs"("id") on delete cascade)');
|
||||
DB::statement('INSERT INTO egg_variables SELECT * FROM _egg_variables_old');
|
||||
DB::statement('DROP TABLE _egg_variables_old');
|
||||
|
||||
// mount_server_server_id_foreign
|
||||
// mount_server_mount_id_foreign
|
||||
DB::statement('ALTER TABLE mount_server RENAME TO _mount_server_old');
|
||||
DB::statement('CREATE TABLE mount_server
|
||||
("server_id" integer not null,
|
||||
"mount_id" integer not null,
|
||||
foreign key("server_id") references "servers"("id") on delete cascade on update cascade,
|
||||
foreign key("mount_id") references "mounts"("id") on delete cascade on update cascade)');
|
||||
DB::statement('INSERT INTO mount_server SELECT * FROM _mount_server_old');
|
||||
DB::statement('DROP TABLE _mount_server_old');
|
||||
DB::statement('CREATE UNIQUE INDEX "mount_server_server_id_mount_id_unique" on "mount_server" ("server_id", "mount_id")');
|
||||
|
||||
// server_variables_variable_id_foreign
|
||||
DB::statement('ALTER TABLE server_variables RENAME TO _server_variables_old');
|
||||
DB::statement('CREATE TABLE server_variables
|
||||
("id" integer primary key autoincrement not null,
|
||||
"server_id" integer not null,
|
||||
"variable_id" integer not null,
|
||||
"variable_value" text not null,
|
||||
"created_at" datetime,
|
||||
"updated_at" datetime,
|
||||
foreign key("server_id") references "servers"("id") on delete cascade,
|
||||
foreign key("variable_id") references "egg_variables"("id") on delete cascade)');
|
||||
DB::statement('INSERT INTO server_variables SELECT * FROM _server_variables_old');
|
||||
DB::statement('DROP TABLE _server_variables_old');
|
||||
|
||||
// subusers_user_id_foreign
|
||||
// subusers_server_id_foreign
|
||||
DB::statement('ALTER TABLE subusers RENAME TO _subusers_old');
|
||||
DB::statement('CREATE TABLE subusers
|
||||
("id" integer primary key autoincrement not null,
|
||||
"user_id" integer not null,
|
||||
"server_id" integer not null,
|
||||
"created_at" datetime,
|
||||
"updated_at" datetime,
|
||||
"permissions" text,
|
||||
foreign key("user_id") references "users"("id") on delete cascade,
|
||||
foreign key("server_id") references "servers"("id") on delete cascade)');
|
||||
DB::statement('INSERT INTO subusers SELECT * FROM _subusers_old');
|
||||
DB::statement('DROP TABLE _subusers_old');
|
||||
});
|
||||
|
||||
DB::statement('PRAGMA foreign_keys = ON');
|
||||
DB::statement('PRAGMA legacy_alter_table = OFF');
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*/
|
||||
public function down(): void
|
||||
{
|
||||
// Reverse not needed
|
||||
}
|
||||
};
|
Loading…
x
Reference in New Issue
Block a user