Skip to content
Snippets Groups Projects
Commit 04c1d49c authored by PavelBegunkov's avatar PavelBegunkov
Browse files

REF: comments + optimizations

parent 80063123
Branches
Tags
No related merge requests found
......@@ -16,6 +16,9 @@ DROP FUNCTION IF EXISTS InternalNotify//
DROP FUNCTION IF EXISTS GetDisciplineMaxRate//
DROP FUNCTION IF EXISTS OrderModuleTypesForSession//
DROP FUNCTION IF EXISTS CreateStudyGroup//
# -------------------------------------------------------------------------------------------
# Label: abbreviations
# -------------------------------------------------------------------------------------------
......@@ -76,7 +79,7 @@ CREATE FUNCTION `InternalIsTeacherAuthor`
NO SQL
BEGIN
RETURN EXISTS (SELECT * FROM `disciplines`
WHERE disciplines.ID = pDisciplineID AND disciplines.AuthorID = pTeacherID);
WHERE disciplines.ID = pDisciplineID AND disciplines.AuthorID = pTeacherID);
END //
......@@ -124,6 +127,7 @@ BEGIN
);
END //
# ordering helper
DROP FUNCTION IF EXISTS InternalOrderModuleTypesForSession//
CREATE FUNCTION `InternalOrderModuleTypesForSession`
(`pModuleType` INT ) RETURNS INT(3)
......@@ -149,6 +153,8 @@ NO SQL
# Label: magic
# -------------------------------------------------------------------------------------------
# set values of record with key \pKey,
# if doesn't exist, then create.
DROP FUNCTION IF EXISTS SetSettings//
CREATE FUNCTION `SetSettings`
(`pKey` VARCHAR(50) CHARSET utf8, `pVal` INT, `pValS` VARCHAR(300) CHARSET utf8
......@@ -196,6 +202,7 @@ END //
# Label: semesters
# -------------------------------------------------------------------------------------------
# set current(for user) semester, life time - db session
DROP FUNCTION IF EXISTS SetSemesterID//
CREATE FUNCTION `SetSemesterID` (`pSemesterID` INT) RETURNS int(11)
NO SQL
......@@ -211,8 +218,9 @@ END //
# Label: study groups
# -------------------------------------------------------------------------------------------
DROP FUNCTION IF EXISTS CreateStudyGroup//
CREATE FUNCTION `CreateStudyGroup`
# negative int, if already exists
DROP FUNCTION IF EXISTS CreateGroup//
CREATE FUNCTION `CreateGroup`
( `pGradeID` INT, `pGroupNum` INT,
`pSpecializationID` INT, `pGroupName` VARCHAR(50) CHARSET utf8
) RETURNS int(11)
......@@ -524,7 +532,6 @@ CREATE FUNCTION `CreateStudent`
`pFirstName` VARCHAR(30) CHARSET utf8,
`pSecondName` VARCHAR(30) CHARSET utf8,
`pGradeID` INT, `pGroupNum` INT, `pFacultyID` INT,
# TODO: delete pGradeID
`pActivationCode` VARCHAR(40) CHARSET utf8
) RETURNS int(11)
NO SQL
......@@ -557,13 +564,14 @@ BEGIN
END //
# unlike fn CreateStudent, this can create all missing records (group, grade, specialization)
DROP FUNCTION IF EXISTS CreateStudentEx//
CREATE FUNCTION `CreateStudentEx`
( `pLastName` VARCHAR(30) CHARSET utf8,
`pFirstName` VARCHAR(30) CHARSET utf8,
`pSecondName` VARCHAR(30) CHARSET utf8,
`pGradeNum` INT, `pGroupNum` INT,
`pGradeNum` INT,
`pGroupNum` INT,
`pDegree` VARCHAR(20) CHARSET utf8,
`pSpecName` VARCHAR(50) CHARSET utf8,
`pFacultyID` INT,
......@@ -656,16 +664,19 @@ BEGIN
DECLARE vChecker, vDisciplineID INT DEFAULT -1;
DECLARE EXIT HANDLER FOR SQLEXCEPTION RETURN -1;
# create discipline
INSERT INTO `disciplines`
(AuthorID, GradeID, SubjectID, ExamType, LectureCount, PracticeCount,LabCount, SemesterID,FacultyID)
VALUES ( pTeacherID, pGradeID, pSubjectID, pExamType, pLectureCount, pPracticeCount, pLabCount,
@CurrentSemesterID, pFacultyID);
SET vDisciplineID = LAST_INSERT_ID();
# bind teacher(author)
INSERT INTO `disciplines_teachers`
(DisciplineID,TeacherID)
VALUES (vDisciplineID, pTeacherID);
# add exam and extra modules
IF pExamType = 'exam' THEN
SET vChecker = AddModuleExam(pTeacherID, vDisciplineID);
END IF;
......@@ -763,36 +774,41 @@ BEGIN
IF vExtraID <= 0 THEN
RETURN -1;
END IF;
# check changed change exam type
# check that exam type really changed
IF (vOldExamType = pExamType) THEN
RETURN 0;
END IF;
IF pExamType = 'exam' THEN
IF pExamType = 'exam' THEN # change to exam
SET vExtraMax = 7;
# count discipline's current max rate
SELECT view_disciplines_results.DisciplineRateMax INTO vChecker
FROM `view_disciplines_results`
WHERE view_disciplines_results.DisciplineID = pDisciplineID
LIMIT 1;
# can't add exam module
IF vChecker >= 61 THEN
RETURN 1;
END IF;
SET vChecker = AddModuleExam(pTeacherID, pDisciplineID);
# delete extra submodules
# delete extra submodules(only 1 extra for exam)
DELETE FROM `submodules`
WHERE submodules.OrderNum > 1 AND submodules.ModuleID = vExtraID;
ELSE
ELSE # change to credit
SET vExtraMax = 29;
SET vChecker = DeleteModuleExam(pTeacherID, pDisciplineID);
# 2 extra submodules (1 created for exam)
SET vChecker = AddSubmodule(pTeacherID, vExtraID, vExtraMax, '', NULL, 'LandmarkControl');
END IF;
# set new exam type
UPDATE `disciplines`
SET disciplines.ExamType = pExamType
WHERE disciplines.ID = pDisciplineID
LIMIT 1;
# set max rate for extra
UPDATE `submodules`
SET submodules.MaxRate = vExtraMax
WHERE submodules.ModuleID = vExtraID;
......@@ -842,15 +858,14 @@ BEGIN
DECLARE vChecker INT DEFAULT -1;
DECLARE EXIT HANDLER FOR SQLEXCEPTION RETURN -1;
# 1. check if AccessedTeacher is author
# 1. check if AccessedTeacher is author
IF NOT InternalIsTeacherAuthor(pTeacherID, pDisciplineID) OR
InternalIsMapLocked(pDisciplineID)
THEN
RETURN -1;
END IF;
# 2. check if study group is bound to discipline
# TODO: extract method
# 2. check if group is bound to discipline
SELECT disciplines_groups.ID INTO vChecker
FROM `disciplines_groups`
WHERE disciplines_groups.GroupID = pGroupID AND
......@@ -860,7 +875,7 @@ BEGIN
RETURN 1;
END IF;
# 3. delete students of this group which were bound to discipline before
# 3. delete students of this group which were bound to discipline before
DELETE FROM `disciplines_students`
WHERE disciplines_students.DisciplineID = pDisciplineID AND
disciplines_students.StudentID IN
......@@ -869,7 +884,7 @@ BEGIN
WHERE students.GroupID = pGroupID
);
# 4. bind whole group
# 4. bind whole group
INSERT INTO `disciplines_groups`
(DisciplineID, GroupID)
VALUES (pDisciplineID, pGroupID );
......@@ -887,12 +902,12 @@ BEGIN
DECLARE vInGroup, vChecker, vGroupID, vTemp INT DEFAULT -1;
DECLARE EXIT HANDLER FOR SQLEXCEPTION RETURN -1;
# 1. check if AccessedTeacher is author
# 1. check if AccessedTeacher is author
IF NOT InternalIsTeacherAuthor(pTeacherID, pDisciplineID) THEN
RETURN -1;
END IF;
# 2. check if student's group is bound yet
# 2. check if student's group is bound yet
SELECT disciplines_groups.ID INTO vInGroup
FROM `students`
INNER JOIN `disciplines_groups` ON disciplines_groups.DisciplineID = pDisciplineID AND
......@@ -910,7 +925,7 @@ BEGIN
END IF;
# 3. try bind student
# 3. try bind student
INSERT INTO `disciplines_students`
(DisciplineID, StudentID, Type)
VALUES (pDisciplineID, pStudentID, 'attach')
......@@ -918,7 +933,6 @@ BEGIN
ON DUPLICATE KEY UPDATE
disciplines_students.StudentID = disciplines_students.StudentID;
RETURN 0;
END //
......@@ -933,6 +947,7 @@ BEGIN
RETURN -1;
END IF;
# detach group from the discipline
DELETE FROM `disciplines_groups`
WHERE disciplines_groups.DisciplineID = pDisciplineID AND
disciplines_groups.GroupID = pGroupID
......@@ -962,6 +977,7 @@ BEGIN
RETURN -1;
END IF;
# try to get general group, if student in it.
SELECT disciplines_groups.ID INTO vInGroup
FROM `students`
INNER JOIN `disciplines_groups` ON disciplines_groups.DisciplineID = pDisciplineID AND
......@@ -969,7 +985,7 @@ BEGIN
WHERE students.ID = pStudentID
LIMIT 1;
IF vInGroup > 0 THEN
IF vInGroup > 0 THEN # student in general group
INSERT INTO `disciplines_students`
(DisciplineID, StudentID, Type)
VALUES (pDisciplineID, pStudentID, 'detach');
......@@ -990,6 +1006,7 @@ CREATE FUNCTION `BindTeacher`
) RETURNS int(11)
NO SQL
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION RETURN -1;
IF NOT InternalIsTeacherAuthor(pTeacherID, pDisciplineID) THEN
RETURN -1;
END IF;
......@@ -1024,7 +1041,7 @@ BEGIN
END //
# assign new author to discipline
DROP FUNCTION IF EXISTS DelegateDiscipline//
CREATE FUNCTION `DelegateDiscipline`
( `pAuthorID` INT, `pNewAuthorID` INT, `pDisciplineID` INT
......@@ -1059,18 +1076,21 @@ BEGIN
RETURN -1;
END IF;
# clear logs
DELETE FROM `logs_rating`
WHERE logs_rating.SubModuleID IN
(SELECT view_roadmap.SubmoduleID
FROM `view_roadmap`
WHERE view_roadmap.DisciplineID = pDisciplineID);
# clear rating
DELETE FROM `rating_table`
WHERE rating_table.SubModuleID IN
(SELECT view_roadmap.SubmoduleID
FROM `view_roadmap`
WHERE view_roadmap.DisciplineID = pDisciplineID);
# unlock discipline
UPDATE `disciplines`
SET disciplines.IsLocked = 0
WHERE disciplines.ID = pDisciplineID
......@@ -1100,33 +1120,31 @@ BEGIN
RETURN -1;
END IF;
# delete only if discipline cleared(doesn't exists related rating's records)
SET vTemp = CountRatings(pAuthorID, pDisciplineID);
IF vTemp > 0 THEN
RETURN -1;
END IF;
# TODO: ClearDiscipline if need
# delete roadmap
DELETE FROM `submodules`
WHERE submodules.ModuleID IN
(SELECT modules.ID
FROM `modules`
WHERE modules.DisciplineID = pDisciplineID
);
DELETE FROM `modules`
WHERE modules.DisciplineID = pDisciplineID;
# detach all entities from discipline
DELETE FROM `disciplines_teachers`
WHERE disciplines_teachers.DisciplineID = pDisciplineID;
DELETE FROM `disciplines_students`
WHERE disciplines_students.DisciplineID = pDisciplineID;
DELETE FROM `disciplines_groups`
WHERE disciplines_groups.DisciplineID = pDisciplineID;
# delete discipline
DELETE FROM `disciplines`
WHERE disciplines.ID = pDisciplineID
LIMIT 1;
......@@ -1135,7 +1153,7 @@ BEGIN
END //
# get count of related with discipline records in rating_table
DROP FUNCTION IF EXISTS CountRatings//
CREATE FUNCTION `CountRatings`
( `pTeacherID` INT, `pDisciplineID` INT
......@@ -1204,25 +1222,11 @@ CREATE FUNCTION `ChangeModuleName`
) RETURNS int(11)
NO SQL
BEGIN
DECLARE vDisciplineID INT DEFAULT -1;
DECLARE EXIT HANDLER FOR SQLEXCEPTION RETURN -1;
SELECT disciplines.ID INTO vDisciplineID
FROM `modules`
INNER JOIN `disciplines` ON disciplines.ID = modules.DisciplineID AND
disciplines.AuthorID = pTeacherID
WHERE modules.ID = pModuleID AND
modules.Type = 'regular'
LIMIT 1;
IF vDisciplineID <= 0 OR
InternalIsMapLocked(vDisciplineID)
THEN
RETURN -1;
END IF;
UPDATE `modules`
SET modules.Name = pName
WHERE modules.ID = pModuleID
WHERE modules.ID = pModuleID AND
modules.Type = 'regular' AND
NOT InternalIsMapLocked(modules.DisciplineID)
LIMIT 1;
RETURN ROW_COUNT()-1;
END //
......@@ -1236,7 +1240,7 @@ CREATE FUNCTION `AddModule`
) RETURNS int(11)
NO SQL
BEGIN
DECLARE vChecker INT DEFAULT 0;
DECLARE vOrderNum INT DEFAULT 0;
DECLARE EXIT HANDLER FOR SQLEXCEPTION RETURN -1;
IF NOT InternalIsTeacherAuthor(pTeacherID, pDisciplineID) OR
......@@ -1245,14 +1249,15 @@ BEGIN
RETURN -1;
END IF;
SELECT MAX(modules.OrderNum)+1 INTO vChecker
# get free orderNum
SELECT MAX(modules.OrderNum)+1 INTO vOrderNum
FROM `modules`
WHERE modules.DisciplineID = pDisciplineID AND modules.Type = 'regular'
LIMIT 1;
INSERT INTO `modules`
(Name, OrderNum, DisciplineID )
VALUES (pName, vChecker, pDisciplineID);
VALUES (pName, vOrderNum, pDisciplineID);
RETURN LAST_INSERT_ID();
END //
......@@ -1271,6 +1276,7 @@ BEGIN
RETURN -1;
END IF;
# check exam module existence
SELECT modules.ID
INTO vChecker
FROM `modules`
......@@ -1282,9 +1288,10 @@ BEGIN
INSERT INTO `modules`
(Name, OrderNum, DisciplineID, Type)
VALUES ('Экзамен' , 3141692 , pDisciplineID, 'exam');
VALUES ('Экзамен' , 3141592 , pDisciplineID, 'exam');
SET vModule = LAST_INSERT_ID();
# 3 attempt for pass exam
SET vChecker = AddSubmodule(pTeacherID, vModule, 40, '', NULL, 'LandmarkControl');
SET vChecker = AddSubmodule(pTeacherID, vModule, 40, '', NULL, 'LandmarkControl');
SET vChecker = AddSubmodule(pTeacherID, vModule, 40, '', NULL, 'LandmarkControl');
......@@ -1299,11 +1306,13 @@ CREATE FUNCTION `AddModuleExtra`
NO SQL
BEGIN
DECLARE vChecker, vModule, vType, vGap INT DEFAULT -1;
DECLARE EXIT HANDLER FOR SQLEXCEPTION RETURN -1;
IF NOT InternalIsTeacherAuthor(pTeacherID, pDisciplineID)
THEN
RETURN -1;
END IF;
# try to find existing extra module
SELECT modules.ID INTO vChecker
FROM `modules`
WHERE modules.DisciplineID = pDisciplineID AND modules.Type = 'extra'
......@@ -1312,11 +1321,13 @@ BEGIN
RETURN -2;
END IF;
# add extra module
INSERT INTO `modules`
(Name, OrderNum, DisciplineID, Type)
VALUES ('Добор баллов' , 2900666 , pDisciplineID, 'extra');
# get discipline exam type
SELECT modules.ID, disciplines.ExamType
INTO vModule, vType
FROM `modules`
......@@ -1328,13 +1339,12 @@ BEGIN
RETURN -1;
END IF;
# 1 extra attempt for exam and 2 for credit
SET vGap = -1;
IF vType = 1 THEN
# exam
IF vType = 1 THEN # exam
SET vGap = 7;
END IF;
IF vType = 2 THEN
# credit
IF vType = 2 THEN # credit
SET vGap = 29;
SET vChecker = AddSubmodule(pTeacherID, vModule, vGap, '', NULL, 'LandmarkControl');
END IF;
......@@ -1350,35 +1360,33 @@ CREATE FUNCTION `DeleteModule`
) RETURNS int(11)
NO SQL
BEGIN
DECLARE vChecker INT DEFAULT -1;
DECLARE vDisciplineID INT DEFAULT -1;
SELECT disciplines.ID
INTO vChecker
# get discipline ID
SELECT disciplines.ID INTO vDisciplineID
FROM `modules`
INNER JOIN `disciplines` ON modules.DisciplineID = disciplines.ID AND
disciplines.AuthorID = pTeacherID
WHERE modules.ID = pModuleID
LIMIT 1;
IF vChecker <= 0 THEN
RETURN -1;
END IF;
IF NOT InternalIsTeacherAuthor(pTeacherID, vChecker) OR
InternalIsMapLocked(vChecker)
# check rights
IF NOT InternalIsTeacherAuthor(pTeacherID, vDisciplineID) OR
InternalIsMapLocked(vDisciplineID)
THEN
RETURN -1;
END IF;
DELETE FROM `submodules`
WHERE submodules.ModuleID = pModuleID;
DELETE FROM `modules`
WHERE modules.ID = pModuleID;
# restore continuous ordering
SET @counter = 0;
UPDATE `modules`
SET modules.OrderNum = (@counter := @counter + 1)
WHERE modules.DisciplineID = vChecker AND
WHERE modules.DisciplineID = vDisciplineID AND
modules.Type = 'regular'
ORDER BY modules.OrderNum ASC;
......@@ -1400,8 +1408,8 @@ BEGIN
RETURN -1;
END IF;
SELECT modules.ID
INTO vExamModuleID
# get exam module ID
SELECT modules.ID INTO vExamModuleID
FROM `modules`
WHERE modules.Type = 'exam' AND
modules.DisciplineID = pDisciplineID
......@@ -1412,7 +1420,6 @@ BEGIN
DELETE FROM `submodules`
WHERE vExamModuleID = submodules.ModuleID;
DELETE FROM `modules`
WHERE vExamModuleID = modules.ID
LIMIT 1;
......@@ -1431,6 +1438,7 @@ BEGIN
DECLARE vChecker, vOrder1, vOrder2,
vDisciplineID1, vDisciplineID2 INT DEFAULT -1;
# get disciplineID and orderNum for 1st module(pModuleID1)
SELECT modules.OrderNum,
modules.DisciplineID
INTO vOrder1, vDisciplineID1
......@@ -1441,6 +1449,7 @@ BEGIN
modules.Type = 'regular'
LIMIT 1;
# get disciplineID and orderNum for 2st module(pModuleID2)
SELECT modules.OrderNum,
modules.DisciplineID
INTO vOrder2, vDisciplineID2
......@@ -1450,20 +1459,21 @@ BEGIN
modules.ID = pModuleID2 AND
modules.Type = 'regular'
LIMIT 1;
# check that modules belong to one discipline, check rights
IF vDisciplineID1 != vDisciplineID2 OR vDisciplineID1 <= 0 OR
InternalIsMapLocked(vDisciplineID1) THEN
RETURN -1;
END IF;
# swap
UPDATE `modules`
SET modules.OrderNum = 271828
WHERE modules.ID = pModuleID1;
UPDATE `modules`
SET modules.OrderNum = vOrder1
WHERE modules.ID = pModuleID2
LIMIT 1;
UPDATE `modules`
SET modules.OrderNum = vOrder2
WHERE modules.ID = pModuleID1
......@@ -1487,8 +1497,8 @@ BEGIN
RETURN -1;
END IF;
SELECT modules.ID
INTO vChecker
# check existing of bonus module
SELECT modules.ID INTO vChecker
FROM `modules`
WHERE modules.DisciplineID = pDisciplineID AND
modules.Type = 'bonus';
......@@ -1496,21 +1506,11 @@ BEGIN
RETURN -2;
END IF;
INSERT INTO `modules`
(Name, OrderNum, DisciplineID, Type)
VALUES ('Бонусные баллы' , 2141692 , pDisciplineID, 3 );
SELECT modules.ID
INTO vModuleID
FROM `modules`
WHERE modules.DisciplineID = pDisciplineID AND
modules.Type = 'bonus'
LIMIT 1;
IF vModuleID <= 0 THEN
RETURN -1;
END IF;
VALUES ('Бонусные баллы' , 2141692 , pDisciplineID, 'bonus');
SET vModuleID = LAST_INSERT_ID();
SET vChecker = AddSubmodule(pTeacherID, vModuleID, 10, '', NULL, 'LandmarkControl');
RETURN 0;
END //
......@@ -1529,12 +1529,12 @@ BEGIN
RETURN -1;
END IF;
SELECT modules.ID
INTO vBonusModuleID
FROM `modules`
WHERE modules.Type = 'bonus' AND
modules.DisciplineID = pDisciplineID
LIMIT 1;
# get bonus module ID
SELECT modules.ID INTO vBonusModuleID
FROM `modules`
WHERE modules.Type = 'bonus' AND
modules.DisciplineID = pDisciplineID
LIMIT 1;
IF vBonusModuleID <= 0 THEN
RETURN -1;
END IF;
......@@ -1556,108 +1556,94 @@ END //
# -------------------------------------------------------------------------------------------
DROP FUNCTION IF EXISTS ChangeSubmoduleMaxAndControl//
CREATE FUNCTION `ChangeSubmoduleMaxAndControl` ( `TeacherID` INT,
`SubmoduleID` INT,
`MaxRate` INT,
`ControlType` VARCHAR(30) CHARSET utf8
) RETURNS int(11)
CREATE FUNCTION `ChangeSubmoduleMaxAndControl`
( `pTeacherID` INT,
`pSubmoduleID` INT,
`pMaxRate` INT,
`pControlType` VARCHAR(30) CHARSET utf8
) RETURNS int(11)
NO SQL
BEGIN
DECLARE vChecker, disciplineID INT;
DECLARE vChecker, vDisciplineID, vIsLocked INT DEFAULT -1;
SET vChecker = -1;
SET disciplineID = -1;
SELECT submodules.ID,
disciplines.ID
INTO vChecker, disciplineID
FROM `submodules`
INNER JOIN `modules` ON submodules.ModuleID = modules.ID
INNER JOIN `disciplines` ON disciplines.ID = modules.DisciplineID
WHERE TeacherID = disciplines.AuthorID AND
SubmoduleID = submodules.ID
LIMIT 1;
IF vChecker <= 0 OR
disciplineID <= 0 OR
InternalIsMapLocked(disciplineID) THEN
# check that discipline and submodule exists and doesn't locked
SELECT disciplines.IsLocked INTO vIsLocked
FROM `submodules`
INNER JOIN `modules` ON submodules.ModuleID = modules.ID
INNER JOIN `disciplines` ON disciplines.ID = modules.DisciplineID
WHERE disciplines.AuthorID = pTeacherID AND
submodules.ID = pSubmoduleID
LIMIT 1;
IF vIsLocked != 0 THEN
RETURN -1;
END IF;
UPDATE `submodules`
SET submodules.MaxRate = MaxRate,
submodules.Type = ControlType
WHERE submodules.ID = SubmoduleID
LIMIT 1;
SET submodules.MaxRate = MaxRate,
submodules.Type = pControlType
WHERE submodules.ID = pSubmoduleID
LIMIT 1;
RETURN 0;
END //
DROP FUNCTION IF EXISTS ChangeSubmoduleName//
CREATE FUNCTION `ChangeSubmoduleName` ( `TeacherID` INT,
`SubmoduleID` INT,
`Name` VARCHAR(200) CHARSET utf8
) RETURNS int(11)
CREATE FUNCTION `ChangeSubmoduleName`
( `pTeacherID` INT,
`pSubmoduleID` INT,
`pName` VARCHAR(200) CHARSET utf8
) RETURNS int(11)
NO SQL
BEGIN
DECLARE vChecker, disciplineID INT;
DECLARE vIsLocked INT DEFAULT -1;
SET disciplineID = -1;
SET vChecker = -1;
SELECT submodules.ID,
disciplines.ID
INTO vChecker, disciplineID
FROM `submodules`
INNER JOIN `modules` ON submodules.ModuleID = modules.ID
INNER JOIN `disciplines` ON disciplines.ID = modules.DisciplineID
WHERE TeacherID = disciplines.AuthorID AND
SubmoduleID = submodules.ID
LIMIT 1;
IF vChecker <= 0 OR
disciplineID <= 0 OR
InternalIsMapLocked(disciplineID) THEN
SELECT disciplines.IsLocked INTO vIsLocked
FROM `submodules`
INNER JOIN `modules` ON submodules.ModuleID = modules.ID
INNER JOIN `disciplines` ON disciplines.ID = modules.DisciplineID
WHERE disciplines.AuthorID = pTeacherID AND
submodules.ID = pSubmoduleID
LIMIT 1;
IF vIsLocked != 0 THEN
RETURN -1;
END IF;
UPDATE `submodules`
SET submodules.Name = Name
WHERE submodules.ID = SubmoduleID
LIMIT 1;
SET submodules.Name = pName
WHERE submodules.ID = pSubmoduleID
LIMIT 1;
RETURN 0;
END //
DROP FUNCTION IF EXISTS ChangeSubmoduleDescription//
CREATE FUNCTION `ChangeSubmoduleDescription` ( `TeacherID` INT,
`SubmoduleID` INT,
`Description` VARCHAR(200) CHARSET utf8
) RETURNS int(11)
CREATE FUNCTION `ChangeSubmoduleDescription`
( `pTeacherID` INT,
`pSubmoduleID` INT,
`pDescription` VARCHAR(200) CHARSET utf8
) RETURNS int(11)
NO SQL
BEGIN
DECLARE vChecker, disciplineID INT;
DECLARE vIsLocked INT DEFAULT -1;
SET vChecker = -1;
SET disciplineID = -1;
SELECT submodules.ID,
disciplines.ID
INTO vChecker, disciplineID
FROM `submodules`
INNER JOIN `modules` ON submodules.ModuleID = modules.ID
INNER JOIN `disciplines` ON disciplines.ID = modules.DisciplineID
WHERE TeacherID = disciplines.AuthorID AND
SubmoduleID = submodules.ID
LIMIT 1;
IF vChecker <= 0 OR
disciplineID <= 0 OR
InternalIsMapLocked(disciplineID) THEN
SELECT disciplines.IsLocked INTO vIsLocked
FROM `submodules`
INNER JOIN `modules` ON submodules.ModuleID = modules.ID
INNER JOIN `disciplines` ON disciplines.ID = modules.DisciplineID
WHERE disciplines.AuthorID = pTeacherID AND
submodules.ID = pSubmoduleID
LIMIT 1;
IF vIsLocked != 0 THEN
RETURN -1;
END IF;
UPDATE `submodules`
SET submodules.Description = Description
WHERE submodules.ID = SubmoduleID
LIMIT 1;
SET submodules.Description = pDescription
WHERE submodules.ID = pSubmoduleID
LIMIT 1;
RETURN 0;
END //
......@@ -1670,37 +1656,27 @@ CREATE FUNCTION `DeleteSubmodule`
) RETURNS int(11)
NO SQL
BEGIN
DECLARE vChecker, vModuleID, vDisciplineID INT DEFAULT -1;
DECLARE vIsLocked, vModuleID INT DEFAULT -1;
DECLARE EXIT HANDLER FOR SQLEXCEPTION RETURN -1;
SELECT submodules.ID, modules.ID, disciplines.ID
INTO vChecker, vModuleID, vDisciplineID
SELECT modules.ID, disciplines.IsLocked
INTO vModuleID, vIsLocked
FROM `submodules`
INNER JOIN `modules` ON modules.ID = submodules.ModuleID
INNER JOIN `disciplines` ON modules.DisciplineID = disciplines.ID
WHERE disciplines.AuthorID = pTeacherID AND
submodules.ID = pSubmoduleID
LIMIT 1;
IF vChecker <= 0 OR
vDisciplineID <= 0 OR
InternalIsMapLocked(vDisciplineID) THEN
IF vIsLocked != 0 THEN
RETURN -1;
END IF;
SET vChecker = -1;
SELECT rating_table.StudentID
INTO vChecker
FROM `rating_table`
WHERE rating_table.SubmoduleID = pSubmoduleID
LIMIT 1;
IF vChecker > 0 THEN
RETURN -2;
END IF;
# handler will catch constraint violation
DELETE FROM `submodules`
WHERE submodules.ID = pSubmoduleID
LIMIT 1;
# restore continuous ordering
SET @counter = 0;
UPDATE `submodules`
SET submodules.OrderNum = (@counter := @counter + 1)
......@@ -1721,49 +1697,39 @@ CREATE FUNCTION `AddSubmodule`
) RETURNS int(11)
NO SQL
BEGIN
DECLARE vChecker INT DEFAULT -1;
DECLARE vOrderNum, vIsLocked INT DEFAULT -1;
DECLARE vDescription VARCHAR(200) CHARSET utf8 DEFAULT pDescription;
DECLARE EXIT HANDLER FOR SQLEXCEPTION RETURN -1;
SELECT disciplines.ID
INTO vChecker
# check author and discipline lock
SELECT disciplines.IsLocked INTO vIsLocked
FROM `modules`
INNER JOIN `disciplines` ON disciplines.ID = modules.DisciplineID
INNER JOIN `disciplines` ON disciplines.ID = modules.DisciplineID
WHERE disciplines.AuthorID = pTeacherID AND
modules.ID = pModuleID
LIMIT 1;
IF vChecker <= 0 OR
InternalIsMapLocked(vChecker)
THEN
IF vIsLocked != 0 THEN
RETURN -1;
END IF;
SET vChecker = 0;
SELECT MAX(submodules.OrderNum)
INTO vChecker
# get free order
SET vOrderNum = 0;
SELECT MAX(submodules.OrderNum) INTO vOrderNum
FROM `submodules`
WHERE submodules.ModuleID = pModuleID
LIMIT 1;
IF vChecker IS NULL THEN
SET vChecker = 0;
END IF;
SET vChecker = vChecker + 1;
SET vOrderNum = vOrderNum + 1;
IF pDescription = '' THEN
INSERT INTO `submodules`
(ModuleID, MaxRate, OrderNum, Name, Description, Type)
VALUES (pModuleID, pMaxRate, vChecker, pName, NULL, pControlType);
ELSE
INSERT INTO `submodules`
(ModuleID, MaxRate, OrderNum, Name, Description, Type )
VALUES (pModuleID, pMaxRate, vChecker, pName, pDescription, pControlType);
# insert submodule
IF vDescription = '' THEN
SET vDescription = NULL;
END IF;
INSERT INTO `submodules`
(ModuleID, MaxRate, OrderNum, Name, Description, Type)
VALUES (pModuleID, pMaxRate, vOrderNum, pName, vDescription, pControlType);
RETURN (SELECT submodules.ID
FROM `submodules`
WHERE submodules.ModuleID = pModuleID AND
submodules.OrderNum = vChecker
LIMIT 1
);
RETURN LAST_INSERT_ID();
END //
......@@ -1785,7 +1751,7 @@ BEGIN
INNER JOIN `disciplines` ON disciplines.ID = modules.DisciplineID
WHERE disciplines.AuthorID = pTeacherID AND
submodules.ID = pSubmoduleID1
LIMIT 1;
LIMIT 1;
SELECT submodules.OrderNum,
submodules.ModuleID
......@@ -1797,12 +1763,14 @@ BEGIN
submodules.ID = pSubmoduleID2
LIMIT 1;
# check, that modules exists and belong to one discipline
IF vModule1 <= 0 OR vModule1 != vModule2 OR
InternalIsMapLocked(vDisciplineID)
THEN
RETURN -1;
END IF;
# swap
UPDATE `submodules`
SET submodules.OrderNum = 271828
WHERE submodules.ID = pSubmoduleID1
......@@ -1872,99 +1840,76 @@ END //
DROP FUNCTION IF EXISTS SetStudentRate//
CREATE FUNCTION `SetStudentRate`
( `pTeacherID` INT, `pStudentID` INT,
`pSubmoduleID` INT, `pRate` INT ) RETURNS int(11)
( `pTeacherID` INT,
`pStudentID` INT,
`pSubmoduleID` INT,
`pRate` INT
) RETURNS int(11)
NO SQL
BEGIN
DECLARE vChecker, vDisciplineID, vGroupID, vRateID, vMaxRate, vMtype INT DEFAULT -1;
DECLARE vIsOver, vIsLocked, vIsUsed tinyint DEFAULT 0;
SELECT students.GroupID
INTO vGroupID
FROM `students`
WHERE students.ID = pStudentID
LIMIT 1;
IF vGroupID <= 0 THEN
RETURN -1;
END IF;
SET vMaxRate = CalculateMaxRateForExtra(pSubmoduleID, pStudentID);
DECLARE vDisciplineID, vMaxRate, vModuleType INT DEFAULT -1;
DECLARE vIsOver, vIsLocked, vIsUsed BOOLEAN DEFAULT FALSE;
DECLARE EXIT HANDLER FOR SQLEXCEPTION RETURN -1;
SET vIsOver = 1;
SELECT modules.DisciplineID,
SET vIsOver = TRUE;
SELECT disciplines.ID,
disciplines.IsLocked,
disciplines.isMilestone,
rating_table.StudentID,
disciplines.IsMilestone,
submodules.IsUsed,
CASE
WHEN modules.type='extra' THEN
CalculateMaxRateForExtra(pSubmoduleID, pStudentID)
ELSE
submodules.maxRate
END,
submodules.maxRate,
modules.Type
INTO vDisciplineID, vIsLocked, vIsOver, vRateID, vIsUsed, vMaxRate, vMtype
FROM `submodules`
INNER JOIN `modules` ON submodules.ModuleID = modules.ID
INNER JOIN `disciplines` ON modules.DisciplineID = disciplines.ID
INNER JOIN `disciplines_teachers` ON disciplines.ID = disciplines_teachers.DisciplineID AND
pTeacherID = disciplines_teachers.TeacherID
LEFT JOIN `disciplines_groups` ON disciplines.ID = disciplines_groups.DisciplineID AND
vGroupID = disciplines_groups.GroupID
LEFT JOIN `disciplines_students` ON disciplines.ID = disciplines_students.DisciplineID AND
pStudentID = disciplines_students.StudentID AND
1 = disciplines_students.Type
LEFT JOIN `rating_table` ON pSubmoduleID = rating_table.SubmoduleID AND
pStudentID = rating_table.StudentID
WHERE submodules.ID = pSubModuleID AND
( disciplines_students.ID IS NOT NULL OR
disciplines_groups.ID IS NOT NULL
)
LIMIT 1;
INTO vDisciplineID, vIsLocked, vIsOver, vIsUsed, vMaxRate, vModuleType
FROM `submodules`
INNER JOIN `modules` ON submodules.ModuleID = modules.ID
INNER JOIN `disciplines` ON modules.DisciplineID = disciplines.ID
WHERE submodules.ID = pSubModuleID
LIMIT 1;
IF vDisciplineID <= 0 OR
# correct max rate for extra module
IF vModuleType = 4 THEN # 4 - extra
SET vMaxRate = CalculateMaxRateForExtra(pSubmoduleID, pStudentID);
END IF;
# 1) check rights
# 2) check, you can't rate regular and bonus after milestone
IF NOT InternalIsStudentAttached(pStudentID, vDisciplineID) OR
NOT InternalIsTeacherBounded(pTeacherID, vDisciplineID) OR
pRate > vMaxRate OR
(vIsOver > 0 AND (vMtype = 1 OR vMtype = 3))
(vIsOver AND (vModuleType = 1 OR vModuleType = 3)) # 1 - regular, 3 - bonus
THEN
RETURN -2;
END IF;
IF vRateID IS NOT NULL AND vRateID > 0 THEN
INSERT INTO `logs_rating`
(StudentID, SubmoduleID, TeacherID, Rate, Action )
VALUES (pStudentID, pSubModuleID, pTeacherID, pRate, 'change');
UPDATE `rating_table`
SET rating_table.TeacherID = pTeacherID,
rating_table.Rate = pRate,
rating_table.Date = CURDATE()
WHERE pSubmoduleID = rating_table.SubmoduleID AND
pStudentID = rating_table.StudentID
# add rate, or update old
SET @tmp = -1;
INSERT INTO `rating_table`
(StudentID, TeacherID, SubmoduleID, Rate, Date)
VALUES ( pStudentID, pTeacherID, pSubmoduleID, pRate, CURDATE())
ON DUPLICATE KEY UPDATE
rating_table.TeacherID = (@tmp = pTeacherID),
rating_table.Rate = pRate,
rating_table.Date = CURDATE();
# log rate
INSERT INTO `logs_rating`
(StudentID, SubmoduleID, TeacherID, Rate, Action )
VALUES (pStudentID, pSubModuleID, pTeacherID, pRate,
CASE WHEN @tmp >= 0 THEN 'add' ELSE 'change' END);
# lock discipline for structure editing
IF NOT vIsLocked THEN
UPDATE `disciplines`
SET disciplines.IsLocked = TRUE
WHERE disciplines.ID = vDisciplineID
LIMIT 1;
END IF;
ELSE
IF NOT vIsLocked THEN
UPDATE `disciplines`
SET disciplines.IsLocked = 1
WHERE disciplines.ID = vDisciplineID
LIMIT 1;
END IF;
INSERT INTO `logs_rating`
(StudentID, SubmoduleID, TeacherID, Rate, Action )
VALUES (pStudentID, pSubModuleID, pTeacherID, pRate, 'add');
INSERT INTO `rating_table`
( StudentID, TeacherID, SubmoduleID, Rate, Date)
VALUES ( pStudentID, pTeacherID, pSubmoduleID, pRate, CURDATE() );
IF NOT vIsUsed THEN
UPDATE `submodules`
SET submodules.IsUsed = 1
# add submodule to max rate counting
IF NOT vIsUsed THEN
UPDATE `submodules`
SET submodules.IsUsed = TRUE
WHERE submodules.ID = pSubModuleID
LIMIT 1;
END IF;
END IF;
RETURN 0;
END //
......@@ -1981,23 +1926,28 @@ END //
DROP FUNCTION IF EXISTS SetRequestStatus//
CREATE FUNCTION `SetRequestStatus`
(`pRequestID` INT, `pStatus` VARCHAR(20) CHARSET utf8) RETURNS int(11)
(`pRequestID` INT, `pStatus` VARCHAR(20) CHARSET utf8
) RETURNS int(11)
NO SQL
BEGIN
UPDATE `requests`
SET requests.Status = pStatus
WHERE requests.ID = pRequestID
LIMIT 1;
RETURN 0;
RETURN ROW_COUNT()-1;
END//
DROP FUNCTION IF EXISTS CreateRequest//
CREATE FUNCTION `CreateRequest`
( `pAccountID` INT, `pTitle` VARCHAR(50) CHARSET utf8,
`pDescription` TEXT CHARSET utf8) RETURNS int(11)
( `pAccountID` INT,
`pTitle` VARCHAR(50) CHARSET utf8,
`pDescription` TEXT CHARSET utf8
) RETURNS int(11)
NO SQL
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION RETURN -1;
INSERT INTO `requests`
(AccountID, Title, Description, Status)
VALUES (pAccountID, pTitle, pDescription, 'opened');
......@@ -2015,15 +1965,16 @@ END//
DROP FUNCTION IF EXISTS CreateRecoveryToken//
CREATE FUNCTION `CreateRecoveryToken`
( `pAccountOrEMail` VARCHAR(255) CHARSET utf8,
`pToken` VARCHAR(100) CHARSET utf8) RETURNS int(11)
( `pAccountOrEMail` VARCHAR(255) CHARSET utf8,
`pToken` VARCHAR(100) CHARSET utf8
) RETURNS int(11)
NO SQL
BEGIN
DECLARE vChecker INT DEFAULT 0;
DECLARE vAccountID INT DEFAULT -1;
DECLARE EXIT HANDLER FOR SQLEXCEPTION RETURN -1;
SELECT accounts.ID
INTO vAccountID
# get account ID
SELECT accounts.ID INTO vAccountID
FROM `accounts`
WHERE accounts.EMail = pAccountOrEMail
LIMIT 1;
......@@ -2031,15 +1982,7 @@ BEGIN
RETURN -1;
END IF;
SELECT recovery_tokens.ID
INTO vChecker
FROM `recovery_tokens`
WHERE recovery_tokens.Token = pToken
LIMIT 1;
IF vChecker > 0 THEN
RETURN -1;
END IF;
# handle catch constraints violations
INSERT INTO `recovery_tokens`
(AccountID, Token )
VALUES (vAccountID, pToken);
......@@ -2055,20 +1998,12 @@ CREATE FUNCTION `UseRecoveryToken`
BEGIN
DECLARE vChecker INT DEFAULT -1;
SELECT recovery_tokens.ID
INTO vChecker
FROM `recovery_tokens`
WHERE recovery_tokens.Token = pToken
LIMIT 1;
IF vChecker <= 0 THEN
RETURN -1;
END IF;
# set token used
UPDATE `recovery_tokens`
SET recovery_tokens.IsUsed = 1
WHERE recovery_tokens.Token = pToken
LIMIT 1;
RETURN 0;
RETURN ROW_COUNT()-1;
END//
......
......@@ -9,6 +9,10 @@ DROP PROCEDURE IF EXISTS GetStudyGroupsForDisciplineFull//
DROP PROCEDURE IF EXISTS GetStudyGroupsForDiscipline//
DROP PROCEDURE IF EXISTS GetStudyGroups//
DROP PROCEDURE IF EXISTS GetDisciplineInfoByID//
DROP PROCEDURE IF EXISTS GetMapForDisciplineExam//
DROP PROCEDURE IF EXISTS GetMapForDiscipline//
# -------------------------------------------------------------------------------------------
# Label: abbreviations
# -------------------------------------------------------------------------------------------
......@@ -628,10 +632,12 @@ BEGIN
END //
DROP PROCEDURE IF EXISTS GetMapForStudent//
DROP PROCEDURE IF EXISTS GetMapForStudentExam//
DROP PROCEDURE IF EXISTS GetRatesForStudentsGroup//
CREATE PROCEDURE `GetRatesForStudentsGroup`
DROP PROCEDURE IF EXISTS GetRatesForGroup//
CREATE PROCEDURE `GetRatesForGroup`
( IN `pDisciplineID` INT, IN `pGroupID` INT)
NO SQL
BEGIN
......@@ -666,9 +672,8 @@ END //
# TODO: rename GetRatesForStudent
DROP PROCEDURE IF EXISTS GetMapForStudent//
CREATE PROCEDURE `GetMapForStudent`
DROP PROCEDURE IF EXISTS GetRates//
CREATE PROCEDURE `GetRates`
( IN `pStudentID` INT, IN `pDisciplineID` INT)
NO SQL
BEGIN
......@@ -704,8 +709,8 @@ END //
# TODO: rename ~ GetRatesForStudent, Rating
DROP PROCEDURE IF EXISTS GetMapForStudentExam//
CREATE PROCEDURE `GetMapForStudentExam`
DROP PROCEDURE IF EXISTS GetRatesExam//
CREATE PROCEDURE `GetRatesExam`
( IN `pStudentID` INT, IN `pDisciplineID` INT)
NO SQL
BEGIN
......@@ -727,11 +732,10 @@ BEGIN
END //
# TODO: rename GetRoadMap
# TODO: order hardcode
# get roadmap of discipline
DROP PROCEDURE IF EXISTS GetMapForDiscipline//
CREATE PROCEDURE `GetMapForDiscipline`
DROP PROCEDURE IF EXISTS GetRoadmap//
CREATE PROCEDURE `GetRoadmap`
( IN `pDisciplineID` INT)
NO SQL
BEGIN
......@@ -755,10 +759,9 @@ BEGIN
END //
# TODO: rename GetRoadMap
# get roadmap of discipline exam
DROP PROCEDURE IF EXISTS GetMapForDisciplineExam//
CREATE PROCEDURE `GetMapForDisciplineExam`
DROP PROCEDURE IF EXISTS GetRoadmapExam//
CREATE PROCEDURE `GetRoadmapExam`
( IN `pDisciplineID` INT)
NO SQL
BEGIN
......@@ -781,9 +784,8 @@ BEGIN
END //
# TODO: rename GetDisciplineInfo
DROP PROCEDURE IF EXISTS GetDisciplineInfoByID//
CREATE PROCEDURE `GetDisciplineInfoByID`
DROP PROCEDURE IF EXISTS GetDisciplineInfo//
CREATE PROCEDURE `GetDisciplineInfo`
( IN `pDisciplineID` INT)
NO SQL
BEGIN
......
......@@ -147,11 +147,10 @@ CREATE OR REPLACE VIEW `view_rating_result` AS
(rating_table.Rate IS NULL) ASC,
view_roadmap.SubmoduleOrderNum DESC
LIMIT 1
) AS 'RateExam',
(RateRegular + RateExtra + RateExam + RateBonus) AS 'RateResult'
) AS 'RateExam'
FROM `rating_table`
LEFT JOIN `view_roadmap` ON view_roadmap.SubmoduleID = rating_table.SubmoduleID
GROUP BY view_rating.StudentID, view_rating.DisciplineID;
GROUP BY rating_table.StudentID, view_roadmap.DisciplineID;
......@@ -35,5 +35,9 @@ UPDATE `general_settings` SET general_settings.Name = 'SemesterID' WHERE general
UPDATE `general_settings` SET general_settings.Name = 'HashKey' WHERE general_settings.ID = 2;
ALTER TABLE `general_settings` ADD UNIQUE (`Name`);
# just for fun :/
UPDATE `modules`
SET modules.OrderNum = 3141592
WHERE modules.OrderNum = 3141692;
......@@ -10,13 +10,13 @@ class Model_Student extends Model
public function getDisciplineMap($student_id, $subject_id)
{
$sql = "CALL `GetMapForStudent`('$student_id', '$subject_id'); ";
$sql = "CALL `GetRates`('$student_id', '$subject_id'); ";
return DB::query(Database::SELECT, $sql)->execute();
}
public function getDisciplineInfoByID($discipline_id)
{
$sql = "CALL `GetDisciplineInfoByID`('$discipline_id'); ";
$sql = "CALL `GetDisciplineInfo`('$discipline_id'); ";
return DB::query(Database::SELECT, $sql)->execute();
}
......
......@@ -93,13 +93,13 @@ class Model_Teacher_Map extends Model
public function getDisciplineInfoByID($discipline_id)
{
$sql = "CALL `GetDisciplineInfoByID`('$discipline_id'); ";
$sql = "CALL `GetDisciplineInfo`('$discipline_id'); ";
return DB::query(Database::SELECT, $sql)->execute();
}
public function getMapForDiscipline($disciplineID)
{
$sql = "CALL `GetMapForDiscipline`('$disciplineID'); ";
$sql = "CALL `GetRoadmap`('$disciplineID'); ";
return DB::query(Database::SELECT, $sql)->execute();
}
......
......@@ -16,25 +16,25 @@ class Model_Teacher_Rating extends Model
public function getMapForDiscipline($disciplineID)
{
$sql = "CALL `GetMapForDiscipline`('$disciplineID'); ";
$sql = "CALL `GetRoadmap`('$disciplineID'); ";
return DB::query(Database::SELECT, $sql)->execute();
}
public function getMapForStudent($studentID, $disciplineID)
{
$sql = "CALL `GetMapForStudent`('$studentID', '$disciplineID'); ";
$sql = "CALL `GetRates`('$studentID', '$disciplineID'); ";
return DB::query(Database::SELECT, $sql)->execute();
}
public function getMapForStudentExam($studentID, $disciplineID)
{
$sql = "CALL `GetMapForStudentExam`('$studentID', '$disciplineID'); ";
$sql = "CALL `GetRatesExam`('$studentID', '$disciplineID'); ";
return DB::query(Database::SELECT, $sql)->execute();
}
public function GetMapForDisciplineExam($disciplineID)
{
$sql = "CALL `GetMapForDisciplineExam`('$disciplineID'); ";
$sql = "CALL `GetRoadmapExam`('$disciplineID'); ";
return DB::query(Database::SELECT, $sql)->execute();
}
......@@ -52,7 +52,7 @@ class Model_Teacher_Rating extends Model
public function getRatesForStudentsGroup($disciplineID, $groupID)
{
$sql = "CALL `getRatesForStudentsGroup`('$disciplineID', '$groupID')";
$sql = "CALL `GetRatesForGroup`('$disciplineID', '$groupID')";
return DB::query(Database::SELECT, $sql)->execute();
}
......
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment