-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathschema.sql
187 lines (154 loc) · 4.91 KB
/
schema.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
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
CREATE TABLE IF NOT EXISTS `calories` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`date` date NOT NULL,
`cals` int(11) NOT NULL,
`item` varchar(255) NOT NULL,
`uid` int(11) NOT NULL,
PRIMARY KEY (`id`)
) CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `activity` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`date` date NOT NULL,
`cals` int(11) NOT NULL,
`item` varchar(255) NOT NULL,
`uid` int(11) NOT NULL,
PRIMARY KEY (`id`)
) CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `goals` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`date` date NOT NULL,
`goal` int(11) NOT NULL,
`uid` int(11) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `uid_date` (`uid`, `date`)
) CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `weight` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`date` date NOT NULL,
`weight` float NOT NULL,
`uid` int(11) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `uid_date` (`uid`, `date`)
) CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `users` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`height` int(11) NOT NULL,
`sex` int(11) NOT NULL,
`dob` date NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `name` (`name`)
) CHARSET=utf8;
DELIMITER //
DROP FUNCTION IF EXISTS GetUserID;
CREATE FUNCTION GetUserID(_name VARCHAR(255))
RETURNS INT
BEGIN
SET @uid = NULL;
SELECT id INTO @uid FROM users WHERE name = _name;
IF @uid IS NULL THEN
SIGNAL SQLSTATE '02000' SET MESSAGE_TEXT = 'User not found.';
END IF;
RETURN @uid;
END //
DELIMITER ;
DELIMITER //
DROP PROCEDURE IF EXISTS GetUsers;
CREATE PROCEDURE GetUsers()
SQL SECURITY DEFINER
BEGIN
SELECT name, height, IF(sex, 'female', 'male') sex, dob FROM users;
END //
DELIMITER ;
DELIMITER //
DROP PROCEDURE IF EXISTS GetUser;
CREATE PROCEDURE GetUser(_user VARCHAR(255), _date DATE, _history INT UNSIGNED)
SQL SECURITY DEFINER
BEGIN
SET @uid = GetUserID(_user);
SET @date = IFNULL(_date, DATE(NOW()));
SET @history = IFNULL(_history, 0);
SET @min = DATE_SUB(@date, INTERVAL @history DAY);
SET @last_weight = NULL;
SELECT weight INTO @last_weight FROM weight
WHERE uid = @uid AND date < @date ORDER BY date DESC LIMIT 1;
SELECT height, IF(sex, 'female', 'male') sex, dob, weight,
@last_weight last_weight, goal FROM users u
JOIN goals g ON g.uid = u.id AND g.date = (
SELECT MAX(date) FROM goals WHERE date <= @date AND uid = @uid)
JOIN weight w ON w.uid = u.id AND w.date = (
SELECT MAX(date) FROM weight WHERE date <= @date AND uid = @uid)
WHERE u.id = @uid;
SELECT id, cals, item FROM calories WHERE date = @date AND uid = @uid;
SELECT id, cals, item FROM activity WHERE date = @date AND uid = @uid;
SELECT weight, date FROM weight
WHERE @min < date AND date <= @date AND uid = @uid ORDER BY DATE;
SELECT goal, date FROM goals
WHERE @min < date AND date <= @date AND uid = @uid ORDER BY DATE;
SELECT SUM(cals) cals, date FROM calories
WHERE uid = @uid AND @min < date AND date < @date AND uid = @uid
GROUP BY date ORDER BY date;
SELECT SUM(cals) cals, date FROM activity
WHERE uid = @uid AND @min < date AND date < @date AND uid = @uid
GROUP BY date ORDER BY date;
END //
DELIMITER ;
DELIMITER //
DROP PROCEDURE IF EXISTS AddCalories;
CREATE PROCEDURE AddCalories(
_user VARCHAR(255), _date DATE, _calories INT UNSIGNED,
_description VARCHAR(255))
SQL SECURITY DEFINER
BEGIN
SET @date = IFNULL(_date, DATE(NOW()));
INSERT INTO calories (date, cals, item, uid)
VALUES (@date, _calories, _description, GetUserID(_user));
END //
DELIMITER ;
DELIMITER //
DROP PROCEDURE IF EXISTS DeleteCalories;
CREATE PROCEDURE DeleteCalories(_user VARCHAR(255), _id INT UNSIGNED)
SQL SECURITY DEFINER
BEGIN
DELETE FROM calories WHERE id = _id AND uid = GetUserID(_user);
END //
DELIMITER ;
DELIMITER //
DROP PROCEDURE IF EXISTS AddActivity;
CREATE PROCEDURE AddActivity(
_user VARCHAR(255), _date DATE, _calories INT UNSIGNED,
_description VARCHAR(255))
SQL SECURITY DEFINER
BEGIN
SET @date = IFNULL(_date, DATE(NOW()));
INSERT INTO activity (date, cals, item, uid)
VALUES (@date, _calories, _description, GetUserID(_user));
END //
DELIMITER ;
DELIMITER //
DROP PROCEDURE IF EXISTS DeleteActivity;
CREATE PROCEDURE DeleteActivity(_user VARCHAR(255), _id INT UNSIGNED)
SQL SECURITY DEFINER
BEGIN
DELETE FROM activity WHERE id = _id AND uid = GetUserID(_user);
END //
DELIMITER ;
DELIMITER //
DROP PROCEDURE IF EXISTS SetWeight;
CREATE PROCEDURE SetWeight(_user VARCHAR(255), _date DATE, _weight FLOAT)
SQL SECURITY DEFINER
BEGIN
INSERT INTO weight (date, weight, uid)
VALUES (_date, _weight, GetUserID(_user))
ON DUPLICATE KEY UPDATE weight = VALUES(weight);
END //
DELIMITER ;
DELIMITER //
DROP PROCEDURE IF EXISTS SetGoal;
CREATE PROCEDURE SetGoal(_user VARCHAR(255), _date DATE, _goal INT UNSIGNED)
SQL SECURITY DEFINER
BEGIN
INSERT INTO goals (date, goal, uid) VALUES (_date, _goal, GetUserID(_user))
ON DUPLICATE KEY UPDATE goal = VALUES(goal);
END //
DELIMITER ;