-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtaupe.sql
135 lines (125 loc) · 4.09 KB
/
taupe.sql
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
USE TAUPEH;
SET FOREIGN_KEY_CHECKS = FALSE;
DROP TABLE IF EXISTS USER;
DROP TABLE IF EXISTS SESSION;
DROP TABLE IF EXISTS HOTEL;
DROP TABLE IF EXISTS ROOM;
DROP TABLE IF EXISTS TAKEN;
DROP TABLE IF EXISTS NOTE;
DROP TABLE IF EXISTS RATEL;
DROP FUNCTION IF EXISTS MAX_RESERVE_D2D;
SET FOREIGN_KEY_CHECKS = TRUE;
CREATE TABLE USER (
ID INT AUTO_INCREMENT NOT NULL,
LNAME VARCHAR(512) NOT NULL,
FNAME VARCHAR(512) NOT NULL,
PHONE VARCHAR(13) NOT NULL,
EMAIL VARCHAR(512) NOT NULL,
HPWD VARCHAR(128) NOT NULL,
TYPE ENUM("CLIENT", "MANAGER", "ADMIN") NOT NULL DEFAULT "CLIENT",
PERM INT NOT NULL DEFAULT 0,
CONSTRAINT prime_user PRIMARY KEY (ID),
CONSTRAINT unique_email_user UNIQUE (EMAIL)
) ENGINE = InnoDB COLLATE utf8mb4_bin;
CREATE TABLE SESSION (
ID INT AUTO_INCREMENT NOT NULL,
TOKEN VARCHAR(128) NOT NULL,
DC DATETIME NOT NULL DEFAULT NOW(),
NAME VARCHAR(512) NOT NULL,
USER INT NOT NULL,
CONSTRAINT prime_session PRIMARY KEY (ID),
CONSTRAINT user_session FOREIGN KEY (USER)
REFERENCES USER (ID) ON DELETE CASCADE
) ENGINE = InnoDB COLLATE utf8mb4_bin;
CREATE TABLE HOTEL (
ID INT AUTO_INCREMENT NOT NULL,
NAME VARCHAR(512) NOT NULL,
COUNTRY VARCHAR(512) NOT NULL,
CITY VARCHAR(512) NOT NULL,
ADDRESS VARCHAR(512) NOT NULL,
DESCR VARCHAR(2048) NOT NULL,
IMG0 VARCHAR(1024) NOT NULL,
IMG1 VARCHAR(1024),
IMG2 VARCHAR(1024),
IMG3 VARCHAR(1024),
IMG4 VARCHAR(1024),
MANAGER INT NOT NULL,
CONSTRAINT prime_hotel PRIMARY KEY (ID),
CONSTRAINT manager_hotel FOREIGN KEY (MANAGER)
REFERENCES USER (ID) ON DELETE CASCADE
) ENGINE = InnoDB COLLATE utf8mb4_bin;
CREATE TABLE ROOM (
ID INT AUTO_INCREMENT NOT NULL,
PRICE DECIMAL(10,2) NOT NULL,
NAME VARCHAR(512) NOT NULL,
DESCR VARCHAR(2048) NOT NULL,
IMG0 VARCHAR(1024) NOT NULL,
IMG1 VARCHAR(1024),
IMG2 VARCHAR(1024),
IMG3 VARCHAR(1024),
IMG4 VARCHAR(1024),
TYPE ENUM("DORMITORY", "SOLO") NOT NULL,
PLACE INT NOT NULL,
HOTEL INT NOT NULL,
DTO DATE NOT NULL,
CONSTRAINT prime_room PRIMARY KEY (ID),
CONSTRAINT hotel_room FOREIGN KEY (HOTEL)
REFERENCES HOTEL (ID) ON DELETE CASCADE,
CONSTRAINT place_room CHECK (PLACE > 0),
CONSTRAINT price_room CHECK (PRICE >= 0)
) ENGINE = InnoDB COLLATE utf8mb4_bin;
CREATE TABLE TAKEN (
DFROM DATE NOT NULL,
DTO DATE NOT NULL,
ROOM INT NOT NULL,
USER INT NOT NULL,
PLACE INT NOT NULL,
CONSTRAINT prime_taken PRIMARY KEY (DFROM, DTO, ROOM, USER),
CONSTRAINT room_taken FOREIGN KEY (ROOM)
REFERENCES ROOM (ID) ON DELETE CASCADE,
CONSTRAINT user_taken FOREIGN KEY (USER)
REFERENCES USER (ID) ON DELETE CASCADE,
CONSTRAINT place_taken CHECK (PLACE > 0)
) ENGINE = InnoDB COLLATE utf8mb4_bin;
CREATE TABLE NOTE (
NOTE INT NOT NULL,
U_ID INT NOT NULL,
R_ID INT NOT NULL,
DTO DATE NOT NULL,
DFROM DATE NOT NULL,
CONSTRAINT prime_note PRIMARY KEY (DFROM, DTO, R_ID, U_ID),
CONSTRAINT taken_note FOREIGN KEY (DFROM, DTO, R_ID, U_ID)
REFERENCES TAKEN (DFROM, DTO, ROOM, USER) ON DELETE CASCADE,
CONSTRAINT note_note CHECK (NOTE >= 0 AND NOTE <= 5 )
) ENGINE = InnoDB COLLATE utf8mb4_bin;
CREATE TABLE RATEL (
IP VARCHAR(128) NOT NULL,
DL DATETIME NOT NULL DEFAULT NOW(),
CL INT NOT NULL DEFAULT 0,
DG DATETIME NOT NULL DEFAULT NOW(),
CG INT NOT NULL DEFAULT 0,
DP DATETIME NOT NULL DEFAULT NOW(),
CP INT NOT NULL DEFAULT 0,
DM DATETIME NOT NULL DEFAULT NOW(),
CM INT NOT NULL DEFAULT 0,
CONSTRAINT prime_ratel PRIMARY KEY (IP),
CONSTRAINT count_ratel CHECK (CL >= 0
AND CG >= 0 AND CP >= 0 AND CM >= 0)
) ENGINE = InnoDB COLLATE utf8mb4_bin;
DELIMITER $$
CREATE FUNCTION MAX_RESERVE_D2D(_FROM DATE, _TO DATE, _ID INT)
RETURNS INT DETERMINISTIC
BEGIN
DECLARE MAX INT DEFAULT 0;
DECLARE CUR INT;
WHILE _FROM < _TO DO
SET CUR = (SELECT SUM(PLACE) FROM TAKEN WHERE
ROOM = _ID AND _FROM BETWEEN DFROM AND DTO
AND DATE_ADD(_FROM, INTERVAL 1 DAY) BETWEEN DFROM AND DTO);
IF CUR > MAX THEN
SET MAX = CUR;
END IF;
SET _FROM = DATE_ADD(_FROM, INTERVAL 1 DAY);
END WHILE;
RETURN MAX;
END $$