Use pointer receiver more offen
This commit is contained in:
parent
6999b4e728
commit
c7569b5e54
59 changed files with 688 additions and 672 deletions
|
|
@ -16,7 +16,7 @@ type MCQ struct {
|
|||
// Title is the label of the question
|
||||
Title string `json:"title"`
|
||||
// Entries stores the set of proposed answers
|
||||
Entries []MCQ_entry `json:"entries"`
|
||||
Entries []*MCQ_entry `json:"entries"`
|
||||
}
|
||||
|
||||
// MCQ_entry represents a proposed response for a given MCQ.
|
||||
|
|
@ -29,20 +29,21 @@ type MCQ_entry struct {
|
|||
}
|
||||
|
||||
// GetMCQ returns a list of flags comming with the challenge.
|
||||
func GetMCQ(id int) (m MCQ, err error) {
|
||||
func GetMCQ(id int) (m *MCQ, err error) {
|
||||
m = &MCQ{}
|
||||
err = DBQueryRow("SELECT id_mcq, id_exercice, order, title FROM exercice_mcq WHERE id_mcq = ?", id).Scan(&m.Id, &m.IdExercice, &m.Order, &m.Title)
|
||||
m.fillEntries()
|
||||
return
|
||||
}
|
||||
|
||||
func (m *MCQ) fillEntries() ([]MCQ_entry, error) {
|
||||
func (m *MCQ) fillEntries() ([]*MCQ_entry, error) {
|
||||
if entries_rows, err := DBQuery("SELECT id_mcq_entry, label, response FROM mcq_entries WHERE id_mcq = ?", m.Id); err != nil {
|
||||
return nil, err
|
||||
} else {
|
||||
defer entries_rows.Close()
|
||||
|
||||
for entries_rows.Next() {
|
||||
var e MCQ_entry
|
||||
e := &MCQ_entry{}
|
||||
|
||||
if err := entries_rows.Scan(&e.Id, &e.Label, &e.Response); err != nil {
|
||||
return nil, err
|
||||
|
|
@ -56,15 +57,15 @@ func (m *MCQ) fillEntries() ([]MCQ_entry, error) {
|
|||
}
|
||||
|
||||
// GetMCQ returns the MCQs coming with the challenge.
|
||||
func (e Exercice) GetMCQ() ([]MCQ, error) {
|
||||
func (e *Exercice) GetMCQ() ([]*MCQ, error) {
|
||||
if rows, err := DBQuery("SELECT id_mcq, id_exercice, ordre, title FROM exercice_mcq WHERE id_exercice = ?", e.Id); err != nil {
|
||||
return nil, err
|
||||
} else {
|
||||
defer rows.Close()
|
||||
|
||||
var mcqs = make([]MCQ, 0)
|
||||
var mcqs = []*MCQ{}
|
||||
for rows.Next() {
|
||||
var m MCQ
|
||||
m := &MCQ{}
|
||||
m.IdExercice = e.Id
|
||||
|
||||
if err := rows.Scan(&m.Id, &m.IdExercice, &m.Order, &m.Title); err != nil {
|
||||
|
|
@ -84,18 +85,19 @@ func (e Exercice) GetMCQ() ([]MCQ, error) {
|
|||
}
|
||||
|
||||
// GetMCQbyChoice returns the MCQ corresponding to a choice ID.
|
||||
func GetMCQbyChoice(cid int) (m MCQ, c MCQ_entry, err error) {
|
||||
func GetMCQbyChoice(cid int) (m *MCQ, c *MCQ_entry, err error) {
|
||||
m = &MCQ{}
|
||||
if errr := DBQueryRow("SELECT id_mcq, id_exercice, ordre, title FROM exercice_mcq WHERE id_mcq = (SELECT id_mcq FROM mcq_entries WHERE id_mcq_entry = ?)", cid).Scan(&m.Id, &m.IdExercice, &m.Order, &m.Title); errr != nil {
|
||||
return MCQ{}, MCQ_entry{}, errr
|
||||
return nil, nil, errr
|
||||
}
|
||||
|
||||
if entries_rows, errr := DBQuery("SELECT id_mcq_entry, label, response FROM mcq_entries WHERE id_mcq = ?", m.Id); errr != nil {
|
||||
return MCQ{}, MCQ_entry{}, errr
|
||||
return nil, nil, errr
|
||||
} else {
|
||||
defer entries_rows.Close()
|
||||
|
||||
for entries_rows.Next() {
|
||||
var e MCQ_entry
|
||||
e := &MCQ_entry{}
|
||||
|
||||
if err = entries_rows.Scan(&e.Id, &e.Label, &e.Response); err != nil {
|
||||
return
|
||||
|
|
@ -113,21 +115,21 @@ func GetMCQbyChoice(cid int) (m MCQ, c MCQ_entry, err error) {
|
|||
}
|
||||
|
||||
// GetId returns the MCQ identifier.
|
||||
func (m MCQ) GetId() int {
|
||||
func (m *MCQ) GetId() int {
|
||||
return m.Id
|
||||
}
|
||||
|
||||
// RecoverId returns the MCQ identifier as register in DB.
|
||||
func (m MCQ) RecoverId() (Flag, error) {
|
||||
func (m *MCQ) RecoverId() (Flag, error) {
|
||||
if err := DBQueryRow("SELECT id_mcq FROM exercice_mcq WHERE title LIKE ? AND id_exercice = ?", m.Title, m.IdExercice).Scan(&m.Id); err != nil {
|
||||
return MCQ{}, err
|
||||
return nil, err
|
||||
} else {
|
||||
return m, err
|
||||
}
|
||||
}
|
||||
|
||||
// Create registers a MCQ into the database and recursively add its entries.
|
||||
func (m MCQ) Create(e Exercice) (Flag, error) {
|
||||
func (m *MCQ) Create(e *Exercice) (Flag, error) {
|
||||
if res, err := DBExec("INSERT INTO exercice_mcq (id_exercice, ordre, title) VALUES (?, ?, ?)", e.Id, m.Order, m.Title); err != nil {
|
||||
return m, err
|
||||
} else if qid, err := res.LastInsertId(); err != nil {
|
||||
|
|
@ -150,7 +152,7 @@ func (m MCQ) Create(e Exercice) (Flag, error) {
|
|||
}
|
||||
|
||||
// Update applies modifications back to the database.
|
||||
func (m MCQ) Update() (int64, error) {
|
||||
func (m *MCQ) Update() (int64, error) {
|
||||
if res, err := DBExec("UPDATE exercice_mcq SET id_exercice = ?, ordre = ?, title = ? WHERE id_mcq = ?", m.IdExercice, m.Order, m.Title, m.Id); err != nil {
|
||||
return 0, err
|
||||
} else if nb, err := res.RowsAffected(); err != nil {
|
||||
|
|
@ -161,7 +163,7 @@ func (m MCQ) Update() (int64, error) {
|
|||
}
|
||||
|
||||
// Delete the MCQ from the database.
|
||||
func (m MCQ) Delete() (int64, error) {
|
||||
func (m *MCQ) Delete() (int64, error) {
|
||||
if _, err := DBExec("DELETE FROM exercice_files_omcq_deps WHERE id_mcq = ?", m.Id); err != nil {
|
||||
return 0, err
|
||||
} else if _, err := DBExec("DELETE FROM exercice_mcq_okey_deps WHERE id_mcq = ?", m.Id); err != nil {
|
||||
|
|
@ -184,7 +186,7 @@ func (m MCQ) Delete() (int64, error) {
|
|||
}
|
||||
|
||||
// AddEntry creates and fills a new struct MCQ_entry and registers it into the database.
|
||||
func (m MCQ) AddEntry(e MCQ_entry) (MCQ_entry, error) {
|
||||
func (m *MCQ) AddEntry(e *MCQ_entry) (*MCQ_entry, error) {
|
||||
if res, err := DBExec("INSERT INTO mcq_entries (id_mcq, label, response) VALUES (?, ?, ?)", m.Id, e.Label, e.Response); err != nil {
|
||||
return e, err
|
||||
} else if nid, err := res.LastInsertId(); err != nil {
|
||||
|
|
@ -196,7 +198,7 @@ func (m MCQ) AddEntry(e MCQ_entry) (MCQ_entry, error) {
|
|||
}
|
||||
|
||||
// Update applies modifications back to the database.
|
||||
func (n MCQ_entry) Update() (int64, error) {
|
||||
func (n *MCQ_entry) Update() (int64, error) {
|
||||
if res, err := DBExec("UPDATE mcq_entries SET label = ?, response = ? WHERE id_mcq = ?", n.Label, n.Response, n.Id); err != nil {
|
||||
return 0, err
|
||||
} else if nb, err := res.RowsAffected(); err != nil {
|
||||
|
|
@ -207,7 +209,7 @@ func (n MCQ_entry) Update() (int64, error) {
|
|||
}
|
||||
|
||||
// Delete the MCQ entry from the database.
|
||||
func (n MCQ_entry) Delete() (int64, error) {
|
||||
func (n *MCQ_entry) Delete() (int64, error) {
|
||||
if res, err := DBExec("DELETE FROM mcq_entries WHERE id_mcq_entry = ?", n.Id); err != nil {
|
||||
return 0, err
|
||||
} else if nb, err := res.RowsAffected(); err != nil {
|
||||
|
|
@ -218,7 +220,7 @@ func (n MCQ_entry) Delete() (int64, error) {
|
|||
}
|
||||
|
||||
// WipeMCQs deletes MCQs coming with the challenge.
|
||||
func (e Exercice) WipeMCQs() (int64, error) {
|
||||
func (e *Exercice) WipeMCQs() (int64, error) {
|
||||
if _, err := DBExec("DELETE FROM exercice_files_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 mcq_entries WHERE id_mcq IN (SELECT id_mcq FROM exercice_mcq WHERE id_exercice = ?);", e.Id); err != nil {
|
||||
|
|
@ -240,25 +242,25 @@ func (e Exercice) WipeMCQs() (int64, error) {
|
|||
}
|
||||
}
|
||||
|
||||
func (m MCQ) GetOrder() int8 {
|
||||
func (m *MCQ) GetOrder() int8 {
|
||||
return m.Order
|
||||
}
|
||||
|
||||
// AddDepend insert a new dependency to a given flag.
|
||||
func (m MCQ) AddDepend(j Flag) (err error) {
|
||||
if d, ok := j.(FlagKey); ok {
|
||||
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 {
|
||||
} 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.")
|
||||
err = errors.New("dependancy type not implemented for this flag")
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// GetDepends retrieve the flag's dependency list.
|
||||
func (m MCQ) GetDepends() ([]Flag, error) {
|
||||
var deps = make([]Flag, 0)
|
||||
func (m *MCQ) GetDepends() ([]Flag, error) {
|
||||
deps := []Flag{}
|
||||
|
||||
if rows, err := DBQuery("SELECT id_flag_dep FROM exercice_mcq_okey_deps WHERE id_mcq = ?", m.Id); err != nil {
|
||||
return nil, err
|
||||
|
|
@ -270,7 +272,7 @@ func (m MCQ) GetDepends() ([]Flag, error) {
|
|||
if err := rows.Scan(&d); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
deps = append(deps, FlagKey{Id: d, IdExercice: m.IdExercice})
|
||||
deps = append(deps, &FlagKey{Id: d, IdExercice: m.IdExercice})
|
||||
}
|
||||
if err := rows.Err(); err != nil {
|
||||
return nil, err
|
||||
|
|
@ -288,7 +290,7 @@ func (m MCQ) GetDepends() ([]Flag, error) {
|
|||
if err := rows.Scan(&d); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
deps = append(deps, MCQ{Id: d, IdExercice: m.IdExercice})
|
||||
deps = append(deps, &MCQ{Id: d, IdExercice: m.IdExercice})
|
||||
}
|
||||
if err := rows.Err(); err != nil {
|
||||
return nil, err
|
||||
|
|
@ -300,12 +302,12 @@ func (m MCQ) GetDepends() ([]Flag, error) {
|
|||
}
|
||||
|
||||
// GetJustifiedFlag searchs for a flag in the scope of the given exercice.
|
||||
func (c MCQ_entry) GetJustifiedFlag(e Exercice) (FlagKey, error) {
|
||||
func (c *MCQ_entry) GetJustifiedFlag(e *Exercice) (*FlagKey, error) {
|
||||
return e.GetFlagKeyByLabel(fmt.Sprintf("\\%%%d\\%%%%", c.Id))
|
||||
}
|
||||
|
||||
// Check if the given vals are the expected ones to validate this flag.
|
||||
func (m MCQ) Check(v interface{}) int {
|
||||
func (m *MCQ) Check(v interface{}) int {
|
||||
var vals map[int]bool
|
||||
if va, ok := v.(map[int]bool); !ok {
|
||||
return -1
|
||||
|
|
@ -326,6 +328,6 @@ func (m MCQ) Check(v interface{}) int {
|
|||
}
|
||||
|
||||
// FoundBy registers in the database that the given Team solved the MCQ.
|
||||
func (m MCQ) FoundBy(t Team) {
|
||||
func (m *MCQ) FoundBy(t *Team) {
|
||||
DBExec("INSERT INTO mcq_found (id_mcq, id_team, time) VALUES (?, ?, ?)", m.Id, t.Id, time.Now())
|
||||
}
|
||||
|
|
|
|||
Reference in a new issue