[Tux4kids-commits] r1290 - tux4kids-admin/trunk/libtux4kidsadmin

Michał Świtakowski swistakers-guest at alioth.debian.org
Wed Jul 29 18:07:46 UTC 2009


Author: swistakers-guest
Date: 2009-07-29 18:07:46 +0000 (Wed, 29 Jul 2009)
New Revision: 1290

Modified:
   tux4kids-admin/trunk/libtux4kidsadmin/class.cpp
   tux4kids-admin/trunk/libtux4kidsadmin/class.h
   tux4kids-admin/trunk/libtux4kidsadmin/class_p.h
   tux4kids-admin/trunk/libtux4kidsadmin/schoolDatabase.cpp
   tux4kids-admin/trunk/libtux4kidsadmin/schoolDatabase_p.h
Log:
database triggers

Modified: tux4kids-admin/trunk/libtux4kidsadmin/class.cpp
===================================================================
--- tux4kids-admin/trunk/libtux4kidsadmin/class.cpp	2009-07-29 17:55:26 UTC (rev 1289)
+++ tux4kids-admin/trunk/libtux4kidsadmin/class.cpp	2009-07-29 18:07:46 UTC (rev 1290)
@@ -57,6 +57,30 @@
 	d->id = id;
 }
 
+QStringList Class::students() const
+{
+	Q_D(const Class);
+	return d->students;
+}
+
+void Class::setStudents(const QStringList &students)
+{
+	Q_D(Class);
+	d->students = students;
+}
+
+QList<Teacher> Class::teachers() const
+{
+	Q_D(const Class);
+	return d->teachers;
+}
+
+void Class::setTeachers(const QList<Teacher> &teachers)
+{
+	Q_D(Class);
+	d->teachers = teachers;
+}
+
 Class &Class::operator=(const Class &other)
 {
 	if (this != &other) {

Modified: tux4kids-admin/trunk/libtux4kidsadmin/class.h
===================================================================
--- tux4kids-admin/trunk/libtux4kidsadmin/class.h	2009-07-29 17:55:26 UTC (rev 1289)
+++ tux4kids-admin/trunk/libtux4kidsadmin/class.h	2009-07-29 18:07:46 UTC (rev 1290)
@@ -5,8 +5,10 @@
 #include <QString>
 
 #include "libtux4kidsadmin_global.h"
+#include "teacher.h"
 
 class ClassPrivate;
+class QStringList;
 
 class LIBTUX4KIDSADMIN_SHARED_EXPORT Class
 {
@@ -18,6 +20,10 @@
 	void setName(QString name);
 	int id() const;
 	void setId(int id);
+	QStringList students() const;
+	void setStudents(const QStringList &students);
+	QList<Teacher> teachers() const;
+	void setTeachers(const QList<Teacher> &teachers);
 	Class &operator=(const Class&);
 
 protected:

Modified: tux4kids-admin/trunk/libtux4kidsadmin/class_p.h
===================================================================
--- tux4kids-admin/trunk/libtux4kidsadmin/class_p.h	2009-07-29 17:55:26 UTC (rev 1289)
+++ tux4kids-admin/trunk/libtux4kidsadmin/class_p.h	2009-07-29 18:07:46 UTC (rev 1290)
@@ -3,7 +3,10 @@
 
 #include <QtGlobal>
 #include <QString>
+#include <QStringList>
 
+class Teacher;
+
 class  ClassPrivate
 {
 public:
@@ -16,6 +19,8 @@
 
 	int id;
 	QString name;
+	QStringList students;
+	QList<Teacher> teachers;
 
 };
 

Modified: tux4kids-admin/trunk/libtux4kidsadmin/schoolDatabase.cpp
===================================================================
--- tux4kids-admin/trunk/libtux4kidsadmin/schoolDatabase.cpp	2009-07-29 17:55:26 UTC (rev 1289)
+++ tux4kids-admin/trunk/libtux4kidsadmin/schoolDatabase.cpp	2009-07-29 18:07:46 UTC (rev 1290)
@@ -53,14 +53,20 @@
 		return;
 	}
 
-	QSqlQuery createClassTeachers("CREATE TABLE class_teachers (id_class integer, id_teacher integer, primary key(id_class,id_teacher));", db);
+	QSqlQuery createClassTeachers("CREATE TABLE class_teachers "
+			"(id_class integer CONSTRAINT fk_id_class REFERENCES classes(id) ON DELETE CASCADE,"
+			"id_teacher integer CONSTRAINT fk_id_teacher REFERENCES teachers(id) ON DELETE CASCADE,"
+			"primary key(id_class,id_teacher));", db);
 	if (!createClassTeachers.isActive()) {
 		error = true;
 		lastError = createClassTeachers.lastError().text();
 		return;
 	}
 
-	QSqlQuery createClassStudents("CREATE TABLE class_students (id_class integer, id_student integer, primary key(id_class,id_student));", db);
+	QSqlQuery createClassStudents("CREATE TABLE class_students "
+			"(id_class integer CONSTRAINT fk_id_class REFERENCES classes(id) ON DELETE CASCADE, "
+			"id_student integer CONSTRAINT fk_id_student REFERENCES students(id) ON DELETE CASCADE,"
+			"primary key(id_class,id_student));", db);
 	if (!createClassStudents.isActive()) {
 		error = true;
 		lastError = createClassStudents.lastError().text();
@@ -68,6 +74,170 @@
 	}
 }
 
+void SchoolDatabasePrivate::createTriggers()
+{
+	error = false;
+	if (!db.isOpen()) {
+		error = true;
+		lastError = QObject::tr("Database is not open");
+		return;
+	}
+
+	QSqlQuery createTrigger1("DROP TRIGGER fki_class_teachers_id_class_classes_id;"
+				 "CREATE TRIGGER fki_class_teachers_id_class_classes_id"
+				 "BEFORE INSERT ON [class_teachers]"
+				 "FOR EACH ROW BEGIN"
+				 "SELECT RAISE(ROLLBACK, \'insert on table"
+				 "class_teachers\" violates foreign key constraint"
+				 "fki_class_teachers_id_class_classes_id\"')"
+	"WHERE NEW.id_class IS NOT NULL AND (SELECT id FROM classes WHERE id = NEW.id_class) IS NULL;" \
+		"END;", db);
+	if (!createTrigger1.isActive()) {
+		error = true;
+		lastError = createTrigger1.lastError().text();
+		return;
+	}
+
+	QSqlQuery createTrigger2("DROP TRIGGER fku_class_teachers_id_class_classes_id;"
+				"CREATE TRIGGER fku_class_teachers_id_class_classes_id"
+				"BEFORE UPDATE ON [class_teachers]"
+				"FOR EACH ROW BEGIN"
+				"SELECT RAISE(ROLLBACK, 'update on table\" class_teachers\" violates foreign key constraint \"fku_class_teachers_id_class_classes_id\"')"
+				"WHERE NEW.id_class IS NOT NULL AND (SELECT id FROM classes WHERE id = NEW.id_class) IS NULL;"
+				"END;", db);
+	if (!createTrigger2.isActive()) {
+		error = true;
+		lastError = createTrigger2.lastError().text();
+		return;
+	}
+
+	QSqlQuery createTrigger3("DROP TRIGGER fkdc_class_teachers_id_class_classes_id;"
+				"CREATE TRIGGER fkdc_class_teachers_id_class_classes_id"
+				"BEFORE DELETE ON classes"
+				"FOR EACH ROW BEGIN"
+				"DELETE FROM class_teachers WHERE class_teachers.id_class = OLD.id;"
+				"END;", db);
+	if (!createTrigger3.isActive()) {
+		error = true;
+		lastError = createTrigger3.lastError().text();
+		return;
+	}
+
+	QSqlQuery createTrigger4("DROP TRIGGER fki_class_teachers_id_teacher_teachers_id;"
+			"CREATE TRIGGER fki_class_teachers_id_teacher_teachers_id"
+			"BEFORE INSERT ON [class_teachers]"
+			"FOR EACH ROW BEGIN"
+			"SELECT RAISE(ROLLBACK, 'insert on table \"class_teachers\" violates foreign key constraint \"fki_class_teachers_id_teacher_teachers_id\"')"
+			"WHERE NEW.id_teacher IS NOT NULL AND (SELECT id FROM teachers WHERE id = NEW.id_teacher) IS NULL;"
+			"END;", db);
+	if (!createTrigger4.isActive()) {
+		error = true;
+		lastError = createTrigger4.lastError().text();
+		return;
+	}
+
+	QSqlQuery createTrigger5("DROP TRIGGER fku_class_teachers_id_teacher_teachers_id;"
+			"CREATE TRIGGER fku_class_teachers_id_teacher_teachers_id"
+			"BEFORE UPDATE ON [class_teachers]"
+			"FOR EACH ROW BEGIN"
+			"SELECT RAISE(ROLLBACK, 'update on table \"class_teachers\" violates foreign key constraint \"fku_class_teachers_id_teacher_teachers_id\"')"
+			"WHERE NEW.id_teacher IS NOT NULL AND (SELECT id FROM teachers WHERE id = NEW.id_teacher) IS NULL;"
+			"END;", db);
+	if (!createTrigger5.isActive()) {
+		error = true;
+		lastError = createTrigger5.lastError().text();
+		return;
+	}
+
+	QSqlQuery createTrigger6("DROP TRIGGER fkdc_class_teachers_id_teacher_teachers_id;"
+			"CREATE TRIGGER fkdc_class_teachers_id_teacher_teachers_id"
+			"BEFORE DELETE ON teachers"
+			"FOR EACH ROW BEGIN"
+			"DELETE FROM class_teachers WHERE class_teachers.id_teacher = OLD.id;"
+			"END;", db);
+	if (!createTrigger6.isActive()) {
+		error = true;
+		lastError = createTrigger6.lastError().text();
+		return;
+	}
+
+	QSqlQuery createTrigger7("DROP TRIGGER fki_class_students_id_class_classes_id;"
+			"CREATE TRIGGER fki_class_students_id_class_classes_id"
+			"BEFORE INSERT ON [class_students]"
+			"FOR EACH ROW BEGIN"
+			"SELECT RAISE(ROLLBACK, 'insert on table \"class_students\" violates foreign key" "constraint \"fki_class_students_id_class_classes_id\"')"
+			"WHERE NEW.id_class IS NOT NULL AND (SELECT id FROM classes WHERE id = NEW.id_class) IS NULL;"
+			"END;", db);
+	if (!createTrigger7.isActive()) {
+		error = true;
+		lastError = createTrigger7.lastError().text();
+		return;
+	}
+
+	QSqlQuery createTrigger8("DROP TRIGGER fku_class_students_id_class_classes_id;"
+			"CREATE TRIGGER fku_class_students_id_class_classes_id"
+			"BEFORE UPDATE ON [class_students]"
+			"FOR EACH ROW BEGIN"
+			"SELECT RAISE(ROLLBACK, 'update on table \"class_students\" violates foreign key constraint \"fku_class_students_id_class_classes_id\"')"
+			"WHERE NEW.id_class IS NOT NULL AND (SELECT id FROM classes WHERE id = NEW.id_class) IS NULL;"
+			"END;", db);
+	if (!createTrigger8.isActive()) {
+		error = true;
+		lastError = createTrigger8.lastError().text();
+		return;
+	}
+
+	QSqlQuery createTrigger9("DROP TRIGGER fkdc_class_students_id_class_classes_id;"
+			"CREATE TRIGGER fkdc_class_students_id_class_classes_id"
+			"BEFORE DELETE ON classes"
+			"FOR EACH ROW BEGIN"
+			"DELETE FROM class_students WHERE class_students.id_class =OLD.id;"
+			"END;", db);
+	if (!createTrigger9.isActive()) {
+		error = true;
+		lastError = createTrigger9.lastError().text();
+		return;
+	}
+
+	QSqlQuery createTrigger10("DROP TRIGGER fki_class_students_id_student_students_id;"
+			"CREATE TRIGGER fki_class_students_id_student_students_id"
+			"BEFORE INSERT ON [class_students]"
+			"FOR EACH ROW BEGIN"
+			"SELECT RAISE(ROLLBACK, 'insert on table \"class_students\" violates foreign key constraint \"fki_class_students_id_student_students_id\"')"
+			"WHERE NEW.id_student IS NOT NULL AND (SELECT id FROM students WHERE id = NEW.id_student) IS NULL;"
+			"END;", db);
+	if (!createTrigger10.isActive()) {
+		error = true;
+		lastError = createTrigger10.lastError().text();
+		return;
+	}
+
+	QSqlQuery createTrigger11("DROP TRIGGER	fku_class_students_id_student_students_id;"
+			"CREATE TRIGGER fku_class_students_id_student_students_id"
+			"BEFORE UPDATE ON [class_students]"
+			"FOR EACH ROW BEGIN"
+			"SELECT RAISE(ROLLBACK, 'update on table \"class_students\" violates foreign key constraint \"fku_class_students_id_student_students_id\"')"
+			"WHERE NEW.id_student IS NOT NULL AND (SELECT id FROM students WHERE id = NEW.id_student) IS NULL;"
+			"END;", db);
+	if (!createTrigger11.isActive()) {
+		error = true;
+		lastError = createTrigger11.lastError().text();
+		return;
+	}
+
+	QSqlQuery createTrigger12("DROP TRIGGER fkdc_class_students_id_student_students_id;"
+			"CREATE TRIGGER fkdc_class_students_id_student_students_id"
+			"BEFORE DELETE ON students"
+			"FOR EACH ROW BEGIN"
+			"DELETE FROM class_students WHERE class_students.id_student = OLD.id;"
+			"END;", db);
+	if (!createTrigger12.isActive()) {
+		error = true;
+		lastError = createTrigger12.lastError().text();
+		return;
+	}
+}
+
 void SchoolDatabasePrivate::addClass(Class &newClass)
 {
 	if (!db.isOpen()) {
@@ -452,8 +622,10 @@
 		return d->db.open();
 	} else {
 		bool result = d->db.open();
-		if (result)
+		if (result) {
 			d->createTables();
+			d->createTriggers();
+		}
 		return result;
 	}
 }

Modified: tux4kids-admin/trunk/libtux4kidsadmin/schoolDatabase_p.h
===================================================================
--- tux4kids-admin/trunk/libtux4kidsadmin/schoolDatabase_p.h	2009-07-29 17:55:26 UTC (rev 1289)
+++ tux4kids-admin/trunk/libtux4kidsadmin/schoolDatabase_p.h	2009-07-29 18:07:46 UTC (rev 1290)
@@ -17,6 +17,7 @@
 	virtual ~SchoolDatabasePrivate();
 
 	void createTables();
+	void createTriggers();
 	void addClass(Class &newClass);
 	void updateClass(const Class &updatedClass);
 	void deleteClass(const Class &deletedClass);




More information about the Tux4kids-commits mailing list