Implement hint dependancy on mcq

This commit is contained in:
nemunaire 2020-01-23 12:39:53 +01:00
parent 6d5e2bcb65
commit 4820d42327
4 changed files with 41 additions and 7 deletions

View File

@ -184,7 +184,7 @@ CREATE TABLE IF NOT EXISTS exercice_flags(
return err
}
if _, err := db.Exec(`
CREATE TABLE IF NOT EXISTS exercice_hints_deps(
CREATE TABLE IF NOT EXISTS exercice_hints_okey_deps(
id_hint INTEGER NOT NULL,
id_flag_dep INTEGER NOT NULL,
FOREIGN KEY(id_hint) REFERENCES exercice_hints(id_hint),
@ -241,6 +241,16 @@ CREATE TABLE IF NOT EXISTS exercice_files_omcq_deps(
FOREIGN KEY(id_file) REFERENCES exercice_files(id_file),
FOREIGN KEY(id_mcq) 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_hints_omcq_deps(
id_hint INTEGER NOT NULL,
id_mcq_dep INTEGER NOT NULL,
FOREIGN KEY(id_hint) REFERENCES exercice_hints(id_hint),
FOREIGN KEY(id_mcq_dep) REFERENCES exercice_flags(id_flag)
) DEFAULT CHARACTER SET = utf8 COLLATE = utf8_bin;
`); err != nil {
return err
}
@ -340,7 +350,7 @@ CREATE TABLE IF NOT EXISTS exercice_tags(
id_exercice INTEGER NOT NULL,
tag VARCHAR(255) NOT NULL,
FOREIGN KEY(id_exercice) REFERENCES exercices(id_exercice)
) DEFAULT CHARACTER SET = utf8 COLLATE = utf8_bin;
) DEFAULT CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
`); err != nil {
return err
}

View File

@ -52,7 +52,9 @@ func (e Exercice) WipeFlags() (int64, error) {
return 0, err
} else if _, err := DBExec("DELETE FROM exercice_flags_omcq_deps WHERE id_flag IN (SELECT id_flag FROM exercice_flags WHERE id_exercice = ?)", e.Id); err != nil {
return 0, err
} else if _, err := DBExec("DELETE FROM exercice_hints_deps WHERE id_flag_dep IN (SELECT id_flag FROM exercice_flags WHERE id_exercice = ?)", e.Id); err != nil {
} else if _, err := DBExec("DELETE FROM exercice_hints_okey_deps WHERE id_flag_dep IN (SELECT id_flag FROM exercice_flags WHERE id_exercice = ?)", e.Id); err != nil {
return 0, err
} else if _, err := DBExec("DELETE FROM exercice_hints_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 _, err := DBExec("DELETE FROM exercice_mcq_okey_deps WHERE id_flag_dep IN (SELECT id_flag FROM exercice_flags WHERE id_exercice = ?)", e.Id); err != nil {
return 0, err

View File

@ -118,7 +118,9 @@ func (h EHint) Delete() (int64, error) {
// WipeHints deletes (only in the database, not on disk) hints coming with the challenge.
func (e Exercice) WipeHints() (int64, error) {
if _, err := DBExec("DELETE FROM exercice_hints_deps WHERE id_hint IN (SELECT id_hint FROM exercice_hints WHERE id_exercice = ?)", e.Id); err != nil {
if _, err := DBExec("DELETE FROM exercice_hints_okey_deps WHERE id_hint IN (SELECT id_hint FROM exercice_hints WHERE id_exercice = ?)", e.Id); err != nil {
return 0, err
} else if _, err := DBExec("DELETE FROM exercice_hints_omcq_deps WHERE id_hint IN (SELECT id_hint FROM exercice_hints WHERE id_exercice = ?)", e.Id); err != nil {
return 0, err
} else if res, err := DBExec("DELETE FROM exercice_hints WHERE id_exercice = ?", e.Id); err != nil {
return 0, err
@ -132,7 +134,9 @@ func (e Exercice) WipeHints() (int64, error) {
// AddDepend insert a new dependency to a given flag.
func (h EHint) AddDepend(f Flag) (err error) {
if d, ok := f.(FlagKey); ok {
_, err = DBExec("INSERT INTO exercice_hints_deps (id_hint, id_flag_dep) VALUES (?, ?)", h.Id, d.Id)
_, err = DBExec("INSERT INTO exercice_hints_okey_deps (id_hint, id_flag_dep) VALUES (?, ?)", h.Id, d.Id)
} else if d, ok := f.(MCQ); ok {
_, err = DBExec("INSERT INTO exercice_hints_omcq_deps (id_hint, id_mcq_dep) VALUES (?, ?)", h.Id, d.Id)
} else {
err = errors.New(fmt.Sprintf("Dependancy type for key (%T) not implemented for this flag.", f))
}
@ -143,7 +147,7 @@ func (h EHint) AddDepend(f Flag) (err error) {
func (h EHint) GetDepends() ([]Flag, error) {
var deps = make([]Flag, 0)
if rows, err := DBQuery("SELECT id_flag_dep FROM exercice_hints_deps WHERE id_hint = ?", h.Id); err != nil {
if rows, err := DBQuery("SELECT id_flag_dep FROM exercice_hints_okey_deps WHERE id_hint = ?", h.Id); err != nil {
return nil, err
} else {
defer rows.Close()
@ -160,6 +164,23 @@ func (h EHint) GetDepends() ([]Flag, error) {
}
}
if rows, err := DBQuery("SELECT id_mcq_dep FROM exercice_hints_omcq_deps WHERE id_hint = ?", h.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: h.IdExercice})
}
if err := rows.Err(); err != nil {
return nil, err
}
}
return deps, nil
}

View File

@ -52,7 +52,8 @@ func ResetExercices() (error) {
"exercice_mcq_okey_deps",
"exercice_mcq_omcq_deps",
"exercice_flags_deps",
"exercice_hints_deps",
"exercice_hints_okey_deps",
"exercice_hints_omcq_deps",
"flag_choices",
"exercice_flags",
"exercice_solved",