From 6252eb62b17ccffff614d9ce26348e1b810b78a6 Mon Sep 17 00:00:00 2001
From: RomanSteinberg <romanofficial@yandex.ru>
Date: Sat, 30 Aug 2014 15:22:38 +0400
Subject: [PATCH] FIX: BindGroup and BindStudent st. proc.

---
 db/StoredProcedures.sql | 104 ++++++++++++++++++++--------------------
 1 file changed, 53 insertions(+), 51 deletions(-)

diff --git a/db/StoredProcedures.sql b/db/StoredProcedures.sql
index a69607c0f..26e9bb8e1 100644
--- a/db/StoredProcedures.sql
+++ b/db/StoredProcedures.sql
@@ -1593,8 +1593,8 @@ END //
 
 
 DROP FUNCTION IF EXISTS BindTeacher//
-CREATE FUNCTION `BindTeacher`(	`AccessedTeacher` INT,
-								`BindingTeacher` INT,
+CREATE FUNCTION `BindTeacher`(	`AccessedTeacherID` INT,
+								`BindingTeacherID` INT,
 								`DisciplineID` INT		
 							 ) 	RETURNS int(11)
     NO SQL
@@ -1602,12 +1602,11 @@ BEGIN
     DECLARE checker INT; 
 
 -- 1. check if AccessedTeacher is author
-
 	SELECT disciplines.ID 
 	INTO checker 
 	FROM `disciplines`
 	WHERE 	disciplines.ID = DisciplineID AND
-			disciplines.AuthorID = AccessedTeacher 
+			disciplines.AuthorID = AccessedTeacherID 
 	LIMIT 1;
 	IF NOT (checker > 0) THEN
 		RETURN -1;
@@ -1619,7 +1618,7 @@ BEGIN
 	INTO checker 
 	FROM `disciplines_teachers`
 	WHERE 	disciplines_teachers.DisciplineID = DisciplineID AND
-			disciplines_teachers.TeacherID = BindingTeacher  
+			disciplines_teachers.TeacherID = BindingTeacherID  
 	LIMIT 1;
 	IF checker > 0 THEN
 		RETURN 0;
@@ -1814,7 +1813,7 @@ END //
 
 
 DROP FUNCTION IF EXISTS BindGroup//
-CREATE FUNCTION `BindGroup`	(	`TeacherID` 	INT,
+CREATE FUNCTION `BindGroup`	(	`AccessedTeacherID` 	INT,
 								`DisciplineID` 	INt,
 								`StudyGroupID` 	INT
 					 		) 	RETURNS int(11)
@@ -1822,26 +1821,18 @@ CREATE FUNCTION `BindGroup`	(	`TeacherID` 	INT,
 BEGIN 
     DECLARE checker INT;  					 
 	
-	SELECT disciplines_teachers.ID
-	INTO checker 
-	FROM `disciplines_teachers`
-	WHERE 	disciplines_teachers.DisciplineID = DisciplineID AND 
-			disciplines_teachers.TeacherID = TeacherID
-	LIMIT 1;
-	IF NOT (checker > 0) THEN 
-		RETURN -1;
-	END IF;
-
-	SET checker = -1;
-	SELECT study_groups.ID
+-- 1. check if AccessedTeacher is author
+	SELECT disciplines.ID 
 	INTO checker 
-	FROM `study_groups`
-	WHERE study_groups.ID = StudyGroupID
+	FROM `disciplines`
+	WHERE 	disciplines.ID = DisciplineID AND
+			disciplines.AuthorID = AccessedTeacherID 
 	LIMIT 1;
-	IF NOT (checker > 0) THEN 
+	IF NOT (checker > 0) THEN
 		RETURN -1;
 	END IF;
-
+	
+-- 2. check if study group is bound to discipline
 	SET checker = -1;
 	SELECT disciplines_groups.ID
 	INTO checker
@@ -1853,6 +1844,7 @@ BEGIN
 		RETURN 0;
 	END IF;
 
+-- 3. delete students of this group which were bound to discipline before
 	DELETE FROM `disciplines_students`
 	WHERE 	disciplines_students.DisciplineID = DisciplineID AND
 			disciplines_students.StudentID IN 
@@ -1860,7 +1852,8 @@ BEGIN
 			FROM `students`
 			WHERE students.StudyGroupID = StudyGroupID
 		);
-
+		
+-- 4. bind whole group
 	INSERT INTO `disciplines_groups` 	(	disciplines_groups.DisciplineID,
 											disciplines_groups.StudyGroupID
 										)
@@ -1873,7 +1866,7 @@ END //
 
 
 DROP FUNCTION IF EXISTS BindStudent//
-CREATE FUNCTION `BindStudent`	(	`TeacherID` 	INT,
+CREATE FUNCTION `BindStudent`	(	`AccessedTeacherID` 	INT,
 									`DisciplineID` 	INT,
 									`StudentID` 	INT
 					 			) 	RETURNS int(11)
@@ -1881,47 +1874,56 @@ CREATE FUNCTION `BindStudent`	(	`TeacherID` 	INT,
 BEGIN 
     DECLARE checker, SG, temp INT;  					 
 
-	SELECT disciplines_teachers.ID
+-- 1. check if AccessedTeacher is author
+	SELECT disciplines.ID 
 	INTO checker 
-	FROM `disciplines_teachers`
-	WHERE 	disciplines_teachers.DisciplineID = DisciplineID AND 
-			disciplines_teachers.TeacherID 	= TeacherID
+	FROM `disciplines`
+	WHERE 	disciplines.ID = DisciplineID AND
+			disciplines.AuthorID = AccessedTeacherID 
 	LIMIT 1;
-	IF NOT (checker > 0) THEN 
+	IF NOT (checker > 0) THEN
 		RETURN -1;
 	END IF;
 	
-    SELECT students.StudyGroupID
-    INTO SG
-    FROM `students`
-    WHERE students.ID = StudentID
-    LIMIT 1;
-    IF NOT (SG > 0) THEN
-    	RETURN -1;
-	END IF;
-    
+-- 2. check if student's group is bound yet	
+	SET checker = -1;
 	SELECT disciplines_groups.ID
-	INTO temp
+	INTO checker
 	FROM `disciplines_groups`
 	WHERE 	disciplines_groups.DisciplineID = DisciplineID AND
-			disciplines_groups.StudyGroupID = SG
+			disciplines_groups.StudyGroupID IN
+			(	SELECT students.StudyGroupID
+				FROM `students`
+				WHERE students.ID = StudentID ) 
 	LIMIT 1;
-
-
-	IF temp > 0 THEN
+	
+	IF checker > 0 THEN
 		DELETE FROM `disciplines_students`
 		WHERE 	disciplines_students.DisciplineID = DisciplineID AND
 				disciplines_students.StudentID = StudentID;
-	ELSE 
-		INSERT INTO `disciplines_students`	(	disciplines_students.DisciplineID,
-												disciplines_students.StudentID,
-												disciplines_students.Type
-											)
-		VALUES								( DisciplineID, StudentID, 'attach');
-
+		RETURN 0;
 	END IF;
-	RETURN 0;
 
+-- 3. check if student is bound
+	SET checker = -1;
+	SELECT disciplines_students.ID
+	INTO checker
+	FROM `disciplines_students`
+	WHERE 	disciplines_students.DisciplineID = DisciplineID AND
+			disciplines_students.StudentID = StudentID
+	LIMIT 1;
+	IF checker > 0 THEN	
+		RETURN 0;
+	END IF;
+	
+-- 4. bind student
+	INSERT INTO `disciplines_students`	(	disciplines_students.DisciplineID,
+											disciplines_students.StudentID,
+											disciplines_students.Type
+										)
+	VALUES								( DisciplineID, StudentID, 'attach');
+	RETURN 1;
+	
 END //
 
 
-- 
GitLab