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 GetGradeID//
DROP FUNCTION IF EXISTS SetCurSemesterID//
DROP FUNCTION IF EXISTS SetHashKey//
drop function if exists InternalIsTeacherBinded//
DROP FUNCTION IF EXISTS GetSemesterID//
DROP FUNCTION IF EXISTS GetRateForDiscExtra//
DROP FUNCTION IF EXISTS GetRateForDiscBonus//
DROP FUNCTION IF EXISTS GetRateForDiscSemester//
DROP FUNCTION IF EXISTS GetRateForDiscExamNum//
DROP FUNCTION IF EXISTS GetRateForDiscExam//
DROP FUNCTION IF EXISTS InternalNotify//
DROP FUNCTION IF EXISTS GetDisciplineMaxRate//
DROP FUNCTION IF EXISTS OrderModuleTypesForSession//
DROP FUNCTION IF EXISTS CreateStudyGroup//
DROP FUNCTION IF EXISTS GetAccCountByCode//
DROP FUNCTION IF EXISTS GetAccCountByMail//
DROP FUNCTION IF EXISTS GetAccCountByLogin//
DROP FUNCTION IF EXISTS ChangePassword//
DROP FUNCTION IF EXISTS ChangeLogin//
DROP FUNCTION IF EXISTS ChangeMail//
DROP FUNCTION IF EXISTS GetRateForDisc//
drop function if exists InternalIsTeacherBounded//
DROP FUNCTION IF EXISTS SetSemesterID//
DROP FUNCTION IF EXISTS AddDiscipline//
DROP FUNCTION IF EXISTS GetMaxRateForDisc//
DROP FUNCTION IF EXISTS SetBitmaskByPagename//
DROP FUNCTION IF EXISTS GetBitmaskByPagename//
DROP FUNCTION IF EXISTS SetSettings//
DROP FUNCTION IF EXISTS UpdateRequest//
# -------------------------------------------------------------------------------------------
# Label: abbreviations
# -------------------------------------------------------------------------------------------
# abbreviation: abbr
# specialization: spec
# department: dep
# -------------------------------------------------------------------------------------------
# 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
FROM `disciplines`
WHERE disciplines.ID = pDisciplineID
LIMIT 1;
RETURN vChecker;
END //
# check, that student really take this course
DROP FUNCTION IF EXISTS InternalIsStudentAttached//
`pStudentID` INT,
`pDisciplineID` INT,
`pSemesterID` INT
) RETURNS BOOLEAN
DECLARE vAttachType enum('attach','detach') DEFAULT NULL;
SELECT disciplines_students.Type INTO vAttachType
FROM `disciplines_students`
WHERE disciplines_students.StudentID = pStudentID AND
disciplines_students.DisciplineID = pDisciplineID
IF vAttachType IS NOT NULL THEN # attached or detached
RETURN (vAttachType = 'attach');
END IF;
RETURN EXISTS(
SELECT * FROM `students_groups`
INNER JOIN `disciplines_groups` ON disciplines_groups.DisciplineID = pDisciplineID AND
disciplines_groups.GroupID = students_groups.GroupID
WHERE students_groups.StudentID = pStudentID AND
students_groups.SemesterID = pSemesterID AND
students_groups.State != 'expulsion'
DROP FUNCTION IF EXISTS InternalIsTeacherBound//
CREATE FUNCTION InternalIsTeacherBound (
`pTeacherID` INT,
`pDisciplineID` INT
) RETURNS BOOLEAN
NO SQL
RETURN EXISTS (
SELECT * FROM `disciplines_teachers`
WHERE disciplines_teachers.TeacherID = pTeacherID AND
disciplines_teachers.DisciplineID = pDisciplineID
LIMIT 1
);
END //
DROP FUNCTION IF EXISTS InternalIsTeacherAuthor//
`pTeacherID` INT,
`pDisciplineID` INT
) RETURNS BOOLEAN
NO SQL
SELECT disciplines.AuthorID INTO vAuthorID
FROM `disciplines`
WHERE disciplines.ID = pDisciplineID
DROP FUNCTION IF EXISTS SetExamPeriodOption//
`pStudentID` INT,
`pSubmoduleID` INT,
`pType` enum('absence','pass')
) RETURNS int(11)
NO SQL
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION RETURN -1;
INSERT INTO `exam_period_options`
(StudentID, SubmoduleID, Type) VALUES(pStudentID, pSubmoduleID, pType)
ON DUPLICATE KEY UPDATE
SELECT disciplines.MaxRate INTO vMaxRate
FROM disciplines
WHERE disciplines.ID = pDisciplineID
DROP FUNCTION IF EXISTS InternalOrderModuleTypesForSession//
CREATE FUNCTION `InternalOrderModuleTypesForSession` (
`pModuleType` INT
) RETURNS INT(3)
CASE pModuleType
WHEN 4 THEN SET vRes = 1; # extra
WHEN 2 THEN SET vRes = 2; # exam
WHEN 3 THEN SET vRes = 3; # bonus
# -------------------------------------------------------------------------------------------
# Label: preferences
# Label: magic
# -------------------------------------------------------------------------------------------
# -------------------------------------------------------------------------------------------
# Label: semesters
# -------------------------------------------------------------------------------------------
# -------------------------------------------------------------------------------------------
# Label: faculties
# -------------------------------------------------------------------------------------------
DROP FUNCTION IF EXISTS CreateFaculty //
`pFacultyName` TEXT CHARSET utf8,
`pFacultyAbbr` TEXT CHARSET utf8
NO SQL
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION RETURN -1;
INSERT INTO faculties
(Name, Abbr) VALUES(pFacultyName, pFacultyAbbr);
# -------------------------------------------------------------------------------------------
# Label: departments
# -------------------------------------------------------------------------------------------
DROP FUNCTION IF EXISTS Department_Create //
CREATE FUNCTION Department_Create (
`pName` VARCHAR(200) CHARSET utf8,
`pFacultyID` INT(11)
) RETURNS INT(11) # department id or -1 if failed
NO SQL
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION RETURN -1;
(Name, FacultyID) VALUES (pName, pFacultyID)
ON DUPLICATE KEY UPDATE
departments.ID = LAST_INSERT_ID(departments.ID);
RETURN LAST_INSERT_ID();
END //
DROP FUNCTION IF EXISTS Department_Search //
CREATE FUNCTION Department_Search (
`pName` VARCHAR(200) CHARSET utf8,
`pFacultyID` INT(11)
) RETURNS INT(11) # department id of -1 if not found
NO SQL
BEGIN
DECLARE vID INT DEFAULT -1;
SELECT departments.ID INTO vID
FROM departments
WHERE departments.Name = pName AND
departments.FacultyID = pFacultyID
LIMIT 1;
RETURN vID;
END //
# -------------------------------------------------------------------------------------------
# Label: specializations
# -------------------------------------------------------------------------------------------
# -------------------------------------------------------------------------------------------
# -------------------------------------------------------------------------------------------
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 vGradeID INT DEFAULT -1;
DECLARE EXIT HANDLER FOR SQLEXCEPTION RETURN -1;
INSERT INTO `grades`
(Num, Degree) VALUES (pGradeNum, pDegree)
ON DUPLICATE KEY UPDATE
grades.ID = LAST_INSERT_ID(grades.ID);
# -------------------------------------------------------------------------------------------
# -------------------------------------------------------------------------------------------
# negative int, if already exists
DROP FUNCTION IF EXISTS CreateGroup//
`pGradeID` INT,
`pGroupNum` INT,
`pSpecializationID` INT,
`pGroupName` VARCHAR(50) CHARSET utf8
) RETURNS int(11) # group id
NO SQL
BEGIN
# check GradeID, SpecID constraints and (GradeID, GroupNum, SpecID) - unique
DECLARE EXIT HANDLER FOR SQLEXCEPTION RETURN -1;
# create discipline
INSERT INTO `study_groups`
(GradeID, GroupNum, SpecializationID, Name)
VALUES (pGradeID, pGroupNum, pSpecializationID, pGroupName)
ON DUPLICATE KEY UPDATE
study_groups.ID = LAST_INSERT_ID(study_groups.ID);
RETURN LAST_INSERT_ID();
DROP FUNCTION IF EXISTS GetGroup//
CREATE FUNCTION `GetGroup` (
`pGradeID` INT,
`pGroupNum` INT,
`pFacultyID` INT
) RETURNS int(11) # groupID or -1 if failed
NO SQL
BEGIN
DECLARE vGroupID INT DEFAULT -1;
SELECT study_groups.ID INTO vGroupID
INNER JOIN `specializations` ON specializations.ID = study_groups.SpecializationID
WHERE study_groups.GradeID = pGradeID AND
study_groups.GroupNum = pGroupNum AND
specializations.FacultyID = pFacultyID
LIMIT 1;
RETURN vGroupID;
END //
DROP FUNCTION IF EXISTS GetStudentGroup//
CREATE FUNCTION `GetStudentGroup` (
`pStudentID` INT,
`pSemesterID` INT
) RETURNS int(11) # groupID or -1 if failed
NO SQL
BEGIN
DECLARE vGroupID INT DEFAULT -1;
SELECT students_groups.GroupID INTO vGroupID
FROM `students_groups`
WHERE students_groups.StudentID = pStudentID AND
students_groups.SemesterID = pSemesterID AND
students_groups.State != 'expulsion'
LIMIT 1;
RETURN vGroupID;
END //
# -------------------------------------------------------------------------------------------
# Label: subjects
# -------------------------------------------------------------------------------------------
DROP FUNCTION IF EXISTS CreateSubject//
`pFacultyID` INT,
`pSubjectName` TEXT CHARSET utf8,
`pSubjectAbbr` VARCHAR(20) CHARSET utf8
) RETURNS int(11)
NO SQL
# create/get subject (subject name is unique key)
INSERT INTO `subjects`
(Name, Abbr) VALUES (pSubjectName, pSubjectAbbr)
subjects.ID = ( @vChecker := LAST_INSERT_ID(subjects.ID));
BEGIN # handler block
DECLARE EXIT HANDLER FOR SQLEXCEPTION RETURN -1;
INSERT INTO `subjects_faculties` # try to attach subject to faculty
(SubjectID, FacultyID) VALUES (vSubjectID, pFacultyID)
subjects_faculties.ID = LAST_INSERT_ID(subjects_faculties.ID);
`pSubjectID` INT
) RETURNS INT(11) # 0 - success
NO SQL
RETURN -1; # Удаляемый предмет используется в disciplines.
END IF;
DELETE FROM `subjects_faculties`
WHERE subjects_faculties.SubjectID = pSubjectID;
WHERE subjects.ID = pSubjectID
LIMIT 1;
RETURN 0; # Успешно удалено;
END //
# -------------------------------------------------------------------------------------------
# Label: accounts
# -------------------------------------------------------------------------------------------
DROP FUNCTION IF EXISTS CheckAccountExistence//
CREATE FUNCTION `CheckAccountExistence` (
`pData` TEXT CHARSET utf8,
`pType` enum('login','email', 'code')
) RETURNS BOOLEAN # TRUE - exist, FALSE - doesn't
NO SQL
SET vRes = EXISTS(
SELECT * FROM `accounts`
WHERE CASE pType
WHEN 'login' THEN pData = accounts.Login
WHEN 'email' THEN pData = accounts.EMail
WHEN 'code' THEN pData = accounts.ActivationCode
ELSE FALSE
END
LIMIT 1
);
# return:
# -1 - unknown error.
# -2 - code doesn't exists.
# -3 - email already registered.
# -4 - login already registered.
`pCode` VARCHAR(40) CHARSET utf8,
`pLogin` VARCHAR(50) CHARSET utf8,
`pEMail` VARCHAR(50) CHARSET utf8,
`pPassword` VARCHAR(255) CHARSET utf8
) RETURNS int(11)
NO SQL
DECLARE vExistEmail, vExistLogin BOOLEAN DEFAULT FALSE;
# check for matching with existing accounts (note: Login & E-Mail are unique)
DECLARE EXIT HANDLER FOR SQLEXCEPTION RETURN -1;
SET vExistEmail = CheckAccountExistence(pEMail, 'email');
IF vExistEmail THEN
RETURN -3;
END IF;
SET vExistLogin = CheckAccountExistence(pLogin, 'login');
IF vExistLogin THEN
RETURN -4;
END IF;
# activate account
UPDATE `accounts`
SET accounts.Login = pLogin,
accounts.Password = SHA1(pPassword),
accounts.EMail = pEMail,
accounts.ActivationCode = NULL
WHERE accounts.ActivationCode = pCode AND
( @vAccountID := accounts.ID ) # save accountID
RETURN IF(ROW_COUNT() = 0, -2, @vAccountID); # 0 - account with this Code not found
DROP FUNCTION IF EXISTS ChangeAccountData//
CREATE FUNCTION `ChangeAccountData` (
`pUserID` INT,
`pData` TEXT CHARSET utf8,
`pType` enum('login', 'email', 'password')
) RETURNS int(11) # 1 - success, 0 - failed
DECLARE EXIT HANDLER FOR SQLEXCEPTION RETURN 0;
CASE pType
WHEN 'login' THEN
UPDATE `accounts`
SET accounts.Login = pData
WHERE accounts.ID = pUserID
LIMIT 1;
WHEN 'email' THEN
UPDATE `accounts`
SET accounts.EMail = pData
WHERE accounts.ID = pUserID
LIMIT 1;
WHEN 'password' THEN
UPDATE `accounts`
SET accounts.Password = SHA1(pData)
WHERE accounts.ID = pUserID
LIMIT 1;
END CASE;
END //
DROP FUNCTION IF EXISTS SignIn//
`pLoginOrMail` VARCHAR(255) CHARSET utf8,
`pPassword` VARCHAR(64) CHARSET utf8
) RETURNS int(11) # account id
NO SQL
BEGIN
DECLARE vAccountID INT DEFAULT -1;
#check account existence
WHERE accounts.Password = SHA1(pPassword) AND
(accounts.Login = pLoginOrMail OR accounts.EMail = pLoginOrMail)
LIMIT 1;
IF vAccountID <= 0 THEN
RETURN -1;
END IF;
# TODO: extract method - log sign in
INSERT INTO `logs_signin` # logging
(AccountID) VALUES (vAccountID);
RETURN vAccountID;
END //
# -------------------------------------------------------------------------------------------
# Label: teachers
# -------------------------------------------------------------------------------------------
DROP FUNCTION IF EXISTS ChangeTeacherInfo//
`pTeacherID` INT,
`pLastName` VARCHAR(30) CHARSET utf8,
`pFirstName` VARCHAR(30) CHARSET utf8,
`pSecondName` VARCHAR(30) CHARSET utf8,
`pJobPositionID` INT,
`pDepartmentID` INT
) RETURNS int(11) # -1 if teacher doesn't exists, otherwise 0
NO SQL
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION RETURN -1;
# set new info
UPDATE `teachers`
SET teachers.LastName = pLastName,
teachers.FirstName = pFirstName,
teachers.SecondName = pSecondName,
teachers.JobPositionID = pJobPositionID,
teachers.DepartmentID = pDepartmentID
WHERE teachers.ID = pTeacherID
LIMIT 1;
END //
DROP FUNCTION IF EXISTS CreateTeacher//
DROP FUNCTION IF EXISTS Teacher_Create//
CREATE FUNCTION `Teacher_Create` (
`pFirstName` VARCHAR(30) CHARSET utf8,
`pSecondName` VARCHAR(30) CHARSET utf8,
`pJobPositionID` INT,
`pDepartmentID` INT,
`pActivationCode` VARCHAR(40) CHARSET utf8
) RETURNS int(11) # 0 - success, <0 failed
NO SQL
BEGIN
DECLARE vAccountID INT DEFAULT -1;
DECLARE EXIT HANDLER FOR SQLEXCEPTION RETURN -1;
INSERT INTO `accounts`
(Login , Password , EMail, UserRoleID, ActivationCode )
VALUES ( NULL, NULL, NULL, 2, pActivationCode);
SET vAccountID = LAST_INSERT_ID();
INSERT INTO `teachers`
(AccountID, LastName, FirstName, SecondName, JobPositionID, DepartmentID)
VALUES (vAccountID, pLastName, pFirstName, pSecondName, pJobPositionID, pDepartmentID);
-- -1 - не сотрудник деканата и не преподаватель дисциплины
-- 0 - только чтение
-- 1 - редактирование
DROP FUNCTION IF EXISTS GetEditRightsForTeacher//
`pTeacherID` INT,
`pDisciplineID` INT
) RETURNS int(11)
NO SQL
DECLARE vUserRole INT DEFAULT -1;
DECLARE vIsBound BOOLEAN;
SET vIsBound = InternalIsTeacherBound(pTeacherID, pDisciplineID);
IF vIsBound > 0 THEN
RETURN 1;
END IF;
SELECT accounts.UserRoleID INTO vUserRole
FROM `teachers`
INNER JOIN `accounts` ON teachers.AccountID=accounts.ID
WHERE teachers.ID = pTeacherID
LIMIT 1;
# TODO: magic constants (4 - сотрудник деканата)
RETURN (vUserRole = 4, 0, -1);
# -------------------------------------------------------------------------------------------
# Label: students
# -------------------------------------------------------------------------------------------
`pLastName` VARCHAR(30) CHARSET utf8,
`pFirstName` VARCHAR(30) CHARSET utf8,
`pSecondName` VARCHAR(30) CHARSET utf8,
`pGradeID` INT,
`pGroupNum` INT,
`pFacultyID` INT,
`pActivationCode` VARCHAR(40) CHARSET utf8,
`pSemesterID` INT
) RETURNS int(11)
NO SQL
DECLARE vAccountID, vGroupID, vStudentID, vSemesterID INT DEFAULT -1;
DECLARE EXIT HANDLER FOR SQLEXCEPTION RETURN -1;
SET vGroupID = GetGroup(pGradeID, pGroupNum, pFacultyID);
IF vGroupID <= 0 THEN
RETURN -1;
END IF;
INSERT INTO `accounts`
(Login , Password , EMail, UserRoleID, ActivationCode )
VALUES ( NULL, NULL, NULL, 1, pActivationCode);
SET vAccountID = LAST_INSERT_ID();
# create student
INSERT INTO `students`
(AccountID, LastName, FirstName, SecondName)
VALUES (vAccountID, pLastName, pFirstName, pSecondName);
RETURN ControlStudentGroup(vStudentID, vGroupID, 'common', pSemesterID);
# unlike fn CreateStudent, this can create all missing records (group, grade, specialization)
`pLastName` VARCHAR(30) CHARSET utf8,
`pFirstName` VARCHAR(30) CHARSET utf8,
`pSecondName` VARCHAR(30) CHARSET utf8,
`pGradeNum` INT,
`pGroupNum` INT,
`pDegree` enum('bachelor', 'master', 'specialist'),
`pSpecName` VARCHAR(50) CHARSET utf8,
`pFacultyID` INT,
`pActivationCode` VARCHAR(40) CHARSET utf8,
`pSemesterID` INT
) RETURNS int(11)
NO SQL
BEGIN
DECLARE vAccountID, vGradeID, vSpecID, vGroupID INT DEFAULT -1;
DECLARE EXIT HANDLER FOR SQLEXCEPTION RETURN -1;
# get specialization id
INSERT INTO `specializations`
(Name, Abbr, FacultyID) VALUES (pSpecName, NULL, pFacultyID)
ON DUPLICATE KEY UPDATE
specializations.ID = LAST_INSERT_ID(specializations.ID);
SET vSpecID = LAST_INSERT_ID();
SET vGradeID = CreateGrade(pGradeNum, pDegree);
SET vGroupID = CreateGroup(vGradeID, pGroupNum, vSpecID, NULL);
RETURN CreateStudent(pLastName, pFirstName, pSecondName, vGradeID, pGroupNum, pFacultyID, pActivationCode, pSemesterID);
# Give a student an academic leave or attach him to group.
# params:
# StudentID (int)
# GroupID (int) : -1, to update all appropriate 'common' records
# State (enum)
# SemesterID (int)
DROP FUNCTION IF EXISTS ControlStudentGroup//
`pState` enum('common', 'outlet', 'expulsion', 'leave'),
) RETURNS int(11)
NO SQL
BEGIN
DECLARE vChecker INT DEFAULT 0;
DECLARE EXIT HANDLER FOR SQLEXCEPTION RETURN -1;
INSERT INTO `students_groups` (StudentID, GroupID, SemesterID, State)
VALUES (pStudentID, pGroupID, pSemesterID, pState)
ON DUPLICATE KEY UPDATE
students_groups.GroupID = pGroupID,
students_groups.State = pState,
students_groups.Date = CURDATE();
RETURN ROW_COUNT()-1;
END //
DROP FUNCTION IF EXISTS RemoveFromGroupInSemester//
CREATE FUNCTION `RemoveFromGroupInSemester` (
`pStudentID` INT,
`pGroupID` INT,
`pSemesterID` INT
) RETURNS int(11)
NO SQL
BEGIN
DECLARE vChecker INT DEFAULT 0;
DECLARE EXIT HANDLER FOR SQLEXCEPTION RETURN -1;
DELETE FROM `students_groups`
WHERE students_groups.GroupID = pGroupID
and students_groups.StudentID = pStudentID
and students_groups.SemesterID = pSemesterID
and students_groups.State = 'common'
LIMIT 1;
RETURN ROW_COUNT()-1;
END //
# -------------------------------------------------------------------------------------------
# Label: disciplines
# -------------------------------------------------------------------------------------------
DROP FUNCTION IF EXISTS GetDisciplineProperty//
CREATE FUNCTION `GetDisciplineProperty` (
`pDisciplineID` INT,
`pType` enum('grade', 'subject', 'author', 'semester', 'milestone', 'type')
) RETURNS int(11)
NO SQL
BEGIN
DECLARE vRes INT DEFAULT -1;
SELECT CASE pType
WHEN 'semester' THEN disciplines.SemesterID
WHEN 'author' THEN disciplines.AuthorID
WHEN 'grade' THEN disciplines.GradeID
WHEN 'subject' THEN disciplines.SubjectID
WHEN 'milestone' THEN disciplines.Milestone
WHEN 'type' THEN disciplines.ExamType + 0
END INTO vRes
FROM `disciplines`
WHERE disciplines.ID = pDisciplineID
LIMIT 1;
RETURN vRes;
END //
DROP FUNCTION IF EXISTS Discipline_Create//
CREATE FUNCTION `Discipline_Create` (
`pTeacherID` INT,
`pGradeID` INT,
`pSubjectID` INT,
`pExamType` enum('exam', 'credit', 'grading_credit'),
`pLectureCount` INT,
`pPracticeCount` INT,
`pLabCount` INT,
`pFacultyID` INT,
`pSemesterID` INT,
`pSubtype` enum('scientific_coursework', 'disciplinary_coursework')
NO SQL
BEGIN
DECLARE vChecker, vDisciplineID INT DEFAULT -1;
DECLARE EXIT HANDLER FOR SQLEXCEPTION RETURN -1;
# todo: make more flexible creation of coursework
# I mean, while creating scientific coursework
# we don't have the SubjectID field, but we must.
# 346 is used as a default id for scientific courseworks.
# This constant is duplicated in Model_Helper_CourseWorkBuilder
SET pSubjectID = 346;
END IF;
(AuthorID, GradeID, SubjectID, ExamType,
LectureCount, PracticeCount,LabCount,
SemesterID, FacultyID, Subtype)
pTeacherID, pGradeID, pSubjectID, pExamType,
pLectureCount, pPracticeCount, pLabCount,
pSemesterID, pFacultyID, pSubtype
SET vChecker = Discipline_BindTeacher(vDisciplineID, pTeacherID);
IF pExamType = 'exam' THEN
SET vChecker = AddModuleExam(pTeacherID, vDisciplineID);
END IF;
SET vChecker = AddModuleExtra(pTeacherID, vDisciplineID);
RETURN vDisciplineID;
END //
DROP FUNCTION IF EXISTS ChangeDisciplineSubject//
CREATE FUNCTION `ChangeDisciplineSubject` (
`pTeacherID` INT,
`pDisciplineID` INT,
`pSubjectID` INT
) RETURNS int(11)
NO SQL
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION RETURN -1;
IF NOT InternalIsTeacherAuthor(pTeacherID, pDisciplineID) OR
InternalIsMapLocked(pDisciplineID)
THEN
RETURN -1;
END IF;
UPDATE `disciplines`
SET disciplines.SubjectID = pSubjectID
WHERE disciplines.ID = pDisciplineID
LIMIT 1;
RETURN ROW_COUNT()-1;
END //
`pFacultyID` INT,
`pSemesterID` INT
) RETURNS int(11)
NO SQL
INTO vCounter, vMilestone
FROM `disciplines`
WHERE disciplines.SemesterID = pSemesterID AND
disciplines.FacultyID = pFacultyID
GROUP BY disciplines.Milestone
ORDER BY cnt DESC
LIMIT 1;
RETURN vMilestone;
END //
`pTeacherID` INT,
`pDisciplineID` INT,
`pGradeID` INT
) RETURNS int(11)
NO SQL
DECLARE EXIT HANDLER FOR SQLEXCEPTION RETURN -1;
IF InternalIsMapLocked(pDisciplineID) OR
NOT InternalIsTeacherAuthor(pTeacherID, pDisciplineID)
THEN
RETURN -1;
END IF;
SET vCurGradeID = GetDisciplineProperty(pDisciplineID, 'grade');
# delete all students
DELETE FROM `disciplines_groups`
WHERE disciplines_groups.DisciplineID = pDisciplineID;
DELETE FROM `disciplines_students`
WHERE disciplines_students.DisciplineID = pDisciplineID;
# set grade
UPDATE `disciplines`
SET disciplines.GradeID = pGradeID
WHERE disciplines.ID = pDisciplineID
LIMIT 1;
RETURN ROW_COUNT()-1;
END //
DROP FUNCTION IF EXISTS ChangeDisciplineControl//
`pTeacherID` INT,
`pDisciplineID` INT,
`pExamType` enum('exam', 'credit', 'grading_credit')
) RETURNS int(11)
NO SQL
DECLARE vChecker, vExtraMax, vExtraID INT DEFAULT -1;
DECLARE vOldExamType enum('exam', 'credit', 'grading_credit');
DECLARE EXIT HANDLER FOR SQLEXCEPTION RETURN -1;
IF InternalIsMapLocked(pDisciplineID) OR
NOT InternalIsTeacherAuthor(pTeacherID, pDisciplineID)
THEN
RETURN -1;
END IF;
# get exam type and extra module ID
SELECT disciplines.ExamType, modules.ID INTO vOldExamType, vExtraID
FROM `modules`
INNER JOIN `disciplines` ON disciplines.ID = modules.DisciplineID
WHERE modules.DisciplineID = pDisciplineID AND
modules.Type = 'extra'
LIMIT 1;
IF vExtraID <= 0 THEN
RETURN -1;
END IF;
# check type changing: exam <-> credit/grading_credit
IF NOT (vOldExamType = 'exam' XOR pExamType != 'exam') THEN
# TODO: extract method addExtraModule
IF pExamType = 'exam' THEN # change to exam
# count discipline's current max rate