create, read, playercount

This commit is contained in:
2022-11-09 16:08:04 -06:00
parent a1f996e508
commit da76917490
37 changed files with 999 additions and 814 deletions

View File

@@ -10,4 +10,5 @@ Post-Deployment Script Template
--------------------------------------------------------------------------------------
*/
:r .\Scripts\PopulateLoginPlatforms.sql
:r .\Scripts\PopulateLoginPlatforms.sql
:r .\Scripts\PopulatePieces.sql

View File

@@ -0,0 +1,2 @@
ALTER DATABASE Shogi
SET ALLOW_SNAPSHOT_ISOLATION ON

View File

@@ -0,0 +1,21 @@
DECLARE @Pieces TABLE(
[Name] NVARCHAR(13)
)
INSERT INTO @Pieces ([Name])
VALUES
('King'),
('GoldGeneral'),
('SilverGeneral'),
('Bishop'),
('Rook'),
('Knight'),
('Lance'),
('Pawn');
MERGE [session].[Piece] as t
USING @Pieces as s
ON t.[Name] = s.[Name]
WHEN NOT MATCHED THEN
INSERT ([Name])
VALUES (s.[Name]);

View File

@@ -1,15 +1,12 @@
CREATE PROCEDURE [session].[CreateSession]
@Name [session].[SessionName],
@Player1Name [user].[UserName],
@InitialBoardStateDocument [session].[JsonDocument]
@Player1Name [user].[UserName]
AS
BEGIN
SET NOCOUNT ON
INSERT INTO [session].[Session] (BoardState, Player1Id)
SELECT
@InitialBoardStateDocument,
Id
INSERT INTO [session].[Session] ([Name], Player1Id)
SELECT @Name, Id
FROM [user].[User]
WHERE [Name] = @Player1Name
END

View File

@@ -0,0 +1,5 @@
CREATE PROCEDURE [session].[DeleteSession]
@Name [session].[SessionName]
AS
DELETE FROM [session].[Session] WHERE [Name] = @Name;

View File

@@ -2,15 +2,32 @@
@Name [session].[SessionName]
AS
BEGIN
SET NOCOUNT ON
SET NOCOUNT ON -- Performance boost
SET XACT_ABORT ON -- Rollback transaction on error
SET TRANSACTION ISOLATION LEVEL SNAPSHOT -- Ignores data changes that happen after the transaction begins.
SELECT
sess.[Name],
BoardState,
p1.[Name] as Player1,
p2.[Name] as Player2
FROM [session].[Session] sess
INNER JOIN [user].[User] p1 on sess.Player1Id = p1.Id
LEFT JOIN [user].[User] p2 on sess.Player2Id = p2.Id
WHERE sess.[Name] = @Name;
BEGIN TRANSACTION
-- Session
SELECT
sess.[Name],
p1.[Name] as Player1,
p2.[Name] as Player2
FROM [session].[Session] sess
INNER JOIN [user].[User] p1 on sess.Player1Id = p1.Id
LEFT JOIN [user].[User] p2 on sess.Player2Id = p2.Id
WHERE sess.[Name] = @Name;
-- Player moves
SELECT
mv.[From],
mv.[To],
mv.IsPromotion,
piece.[Name] as PieceFromHand
FROM [session].[Move] mv
INNER JOIN [session].[Session] sess ON sess.Id = mv.SessionId
RIGHT JOIN [session].Piece piece on piece.Id = mv.PieceIdFromHand
WHERE sess.[Name] = @Name;
COMMIT
END

View File

@@ -1,4 +1,4 @@
CREATE PROCEDURE [session].[ReadAllSessionsMetadata]
CREATE PROCEDURE [session].[ReadSessionPlayerCount]
AS
BEGIN
SET NOCOUNT ON;

View File

@@ -0,0 +1,20 @@
CREATE TABLE [session].[Move]
(
[Id] INT NOT NULL PRIMARY KEY IDENTITY,
[SessionId] BIGINT NOT NULL,
[From] VARCHAR(2) NOT NULL,
[To] VARCHAR(2) NOT NULL,
[IsPromotion] BIT NOT NULL,
[PieceIdFromHand] INT NULL
CONSTRAINT [Cannot end where you start]
CHECK ([From] <> [To]),
CONSTRAINT FK_Move_Session FOREIGN KEY (SessionId) REFERENCES [session].[Session] (Id)
ON DELETE CASCADE
ON UPDATE CASCADE,
CONSTRAINT FK_Move_Piece FOREIGN KEY (PieceIdFromHand) REFERENCES [session].[Piece] (Id)
ON DELETE NO ACTION
ON UPDATE NO ACTION
)

View File

@@ -0,0 +1,5 @@
CREATE TABLE [session].[Piece]
(
[Id] INT NOT NULL PRIMARY KEY IDENTITY,
[Name] NVARCHAR(13) NOT NULL UNIQUE
)

View File

@@ -4,13 +4,12 @@
[Name] [session].[SessionName] UNIQUE,
Player1Id BIGINT NOT NULL,
Player2Id BIGINT NULL,
BoardState [session].[JsonDocument] NOT NULL,
Created DATETIMEOFFSET NOT NULL DEFAULT SYSDATETIMEOFFSET(),
CONSTRAINT [BoardState must be json] CHECK (isjson(BoardState)=1),
CONSTRAINT FK_Player1_User FOREIGN KEY (Player1Id) REFERENCES [user].[User] (Id)
ON DELETE CASCADE
ON UPDATE CASCADE,
CONSTRAINT FK_Player2_User FOREIGN KEY (Player2Id) REFERENCES [user].[User] (Id)
ON DELETE NO ACTION
ON UPDATE NO ACTION

View File

@@ -22,6 +22,7 @@
<SqlServerVerification>False</SqlServerVerification>
<IncludeCompositeObjects>True</IncludeCompositeObjects>
<TargetDatabaseSet>True</TargetDatabaseSet>
<DefaultSchema>session</DefaultSchema>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<OutputPath>bin\Release\</OutputPath>
@@ -77,14 +78,21 @@
<Build Include="User\Types\UserName.sql" />
<Build Include="Session\Types\JsonDocument.sql" />
<Build Include="User\StoredProcedures\CreateUser.sql" />
<Build Include="Session\Stored Procedures\ReadAllSessionsMetadata.sql" />
<Build Include="Session\Stored Procedures\ReadSessionPlayerCount.sql" />
<Build Include="User\StoredProcedures\ReadUser.sql" />
<Build Include="User\Tables\LoginPlatform.sql" />
<None Include="Post Deployment\Scripts\PopulateLoginPlatforms.sql" />
<Build Include="Session\Stored Procedures\UpdateSession.sql" />
<Build Include="Session\Stored Procedures\ReadSession.sql" />
<Build Include="Session\Tables\Move.sql" />
<Build Include="Session\Tables\Piece.sql" />
<Build Include="Session\Stored Procedures\DeleteSession.sql" />
</ItemGroup>
<ItemGroup>
<PostDeploy Include="Post Deployment\Script.PostDeployment.sql" />
</ItemGroup>
<ItemGroup>
<None Include="Post Deployment\Scripts\PopulatePieces.sql" />
<None Include="Post Deployment\Scripts\EnableSnapshotIsolationLevel.sql" />
</ItemGroup>
</Project>