func (maker *courseMaker) GetByID(id int64) (*Course, error) { var ( err error get_course string = queries["get_course"] get_course_members string = queries["get_course_members"] get_course_teachers string = queries["get_course_teachers"] course *Course = NewCourse() studentIDs []int64 = []int64{} teacherIDs []int64 = []int64{} stmt *sqlx.Stmt acid util.AcidTx ) // Get the course's name. acid = func(tx *sqlx.Tx) { // Add the course stmt, err = tx.Preparex(get_course) PanicOnError(err) err = stmt.Get(course, id) PanicOnError(err) // Get the rows out of course_members stmt, err = tx.Preparex(get_course_members) PanicOnError(err) err = stmt.Select(&studentIDs, id) PanicOnError(err) // Get the rows out of course_teachers stmt, err = tx.Preparex(get_course_teachers) PanicOnError(err) stmt.Select(&teacherIDs, id) PanicOnError(err) for _, studentID := range studentIDs { student, err := StudentStore.GetByID(studentID) PanicOnError(err) course.Students = append(course.Students, student) } for _, teacherID := range teacherIDs { teacher, err := TeacherStore.GetByID(teacherID) PanicOnError(err) course.Teachers = append(course.Teachers, teacher) } } err = util.AcidCtx(acid, maker) if err != nil { return nil, err } return course, nil }
func GetAndMarshal(query string, db Execer, destination interface{}, args ...interface{}) (err error) { var stmt *sqlx.Stmt var acid AcidTx = func(tx *sqlx.Tx) { stmt, err = tx.Preparex(query) if err != nil { panic(err) } if err = stmt.Get(destination, args...); err != nil { panic(err) } } AcidCtx(acid, db) return err }