Newer
Older
SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
DELIMITER //
DROP FUNCTION IF EXISTS SaveSession //
DROP FUNCTION IF EXISTS DeattachAllStudents//
PavelBegunkov
committed
DROP FUNCTION IF EXISTS GetGroup//
DROP FUNCTION IF EXISTS CreateDepartment //
# -------------------------------------------------------------------------------------------
# Label: internals
# -------------------------------------------------------------------------------------------
# actually check for first scoring, in this case you cannot yet edit discipline
# "SetRate" stored procedure can change isLocked flag
DROP FUNCTION IF EXISTS InternalIsMapLocked//
CREATE FUNCTION InternalIsMapLocked (pDisciplineID INT) RETURNS BOOLEAN
READS SQL DATA
RETURN (
SELECT disciplines.IsLocked FROM disciplines
WHERE disciplines.ID = pDisciplineID LIMIT 1
) <=> TRUE//
# check, that student really take this course
DROP FUNCTION IF EXISTS InternalIsStudentAttached//
CREATE FUNCTION InternalIsStudentAttached (
pDisciplineID INT
) RETURNS BOOLEAN
READS SQL DATA
BEGIN
DECLARE vAttachType enum('attach','detach') DEFAULT NULL;
DECLARE vSemesterID, vGroupID INT DEFAULT 0;
SET vSemesterID = GetDisciplineProperty(pDisciplineID, 'semester');
SELECT disciplines_students.Type INTO vAttachType
FROM disciplines_students
WHERE disciplines_students.RecordBookID = pRecordBookID AND
disciplines_students.DisciplineID = pDisciplineID
LIMIT 1;
IF vAttachType IS NOT NULL THEN # attached or detached
RETURN (vAttachType <=> 'attach');
END IF;
SET vGroupID = GetStudentGroup(pRecordBookID, vSemesterID);
RETURN EXISTS(SELECT * FROM disciplines_groups
WHERE disciplines_groups.GroupID = vGroupID
);
END //
# check, that teacher teach this course
DROP FUNCTION IF EXISTS InternalIsTeacherBound//
CREATE FUNCTION InternalIsTeacherBound (
pTeacherID INT,
pDisciplineID INT
) RETURNS BOOLEAN
READS SQL DATA
RETURN EXISTS (
SELECT * FROM disciplines_teachers
WHERE disciplines_teachers.TeacherID = pTeacherID AND disciplines_teachers.DisciplineID = pDisciplineID
LIMIT 1
)//
DROP FUNCTION IF EXISTS InternalIsTeacherAuthor//
CREATE FUNCTION InternalIsTeacherAuthor (
pTeacherID INT,
pDisciplineID INT
) RETURNS BOOLEAN
READS SQL DATA
RETURN (
SELECT disciplines.AuthorID FROM disciplines
WHERE disciplines.ID = pDisciplineID LIMIT 1
) <=> pTeacherID //
DROP FUNCTION IF EXISTS SetExamPeriodOption//
DROP FUNCTION IF EXISTS Discipline_SetExamPeriodOption//
CREATE FUNCTION Discipline_SetExamPeriodOption (
pType enum('absence', 'pass', 'null')
DECLARE vType INT DEFAULT NULL;
DECLARE EXIT HANDLER FOR SQLEXCEPTION RETURN -1;
IF pType != 'null' THEN
SET vType = pType;
END IF;
INSERT INTO exam_period_options (RecordBookID, SubmoduleID, Type) VALUES(pRecordBookID, pSubmoduleID, vType)
exam_period_options.Type = vType;
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
END //
# check, regular + exam rate == 100
DROP FUNCTION IF EXISTS InternalIsMapCreated//
CREATE FUNCTION InternalIsMapCreated (pDisciplineID INT
) RETURNS int(11)
READS SQL DATA
RETURN (
SELECT disciplines.MaxRate FROM disciplines
WHERE disciplines.ID = pDisciplineID LIMIT 1
) <=> 100//
# ordering helper
DROP FUNCTION IF EXISTS InternalOrderModuleTypesForSession//
CREATE FUNCTION InternalOrderModuleTypesForSession (pModuleType INT) RETURNS INT(3)
DETERMINISTIC CONTAINS SQL
RETURN (CASE pModuleType
WHEN 4 THEN 1 # extra
WHEN 2 THEN 2 # exam
WHEN 3 THEN 3 # bonus
ELSE 4
END)//
# -------------------------------------------------------------------------------------------
# Label: user roles
# -------------------------------------------------------------------------------------------
-- todo: search by name
DROP FUNCTION IF EXISTS GetUserRole//
CREATE FUNCTION GetUserRole(
pType enum('student', 'teacher', 'admin', 'dean')
) RETURNS INT(11)
DETERMINISTIC CONTAINS SQL
RETURN (CASE pType
WHEN 'dean' THEN 4
WHEN 'teacher' THEN 2
WHEN 'admin' THEN 3
ELSE 1
END)//
# -------------------------------------------------------------------------------------------
# Label: grades
# -------------------------------------------------------------------------------------------
DROP FUNCTION IF EXISTS CreateGrade//
CREATE FUNCTION CreateGrade (
pGradeNum INT,
pDegree enum('bachelor', 'master', 'specialist')
) RETURNS int(11) # groupID or -1 if failed
NO SQL
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION RETURN -1;
IF pDegree IS NULL OR NOT (pDegree BETWEEN 'bachelor' AND 'specialist') THEN
RETURN -1;
END IF;
INSERT INTO grades (Num, Degree) VALUES (pGradeNum, pDegree)
ON DUPLICATE KEY UPDATE
grades.ID = LAST_INSERT_ID(grades.ID);
RETURN LAST_INSERT_ID();
END //
# -------------------------------------------------------------------------------------------
# Label: groups
# -------------------------------------------------------------------------------------------
# negative int, if already exists
DROP FUNCTION IF EXISTS CreateGroup//
CREATE FUNCTION CreateGroup (
pGradeID INT,
pGroupNum INT,
pSpecializationID INT,
PavelBegunkov
committed
pGroupName VARCHAR(50) CHARSET utf8,
pYear INT
) RETURNS int(11) # group id
NO SQL
BEGIN
PavelBegunkov
committed
DECLARE vGroupID, vFacultyID, vGroupYear, vIsSpecMatch INT DEFAULT -1;
DECLARE EXIT HANDLER FOR SQLEXCEPTION RETURN -1;
PavelBegunkov
committed
SET vFacultyID = (SELECT FacultyID FROM specializations WHERE specializations.ID = pSpecializationID LIMIT 1);
PavelBegunkov
committed
INSERT INTO study_groups (GradeID, GroupNum, FacultyID) VALUES (pGradeID, pGroupNum, vFacultyID)
ON DUPLICATE KEY UPDATE
study_groups.ID = LAST_INSERT_ID(study_groups.ID);
PavelBegunkov
committed
SET vGroupID = LAST_INSERT_ID();
SELECT groups_years.GroupID, (groups_years.SpecializationID = pSpecializationID AND
(pGroupName IS NULL OR groups_years.Name <=> pGroupName))
PavelBegunkov
committed
INTO vGroupYear, vIsSpecMatch
FROM groups_years
WHERE groups_years.GroupID = vGroupID AND groups_years.Year = pYear
LIMIT 1;
PavelBegunkov
committed
IF vGroupYear = -1 THEN
INSERT INTO groups_years (GroupID, Year, SpecializationID, Name)
VALUES (vGroupID, pYear, pSpecializationID, pGroupName);
Loading full blame...