Skip to content
Snippets Groups Projects
functions.sql 68.3 KiB
Newer Older
    INSERT INTO `submodules`
        (ModuleID, MaxRate, OrderNum, Name, Description, Type)
        VALUES  (pModuleID, pMaxRate, vOrderNum, pName, vDescription, pControlType);
    RETURN  LAST_INSERT_ID();
PavelBegunkov's avatar
PavelBegunkov committed
END //



DROP FUNCTION IF EXISTS SwapSubmoduleOrder//
CREATE FUNCTION `SwapSubmoduleOrder` (
        `pTeacherID` INT,
        `pSubmoduleID1` INT,
        `pSubmoduleID2` INT
    ) RETURNS int(11)
PavelBegunkov's avatar
PavelBegunkov committed
    NO SQL
BEGIN
    DECLARE vDisciplineID, vOrder1, vOrder2,
            vModule1, vModule2 INT DEFAULT -1;

    SELECT  submodules.OrderNum,
            submodules.ModuleID,
            disciplines.ID
        INTO vOrder1, vModule1, vDisciplineID
        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 = pSubmoduleID1
        LIMIT 1;
PavelBegunkov's avatar
PavelBegunkov committed

    SELECT  submodules.OrderNum,
            submodules.ModuleID
        INTO vOrder2, vModule2
        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 = pSubmoduleID2
        LIMIT 1;

    # check, that modules exists and belong to one discipline
PavelBegunkov's avatar
PavelBegunkov committed
    IF  vModule1 <= 0 OR vModule1 != vModule2 OR
        InternalIsMapLocked(vDisciplineID)
    THEN
        RETURN -1;
    END IF;

PavelBegunkov's avatar
PavelBegunkov committed
    UPDATE `submodules`
        SET submodules.OrderNum     = 271828
        WHERE submodules.ID = pSubmoduleID1
        LIMIT 1;
    UPDATE `submodules`
        SET submodules.OrderNum     = vOrder1
        WHERE submodules.ID = pSubmoduleID2
        LIMIT 1;
    UPDATE `submodules`
        SET submodules.OrderNum     = vOrder2
        WHERE submodules.ID = pSubmoduleID1
        LIMIT 1;
    RETURN 0;
END //


# -------------------------------------------------------------------------------------------
# Label: rating
# -------------------------------------------------------------------------------------------


# Вычисление максимального балла для submodule
DROP FUNCTION IF EXISTS CalculateMaxRateForExtra//
CREATE FUNCTION `CalculateMaxRateForExtra` (
        `pDisciplineID` INT,
        `pStudentID` INT
    ) RETURNS int(11)
PavelBegunkov's avatar
PavelBegunkov committed
    NO SQL
BEGIN
    DECLARE vExamType enum('exam', 'credit') DEFAULT NULL;
    DECLARE vDiscID, vLim, vResult INT DEFAULT 0;
    # get disc type
    SET vExamType = GetDisciplineProperty(pDisciplineID, 'type');
    # submodule doesn't exists
    IF vExamType IS NULL OR vExamType <= 0 THEN
        RETURN -1;
PavelBegunkov's avatar
PavelBegunkov committed
    END IF;
    SET vLim = IF(vExamType = 'exam', 38, 60);
    SELECT SUM(IF(view_roadmap.ModuleType = 'regular', rating_table.Rate, 0)) INTO vResult
        FROM `view_roadmap`
        LEFT JOIN `rating_table` ON rating_table.StudentID = pStudentID AND
                                    rating_table.SubmoduleID = view_roadmap.SubmoduleID
        WHERE view_roadmap.DisciplineID = pDisciplineID
PavelBegunkov's avatar
PavelBegunkov committed
        LIMIT 1;
    RETURN vLim - vResult;
PavelBegunkov's avatar
PavelBegunkov committed
END //


DROP FUNCTION IF EXISTS SetStudentRate//
CREATE FUNCTION `SetStudentRate` (
        `pTeacherID` INT,
        `pStudentID` INT,
        `pSubmoduleID` INT,
        `pRate` INT
    ) RETURNS int(11)
PavelBegunkov's avatar
PavelBegunkov committed
    NO SQL
BEGIN
    DECLARE vDisciplineID, vMaxRate, vModuleType, vSemesterID INT DEFAULT -1;
    DECLARE vIsOver, vIsLocked, vIsUsed BOOLEAN DEFAULT FALSE;
    DECLARE EXIT HANDLER FOR SQLEXCEPTION RETURN -1;
    IF pRate < 0 THEN
        INSERT INTO `logs_rating`
            (StudentID, SubmoduleID, TeacherID, Rate, Action )
PavelBegunkov's avatar
PavelBegunkov committed
            VALUES  (pStudentID, pSubmoduleID, pTeacherID, pRate, 'delete');

        # TODO: extract method log rate
        DELETE FROM `rating_table`
            WHERE   rating_table.StudentID = pStudentID AND
                    rating_table.SubmoduleID = pSubmoduleID
            LIMIT 1;

        RETURN ROW_COUNT()-1;
    END IF;

    SET vIsOver = TRUE;
    SELECT  disciplines.ID,
            disciplines.SemesterID,
xamgore's avatar
xamgore committed
            disciplines.IsLocked,
PavelBegunkov's avatar
PavelBegunkov committed
            disciplines.Milestone,
PavelBegunkov's avatar
PavelBegunkov committed
            submodules.IsUsed,
            submodules.maxRate,
PavelBegunkov's avatar
PavelBegunkov committed
            modules.Type
        INTO vDisciplineID, vSemesterID, vIsLocked, vIsOver, vIsUsed, vMaxRate, vModuleType
        FROM `submodules`
        INNER JOIN `modules`                ON  submodules.ModuleID = modules.ID
        INNER JOIN `disciplines`            ON  modules.DisciplineID = disciplines.ID
PavelBegunkov's avatar
PavelBegunkov committed
        WHERE   submodules.ID = pSubmoduleID
        LIMIT 1;
    # correct max rate for extra module
    IF vModuleType = 4 THEN # 4 - extra
        SET vMaxRate = CalculateMaxRateForExtra(vDisciplineID, pStudentID);
    END IF;

    # 1) check rights
    # 2) check, you can't rate regular and bonus after milestone
    # 3) check, max rate exceeding
    IF  NOT InternalIsStudentAttached(pStudentID, vDisciplineID, vSemesterID) OR
        NOT InternalIsTeacherBound(pTeacherID, vDisciplineID) OR
PavelBegunkov's avatar
PavelBegunkov committed
        pRate > vMaxRate OR
        (vIsOver AND (vModuleType = 1 OR vModuleType = 3)) # 1 - regular, 3 - bonus
PavelBegunkov's avatar
PavelBegunkov committed
    THEN
        RETURN -2;
    END IF;

    # add rate, or update old
PavelBegunkov's avatar
PavelBegunkov committed
    SET @tmp = 0;
    INSERT INTO `rating_table`
        (StudentID, TeacherID, SubmoduleID, Rate, Date)
        VALUES  ( pStudentID, pTeacherID, pSubmoduleID, pRate, CURDATE())
        ON DUPLICATE KEY UPDATE
PavelBegunkov's avatar
PavelBegunkov committed
            rating_table.TeacherID  = (@tmp := pTeacherID),
            rating_table.Rate       = pRate,
            rating_table.Date       = CURDATE();

    # log rate
    INSERT INTO `logs_rating`
        (StudentID, SubmoduleID, TeacherID, Rate, Action )
PavelBegunkov's avatar
PavelBegunkov committed
        VALUES  (pStudentID, pSubmoduleID, pTeacherID, pRate,
PavelBegunkov's avatar
PavelBegunkov committed
                        CASE WHEN @tmp > 0 THEN 'add' ELSE 'change' END);

    # lock discipline for structure editing
    IF NOT vIsLocked THEN
        UPDATE `disciplines`
xamgore's avatar
xamgore committed
        SET disciplines.IsLocked = TRUE
        WHERE disciplines.ID = vDisciplineID
PavelBegunkov's avatar
PavelBegunkov committed
        LIMIT 1;
    END IF;
    # add submodule to max rate counting
    IF NOT vIsUsed THEN
        UPDATE `submodules`
            SET submodules.IsUsed = TRUE
PavelBegunkov's avatar
PavelBegunkov committed
            WHERE submodules.ID = pSubmoduleID
PavelBegunkov's avatar
PavelBegunkov committed
            LIMIT 1;
    END IF;
    RETURN 0;
END //





# -------------------------------------------------------------------------------------------
# Label: requests
# -------------------------------------------------------------------------------------------



DROP FUNCTION IF EXISTS SetRequestStatus//
CREATE FUNCTION `SetRequestStatus` (
        `pRequestID` INT,
ViolettaShevchenko's avatar
ViolettaShevchenko committed
        `pStatus` enum('opened','processed','closed')
    ) RETURNS int(11)
PavelBegunkov's avatar
PavelBegunkov committed
    NO SQL
BEGIN
ViolettaShevchenko's avatar
ViolettaShevchenko committed
    DECLARE EXIT HANDLER FOR SQLEXCEPTION RETURN -1;
PavelBegunkov's avatar
PavelBegunkov committed
    UPDATE `requests`
        SET requests.Status = pStatus
        WHERE requests.ID = pRequestID
        LIMIT 1;
    RETURN ROW_COUNT()-1;
PavelBegunkov's avatar
PavelBegunkov committed
END//

DROP FUNCTION IF EXISTS CreateRequest//
ViolettaShevchenko's avatar
ViolettaShevchenko committed
CREATE FUNCTION `CreateRequest`
    (   `pAccountID` INT,
        `pTitle` VARCHAR(50) CHARSET utf8,
        `pDescription` TEXT CHARSET utf8,
        `pImage` BOOLEAN
    ) RETURNS int(11)
NO SQL
BEGIN
    DECLARE EXIT HANDLER FOR SQLEXCEPTION RETURN -1;

ViolettaShevchenko's avatar
ViolettaShevchenko committed
    INSERT INTO `requests`
    (AccountID, Title, Description, Status, HasImage)
    VALUES  (pAccountID, pTitle, pDescription, 'opened', pImage);
    RETURN LAST_INSERT_ID();
DROP FUNCTION IF EXISTS UpdateRequest//
CREATE FUNCTION `UpdateRequest` (
    `pRequestID` INT,
ViolettaShevchenko's avatar
ViolettaShevchenko committed
    `pTitle` VARCHAR(50) CHARSET utf8,
    `pDescription` TEXT CHARSET utf8
) RETURNS int(11)
NO SQL
BEGIN
    DECLARE EXIT HANDLER FOR SQLEXCEPTION RETURN -1;
ViolettaShevchenko's avatar
ViolettaShevchenko committed
        SET requests.Description = pDescription,
            requests.Title = pTitle,
            requests.Date = NOW()
        WHERE   requests.ID = pRequestID AND
                requests.Description IS NULL AND
                requests.Title IS NULL
PavelBegunkov's avatar
PavelBegunkov committed
# -------------------------------------------------------------------------------------------
# Label: recovery
# -------------------------------------------------------------------------------------------



DROP FUNCTION IF EXISTS CreateRecoveryToken//
CREATE FUNCTION `CreateRecoveryToken` (
PavelBegunkov's avatar
PavelBegunkov committed
    `pAccountOrEMail` VARCHAR(255) CHARSET utf8,
    `pToken` VARCHAR(100) CHARSET utf8
) RETURNS VARCHAR(255) charset utf8
PavelBegunkov's avatar
PavelBegunkov committed
    NO SQL
BEGIN
    DECLARE vAccountID INT DEFAULT -1;
PavelBegunkov's avatar
PavelBegunkov committed
    DECLARE vUserFullName TEXT charset utf8;
    DECLARE EXIT HANDLER FOR SQLEXCEPTION RETURN -2;
    # get account ID
    SELECT accounts.ID INTO vAccountID
PavelBegunkov's avatar
PavelBegunkov committed
        FROM `accounts`
PavelBegunkov's avatar
PavelBegunkov committed
        WHERE accounts.EMail = pAccountOrEMail OR
              accounts.Login = pAccountOrEMail
PavelBegunkov's avatar
PavelBegunkov committed
        LIMIT 1;
    IF vAccountID <= 0 THEN
PavelBegunkov's avatar
PavelBegunkov committed
    END IF;

    SET vUserFullName = GetUserFullNameByAccountID(vAccountID);
PavelBegunkov's avatar
PavelBegunkov committed
    IF vUserFullName IS NULL OR vUserFullName = '' THEN
        RETURN '';
    END IF;
    # transform all unused recovery tokens into used
    UPDATE `recovery_tokens`
    SET recovery_tokens.isUsed = 1
PavelBegunkov's avatar
PavelBegunkov committed
    WHERE   recovery_tokens.isUsed = 0 AND
            recovery_tokens.AccountID = vAccountID;
    # handle catch constraints violations
PavelBegunkov's avatar
PavelBegunkov committed
    INSERT INTO `recovery_tokens`
PavelBegunkov's avatar
PavelBegunkov committed
        ( AccountID, Token )
        VALUES  (vAccountID, pToken);
PavelBegunkov's avatar
PavelBegunkov committed
END//

DROP FUNCTION IF EXISTS GetUserFullNameByAccountID//
CREATE FUNCTION `GetUserFullNameByAccountID` (
        `pAccountID` INT(11)
    ) RETURNS VARCHAR(255) charset utf8
PavelBegunkov's avatar
PavelBegunkov committed
    DECLARE vUserFullName VARCHAR(255) charset utf8;
    # try to find student with that account id
    SELECT students.ID, CONCAT(students.LastName,' ',students.FirstName,' ',students.SecondName)
        INTO vChecker, vUserFullName
        FROM `students`
        WHERE students.AccountID = pAccountID
        LIMIT 1;

    IF vChecker <= 0 THEN # try to find teacher with that account id
        SELECT teachers.ID, CONCAT(teachers.LastName,' ',teachers.FirstName,' ',teachers.SecondName)
            INTO vChecker, vUserFullName
            FROM `teachers`
            WHERE teachers.AccountID = pAccountID
            LIMIT 1;

        IF vChecker <= 0 THEN
PavelBegunkov's avatar
PavelBegunkov committed
            RETURN '';
PavelBegunkov's avatar
PavelBegunkov committed

DROP FUNCTION IF EXISTS UseRecoveryToken//
CREATE FUNCTION `UseRecoveryToken` (
        `pToken` VARCHAR(100) CHARSET utf8
    ) RETURNS int(11)
PavelBegunkov's avatar
PavelBegunkov committed
    NO SQL
BEGIN
    DECLARE vChecker INT DEFAULT -1;

    # set token used
PavelBegunkov's avatar
PavelBegunkov committed
    UPDATE `recovery_tokens`
        SET recovery_tokens.IsUsed = 1
        WHERE recovery_tokens.Token = pToken
        LIMIT 1;
    RETURN ROW_COUNT()-1;
PavelBegunkov's avatar
PavelBegunkov committed
END//

DROP FUNCTION IF EXISTS SaveSession //
CREATE FUNCTION SaveSession
    (   pSessionID VARCHAR(40),
        pUserLogin VARCHAR(50) CHARSET utf8,
        pUserPassword VARCHAR(64)
    ) RETURNS INT(11)
PavelBegunkov's avatar
PavelBegunkov committed
    NO SQL
PavelBegunkov's avatar
PavelBegunkov committed
    INSERT INTO sessions (SessionID, Login, Password)
        VALUES(pSessionID, pUserLogin, pUserPassword);
    RETURN LAST_INSERT_ID();