![]() | ![]() | |||||||||||||||
| ||||||||||||||||
Interpreter DirectivesPragmas, or interpreter directives, provide additional instructions to AdaScript. The Pragmas
Shell VariablesUNIX-like operating systems have environment variables. These are variables that the operating system assign to your running program. You can also read environment variables using the command_line package. Importing Shell Environment VariablesNormally, SparForte will not copy your environment variables into SparForte. Instead, you request the variables using pragma import. SparForte will examine the environment variables and, if it finds one with the same name, the SparForte variable will have the same value as the environment variable.
=> JAVA_HOME : string
Example: Importing an environment variable on the command line
A few variables are automatically imported when SparForte runs. These variables are needed for the proper functioning of the shell (for example, HOME). You can also use the --import-all command line option to import all the environment variables. However, --import-all is meant to be a convenience or debugging tool: it is a better technique to import only what your script needs to run. You can examine a variable with env to see if it is imported or exported.
=> env HOME If the variable doesn't exist, SparForte will report an error. This behaviour can be overridden using pragma unchecked_import: if the variable doesn't exist in the environment, the value will be unchanged. It is a good idea to assign a default value. If you are using SparForte as your login shell, there is nothing to import: there's no previous shell to import variable from to put them into SparForte. Exporting Shell Environment VariablesTo make your Sparforte variables visble to other programs, such as external commands, you must export the variable into the operating system environment variables with pragma export. This exporting process occurs whenever an external command is executed, the standard technique in shells.
=> JAVA_HOME : string := "/usr/lib64/jvm/java" If you use SparForte as your login shell, variables like JAVA_HOME can be set up in your SparForte profile file so they are created and exported whenever you log in. Both Importing and Exporting, and Volatile Shell Environment VariablesEnvironment variables can be both imported and exported by using both pragmas.
=> DISPLAY : string;
Example: Importing and Exporting the X Windows DISPLAY variable
Pragma volatile will mark a variable as "volatile", meaning that its value can change unexpectedly and SparForte should reload the value from the environment whenever it is referenced. Although you can make volatile environment variables, it probably won't be useful: these variables are owned by the running process, which is SparForte, so it is virtually impossible to change their values except using the SparForte itself. CGI VariablesCGI variables are the HTTP FORM tag variables submitted from a web page. If you are in a web template (if you used pragma template or pragma unrestricted_template), you can read the variables using pragma import. If the variable doesn't exist, SparForte will report an error. This behaviour can be overridden using pragma unchecked_import: if the variable doesn't exist in the environment, the value will be unchanged. It is a good idea to assign a default value. You cannot export CGI variables: there's nowhere to export the values to. Pragma volatile can be used, but like shell variables, it has no meaningful effect: the CGI variables will not change while in a template. You can also read CGI variables using the CGI package. Local Memcache VariablesMemcached (or the Memcache Daemon) is a general-purpose networked memory caching system that was originally developed by Danga Interactive for LiveJournal, but is now used by many other sites. It is often used to speed up dynamic database-driven websites by caching data and objects in RAM to reduce the number of times an external data source (such as a database or API) must be read. Memcached has been used by web sites including YouTube, Facebook and Twitter. SparForte supports memcached natively (that is, you don't need to use a special package to access memcached.) The memcached support is built on the PegaSoft PegaSock socket library, which supports local memcached caching as well as distributed, redundant memcached caching clusters. One important rule: PegaSock expects a non-empty string for all variable values (it uses an empty string to represent a cache miss.) When importing or exporting to local_memcache, the variables will be imported or exported from your local machine. SparForte expects to find a memcached server running on localhost and port 11211 (the default memcached port). All SparForte scripts running on the same server can access the memcache variables.
=> s : string := "test"
Example: A simple command line example of local_memcache
Importing with MemcacheWhen importing, The variable will be read from memcache when pragma import is used.
=> user_count : string
Example: Importing a memcached variable on the command line
(For example, if you import a variable named "user_count", SparForte will request the value of "user_count" from memcached hash table on the localhost using a memcached GET command.) If the variable doesn't exist, SparForte will report an error. This behaviour can be overridden using pragma unchecked_import: if the variable doesn't exist in the environment, the value will be unchanged. It is a good idea to assign a default value. The variable will normally be read at the time of importing, though this behaviour can be changed with pragam volatile (see below). You can use a declare block to get the value at your discretion by using an imported variable.
declare
Example: Using declare to import on demand
Exporting with MemcacheWhen exporting, the variable's final value will be stored in memcache with the memcache SET command when the varible goes out of scope or is destroyed with unset. You can update the value at any time using a declare block and an exported variable:
new_status_value := "good";
Example: Using declare to export on demand
Importing, Exporting and Volatile with MemcacheIt is possible to declare a variable as both imported and exported using both import/export pragmas. Pragma volatile will mark a variable as "volatile", meaning that its value can change unexpectedly and SparForte should reload the value from the memcached whenever it is referenced. You can declare a variable as import, export and volatile. For example:
declare
Example: Using import, export and volatile
In this example, the assignment statement will get the latest value for user_count, convert it to a number, add 1 and convert the result back to a string. When the declare block ends, the value of user_count will be stored in memcached. Bear in mind that this kind of operation is not atomic: another script could try to update user_count in memcache before the first script can write the result. If you want to lock access to the variable to guarantee exclusive access, you will need to use the lock_file package or a similar approach. Handling Server FailuresPegaSock uses a countdown system when a memcache server cannot be found. If it cannot connect, it marks the server as off-line and will return cache misses for several commands. After enough commands have passed, it will attempt to reconnect to memcached. These "back offs" are escallating: each failed reconnect attempt will result in a longer backoff period. This is done for performance reasons: establishing new network connections is a very slow operation. If you don't have memcached running on your local machine, it will have the same effect. You'll periodically see warning messages from PegaSock because it is unable to establish a connection.
=> s : string
Example: The memcached server is not running or cannot be accessed
Distributed Memcache VariablesIf you have memcached running on two or more servers, you can create a redundant distributed cache using the "memcache" method instead of "local_memcache". In order to use a distributed cache, inform SparForte of what servers to use with pragma register_memcache_server.
=> pragma register_memcache_server( "cachehost1", 11211 );
Example: Importing a variable stored on two hosts
With more than one server, SparForte will store the variable on two servers. If one server should fail, it wil retrieve the variable value from the other. |
Block Statements and Subprograms |