-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathPL.sql
More file actions
301 lines (261 loc) · 10.5 KB
/
Copy pathPL.sql
File metadata and controls
301 lines (261 loc) · 10.5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
DELIMITER //
-- RESET DATABASE --------------------------------------------------------------------------------------------
CREATE PROCEDURE ResetGoodplays()
BEGIN
SET FOREIGN_KEY_CHECKS = 0;
-- clear data in the tables
TRUNCATE TABLE Players;
TRUNCATE TABLE Friends;
TRUNCATE TABLE PlayersFriends;
TRUNCATE TABLE Games;
TRUNCATE TABLE GamesPlayed;
-- Insert example data into the Players table--------------
INSERT INTO Players (username, email, password)
VALUES ('gamer_kid', 'gamer_kid@email.com', 'g@m3rP@55'),
('racergirl12', 'racingislife@email.com', 'r@c3c@r!'),
('tetrislover99', 'retrogames1@email.com', 'tetetet3t0ris'),
('greatsword_luvr', 'monsterhun123@email.com', 'M0n$terHunt3R'),
('musicdiv3r', 'mitchiemfan@email.com', 'm1kuinF0RTN1T3');
-- Insert example data into the Friends table--------------
INSERT INTO Friends (initiated_by, friend_added, date_added)
VALUES (1, 2, NULL),
(1, 3, '2023-04-20'),
(3, 2, NULL);
-- Insert example data into the PlayerFriends table--------------
INSERT INTO PlayersFriends (friendslist_id, player_id, friend_id, status)
VALUES (1, 1, 2, 'declined'),
(2, 1, 3, 'accepted'),
(3, 3, 2, 'pending');
-- Insert example data into the Games table--------------
INSERT INTO Games (title, genre, game_platform, release_date)
VALUES ('Minecraft', 'Fantasy', 'PC, Mobile, Linux, Mac, Xbox One, Xbox Series X/S, Playstation 4/5', '2011-11-18'),
('The Sims 4', 'Simulation', 'PC, Mac, Playstation 4, Xbox One', '2015-02-17'),
('Monster Hunter Wilds', 'Action RPG', 'PC, Playstation 5, Xbox Series X/S', '2025-02-28'),
('Metaphor: ReFantazio', 'JRPG', 'PC, Playstation 4/5, Xbox Series X/S', '2024-10-11'),
('World of Warcraft', 'Fantasy', 'PC, Mac, Android', '2004-11-23');
-- Insert example data into the GamesPlayed table--------------
INSERT INTO GamesPlayed (player_id, game_id, status, rating, date_started, date_completed, hours_played)
VALUES (1, 3, 'currently playing', 10.0, '2025-02-28', NULL, 326),
(2, 2, 'want to play', NULL, NULL, NULL, 0),
(3, 4, 'finished playing', 9.4, '2025-03-23', '2025-05-03', 100),
(1, 1, 'finished playing', 5.5, '2020-06-27', '2020-08-17', 93);
END //
-- DELETE CRUD PROCEDURES ------------------------------------------------------------------------------------
-- delete all instances of players with the given pid -------------------------
CREATE PROCEDURE DeletePlayer(IN pid INT)
BEGIN
DECLARE uname VARCHAR(25);
-- Get username associated with pid
SELECT username INTO uname
FROM `Players`
WHERE player_id = pid;
-- delete all records of attributes with given pid
DELETE FROM Players WHERE player_id = pid;
DELETE FROM PlayersFriends WHERE player_id = pid;
DELETE FROM Friends WHERE initiated_by = uname;
DELETE FROM GamesPlayed WHERE player_id = pid;
SET FOREIGN_KEY_CHECKS = 1;
END //
-- delete all instances of friends with the given fid ----------------------------
CREATE PROCEDURE DeleteFriend(IN fid INT)
BEGIN
DECLARE player INT;
DECLARE friend INT;
-- get player and friend involved from the Friends table
SELECT p1.player_id, p2.player_id
INTO player, friend
FROM Friends f
JOIN Players p1 ON f.initiated_by = p1.username
JOIN Players p2 ON f.friend_added = p2.username
WHERE f.friendslist_id = fid;
DELETE FROM Friends WHERE friendslist_id = fid;
DELETE FROM PlayersFriends
WHERE (player_id = player AND friend_id = friend) OR (player_id = friend AND friend_id = player);
SET FOREIGN_KEY_CHECKS = 1;
END //
-- delete all instances of games with the given gid -----------------------
CREATE PROCEDURE DeleteGame(IN gid INT)
BEGIN
DELETE FROM Games WHERE game_id = gid;
DELETE FROM GamesPlayed WHERE game_id = gid;
SET FOREIGN_KEY_CHECKS = 1;
END //
-- delete all instances of playersfriends with the given pfid ---------------------------
CREATE PROCEDURE DeletePlayersFriends(IN pfid INT)
BEGIN
-- delete all records associated with pfid
DELETE FROM PlayersFriends WHERE friendslist_id = pfid;
DELETE FROM Friends WHERE friendslist_id = pfid;
SET FOREIGN_KEY_CHECKS = 1;
END //
-- delete all gamesplayed with the given gpid ---------------------------
CREATE PROCEDURE DeleteGamesPlayed(IN gpid INT)
BEGIN
DELETE FROM GamesPlayed WHERE gameplayed_id = gpid;
SET FOREIGN_KEY_CHECKS = 1;
END //
-- ADD CRUD PROCEDURES ---------------------------------------------------------------------------------------
-- add new player -------------------------------------
CREATE PROCEDURE AddPlayer(
IN in_username VARCHAR(25),
IN in_email VARCHAR(75),
IN in_password VARCHAR(50)
)
BEGIN
INSERT INTO Players (username, email, password)
VALUES (in_username, in_email, in_password);
SET FOREIGN_KEY_CHECKS = 1;
END //
-- add new game ---------------------------------------
CREATE PROCEDURE AddGame(
IN in_title VARCHAR(200),
IN in_genre VARCHAR(50),
IN in_game_platform VARCHAR(255),
IN in_release_date DATE
)
BEGIN
INSERT INTO Games (title, genre, game_platform, release_date)
VALUES (in_title, in_genre, in_game_platform, in_release_date);
SET FOREIGN_KEY_CHECKS = 1;
END //
-- add new friend ---------------------------------------
CREATE PROCEDURE AddFriend(
IN in_initiated_by INT,
IN in_friend_added INT,
IN in_date_added DATE
)
BEGIN
DECLARE next_friendslist_id INT;
-- insert into friends table -------------------
IF in_date_added IS NULL THEN
INSERT INTO Friends (initiated_by, friend_added, date_added)
VALUES (in_initiated_by, in_friend_added, NULL);
ELSE
INSERT INTO Friends (initiated_by, friend_added, date_added)
VALUES (in_initiated_by, in_friend_added, in_date_added);
END IF;
SET next_friendslist_id = LAST_INSERT_ID();
-- insert into playersfriends table ---------------------
IF in_date_added IS NULL THEN
INSERT INTO PlayersFriends (friendslist_id, player_id, friend_id, status)
VALUES (next_friendslist_id, in_initiated_by, in_friend_added, 'pending');
ELSE
INSERT INTO PlayersFriends (friendslist_id, player_id, friend_id, status)
VALUES (next_friendslist_id, in_initiated_by, in_friend_added, 'accepted');
END IF;
SET FOREIGN_KEY_CHECKS = 1;
END //
-- add a new game played ------------------------------
CREATE PROCEDURE AddGamePlayed(
IN in_pid INT,
IN in_gid INT,
IN in_status VARCHAR(50),
IN in_rating DECIMAL(3,1),
IN in_date_started DATE,
IN in_date_completed DATE,
IN in_hours_played INT
)
BEGIN
IF in_status = 'want to play' THEN
INSERT INTO GamesPlayed (player_id, game_id, status, rating, date_started, date_completed, hours_played)
VALUES (in_pid, in_gid, in_status, NULL, NULL, NULL, 0);
ELSEIF in_status = 'currently playing' THEN
INSERT INTO GamesPlayed (player_id, game_id, status, rating, date_started, date_completed, hours_played)
VALUES (in_pid, in_gid, in_status, in_rating, in_date_started, NULL, in_hours_played);
ELSEIF in_status = 'finished playing' THEN
INSERT INTO GamesPlayed (player_id, game_id, status, rating, date_started, date_completed, hours_played)
VALUES (in_pid, in_gid, in_status, in_rating, in_date_started, in_date_completed, in_hours_played);
END IF;
SET FOREIGN_KEY_CHECKS = 1;
END //
-- EDIT CRUD PROCEDURES --------------------------------------------------------------------------------------
-- edit a player -----------------------
CREATE PROCEDURE EditPlayer(
IN in_pid INT,
IN in_username VARCHAR(25),
IN in_email VARCHAR(75)
)
BEGIN
UPDATE Players
SET
username = IFNULL(NULLIF(in_username, ''), username),
email = IFNULL(NULLIF(in_email, ''), email)
WHERE player_id = in_pid;
SET FOREIGN_KEY_CHECKS = 1;
END //
-- edit a players friend -------------------
CREATE PROCEDURE EditPlayersFriend(
IN in_friendslist_id INT,
IN in_status VARCHAR(50)
)
BEGIN
DECLARE current_status VARCHAR(50);
-- get the current status
SELECT status INTO current_status FROM PlayersFriends
WHERE friendslist_id = in_friendslist_id;
-- update the status
UPDATE PlayersFriends
SET status = in_status
WHERE friendslist_id = in_friendslist_id;
-- if changing from pending to accepted, update date_added on the friends table to the current date
IF current_status = 'pending' AND in_status = 'accepted' THEN
UPDATE Friends
SET date_added = CURDATE()
WHERE friendslist_id = in_friendslist_id;
-- if changing from accepted to blocked, remove date from the friends table to nothing
ELSEIF current_status = 'accepted' AND in_status = 'blocked' THEN
UPDATE Friends
SET date_added = NULL
WHERE friendslist_id = in_friendslist_id;
END IF;
SET FOREIGN_KEY_CHECKS = 1;
END //
-- edit a game ------------------------
CREATE PROCEDURE EditGame(
IN in_gid INT,
IN in_title VARCHAR(200),
IN in_genre VARCHAR(50),
IN in_game_platform VARCHAR(255),
IN in_release_date DATE
)
BEGIN
UPDATE Games
SET
title = IFNULL(NULLIF(in_title, ''), title),
genre = IFNULL(NULLIF(in_genre, ''), genre),
game_platform = IFNULL(NULLIF(in_game_platform, ''), game_platform),
release_date = IFNULL(NULLIF(in_release_date, ''), release_date)
WHERE game_id = in_gid;
SET FOREIGN_KEY_CHECKS = 1;
END //
-- edit a game played ------------------
CREATE PROCEDURE EditGamePlayed(
IN in_gpid INT,
IN in_status VARCHAR(50),
IN in_rating DECIMAL(3,1),
IN in_date_started DATE,
IN in_date_completed DATE,
IN in_hours_played INT
)
BEGIN
DECLARE current_status VARCHAR(50);
-- get the current status
SELECT status INTO current_status FROM GamesPlayed
WHERE gameplayed_id = in_gpid;
UPDATE GamesPlayed
SET
status = IFNULL(NULLIF(in_status, ''), status),
rating = IFNULL(NULLIF(in_rating, ''), rating),
date_started = IFNULL(NULLIF(in_date_started, ''), date_started),
date_completed = IFNULL(NULLIF(in_date_completed, ''), date_completed),
hours_played = IFNULL(NULLIF(in_hours_played, ''), hours_played)
WHERE gameplayed_id = in_gpid;
-- if changing from finished playing to currently playing, remove date from the friends table to nothing
IF current_status = 'finished playing' AND in_status = 'currently playing' THEN
UPDATE GamesPlayed
SET date_completed = NULL
WHERE gameplayed_id = in_gpid;
END IF;
SET FOREIGN_KEY_CHECKS = 1;
END //
DELIMITER ;