Newer
Older
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//
# -------------------------------------------------------------------------------------------
# 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
DECLARE vChecker BOOLEAN DEFAULT FALSE;
SELECT disciplines.isLocked INTO vChecker
FROM `disciplines`
WHERE disciplines.ID = pDisciplineID
LIMIT 1;
RETURN vChecker;
END //
# check, that student really take this course
DROP FUNCTION IF EXISTS InternalIsStudentAttached//
CREATE FUNCTION `InternalIsStudentAttached` (
`pStudentID` INT,
`pDisciplineID` INT,
`pSemesterID` INT
) RETURNS BOOLEAN
DECLARE vAttachType enum('attach','detach') DEFAULT NULL;
SELECT view_disciplines_students.AttachType INTO vAttachType
FROM `view_disciplines_students`
WHERE view_disciplines_students.SemesterID = pSemesterID AND
view_disciplines_students.StudentID = pStudentID AND
view_disciplines_students.DisciplineID = pDisciplineID
LIMIT 1;
RETURN ( NOT vAttachType <=> 'detach' );
DROP FUNCTION IF EXISTS InternalIsTeacherBound//
CREATE FUNCTION InternalIsTeacherBound (
`pTeacherID` INT,
`pDisciplineID` INT
) RETURNS BOOLEAN
RETURN EXISTS (
SELECT * FROM `disciplines_teachers`
WHERE disciplines_teachers.TeacherID = pTeacherID AND
disciplines_teachers.DisciplineID = pDisciplineID
LIMIT 1
);
END //
DROP FUNCTION IF EXISTS InternalIsTeacherAuthor//
CREATE FUNCTION `InternalIsTeacherAuthor` (
`pTeacherID` INT,
`pDisciplineID` INT
) RETURNS BOOLEAN
SELECT disciplines.AuthorID INTO vAuthorID
FROM `disciplines`
WHERE disciplines.ID = pDisciplineID
DROP FUNCTION IF EXISTS SetExamPeriodOption//
CREATE FUNCTION `SetExamPeriodOption` (
`pStudentID` INT,
`pSubmoduleID` INT,
) 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
CREATE FUNCTION `InternalIsMapCreated` (
`pDisciplineID` INT
) RETURNS int(11)
DECLARE vMaxRate INT DEFAULT -1;
SELECT view_disciplines_results.DisciplineRateMax INTO vMaxRate
FROM `view_disciplines_results`
WHERE view_disciplines_results.DisciplineID = pDisciplineID
LIMIT 1;
RETURN ( vMaxRate = 100 );
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
# -------------------------------------------------------------------------------------------
# set values of record with key \pKey,
# if doesn't exist, then create.
CREATE FUNCTION `SetSettings` (
`pKey` VARCHAR(50) CHARSET utf8,
`pVal` INT,
`pValS` VARCHAR(300) CHARSET utf8
) RETURNS int(11)
NO SQL
BEGIN
INSERT INTO `general_settings`
(Val, ValS, Name) VALUES (pVal, pValS, pKey)
ON DUPLICATE KEY UPDATE
general_settings.Val = pVal,
general_settings.ValS = pValS;
END//
DROP FUNCTION IF EXISTS SetBitmaskByPagename//
CREATE FUNCTION `SetBitmaskByPagename` (
`pPagename` TEXT CHARSET utf8,
`pMask` INT
) RETURNS int(11)
(Pagename, Bitmask) VALUES (pPagename, pMask)
ON DUPLICATE KEY UPDATE
page_access.Bitmask = pMask;
RETURN 0;
END //
DROP FUNCTION IF EXISTS GetBitmaskByPagename//
CREATE FUNCTION `GetBitmaskByPagename` (
`pPagename` TEXT CHARSET utf8
) RETURNS int(11)
DECLARE vBitmask INT DEFAULT 0;
SELECT page_access.Bitmask INTO vBitmask
FROM `page_access`
WHERE page_access.Pagename = pPagename
LIMIT 1;
RETURN vBitmask;
END //
# -------------------------------------------------------------------------------------------
# Label: semesters
# -------------------------------------------------------------------------------------------
# -------------------------------------------------------------------------------------------
# Label: faculties
# -------------------------------------------------------------------------------------------
`pFacultyName` TEXT CHARSET utf8,
`pFacultyAbbr` TEXT CHARSET utf8
) RETURNS INT(11) # 0 - success
NO SQL
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION RETURN -1;
INSERT INTO faculties
(Name, Abbr) VALUES(pFacultyName, pFacultyAbbr);
# -------------------------------------------------------------------------------------------
# Label: departments
# -------------------------------------------------------------------------------------------
CREATE FUNCTION CreateDepartment (
`pName` VARCHAR(200) CHARSET utf8,
) 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 //
# -------------------------------------------------------------------------------------------
# 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 //
# -------------------------------------------------------------------------------------------
# Label: subjects
# -------------------------------------------------------------------------------------------
DROP FUNCTION IF EXISTS CreateSubject//
CREATE FUNCTION `CreateSubject` (
`pFacultyID` INT,
`pSubjectAbbr` VARCHAR(20) CHARSET utf8
) RETURNS int(11)
NO SQL
BEGIN
DECLARE vSubjectID INT DEFAULT -1;
# create/get subject (subject name is unique key)
INSERT INTO `subjects`
(Name, Abbr) VALUES (pSubjectName, pSubjectAbbr)
ON DUPLICATE KEY UPDATE
subjects.ID = LAST_INSERT_ID(subjects.ID);
SET vSubjectID = LAST_INSERT_ID();
BEGIN # handler block
DECLARE EXIT HANDLER FOR SQLEXCEPTION RETURN -1;
# try to attach subject to faculty
INSERT INTO `subjects_faculties`
(SubjectID, FacultyID) VALUES (vSubjectID, pFacultyID)
subjects_faculties.ID = LAST_INSERT_ID(subjects_faculties.ID);
CREATE FUNCTION DeleteSubject (
`pSubjectID` INT
SET vChecker = EXISTS(
SELECT * FROM `disciplines`
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
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
);
CREATE FUNCTION `ActivateAccount` (
`pCode` VARCHAR(40) CHARSET utf8,
`pLogin` VARCHAR(50) CHARSET utf8,
`pEMail` VARCHAR(50) CHARSET utf8,
`pPassword` VARCHAR(255) CHARSET utf8
NO SQL
BEGIN
# check for matching with existing accounts (note: Login & E-Mail are unique)
DECLARE EXIT HANDLER FOR SQLEXCEPTION RETURN -1;
# activate account
UPDATE `accounts`
SET accounts.Login = pLogin,
accounts.Password = pPassword,
accounts.EMail = pEMail,
accounts.ActivationCode = NULL
WHERE accounts.ActivationCode = pCode AND
( @vAccountID := accounts.ID ) # save accountID
DROP FUNCTION IF EXISTS ChangeAccountData//
CREATE FUNCTION `ChangeAccountData` (
`pUserID` INT,
`pData` TEXT CHARSET utf8,
`pType` enum('login', 'email', 'password')
) RETURNS int(11) # 0 - success, <0 - failed
NO SQL
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION RETURN -1;
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 = pData
WHERE accounts.ID = pUserID
LIMIT 1;
END CASE;
END //
DROP FUNCTION IF EXISTS SignIn//
CREATE FUNCTION `SignIn` (
`pLoginOrMail` VARCHAR(255) CHARSET utf8,
NO SQL
BEGIN
DECLARE vAccountID INT DEFAULT -1;
#check account existence
FROM `accounts`
WHERE accounts.Password = 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//
CREATE FUNCTION `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//
CREATE FUNCTION `CreateTeacher` (
`pLastName` VARCHAR(30) CHARSET utf8,
`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;
# TODO: kill magic constants
# user role 2 - common teacher
# create account
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);
RETURN ROW_COUNT()-1;
END //
DROP FUNCTION IF EXISTS CreateTeacherByDepName//
CREATE FUNCTION `CreateTeacherByDepName` (
`pLastName` VARCHAR(30) CHARSET utf8,
`pFirstName` VARCHAR(30) CHARSET utf8,
`pSecondName` VARCHAR(30) CHARSET utf8,
`pDepartmentName` VARCHAR(200) CHARSET utf8,
) RETURNS int(11) # 0 - success, < 0 - failed
DECLARE vAccountID, vRoleID, vDepID INT DEFAULT -1;
DECLARE EXIT HANDLER FOR SQLEXCEPTION RETURN -1;
SET vDepID = CreateDepartment(pDepartmentName, pFacultyID);
IF vDepID < 0 THEN
RETURN -1;
RETURN CreateTeacher(pLastName, pFirstName, pSecondName, 12, vDepID, pActivationCode);
-- -1 - не сотрудник деканата и не преподаватель дисциплины
-- 0 - только чтение
-- 1 - редактирование
DROP FUNCTION IF EXISTS GetEditRightsForTeacher//
CREATE FUNCTION `GetEditRightsForTeacher` (
`pTeacherID` INT,
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;
IF vUserRole = 4 THEN # 4 - сотрудник деканата
RETURN 0;
END IF;
RETURN -1;
END //
# -------------------------------------------------------------------------------------------
# Label: students
# -------------------------------------------------------------------------------------------
# TODO: magic constants (UserRoleID)
# TODO: transaction
CREATE FUNCTION `CreateStudent` (
`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
) RETURNS int(11)
NO SQL
BEGIN
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;
# create new account
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);
# TODO: add param semester id
SELECT general_settings.Val INTO vSemesterID
FROM `general_settings`
WHERE general_settings.Name = 'SemesterID'
LIMIT 1;
RETURN ControlStudentGroup(vStudentID, vGroupID, FALSE, vSemesterID);
# unlike fn CreateStudent, this can create all missing records (group, grade, specialization)
CREATE FUNCTION `CreateStudentEx` (
`pLastName` VARCHAR(30) CHARSET utf8,
`pFirstName` VARCHAR(30) CHARSET utf8,
`pSecondName` VARCHAR(30) CHARSET utf8,
`pDegree` enum('bachelor', 'master', 'specialist'),
`pSpecName` VARCHAR(50) CHARSET utf8,
`pFacultyID` INT,
`pActivationCode` VARCHAR(40) CHARSET utf8
) 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);
# Give a student an academic leave or attach him to group.
# params:
# StudentID (int)
# GroupID (int) : is used, if OnLeave == false
# OnLeave (bool) : true - into study leave, false - attach to group
DROP FUNCTION IF EXISTS ControlStudentGroup//
`pState` BOOLEAN,
`pSemesterID` INT
) RETURNS int(11)
NO SQL
BEGIN
DECLARE vChecker INT DEFAULT 0;
DECLARE EXIT HANDLER FOR SQLEXCEPTION RETURN -1;
UPDATE `students_groups`
SET students_groups.IsStudyLeave = TRUE,
students_groups.Date = CURDATE()
WHERE students_groups.StudentID = pStudentID AND
students_groups.SemesterID = pSemesterID
INSERT INTO `students_groups`
(StudentID, GroupID, SemesterID)
VALUES(pStudentID, pGroupID, pSemesterID)
ON DUPLICATE KEY UPDATE
students_groups.GroupID = pGroupID;
END IF;
RETURN ROW_COUNT()-1;
END //
# -------------------------------------------------------------------------------------------
# Label: disciplines
# -------------------------------------------------------------------------------------------
DROP FUNCTION IF EXISTS GetDisciplineSemesterID//
CREATE FUNCTION `GetDisciplineSemesterID` (
`pDisciplineID` INT
) RETURNS int(11)
NO SQL
BEGIN
DECLARE vSemesterID INT DEFAULT -1;
SELECT disciplines.SemesterID INTO vSemesterID
FROM `disciplines`
WHERE disciplines.ID = pDisciplineID
LIMIT 1;
RETURN vSemesterID;
END //
DROP FUNCTION IF EXISTS Discipline_Create//
CREATE FUNCTION `Discipline_Create` (
`pTeacherID` INT,
`pGradeID` INT,
`pSubjectID` INT,
`pExamType` VARCHAR(30) CHARSET utf8,
`pLectureCount` INT,
`pPracticeCount` INT,
`pLabCount` INT,
`pFacultyID` INT,
`pSemesterID` INT,
`pSubtype` VARCHAR(30) CHARSET utf8 # scientific_coursework discipline_coursework
) RETURNS int(11)
NO SQL
BEGIN
DECLARE vChecker, vDisciplineID INT DEFAULT -1;
DECLARE EXIT HANDLER FOR SQLEXCEPTION RETURN -1;
(AuthorID, GradeID, SubjectID, ExamType,
LectureCount, PracticeCount,LabCount,
SemesterID, FacultyID, Subtype)
pTeacherID, pGradeID, pSubjectID, pExamType,
pLectureCount, pPracticeCount, pLabCount,
pSemesterID, pFacultyID, pSubtype
SET vChecker = BindTeacher(pTeacherID, pTeacherID, vDisciplineID);
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 //
CREATE FUNCTION `GetMilestone` (
`pFacultyID` INT,
`pSemesterID` INT
) RETURNS int(11)
NO SQL
BEGIN
DECLARE vMilestone, vCounter INT DEFAULT 0;
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 //
CREATE FUNCTION `ChangeDisciplineGrade` (
`pTeacherID` INT,
`pDisciplineID` INT,
`pGradeID` INT
DECLARE EXIT HANDLER FOR SQLEXCEPTION RETURN -1;
IF InternalIsMapLocked(pDisciplineID) OR
NOT InternalIsTeacherAuthor(pTeacherID, pDisciplineID)
THEN
RETURN -1;
END IF;
# get current grade
SELECT disciplines.GradeID INTO vCurGradeID
FROM `disciplines`
WHERE disciplines.ID = pDisciplineID
LIMIT 1;
# 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//
CREATE FUNCTION `ChangeDisciplineControl` (
`pTeacherID` INT,
`pDisciplineID` INT,
`pExamType` enum('exam', 'credit', 'grading_credit')
DECLARE vChecker, vExtraMax, vExtraID INT DEFAULT -1;
DECLARE vOldExamType enum('exam', 'credit', 'grading_credit') DEFAULT -1;
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 `disciplines`
INNER JOIN `modules` ON modules.DisciplineID = pDisciplineID AND
modules.Type = 'extra'
WHERE disciplines.ID = pDisciplineID
LIMIT 1;
IF vExtraID <= 0 THEN
RETURN -1;
END IF;
# set new exam type
UPDATE `disciplines`
SET disciplines.ExamType = pExamType
WHERE disciplines.ID = pDisciplineID
LIMIT 1;
# check type changing: exam <-> credit/grading_credit
IF vOldExamType = 'exam' XOR pExamType != 'exam' THEN
IF pExamType = 'exam' THEN # change to exam
SELECT view_disciplines_results.DisciplineRateMax INTO vChecker
FROM `view_disciplines_results`
WHERE view_disciplines_results.DisciplineID = pDisciplineID
LIMIT 1;