Exam data is stored via a storage provider, which is a list of functions.
Each user action will trigger a storage event for which one of the functions provided by the storage provider
is called.
See dbi_storage_provider()
for an implementation based on a DBI backend.
Storage providers must implement all of the functions listed under Storage functions.
The arguments to the storage functions are:
user
the user object (as returned from the configured authentication provider).
May be NULL
for get_section_data()
, in which case data for all users is requested.
exam_id
the exam id as given in the Rmd file.
exam_version
the exam version string as given in the Rmd file.
seed
an integer representing the random seed associated with the attempt.
started_at
the timestamp when the attempt was started (as POSIXct object in the system's timezone).
finished_at
the timestamp when the attempt was finished (as POSIXct object in the system's timezone).
attempt_id
the attempt identifier as returned by start_attempt()
or get_attempts()
.
section
the section identifier string. May be NULL
for get_section_data()
, in which case data for
all sections is requested.
section_data
an R list object with arbitrary elements. The storage function should not make any assumptions on the make-up of this list.
points
an R list object with arbitrary elements. The storage function should not make any assumptions on the make-up of this list.
...
additional arguments for future extensions.
create_attempt(user, exam_id, exam_version, seed, started_at, ...)
Create a new attempt with the given seed and start time.
The function should return a unique identifier for the attempt.
In case of an error, the function should return FALSE
.
finish_attempt(attempt_id, finished_at, ...)
Mark the attempt as finished.
The function should return TRUE
if the data is saved successfully and FALSE
in case of an error.
grade_attempt(attempt_id, points, ...)
Grade the given attempt, i.e., assign the given points to the attempt.
The function should return TRUE
if the points are saved successfully and FALSE
in case of an error.
get_attempts(user, exam_id, exam_version, ...)
Return a list of all previous attempts for the given filter.
The argument user
can be NULL
, in which case the function should return the attempts for all users.
The function must return a list of attempts. Each list object must contain the following:
id
the identifier associated with this attempt.
user
the user object associated with this attempt.
started_at
the time (as POSIXct object in the system's timezone) the attempt was started.
finished_at
the time (as POSIXct object in the system's timezone) the attempt
was finished, or NULL
if it has not been finished.
points
the R list object as given to grade_attempt()
, or NULL
if the attempt is not yet graded.
In case there are no attempts associated with this user and exam, or in the case of an error, the function should return an empty list.
save_section_data(attempt_id, section, section_data, ...)
Save the given section data.
The function should return TRUE
if the data is saved successfully and FALSE
in case of an error.
get_section_data(attempt_id, section, ...)
Query the most recent section data for the given attempt.
If section
is NULL
, the function should not filter data for this criterion.
In this case the function should return only the most recent section data available for the given attempt.
The function must return a list of section data objects matching the given filter. Each object must contain the
following:
section
the section identifier string as given in the call to save_section_data()
.
timestamp
the time (as POSIXct object in the system's timezone) the section data was saved.
section_data
the section data object as given in the call to save_section_data()
.
In case of an error, or if there is no data available for the given filter, the function should return an empty list.
get_last_section(attempt_id, ...)
Get the identifier of the section for which the most recent data is available.
The function should return a character with the section identifier of the section for which data was saved
most recently.
In case of an error, or if there is no data available for the given filter, the function should return NULL
.
Other storage configuration:
dbi_storage_provider()
,
setup_database()