Global request data
The purpose of global-request data is to facilitate using global variable(s) within a single
request anywhere in your code. This is different from
global_process_data which is used across many requests.
You can of course create global variables in C (and use C's "extern" to make them available anywhere). Vely's global-request data is an easier and more structured way to share data globally within a single request, without having to actually define and maintain global variables. It also makes it more maintainable because the usage of shared global information is well-encapsulated and easy to track (for instance in code reviews).
What is global-request data
Global-request data is a generic pointer (void*) that points to any memory you wish to be shared among all your code within a single request. This memory is usually a structure containing information globally pertinent to your application. The pointer's scope is a single
request, and it is initialized to NULL before each request. It is stored in Vely's internal request structure so it can be used anywhere.
Setting
where <data> is a pointer to any memory you wish to use anywhere in your code.
Getting
Global-request data can be obtained anywhere in your code with:
where <data> is a pointer to any type.
Usage
Typically you would define a structure or a typedef that encapsulates any data that needs to be shared throughout your code during a single request processing.
Then in
before_request_handler, you would create the variable (or an array) of this type by using
new-mem - this way the memory is automatically released at the end of the request. Use
new-mem for any members that need allocating, thus eliminating the possibility of memory leaks. Initialize anything that needs it.
Next, save the pointer to the variable (or an array) you created by using
set-req.
Finally, anywhere you need to set or get any data, use
get-req to get the pointer and manipulate or read your global-request data.
Examples
Suppose your application has an include file my.h in which you define type "reqdata":
#ifndef _MY
#define _MY
typedef struct s_reqdata {
bool some_flag;
bool another_flag;
char *ptr;
} reqdata;
#endif
Your
before_request_handler might look like this - note that my.h is included, providing your type definition "reqdata":
#include "vely.h"
#include "my.h"
void _before () {
reqdata *rd;
new-mem rd size sizeof(reqdata)
rd->some_flag = false;
rd->another_flag = false;
set-req data rd
}
In the above code, a new pointer "rd" to type "reqdata" is created with
new-mem. Data initialization takes place - anything that needs initialization should be initialized. Finally, pointer "rd" is saved to request's internal structure with
set-req, so it can be used anywhere during request processing.
In your code, wherever it's needed, you can obtain this data into a local pointer of the same type "reqdata" (in this case pointer name is "mydata"). You can do that with
get-req and then examine or set any global variable you wish:
#include "vely.h"
#include "my.h"
void mycode () {
...
reqdata *mydata;
get-req data to mydata
if (mydata->another_flag) {
mydata->some_flag = true;
my_data->ptr = "some data";
}
}
See also
Requests (
after_request_handler before_request_handler building_URL getting_URL global_request_data non_request normalized_URL request request_URL startup_handler vely_dispatch_request )
SEE ALL (
documentation)