Files
gaseous-server/gaseous-server/Support/Database/MySQL/gaseous-1024.sql
Michael Green 173e49286b WIP
2024-12-06 12:25:17 +11:00

414 lines
13 KiB
SQL

CREATE TABLE `Signatures_RomToSource` (
`SourceId` int NOT NULL,
`RomId` int NOT NULL,
PRIMARY KEY (`SourceId`, `RomId`)
);
CREATE TABLE `Signatures_Games_Countries` (
`GameId` INT NOT NULL,
`CountryId` INT NOT NULL,
PRIMARY KEY (`GameId`, `CountryId`),
CONSTRAINT `GameCountry` FOREIGN KEY (`GameId`) REFERENCES `Signatures_Games` (`Id`) ON DELETE CASCADE ON UPDATE NO ACTION
);
CREATE TABLE `Signatures_Games_Languages` (
`GameId` INT NOT NULL,
`LanguageId` INT NOT NULL,
PRIMARY KEY (`GameId`, `LanguageId`),
CONSTRAINT `GameLanguage` FOREIGN KEY (`GameId`) REFERENCES `Signatures_Games` (`Id`) ON DELETE CASCADE ON UPDATE NO ACTION
);
ALTER TABLE `Games_Roms` ADD COLUMN `RomDataVersion` INT DEFAULT 1;
CREATE TABLE UserProfiles (
`Id` VARCHAR(45) NOT NULL,
`UserId` VARCHAR(45) NOT NULL,
`DisplayName` VARCHAR(255) NOT NULL,
`Quip` VARCHAR(255) NOT NULL,
`Avatar` LONGBLOB,
`AvatarExtension` CHAR(6),
`ProfileBackground` LONGBLOB,
`ProfileBackgroundExtension` CHAR(6),
`UnstructuredData` LONGTEXT NOT NULL,
PRIMARY KEY (`Id`, `UserId`)
);
ALTER TABLE `PlatformMap_Bios`
ADD COLUMN `Enabled` BOOLEAN DEFAULT TRUE;
CREATE TABLE `User_PlatformMap` (
`id` VARCHAR(128) NOT NULL,
`GameId` BIGINT NOT NULL,
`PlatformId` BIGINT NOT NULL,
`Mapping` LONGTEXT,
PRIMARY KEY (`id`, `GameId`, `PlatformId`),
CONSTRAINT `User_PlatformMap_UserId` FOREIGN KEY (`id`) REFERENCES `Users` (`Id`) ON DELETE CASCADE
);
ALTER TABLE `UserTimeTracking`
ADD COLUMN `PlatformId` BIGINT,
ADD COLUMN `IsMediaGroup` BOOLEAN DEFAULT FALSE,
ADD COLUMN `RomId` BIGINT;
CREATE TABLE `User_RecentPlayedRoms` (
`UserId` varchar(128) NOT NULL,
`GameId` bigint(20) NOT NULL,
`PlatformId` bigint(20) NOT NULL,
`RomId` bigint(20) NOT NULL,
`IsMediaGroup` tinyint(1) DEFAULT NULL,
PRIMARY KEY (
`UserId`,
`GameId`,
`PlatformId`
),
CONSTRAINT `RecentPlayedRoms_Users` FOREIGN KEY (`UserId`) REFERENCES `Users` (`Id`) ON DELETE CASCADE
);
CREATE TABLE `User_GameFavouriteRoms` (
`UserId` varchar(128) NOT NULL,
`GameId` bigint(20) NOT NULL,
`PlatformId` bigint(20) NOT NULL,
`RomId` bigint(20) NOT NULL,
`IsMediaGroup` tinyint(1) DEFAULT NULL,
PRIMARY KEY (
`UserId`,
`GameId`,
`PlatformId`
),
CONSTRAINT `GameFavouriteRoms_Users` FOREIGN KEY (`UserId`) REFERENCES `Users` (`Id`) ON DELETE CASCADE
);
ALTER TABLE `Games_Roms`
CHANGE `Path` `RelativePath` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL;
ALTER TABLE `Games_Roms`
ADD CONSTRAINT Games_Roms_LibraryId FOREIGN KEY (`LibraryId`) REFERENCES `GameLibraries` (`Id`) ON DELETE CASCADE;
CREATE VIEW view_Games_Roms AS
SELECT `Games_Roms`.*, CONCAT(
`GameLibraries`.`Path`, '/', `Games_Roms`.`RelativePath`
) AS `Path`, `GameLibraries`.`Name` AS `LibraryName`
FROM
`Games_Roms`
JOIN `GameLibraries` ON `Games_Roms`.`LibraryId` = `GameLibraries`.`Id`;
CREATE VIEW view_UserTimeTracking AS
SELECT *, DATE_ADD(
SessionTime, INTERVAL SessionLength MINUTE
) AS SessionEnd
FROM UserTimeTracking;
CREATE INDEX idx_game_name ON Game (`Name`);
CREATE INDEX idx_game_totalratingcount ON Game (TotalRatingCount);
CREATE INDEX idx_alternativename_game ON AlternativeName (Game);
CREATE INDEX idx_gamestate_romid ON GameState (RomId);
CREATE INDEX idx_gamestate_ismediagroup_userid ON GameState (IsMediaGroup, UserId);
CREATE INDEX idx_rommediagroup_gameid ON RomMediaGroup (GameId);
CREATE INDEX idx_favourites_userid_gameid ON Favourites (UserId, GameId);
CREATE TABLE `MetadataMap` (
`Id` bigint(20) NOT NULL AUTO_INCREMENT,
`PlatformId` bigint(20) NOT NULL,
`SignatureGameName` varchar(255) NOT NULL,
PRIMARY KEY (`id`),
INDEX `idx_gamename` (
`SignatureGameName`,
`PlatformId`
)
);
CREATE TABLE `MetadataMapBridge` (
`ParentMapId` bigint(20) NOT NULL,
`MetadataSourceType` int(11) NOT NULL DEFAULT 0,
`MetadataSourceId` bigint(20) NOT NULL,
`Preferred` BOOLEAN NOT NULL DEFAULT 0,
`ProcessedAtImport` BOOLEAN NOT NULL DEFAULT 0,
PRIMARY KEY (
`ParentMapId`,
`MetadataSourceType`,
`MetadataSourceId`
),
CONSTRAINT `MetadataMapBridge_MetadataMap` FOREIGN KEY (`ParentMapId`) REFERENCES `MetadataMap` (`Id`) ON DELETE CASCADE
);
CREATE OR REPLACE VIEW `view_MetadataMap` AS
SELECT `MetadataMap`.*, `MetadataMapBridge`.`MetadataSourceType`, `MetadataMapBridge`.`MetadataSourceId`
FROM
`MetadataMap`
LEFT JOIN `MetadataMapBridge` ON (
`MetadataMap`.`Id` = `MetadataMapBridge`.`ParentMapId`
AND `MetadataMapBridge`.`Preferred` = 1
);
ALTER TABLE `Games_Roms`
ADD CONSTRAINT metadataMapId FOREIGN KEY (`MetadataMapId`) REFERENCES `MetadataMap` (`Id`) ON DELETE CASCADE;
ALTER TABLE `Games_Roms`
ADD COLUMN `MetadataMapId` BIGINT NOT NULL DEFAULT 0;
ALTER TABLE `AgeGroup`
ADD COLUMN `SourceId` INT NOT NULL DEFAULT 1 AFTER `Id`,
DROP PRIMARY KEY,
ADD PRIMARY KEY (`Id`, `SourceId`);
ALTER TABLE `AgeRating`
ADD COLUMN `SourceId` INT NOT NULL DEFAULT 1 AFTER `Id`,
DROP PRIMARY KEY,
ADD PRIMARY KEY (`Id`, `SourceId`);
ALTER TABLE `AgeRatingContentDescription`
ADD COLUMN `SourceId` INT NOT NULL DEFAULT 1 AFTER `Id`,
DROP PRIMARY KEY,
ADD PRIMARY KEY (`Id`, `SourceId`);
ALTER TABLE `AlternativeName`
ADD COLUMN `SourceId` INT NOT NULL DEFAULT 1 AFTER `Id`,
DROP PRIMARY KEY,
ADD PRIMARY KEY (`Id`, `SourceId`);
ALTER TABLE `Artwork`
ADD COLUMN `SourceId` INT NOT NULL DEFAULT 1 AFTER `Id`,
DROP PRIMARY KEY,
ADD PRIMARY KEY (`Id`, `SourceId`);
ALTER TABLE `Collection`
ADD COLUMN `SourceId` INT NOT NULL DEFAULT 1 AFTER `Id`,
DROP PRIMARY KEY,
ADD PRIMARY KEY (`Id`, `SourceId`);
ALTER TABLE `Company`
ADD COLUMN `SourceId` INT NOT NULL DEFAULT 1 AFTER `Id`,
DROP PRIMARY KEY,
ADD PRIMARY KEY (`Id`, `SourceId`);
ALTER TABLE `CompanyLogo`
ADD COLUMN `SourceId` INT NOT NULL DEFAULT 1 AFTER `Id`,
DROP PRIMARY KEY,
ADD PRIMARY KEY (`Id`, `SourceId`);
ALTER TABLE `Cover`
ADD COLUMN `SourceId` INT NOT NULL DEFAULT 1 AFTER `Id`,
DROP PRIMARY KEY,
ADD PRIMARY KEY (`Id`, `SourceId`);
ALTER TABLE `ExternalGame`
ADD COLUMN `SourceId` INT NOT NULL DEFAULT 1 AFTER `Id`,
DROP PRIMARY KEY,
ADD PRIMARY KEY (`Id`, `SourceId`);
ALTER TABLE `Franchise`
ADD COLUMN `SourceId` INT NOT NULL DEFAULT 1 AFTER `Id`,
DROP PRIMARY KEY,
ADD PRIMARY KEY (`Id`, `SourceId`);
ALTER TABLE `Game`
CHANGE `Id` `Id` bigint(20) NOT NULL AUTO_INCREMENT,
ADD COLUMN `SourceId` INT NOT NULL DEFAULT 1 AFTER `Id`,
DROP INDEX IF EXISTS `Id_UNIQUE`,
DROP INDEX IF EXISTS `PRIMARY`,
ADD PRIMARY KEY (`Id`, `SourceId`);
ALTER TABLE `GameMode`
ADD COLUMN `SourceId` INT NOT NULL DEFAULT 1 AFTER `Id`,
DROP PRIMARY KEY,
ADD PRIMARY KEY (`Id`, `SourceId`);
ALTER TABLE `GameVideo`
ADD COLUMN `SourceId` INT NOT NULL DEFAULT 1 AFTER `Id`,
DROP PRIMARY KEY,
ADD PRIMARY KEY (`Id`, `SourceId`);
ALTER TABLE `Genre`
ADD COLUMN `SourceId` INT NOT NULL DEFAULT 1 AFTER `Id`,
DROP PRIMARY KEY,
ADD PRIMARY KEY (`Id`, `SourceId`);
ALTER TABLE `InvolvedCompany`
ADD COLUMN `SourceId` INT NOT NULL DEFAULT 1 AFTER `Id`,
DROP PRIMARY KEY,
ADD PRIMARY KEY (`Id`, `SourceId`);
ALTER TABLE `MultiplayerMode`
ADD COLUMN `SourceId` INT NOT NULL DEFAULT 1 AFTER `Id`,
DROP PRIMARY KEY,
ADD PRIMARY KEY (`Id`, `SourceId`);
ALTER TABLE `Platform`
ADD COLUMN `SourceId` INT NOT NULL DEFAULT 1 AFTER `Id`,
DROP INDEX IF EXISTS `Id_UNIQUE`,
DROP INDEX IF EXISTS `PRIMARY`,
ADD PRIMARY KEY (`Id`, `SourceId`);
ALTER TABLE `PlatformLogo`
ADD COLUMN `SourceId` INT NOT NULL DEFAULT 1 AFTER `Id`,
DROP PRIMARY KEY,
ADD PRIMARY KEY (`Id`, `SourceId`);
ALTER TABLE `PlatformVersion`
ADD COLUMN `SourceId` INT NOT NULL DEFAULT 1 AFTER `Id`,
DROP PRIMARY KEY,
ADD PRIMARY KEY (`Id`, `SourceId`);
ALTER TABLE `PlayerPerspective`
ADD COLUMN `SourceId` INT NOT NULL DEFAULT 1 AFTER `Id`,
DROP PRIMARY KEY,
ADD PRIMARY KEY (`Id`, `SourceId`);
ALTER TABLE `ReleaseDate`
ADD COLUMN `SourceId` INT NOT NULL DEFAULT 1 AFTER `Id`,
DROP PRIMARY KEY,
ADD PRIMARY KEY (`Id`, `SourceId`);
ALTER TABLE `Screenshot`
ADD COLUMN `SourceId` INT NOT NULL DEFAULT 1 AFTER `Id`,
DROP PRIMARY KEY,
ADD PRIMARY KEY (`Id`, `SourceId`);
ALTER TABLE `Theme`
ADD COLUMN `SourceId` INT NOT NULL DEFAULT 1 AFTER `Id`,
DROP PRIMARY KEY,
ADD PRIMARY KEY (`Id`, `SourceId`);
ALTER TABLE `ReleaseDate`
CHANGE `m` `Month` int(11) DEFAULT NULL,
CHANGE `y` `Year` int(11) DEFAULT NULL;
CREATE OR REPLACE VIEW `view_Games_Roms` AS
SELECT
`Games_Roms`.`Id` AS `Id`,
`Games_Roms`.`PlatformId` AS `PlatformId`,
`view_MetadataMap`.`Id` AS `MetadataMapId`,
`view_MetadataMap`.`MetadataSourceType` AS `GameIdType`,
`view_MetadataMap`.`MetadataSourceId` AS `GameId`,
`Games_Roms`.`Name` AS `Name`,
`Games_Roms`.`Size` AS `Size`,
`Games_Roms`.`CRC` AS `CRC`,
`Games_Roms`.`MD5` AS `MD5`,
`Games_Roms`.`SHA1` AS `SHA1`,
`Games_Roms`.`DevelopmentStatus` AS `DevelopmentStatus`,
`Games_Roms`.`Flags` AS `Flags`,
`Games_Roms`.`Attributes` AS `Attributes`,
`Games_Roms`.`RomType` AS `RomType`,
`Games_Roms`.`RomTypeMedia` AS `RomTypeMedia`,
`Games_Roms`.`MediaLabel` AS `MediaLabel`,
`Games_Roms`.`RelativePath` AS `RelativePath`,
`Games_Roms`.`MetadataSource` AS `MetadataSource`,
`Games_Roms`.`MetadataGameName` AS `MetadataGameName`,
`Games_Roms`.`MetadataVersion` AS `MetadataVersion`,
`Games_Roms`.`LibraryId` AS `LibraryId`,
`Games_Roms`.`LastMatchAttemptDate` AS `LastMatchAttemptDate`,
`Games_Roms`.`RomDataVersion` AS `RomDataVersion`,
CONCAT(
`GameLibraries`.`Path`,
'/',
`Games_Roms`.`RelativePath`
) AS `Path`,
`GameLibraries`.`Name` AS `LibraryName`
FROM (
`Games_Roms`
JOIN `GameLibraries` ON (
`Games_Roms`.`LibraryId` = `GameLibraries`.`Id`
)
LEFT JOIN `view_MetadataMap` ON (
`Games_Roms`.`MetadataMapId` = `view_MetadataMap`.`Id`
)
);
CREATE OR REPLACE VIEW `view_GamesWithRoms` AS
SELECT DISTINCT
`Games_Roms`.`GameId` AS `ROMGameId`,
`view_MetadataMap`.`Id` AS `MetadataMapId`,
`view_MetadataMap`.`MetadataSourceType` AS `GameIdType`,
CASE
WHEN `Game`.`Id` IS NULL THEN 0
ELSE `Game`.`Id`
END AS `Id`,
`Game`.`AgeRatings` AS `AgeRatings`,
`Game`.`AggregatedRating` AS `AggregatedRating`,
`Game`.`AggregatedRatingCount` AS `AggregatedRatingCount`,
`Game`.`AlternativeNames` AS `AlternativeNames`,
`Game`.`Artworks` AS `Artworks`,
`Game`.`Bundles` AS `Bundles`,
`Game`.`Category` AS `Category`,
`Game`.`Checksum` AS `Checksum`,
`Game`.`Collection` AS `Collection`,
`Game`.`Cover` AS `Cover`,
`Game`.`CreatedAt` AS `CreatedAt`,
`Game`.`Dlcs` AS `Dlcs`,
`Game`.`Expansions` AS `Expansions`,
`Game`.`ExternalGames` AS `ExternalGames`,
`Game`.`FirstReleaseDate` AS `FirstReleaseDate`,
`Game`.`Follows` AS `Follows`,
`Game`.`Franchise` AS `Franchise`,
`Game`.`Franchises` AS `Franchises`,
`Game`.`GameEngines` AS `GameEngines`,
`Game`.`GameModes` AS `GameModes`,
`Game`.`Genres` AS `Genres`,
`Game`.`Hypes` AS `Hypes`,
`Game`.`InvolvedCompanies` AS `InvolvedCompanies`,
`Game`.`Keywords` AS `Keywords`,
`Game`.`MultiplayerModes` AS `MultiplayerModes`,
CASE
WHEN `Game`.`Name` IS NULL THEN `view_MetadataMap`.`SignatureGameName`
ELSE `Game`.`Name`
END AS `Name`,
CASE
WHEN `Game`.`Name` IS NULL THEN CASE
WHEN `view_MetadataMap`.`SignatureGameName` LIKE 'The %' THEN CONCAT(
TRIM(
SUBSTR(
`view_MetadataMap`.`SignatureGameName`,
4
)
),
', The'
)
ELSE `view_MetadataMap`.`SignatureGameName`
END
WHEN `Game`.`Name` LIKE 'The %' THEN CONCAT(
TRIM(SUBSTR(`Game`.`Name`, 4)),
', The'
)
ELSE `Game`.`Name`
END AS `NameThe`,
`Game`.`ParentGame` AS `ParentGame`,
`Game`.`Platforms` AS `Platforms`,
`Game`.`PlayerPerspectives` AS `PlayerPerspectives`,
`Game`.`Rating` AS `Rating`,
`Game`.`RatingCount` AS `RatingCount`,
`Game`.`ReleaseDates` AS `ReleaseDates`,
`Game`.`Screenshots` AS `Screenshots`,
`Game`.`SimilarGames` AS `SimilarGames`,
`Game`.`Slug` AS `Slug`,
`Game`.`StandaloneExpansions` AS `StandaloneExpansions`,
`Game`.`Status` AS `Status`,
`Game`.`StoryLine` AS `StoryLine`,
`Game`.`Summary` AS `Summary`,
`Game`.`Tags` AS `Tags`,
`Game`.`Themes` AS `Themes`,
`Game`.`TotalRating` AS `TotalRating`,
`Game`.`TotalRatingCount` AS `TotalRatingCount`,
`Game`.`UpdatedAt` AS `UpdatedAt`,
`Game`.`Url` AS `Url`,
`Game`.`VersionParent` AS `VersionParent`,
`Game`.`VersionTitle` AS `VersionTitle`,
`Game`.`Videos` AS `Videos`,
`Game`.`Websites` AS `Websites`,
`Game`.`dateAdded` AS `dateAdded`,
`Game`.`lastUpdated` AS `lastUpdated`
FROM (
`Games_Roms`
JOIN `view_MetadataMap` ON (
`view_MetadataMap`.`Id` = `Games_Roms`.`MetadataMapId`
)
LEFT JOIN `Game` ON (
`Game`.`SourceId` = `view_MetadataMap`.`MetadataSourceType`
AND `Game`.`Id` = `view_MetadataMap`.`MetadataSourceId`
)
);