From 6921431a772c8d750b18207335f65d3a429818f8 Mon Sep 17 00:00:00 2001 From: Pierre-Olivier Mercier Date: Mon, 20 Jan 2020 17:29:34 +0100 Subject: [PATCH] Flag MCQ can now depend on MCQ --- libfic/db.go | 10 ++++++++++ libfic/mcq.go | 34 ++++++++++++++++++++++++++++++++-- libfic/reset.go | 1 + 3 files changed, 43 insertions(+), 2 deletions(-) diff --git a/libfic/db.go b/libfic/db.go index 62b4b2e2..d8e97fc8 100644 --- a/libfic/db.go +++ b/libfic/db.go @@ -261,6 +261,16 @@ CREATE TABLE IF NOT EXISTS exercice_flags_omcq_deps( FOREIGN KEY(id_flag) REFERENCES exercice_flags(id_flag), FOREIGN KEY(id_mcq_dep) REFERENCES exercice_mcq(id_mcq) ) DEFAULT CHARACTER SET = utf8 COLLATE = utf8_bin; +`); err != nil { + return err + } + if _, err := db.Exec(` +CREATE TABLE IF NOT EXISTS exercice_mcq_omcq_deps( + id_mcq INTEGER NOT NULL, + id_mcq_dep INTEGER NOT NULL, + FOREIGN KEY(id_mcq) REFERENCES exercice_mcq(id_mcq), + FOREIGN KEY(id_mcq_dep) REFERENCES exercice_mcq(id_mcq) +) DEFAULT CHARACTER SET = utf8 COLLATE = utf8_bin; `); err != nil { return err } diff --git a/libfic/mcq.go b/libfic/mcq.go index f21e6e05..70fc4532 100644 --- a/libfic/mcq.go +++ b/libfic/mcq.go @@ -164,6 +164,10 @@ func (m MCQ) Delete() (int64, error) { return 0, err } else if _, err := DBExec("DELETE FROM exercice_mcq_okey_deps WHERE id_mcq = ?", m.Id); err != nil { return 0, err + } else if _, err := DBExec("DELETE FROM exercice_mcq_omcq_deps WHERE id_mcq = ?", m.Id); err != nil { + return 0, err + } else if _, err := DBExec("DELETE FROM exercice_mcq_omcq_deps WHERE id_mcq_dep = ?", m.Id); err != nil { + return 0, err } else if _, err := DBExec("DELETE FROM exercice_flags_omcq_deps WHERE id_mcq_dep = ?", m.Id); err != nil { return 0, err } else if res, err := DBExec("DELETE FROM exercice_mcq WHERE id_mcq = ?", m.Id); err != nil { @@ -219,6 +223,10 @@ func (e Exercice) WipeMCQs() (int64, error) { return 0, err } else if _, err := DBExec("DELETE FROM exercice_mcq_okey_deps WHERE id_mcq IN (SELECT id_mcq FROM exercice_mcq WHERE id_exercice = ?);", e.Id); err != nil { return 0, err + } else if _, err := DBExec("DELETE FROM exercice_mcq_omcq_deps WHERE id_mcq IN (SELECT id_mcq FROM exercice_mcq WHERE id_exercice = ?);", e.Id); err != nil { + return 0, err + } else if _, err := DBExec("DELETE FROM exercice_mcq_omcq_deps WHERE id_mcq_dep IN (SELECT id_mcq FROM exercice_mcq WHERE id_exercice = ?);", e.Id); err != nil { + return 0, err } else if res, err := DBExec("DELETE FROM exercice_mcq WHERE id_exercice = ?;", e.Id); err != nil { return 0, err } else if nb, err := res.RowsAffected(); err != nil { @@ -232,6 +240,8 @@ func (e Exercice) WipeMCQs() (int64, error) { func (m MCQ) AddDepend(j Flag) (err error) { if d, ok := j.(FlagKey); ok { _, err = DBExec("INSERT INTO exercice_mcq_okey_deps (id_mcq, id_flag_dep) VALUES (?, ?)", m.Id, d.Id) + } else if d, ok := j.(MCQ); ok { + _, err = DBExec("INSERT INTO exercice_mcq_omcq_deps (id_mcq, id_mcq_dep) VALUES (?, ?)", m.Id, d.Id) } else { err = errors.New("Dependancy type not implemented for this flag.") } @@ -240,12 +250,13 @@ func (m MCQ) AddDepend(j Flag) (err error) { // GetDepends retrieve the flag's dependency list. func (m MCQ) GetDepends() ([]Flag, error) { + var deps = make([]Flag, 0) + if rows, err := DBQuery("SELECT id_flag_dep FROM exercice_mcq_okey_deps WHERE id_mcq = ?", m.Id); err != nil { return nil, err } else { defer rows.Close() - var deps = make([]Flag, 0) for rows.Next() { var d int64 if err := rows.Scan(&d); err != nil { @@ -257,8 +268,27 @@ func (m MCQ) GetDepends() ([]Flag, error) { return nil, err } - return deps, nil } + + if rows, err := DBQuery("SELECT id_mcq_dep FROM exercice_mcq_omcq_deps WHERE id_mcq = ?", m.Id); err != nil { + return nil, err + } else { + defer rows.Close() + + for rows.Next() { + var d int64 + if err := rows.Scan(&d); err != nil { + return nil, err + } + deps = append(deps, MCQ{Id: d, IdExercice: m.IdExercice}) + } + if err := rows.Err(); err != nil { + return nil, err + } + + } + + return deps, nil } // GetJustifiedFlag searchs for a flag in the scope of the given exercice. diff --git a/libfic/reset.go b/libfic/reset.go index 4fb95236..483cd06e 100644 --- a/libfic/reset.go +++ b/libfic/reset.go @@ -50,6 +50,7 @@ func ResetExercices() (error) { "flag_found", "exercice_flags_omcq_deps", "exercice_mcq_okey_deps", + "exercice_mcq_omcq_deps", "exercice_flags_deps", "exercice_hints_deps", "flag_choices",