414 lines
13 KiB
SQL
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`
|
|
)
|
|
); |