docs.roxen.comBack to normal mode
DocsRoxenWebServer 4.0System Developer ManualThe Roxen Module API
Copyright  2006, Roxen Internet Software
Suggestions, comments & compliments

Module Variables

Roxen modules have other common denominators than those mentioned on the previous pages - the concept of administrator configurable variables for whatever module configuration data your module might depend on. Besides the variable types mentioned here, you may extend Roxen with user-defined data types, for which you create the widgetry, define storage methods and so on.

The module variables accessable from the administration interface are defined using defvar(), queried using query() or QUERY(), can be undefined using killvar(), may be altered run-time using set() or tweaked with using the variable object's own methods, after getting hold of the variable object with getvar().

Each roxen module may or may not choose to define any number of variables, each having a name unique to the module (to identify it when referring to it, polling or modifying its value, visibility or similar). The variable definition is shared among all instances of your module, but each module may have been set up with different operating parameters by the administrator, so their values may differ. The configuration data resides with the configuration data of the virtual server that the module is loaded in, where each instance of a module has its own region.

As a technical curiosity, it can be noted that module variables are quite memory conservative - even a huge roxen server setup with thousands of virtual servers, each with several modules loaded, won't gnaw away as much memory as would an older roxen (or any caudium) server. This is possible, since module variables that have not changed from their preset values (which is typically the case, since most variables have reasonable defaults), may fall back on that value, which can be found in the module's definition, instead of among its data.

In short: if you encounter some situation where there is reason to provide an administrator a choice of operating parameters, don't make constant declarations in your code - define module variables instead. It's easy, both for you as a programmer and for the administrator, more fault-tolerant (not having anybody meddling with your code), as robust as you care to make it (you may equip your variable objects with hooks to verify input validity, should the datatype be too lax for your own taste and purposes), it provides an easy way to document your variables, only show those variables that are relevant given the circumstances and finally - it even looks nice! (Never underestimate the value of readable code. :-)

Variable.Variable defvar(string name, Variable.Variable var)

Defines a module variable var, giving it the unique identifier name (this name is used when accessing the variable with query(), set() and friends). The recommended place to put your defvar() declarations is in your module's create() callback, such as:

void create(Configuration|void conf)
  defvar("location", Variable.Location("/cgi-bin/",
	 0, "CGI-bin path", "This is where the "
	 "module will be inserted in the virtual "
	 "namespace of your server."));

  defvar("errors", Variable.Flag(0, 0,
         "Report errors visibly", "If this flag "
	 "is set, errors will not only show up "
	 "in the debug log file."));

For info on the available variable types, and the full host of API methods available in the variable objects themselves, see the docs for Variable.Variable.

In roxen versions 2.0 and older, the defvar() API looked a bit differently (and the old-style API is still legal, for backwards compatibility) - it is mentioned here only for ease of reading and understanding legacy code:

Variable.Variable defvar(string var, mixed value, string name, int type, string doc, array|void misc, int|function|void hide_if_true)

A deprecated (although it will be supported for the forseeable future) compatibility version of the function. This is how you read its parameters:

string var

The variable identifier

mixed value

The default value

string name

The name of the variable that gets presented in the admin interface

int type

The type of the variable (one of the TYPE_ defines defined in module.h). These constants correspond to the various Variable.Variable classes (similarly named minus the TYPE_ prefix) used in the new API.

string doc

The variable documentation string

array|void misc

Additional type-dependent data

int|function|void hide_if_true

The constant 1 to always hide the variable from the administrator, 0 to never hide it, or a function returning 1 when the variable should be hidden and 0 otherwise.

mixed query(string var, int|void ok)

Query the value of the variable var. If ok is true, it is not an error if the specified variable does not exist. Instead, UNDEFINED (the value 0 with zero_type()==1) is returned.


Compatibility/convenience macro defined in module.h that is synonym to query(), apart from its syntax. If you prefer the syntax QUERY(var) to query("var"), feel free to use that instead. There used to be a speed difference in older versions of roxen, where the QUERY() method was slightly faster (didn't perform any error checking), but that is no longer the case.

int killvar(string var)

Undefine the previously defined variable var. This is useful mainly when inheriting another module (filesystem.pike, for instance), and all of its variables do no apply to your extended or otherwise modified version.

void set(string var, mixed value)

Set the variable var to the specified value. Typically used when you have invisible variables where you save some form of module state that should survive a server restart, but that is not meaned to be modified by an administrator.

Variable.Variable getvar(string name)

Return the variable object associated with the specified variable.