
A web application environment.
Radianceについて
Radianceは、Webアプリケーションの開発環境です。Webフレームワークのようなものですが、より汎用的で、自由にカスタマイズできます。特別な変更を加える必要なく、個人的なWebサイトやWebアプリケーションを簡単に書くことができます。
入手方法
Radiance本体、関連するモジュールやアプリケーションは、Quicklispを通して配布されています。Radianceをインストールするには、次のようにします。
(ql-dist:install-dist "http://dist.shirakumo.org/shirakumo.txt")
(ql:quickload :radiance)
以上で、Quicklispのquickload
コマンドでPurplishなどのRadianceモジュールを利用できるようになります。
チュートリアル
Radianceのチュートリアルはこちらです。チュートリアルを通して、Radianceの使い方に慣れることができます。Radianceの重要な概念やWebアプリケーションの書き方を紹介しています。特定の機能が必要なときに、どこを調べれば良いかが分かるようにしました。チュートリアルの最後では、Radianceの本番環境でのインストールとデプロイ方法について説明しています。
簡単な例
あなたが一番したいことはユーザにHTMLを配信することでしょう。その方向で進めながら、少しずつ拡張していきます。まずはRadianceの準備をします。
(ql:quickload :radiance)
(radiance:startup)
初めてRadianceを使う場合には、r-welcome
モジュールを使ってください。r-welcome
モジュールを使うと、Welcomeページへのリンクを取得してブラウザで開くことができます。まずは小さなページにリンクをはります。
(in-package :rad-user)
(define-page example "/example" ()
(setf (content-type *response*) "text/plain")
"Hi!")
localhost:8080/exampleにアクセスすると、"Hi"と表示されるはずです。これではかなり退屈ですね。次はcl-whoを用いてHTMLを出してみましょう。
(ql:quickload :cl-who)
(define-page example "/example" ()
(cl-who:with-html-output-to-string (o)
(cl-who:htm
(:html
(:head (:title "Example Page"))
(:body (:header (:h1 "Couldn't Be Simpler."))
(:main (:p "Trust me on this one.")))))))
普通であれば、ここからフォントの書式を変えたりCSSを追加しながらページのデザインを作っていくかと思います。HTMLにCSSを読み込ませることは可能ですが、長い目でみれば最良の方法とはいえません。
ここでは、モジュール(module)の作り方を紹介します。モジュールを使うことで、Webページを適切に整理することができます。モジュールに必要なファイルは手動で作れますが、ここでは雛形を用いてモジュールを自動生成します。
(create-module "example")
モジュールは自動生成されると、モジュールへのパスが返されます。生成されるものは、ASDFのシステムファイル、Lispのmainファイル、2つのフォルダ(static
とtemplate
)です。
static
フォルダには、静的に配信されるファイルが入ります。template
には、テンプレートエンジン関連のファイルが入ります。
example.lisp
を開いて、先ほどのコードを元にページを定義しましょう。
(define-page example "/example" ()
(cl-who:with-html-output-to-string (o)
(cl-who:htm
(:html
(:head (:title "Example Page"))
(:body (:header (:h1 "Couldn't Be Simpler."))
(:main (:p "Trust me on this one.")))))))
ページはシンボルの名前で特定されます。独自にモジュールを作成すると、新しいパッケージが生成されます。上の例において、シンボルexample
は一度も使われていないシンボルです。パッケージ内での名前衝突を避けるために、rad-userパッケージ
でページを消す必要があるかもしれません。
(remove-page 'rad-user::example)
次に簡単なCSSファイルを作りましょう。static
フォルダにexample.css
という名前で作成してください。CSSを書くのが面倒であれば、次のCSSコードを使ってください。
body{
font-family: sans-serif;
font-size: 12pt;
background: #EEE;
}
header{
text-align: center;
}
main{
width: 800px;
margin: 0 auto 0 auto;
background: #FFF;
padding: 10px;
border: 1px solid #BBB;
border-radius: 5px;
}
HTMLがこのCSSファイルにリンクするように修正しましょう。後では、アドレスをCSSファイルに対応づけるために、Radianceのルーティングシステムを利用しますが、ここでは利用せずに進めていきます。
(define-page example "/example" ()
(cl-who:with-html-output-to-string (o)
(cl-who:htm
(:html
(:head (:title "Example Page")
(:link :rel "stylesheet" :type "text/css"
:href (uri-to-url "/static/example/example.css" :representation :external)))
(:body (:header (:h1 "Couldn't Be Simpler."))
(:main (:p "Trust me on this one.")))))))
ページを再度読み込むと、スタイルが適用されているはずです。uri-to-url
が動作する原理については、後で詳しく説明します。大切な点は、どのようにセットアップしても、静的ファイルへのリンクが適切に処理されることです。
1. Radianceの概念と要素(Radiance Concepts & Parts)
1.1 URI
URI
はRadianceの中心的な概念です。URIはオブジェクトであり、ドメイン
、ポート番号(オプション)
、パス
を含むリストです。
RadianceのURIは、URIから一般的な要素を抽出したもので、スキーマ、クエリ、フラグメント等は含みません。domains
のURIは、フレームワークにおいて複数の場所で使われる点が普通と違います。URIはlocation
を捕捉したりdispatch matching
を処理するために使われます。
URIは変更可能です。ただし、URIの修正は重要なパスに依存する場所で行われるはずなので、パフォーマンスの点で重要です。また、想定外の方法でURIを修正した場合、予想外の動作を引き起こす可能性があります。
URIは固有の文字列で表現されて、文字列にシリアライズすることができます。また、文字列をパーズして完全なURIオブジェクトに戻すことも可能です。URIはFASLファイルにリテラルで書き出されるので、マクロから吐き出すことも可能です。URIのシンタックスは、次の通りです。
URI ::= DOMAINS? (':' PORT)? '/' PATH?
DOMAINS ::= DOMAIN ('.' DOMAIN)*
DOMAIN ::= ('a'..'Z' | '0'..'9' | '-')
PORT ::= ('0'..'9'){1, 5}
PATH ::= .*
URIをURLに変換するにはuri-to-url
を使います。uri-to-url
を使うと、リバース(reversal)、エンコーディング、フォーマットの修正は自動で行われます。
uri
, domains
, port
, path
, matcher
, uri-string
, make-uri
, make-url
, ensure-uri
, copy-uri
, parse-uri
, uri<
, uri>
, uri=
, uri-matches
, merge-uris
, represent-uri
, uri-to-url
を参考にしてください。
1.2 リクエストとレスポンス(Request and Response)
サーバを行き来するデータを格納するには、request
オブジェクトとresponse
オブジェクトを使います。request
オブジェクトは、リクエストがどこに向かうのかを表すURI、ヘッダ、POSTやGETのペイロード、クッキーなど、全ての情報を保持します。また、response
オブジェクトは、リターンコード、ヘッダー、クッキー、BODYのデータを保持します。
リクエストが行われている間、これらの2つのオブジェクトは必ず存在し、*request*
と*response*
に束縛されます。それらは、動的なページ生成のために必要な多くの情報を含みます。*request*
にはdata
テーブルがあり、任意のデータを保存することができます。これは、システム内の部品の間でリクエストの実行中に取得される情報を扱うときに役立ちます。
リクエストは、必ずしもHTTPサーバから来る必要はありません。動作をテストするために、プログラムからリクエストを送ることも可能です。どのような場合でも、リクエストをディスパッチするインターフェイスはrequest
と呼ばれます。この仕組みは、リクエストとレスポンスを構築して、URIを適切に処理します。もし独自にリクエストオブジェクトを送る場合はexecute-request
を使うこともできます。
リクエスト処理に関する詳しい情報は、dispatcher、pages、API endpointをご参照ください。
*request*
, *response*
, *default-external-format*
, *default-content-type*
, request
, uri
, http-method
, headers
, post-data
, get-data
, cookies
, user-agent
, referer
, domain
, remote
, data
, issue-time
, response
, data
, return-code
, content-type
, external-format
, headers
, cookies
, cookie
, name
, value
, domain
, path
, expires
, http-only
, secure
, cookie-header
, cookie
, get-var
, post-var
, post/get
, header
, file
, redirect
, serve-file
, request-run-time
, *debugger*
, handle-condition
, render-error-page
, execute-request
, set-data
, request
も参考にしてしてください。
1.3 ルート(Route)
リクエストは、ルーティングシステムを通してディスパッチされます。他のフレームワークにおいてroutes
は、どのハンドラがリクエストを処理するかを指定しますが、Radianceではその方式とは違います。Radianceにおいてルート(route
)とは、URIを変換するフォームです。ルートは、2つの世界を作成して保持します。内部の世界と外部の世界です。
内部の世界は、Webアプリケーションが実際に動作する世界です。外部の世界は、HTTPサーバとWebサイトを利用するユーザが暮らす世界です。この区別は、サーバの潜在的な罠を避けてWebアプリケーションを書くために必要不可欠です。あなたは、アプリケーションを動作させるために、どのドメインやポートやパスが必要になるかを心配する必要はありません。また、Webの管理者として、システムをカスタマイズしながら壊さず運用することができます。
ルーティングには、Mapping
とReversal
の2種類があります。Mapping
は、外部の世界からくるURIを内部の世界のURIに変換します。たいていの場合、トップレベルのドメインを切り取り、サブドメインにマッピングします。一方、Reversal
は逆のことをします。内部の世界から外部の世界へと進みます。このことは、あなたが提供するWebページが、実際に外部からアクセス可能なリソースを参照できるようにするために必要です。
ルーティングは、任意の処理を行うことができます。基本的なレベルでは、何らかの方法でURIを修正する関数です。ルーティングを使うと、強力で柔軟なシステムを構築することができます。アプリケーションの開発者として、external-uri
かuri-to-url
を、ページ内の全てのリンクに使うようにしてください。
route
, name
, direction
, priority
, translator
, route
, remove-route
, list-routes
, define-route
, define-matching-route
, define-target-route
, define-string-route
, internal-uri
, external-uri
も参考にしてください。
1.4 URIディスパッチャー(URI Dispatcher)
ついに、リクエストに応じてコンテンツを生成する段階まできました。URIディスパッチャーは、URIのサブクラスであり、名前、関数、優先順位を運びます。リクエストがくる度に実行される優先順位のリストがあります。リクエストのURIは、それぞれのディスパッチャーに対応します。適合する1番目のディスパッチャーの関数が実行されます。
たったこれだけです。ディスパッチャー関数は、ページの内容を提供するために、必要な値を、レスポンスオブジェクトに設定する責任があります。そのためには、レスポンスオブジェクトのdata
のフィールドに直接設定するか、関数から適切な値を返します。Radianceは、4つの型のデータ(stream
、pathname
、string
、(array (unsigned-byte 8))
)を受けとります。
もしURIディスパッチャーが明示的な優先順位の番号を持っていない場合、優先順位はURIの特異性によって決まります。どのように計算がされるかについて詳しく知りたい場合は、URIソーティング関数であるuri>
をみてください。
uri-dispatcher
, name
, dispatch-function
, priority
, uri-dispatcher
, remove-uri-dispatcher
, list-uri-dispatchers
, uri-dispatcher>
, define-uri-dispatcher
, dispatch
もご参照ください。
1.5 ページ(Page)
ページは、実際にコンテンツを提供する関数を定義するために用いられます。しかし、ページはURIディスパッチャーであり、物事を簡単にするためのマクロをいくつか含みます。注目してもらいたいのは、拡張可能なオプションです。詳しくみていきましょう。
Radianceには、デフォルトでセットアップされるページがいくつかあります。例えば、favicon
とrobots
のページは、Radianceのstatic/
ディレクトリで配信されます。本番環境でも、自分のページの配信や更新をしたいことがあるかと思います。
そのような目的を果たすために、static
ページの仕組みがあります。static
ページは、静的コンテンツをWebアプリケーションとモジュールに渡します。static
ページは、そのドメインでも/static/...
のパスで有効であり、最初のディレクトリがモジュール名の形式である必要があります。残りは、モジュールのstatic/
ディレクトリの範囲にあるパスです。この仕組みにより、CSS、JavaScript、画像などの静的ファイルを参照することができます。
最後にapi
ページですが、APIエンドポイントのディスパッチを処理する役割があります。これについては次の章で説明します。ページは、静的ファイルの場合と同様に、どのドメインにおいても/api/...
のパスを捕捉して動作します。
page
, remove-page
, define-page
をご参照ください。
1.6 APIエンドポイント(API Endpoint)
Radianceは、REST APIとの連携もサポートしています。これは取ってつけた機能ではありません。多くの現代のアプリケーションは、そのようなAPIを提供することが多いですが、RadianceでもAPIエンドポイントを含むWebアプリケーションを書くことができます。
概念を説明すると、APIエンドポイントは、ブラウザーのリクエストに応じて呼び出すことができる関数です。レスポンスは、リクエストの送り主が読める形式にシリアライズされます。重要な点は、APIエンドポイントはユーザからもプログラムからも利用可能であるべきということです。APIを通してプログラムから実行されるアクションは全てユーザによって実行されるので、Radianceでは両方から利用可能にするように推奨しています。重複を避けるために、これら2つを1つのものとして扱います。
全てのデータの更新は、APIエンドポイントを通して行われます。リクエスト主がユーザ
かプログラム
かを区別せずに処理されます。ユーザがリクエストを行う場合は、適切なページにリダイレクトします。プログラムからリクエストが行われた場合は、読み込めるフォーマットでデータのペイロードが提供されます。
全てのパートのうち、APIフォーマットのシステムですが、データを特別なフォーマットにシリアライズすることを担当します。デフォルトでは、S式を基本とするフォーマットが提供されていますが、JSON形式の出力も簡単にロードできます。
次に、browser
のPOST/GETパラメータの仕様をみましょう。そのパラメータが"true"
という文字列を含む場合、APIリクエストはユーザからであると扱われて、ペイロードデータは出力されずにリダイレクトされます。
あなたのアプリケーションは、統一されたAPIを提供するために、これらをうまく使う必要があります。今、実際のエンドポイントの定義は、名前、関数、引数を記述するラムダリスト、リクエストのパーズ関数で構成されます。引数の典型としては、必須の引数かオプショナル引数が理にかなっています。結局、HTTPリクエストは、キーワード引数しかもつことができません。キーワード引数は省略可能です。
APIエンドポイントの名前は、どこにリーチできるかを示す識別名として機能します。APIエンドポイントは、/api/
パスに存在し、エンドポイントの名前もそれに従います。エンドポイントを修正する際には、あなたのモジュールやアプリケーションが、他のエンドポイントをうっかり踏み外さないように気をつけなければいけません。これはURIディスパッチのときとは違いますが、理由は、APIエンドポイントは、曖昧さやパスのプロセスを許可しないからです。なので、全てのエンドポイントは、唯一のパスをもなければいけません。唯一のパスは、直接、名前としてサーブします。
生の(raw)関数は、APIがインターフェイスを提供する関数です。生の関数は、リクエストされたアクションを行い、適切なデータを上で述べた通りに返す役割を果たします。フォーマットされたAPIのデータを返すためには、api-output
を使います。ブラウザリクエストからリクエストを受けてリダイレクトをするには、redirect
を使います。
最後に、リクエストのパーズ関数は、リクエストオブジェクトを受け取り、関数が必要な実引数を抽出して、最終的に、可能であれば、適切な引数を適用させて関数を呼び出します。パーズ関数は、もし必要な引数が見当たらない場合、api-argument-missing
エラーの信号を送ります。無駄な実引数は無視されます。
call-api
を用いると、プログラムからAPIエンドポイントを呼び出すこともできます。call-api-request
を使うと、Requestをシュミレーションすることができます。どちらもURIディスパッチの仕組みを通る必要はありません。
ページと似ていますが、APIエンドポイントの定義は、定義を簡単にするために、拡張オプションも受け付けます。オプションについては、次で説明します。
api
, *default-api-format*
, *serialize-fallback*
, api-format
, remove-api-format
, list-api-formats
, define-api-format
, api-output
, api-serialize
, api-endpoint
, remove-api-endpoint
, list-api-endpoints
, api-endpoint
, name
, handler
, argslist
, request-handler
, call-api-request
, call-api
, define-api
をご参照ください。
1.7 オプション(Option)
オプションは、拡張しやすい定義用マクロを提供します。フレームワークで何か定義するときに、共通のオペレーションを短しようとするときに役に立ちます。例えば、アクセス権があるユーザに対して、ページかAPIエンドポイントを制限するような共通するタスクがあるとします。
このような実装を簡単にするために、Radianceは一般的なオプションに仕組みを提供します。オプションは、定義のマクロが属するオプションの型によって分けられます。Radianceは、api
とpage
のオプションを提供します。
それぞれのオプションは、オプションの型に応じて、名前と多くの引数を受け入れる関数のために、キーワードをもっています。定義名、ボディー部、最終にオプションに渡される値を含んだリストが、いつも引数として与えられます。
この拡張用(expansion)の関数は、定義マクロのボディーの式を変換します。環境の設定を許可するために、定義自体では含まれない式を吐き出すこともできます。
option
, option-type
, name
, expander
, option
, remove-option
, list-options
, define-option
, expand-options
をご参照ください。
1.8 モジュール(Module)
モジュールの概念は、Radianceにおいて必要不可欠です。全体を構成する要素として働きます。技術レベルでいうと、モジュールは、特別なメタデータが与えられたパッケージです。モジュールは、modularize
システムによって提供され、フック、トリガー、インターフェイス等を使いやすくして、他の情報をトラッキングするために使われます。
defpackage
を使う代わりに、define-module
を使うようにしてください。シンタックスはdefpackage
ですが、:domain
のような特別なオプションを含んでいるので、モジュールが機能するプライマリ・ドメインを特定することができます。
モジュールのシステムでは、ASDFのシステムをモジュールに記すこともできます。もし記せば、そのASDFシステムは仮想のモジュールになります。このようにするためには、システムの定義にオプションを3つ追加する必要があります:
:defsystem-depends-on (:radiance)
:class "radiance:virtual-module"
:module-name "MY-MODULE"
こうすることで、Radianceは、ASDFのシステム情報を特定して、あなたのモジュールに関連づけることができます。新しいモジュールのために、必須のシステムとモジュールの定義を自動で行うには、create-module
をみてください。
virtual-module
, virtual-module-name
, define-module
, define-module-extension
, delete-module
, module
, module-p
, module-storage
, module-storage-remove
, module-identifier
, module-name
, current-module
, module-domain
, module-permissions
, module-dependencies
, module-required-interfaces
, module-required-systems
, module-pages
, module-api-endpoints
, describe-module
, find-modules-directory
, *modules-directory*
, create-module
をご参照ください。
1.9 フック(Hook)
Radianceには、互いのモジュールを連携させるために、フック(hook)の仕組みがあります。フックを使うと、ある種のイベントに反応して、任意の関数を実行できます。例えば、意見を交換するソフトウェアでは、投稿が新たに作られる度にトリガーされるフックを設定することができます。拡張では、追加のタスクを実行するためにトリガーをフックに対して定義できます。
フックは、任意の数のトリガーをもつことができますが、トリガーは長すぎないようにしてください。フックをトリガーすることは、全てのトリガーが終了するまでブロックされる動作だからです。そのようなわけで、長い間続くようなトリガーの実行は、リクエストへのレスポンスを遅らせてしまう可能性があります。
フックは、長い間はonであり、後にoffになるスイッチにような関数であるべきです。また、新しいトリガーが実行中に定義された場合は、自動で呼び出されるべきです。これはdefine-hook-switch
により容易になります。define-hook-switch
は2つのフックを作ります。1つ目がトリガーされると、それに定義されているトリガーは、後に2つ目のフックがトリガーされたときに自動で呼び出されます。このおかげで、仮にトリガーがサーバの起動後に定義されたとしても、server-start
は適切に動作します。
list-hooks
, define-hook
, remove-hook
, define-trigger
, remove-trigger
, trigger
, define-hook-switch
をご参照ください。
1.10 インターフェイス(Interface)
システムが一枚岩になることを避けるために、またバックエンドも拡張できるように、Radianceにはインターフェイス(Interface)
の仕組みがあります。一般的にインターフェイスとは、関数、マクロ、変数がどのように動作するかについて約束事を書くものであり、実際の実装をそこに書かないことをいいます。つまり。インターフェイスがうまく動作するためには、実装を外側に置くことが大切です。このことにより、インターフェイスに対してコードを書くことができ、特定のバックエンドに結びつけることなく、与えられた機能を利用することができます。
具体例として、データベースのためのインターフェイスをみていきましょう。データベースには多くの種類があり、全ては違う方法でやりとりをしますが、データの保存、検索、修正等、どれにも共通する操作があるので、インターフェイスは実用的です。では、共通する操作を提供するインターフェイスを作ります。これは、特定の種類のデータベースが実際にすることは、それぞれの実装次第です。また、アプリケーションの作者として、データベース・インターフェイスを活用することができます。このインターフェイスを使えば、様々なデータベースに対して自動的にうまく動作するようにできるでしょう。
これはアプリケーションの作者に有利なだけではありません。インターフェイスで実装を分離することにより、システム管理者は、比較的容易に、特殊な機能を独自に実装することができます。インターフェイスが不透明であることにより、Lispのプロセスで動くものと、外部で動くプロセスを連携することができます。これは、Productionシステムの管理者が必要な情報を選び出すために、開かれた選択肢を多く与えます。
実際、インターフェイスは特別な種類のモジュールであり、特別な種類のパッケージです。定義の一部として、関数や変数などの束縛のために、一連の定義を含みます。インターフェイスはパッケージなので、あなたがコンポーテントで使えるユーザは、他のパケージにあるものも何でも使えます。違いはありません。実装の作者として、あなたはインターフェイスが示す定義を再定義することができます。
実際にインターフェイスを利用するモジュールを読み込むためには、インターフェイスの実装は、事前に読み込まれる必要があります。そうでなければ、マクロは適切に動作しません。あなたのASDFシステムの定義において、特定の実装を参照する必要なく、インターフェイスに依存することを許可するためには、Radianceは拡張されたASDFを提供します。この拡張を使うと、(:interface :foo)
のようなリストを:depends-on
に追加することができます。モジュールがロードされたときに、Radianceはインターフェイスを具体的な処理に分解します。
Radianceは、標準のインターフェイスを提供します。それぞれのインターフェイスは、radiance-contribsによって提供される標準実装を1つ以上もちます。インターフェイスは次の通りです:
拡張可能な管理者ページを提供します。
認証とログインに関することを全て処理します。
IPアドレスによってユーザがサイトにアクセスすることを禁止します。
キャッシュの仕組みを提供します。
データベースの柔軟なインターフェイスです。オブジェクトの保存、リレーショナルデータベースをバックエンドとして利用できます。
ログ出力のためのインターフェイスです。デバッグやメッセージを出力できます。
メールを送るための最小限のインターフェイスです。
ユーザのプロフィールや属性を拡張するために使います。
特定のリソースにrate limitationを許可します。
Radianceを外部の世界と結びつける架け橋のような役割を果たすインターフェイスです。
トラッキングするために、継続するセッションを保証します。
ユーザアカウントとパーミションの機能を提供します。
それぞれのインターフェイスについては、次の章で説明します。
interface
, interface-p
, implementation
, implements
, reset-interface
, define-interface-extension
, find-implementation
, load-implementation
, define-interface
, define-implement-trigger
をご参照ください。
1.11 環境(Environment)
同じマシン内の複数のRadianceインスタンスに対して異なる設定ができるように、Radianceでは環境(Environment)という仕組みを用意しています。基本的に環境とは、Radianceの設定、ランタイム・ファイル、読み込まれるモジュールの一式です。Radianceの設定は、インターフェイスの実装へのマッピングを含み、インターフェイスが求められたときに選ばれるようにします。
startup
が呼び出された時、どれだけ遅くとも、特定の環境が選択されます。早ければ、モジュールがロードされたときに選択されます。後者の場合は、環境を選ぶために、インタラクティブな再起動が可能です。これは必須の機能ですが、理由は、そうでなければ、Radianceがインターフェイスのマッピングを解決できないからです。
環境のシステムの一部として、Radianceは、あなたのアプリケーションで使える(使うべき)設定システムを提供します。設定システムを使うと、それぞれの環境ごとに、適切に設定することができます。その設定は、いつでも持続性があるうえに可読性にも優れたフォーマットで保存されるので、特別なツールで読み込んだり修正したりする必要はありません。
実際に設定手順でどのように保存処理がされているかを知りたい方は、ubiquitousを参考にしてください。 value
関数の代わりに、Radianceではconfig
関数を使えます。
設定ファイルとは別に、環境は、ユーザのアップロードやキャッシュなどのランタイムのデータのために、継続的な記憶場所を提供します。environment-module-directory
とenvironment-module-pathname
を使うことで、この場所から情報を取り出すことができます。アップロードやキャッシュを保存するとき、モジュールはこれらのパス(path)を利用して、継続的なインターフェイスを管理者に与えます。デプロイされたシステムでは、環境の記憶場所を変更することが望ましいかもしれません。そのような場合、管理者は、想定通りに動作させるためにenvironment-directory
と environment-module-directory
の上で新たなメソッドを与えることをおすすめします。詳しい動作については、関連するドキュメントを参照してください。
環境は、管理者の上書きを許可します。environment-module-directory
に:static
と:template
を使うことで、モジュールの標準テンプレートや静的なファイルへのパスをえることができます。各々のディレクトリ中でのパスは、モジュール自体のソースファイルと対応する必要があります。
実際にモジュールが利用する静的ファイルとテンプレートは、ロード時にキャッシュされることに注意してください。したがって、Lispイメージが再起動されるか、モジュールのソースファイルが再読みされない限り、変更は有効になりません。
environment-change
, environment
, environment-directory
, environment-module-directory
, environment-module-pathname
, check-environment
, mconfig-pathname
, mconfig-storage
, mconfig
, defaulted-mconfig
, config
, defaulted-config
, template-file
, @template
, static-file
, @static
をご参照ください。
1.12 マイグレーション・システム(Migration System)
システムは、以前のバージョンと互換性のない形で進化することがあります。そのような場合、現在のセットアップが、新しいバージョンと機能的に問題なく動作するように、ランタイム・データのマイグレーションが必要です。Radianceは、このプロセスを自動化して、アップグレードを円滑に進める仕組みがあります。 異なるバージョン間でのマイグレーションは、Radianceが起動する際に自動で行われるべきです。管理者として、マイグレーションが適切にされるために、何か他に行う必要はありません。しかしながら、モジュールの作者として、モジュールに対してデータのマイグレーションがされるために実行されるコードを提供する必要はあります。
モジュールをマイグレーションできるように、バージョンの仕様をもっているASDFによりモジュールを読み込む必要があります。そのバージョンは、標準的なドットで区切られた数字の形式をとります。オプションとして、ハッシュのバージョンを語尾にたすことができます。
その後、define-version-migration
で、個々のバージョン間でのマイグレーションのステップを定義することができます。一度定義されると、Radianceは、自動的に固定のバージョンを選び、現在のバージョンに合うように、必要なマイグレーションの手順を実行します。マイグレーションの手順に関するより詳しい情報は、migrate
とmigrate-versions
をご覧ください。
last-known-system-version
, migrate-versions
, define-version-migration
, ready-dependency-for-migration
, ensure-dependencies-ready
, versions
, migrate
も参照ください。
1.13 インスタンス管理(Instance Management)
Radianceは、ソフトウェアの起動から終了までの一連の流れを提供します。これによりソフトウェアは、適切に起動して利用可能になり、綺麗に片付けて終了することを保証します。一連の流れの多くは、決まったフックが、正しい順序で、適切な回数だけ呼ばれることにより実現されています。
インターフェイスの関数を適切に使うことで、サーバを手動で起動することは可能ですが、手動でアプリケーションが正しく動作すると想定しないでください。多くの場合、特定のフックが適切な順番で呼び出される必要があるので、startup
とshutdown
によりRadianceのインスタンスを管理する必要があります。startup
とshutdown
のドキュメントには、どのフックが、どの順番で呼び出されているかが説明されています。実装では、シンボルがexportされていない限り、追加で特定されない定義をインターフェオスのパッケージのシンボルに加えることができます。
*startup-time*
, uptime
, server-start
, server-ready
, server-stop
, server-shutdown
, startup
, startup-done
, shutdown
, shutdown-done
, started-p
をご参照ください。
2. 標準インターフェイス
標準のインターフェイスは、Radianceとcore packageと一緒に配布されています。ライブラリは、追加のインターフェイスを提供することも可能です。インターフェイスの実装ですが、インターフェイス定義では、次の制限の緩和が許可されています:
&key
引数を含むラムダリストは、実装依存のキーワード引数を使って拡張できます。&optional
引数を含み、&key
か&rest
を含まないラムダリストは、オプショナル引数で拡張できます。必須の引数しか含まないラムダリストは、オプショナル引数かキーワード引数で拡張できます。
2.1 管理(admin)
adminインターフェイスは、管理者ページを作成するためのものです。ユーザ構成の設定やシステム情報の表示のために使えます。"管理(administration)"という名前ですが、システムの管理者だけに限ったものではありません。どのユーザにも利用できることができます。
管理者ページは、カテゴリー分けされたメニュやパネルを表示できなければいけません。パネル群は、他のモジュールによって提供されており、admin:define-panel
で追加できます。秘密情報を含むようなパネルにアクセスするパネルは、:access
オプションでアクセスを禁止させるようにしてください。パーミッションについては、 userインターフェイスを参照してください。
管理者ページや特定のパネルにリンクをはるには、page
リソースを使ってください。
admin:list-panels
, admin:remove-panel
, admin:define-panel
, admin:panel
をご覧ください。
2.2 認証(auth)
authインターフェイスは、ユーザをリクエストと結びつけます。そのために、ユーザがシステムに対して自分自身を認証させる方法を提供しなければいけません。どのように実現するかは、実装次第です。実装は、認証のプロセスが初期化するためのページを提供しなければいけません。page
のソースを通してURIを認証プロセスに渡して、"login"
を引数として渡します。
現在リクエストに結び付けられているユーザをauth:current
コマンドで調べることができます。ユーザが"anonymous"
と解釈される場合は、NIL
を返します。詳しくはuserインターフェイスを参照ください。
auth:*login-timeout*
, auth:page
, auth:current
, auth:associate
もご覧ください。
2.3 禁止(ban)
banインターフェイスは、IPによるアクセス制限を提供します。IP BANされたクライアントのIPアドレスからは、リクエストするページに対してアクセス出来なくなります。BANは、タイムアウトの後、手動と自動いずれでも、離す(lift)することができます。実装として、ユーザのIPを監視するために、追加の労力を割くことは想定していません。
ban:jail
, ban:list
, ban:jail-time
, ban:release
をご参照ください。
2.4 キャッシュ(cache)
cacheインターフェイスは、一般的なキャッシュの仕組みを提供します。カスタマイズ可能で無効化のテストをもっています。キャッシュを明示的に新しくするには、cache:renew
をつかいます。cache:with-cache
を使うと、キャッシュの部品を構築することができ、テストのformがtrueと評価されたときに、BODYのキャッシュ値が返されるようにできます。
キャッシュ値が保存される方法は実装によります。 cache:get
かcache:with-cache
を使うと、キャッシュ値は文字列かバイト列に強制変換されます。実装では、キャッシュに格納できる typeには制限がありませんが、少なくとも、文字列とバイト列はサポートします。
キャッシュ値の名前は、名前とパッケージ名が、次の文字を含まないシンボルでなければいけません:<>:"/\|?*.
キャッシュ値の変形は、princ
によって表示される表現とは区別されるオブジェクトである必要があります。その際には、先ほどと同じ文字の制限が適用されます。
cache:get
, cache:renew
, cache:with-cache
をご参照ください。
2.5 データベース(database)
databaseインターフェイスは、データを持続させるためのレイヤーを提供します。通常は、データベースと呼ばれるレイヤーです。リレーショナル型のデータベースである必要はありませんが、そうであってもいいです。実装の変数を保持するために、基本的なデータベースの機能しかサポートされません。(joinsやtriggers等はありません)データ型も、整数、float、文字列に限定されます。これらの制限にも関わらず、多くのアプリケーションにおいて、データベースインターフェイスはとても役に立ちます。
伝統的なRDMBの用語と区別するために、特別な用語が使われます。schema
は"structure"、table
は"collection"、row
は"record"とします。
データベースに接続する前に、データベース関連の命令を実行すると、未定義の動作を招きます。Radianceでは、Radianceが動作している間はデータベースが接続されることを保障しているので、どのページ、どのAPI、どのURIディスパッチャーの定義において、データベースインターフェイスを問題なく使えます。
実際にデータ保存を行うための関数は、db:insert
、db:remove
、db:update
、db:select
、db:iterate
です。
それらは、あなたが期待するように動作するはずです。
詳しくは、それぞれの関数に書かれているコメントを読んでください。コレクションの作り方、どのような制限があるかを知りたい方は、db:create
のコメントも参考にしてください。
データベースは、データ操作が完了すれば、Radianceを再起動したり、Lispのイメージや機械がクラッシュしたとしても、データの変更は存続されなければいけません。
database:condition
, database:connection-failed
, database:connection-already-open
, database:collection-condition
, database:invalid-collection
, database:collection-already-exists
, database:invalid-field
, database:id
, database:ensure-id
, database:connect
, database:disconnect
, database:connected-p
, database:collections
, database:collection-exists-p
, database:create
, database:structure
, database:empty
, database:drop
, database:iterate
, database:select
, database:count
, database:insert
, database:remove
, database:update
, database:with-transaction
, database:query
, database:connected
, database:disconnected
を参照してください。
2.6 ロガー(logger)
loggerインターフェースは、ログの関数を提供します。システムの中で関連して起きていることについて、ログのメッセージを出すことができます。ログの出力内容と出力方法に関しては、実装とシステムの管理者次第です。
logger:log
, logger:trace
, logger:debug
, logger:info
, logger:warn
, logger:error
, logger:severe
, logger:fatal
をご覧ください。
2.7 メール(mail)
mailインターフェースは、メールを送る仕組みを組み込むことができます。様々なコンポーネントが、Webサイトの外からユーザとつながるために、メールのアクセスが必要になるかもしれません。リモートサーバ、ローカル環境でのメール送信等、メールの送信方法の設定は、処理系依存です。mail:send
のフックを使うと、メールが送られる前に、メールに反応することができます。
mail:send
をご覧ください。
2.8 プロフィール(profile)
profileインターフェイスを使うと、ユーザが存在するアプリケーションにおいて、ユーザへのインターフェイスを拡張することができます。このインターフェイスは、機能の一部として、ユーザのプロフィールが表示されるページを提供する必要があります。そのプロフィールは、数種類のパネルを表示しなければいけません。パネルは、他のモジュールによって提供されており、profile:define-panel
で追加できます。
page
リソースの型情報により、ユーザのプロフィールページへのURIを得ることができます。
このインターフェイスを使うと、視覚的にユーザを特定させるために、profile:avatar
でアバター画像にアクセスすることができます。また、profile:name
を使うとユーザ名をカスタマイズできます。profile:fields
、profile:add-field
、profile:remove-field
を使うと、どのようなデータをユーザの属性に含むか、それを公に(public)表示させるかどうか指定できます。
profile:page
, profile:avatar
, profile:name
, profile:fields
, profile:add-field
, profile:remove-field
, profile:list-panels
, profile:remove-panel
, profile:define-panel
, profile:panel
をご参照ください。
2.9 評価(rate)
rateインターフェースは、Rate limitationの仕組みを提供します。秘密情報や負荷が高いリソースへのアクセスを防ぐことができます。2つの段階があります。第1段階は、rate:define-limit
により特定のリソースに対してRate limitationの動作を定義します。その後、リソースがrate:with-limitation
マクロにより、リソースが保護されます。もし、特定のユーザからblockへのアクセスがあまりに頻繁にされる場合、ブロック(block)は呼び出されません。制限定義内のコード(the code in the limit definition)が、代わりに実行されます。
Rate limitation
は、各クライアント、各ユーザ、各セッションごとで実装に依存しますが、グローバルではないことに注意してください。
rate:define-limit
, rate:left
, rate:with-limitation
をご参照ください。
2.10 サーバ(server)
serverインターフェイスとloggerインターフェイスは、Radianceが起動時に順番通りに読み込まれます。HTTPリクエストに応答する責任があります。実装では、リクエストを受け入れて、Radianceのrequest
関数に渡す必要があります。その後、response
はリクエスト主に戻されます。
リスナーの動作を特定する引数は実装によることに注意してください。しかし、実装は、(mconfig :radiance :port)
で設定されたlocalhost
とポートからでアクセスできる標準のリスナーを提供して、radiance:startup
で起動できるようにする必要があります。
server:start
, server:stop
, server:listeners
, server:started
, server:stopped
をご参照ください。
2.11 セッション(session)
sessionインターフェースは、あるクライアントが行う複数のリクエストを追跡します。クライアントによっては情報を隠蔽したり偽装している場合があるので、完全にはクライアントを追跡できるとはいえません。しかし、多くのユーザに対しては、うまく動作するはずです。セッション・インターフェイスは、他のインターフェイスや低レイヤーのライブラリの中で使われます。ユーザ認証にような一貫性を保つために使われます。
session:*default-timeout*
, session:session
, session:=
, session:start
, session:get
, session:list
, session:id
, session:field
, session:timeout
, session:end
, session:active-p
, session:create
をご参照ください。
2.12 ユーザ(user)
userインターフェースは、ユーザオブジェクトを永続させ、パーミションの仕組みを組み込めます。ユーザ認証、ユーザの特定、トラッキング等は扱いません。このインターフェイスでは、ユーザオブジェクトを提供するのみであり、パーミション情報が管理されます。
パーミションに関する詳細は、user:user
を参照してください。
user:condition
, user:not-found
, user:user
, user:=
, user:list
, user:get
, user:id
, user:username
, user:fields
, user:field
, user:remove-field
, user:remove
, user:check
, user:grant
, user:revoke
, user:add-default-permissions
, user:create
, user:remove
, user:action
, user:ready
, user:unready
もご覧ください。
バージョンの変更
1.0 -> 2.0
issue #28のなかで、
*environment-root*
は削除されました。#29で問題点が修正されました。*environment-root*
は、environment-directory
関数に統合されることにより、より汎用的なメカニズムに置き換えられました。もし*environment-root*
をカスタマイズして利用していた場合、§1.11
を参考にenvironment-directory
を変更してください。issue #30で、モジュールのバージョンを変更するために、自動でマイグレーションができる仕組みを入れました。#31で修正を加えました。この機能は、すでにRediance自体とモジュールで、新しい環境ディレクトリ(environment directories)を構成するために使われており、自動で以前のデータを現在の新たな場所に移動してくれます。詳しくは
§1.12
を参考にしてください。issue #26の後、モジュールのソースを変更することなく、管理者がモジュールのテンプレートや静的ファイルを上書きできるようになりました。環境に関連するドキュメントは、
§1.11
を参照してください。ユーザ・インターフェイスは、整数のuser:idが、各々のユーザ・オブジェクトをサポートすることを求められます。これにより、データベースでユーザを参照できて、より効率的に記録できるようになりました。
データベース・インターフェイスは、
:unique
、db:select
、db:iterate
のサポートを求められます。
参考
- modularize :パッケージのメタシステム
- modularize-interfaces :インターフェイスと実装の拡張
- modularize-hooks :フックとトリガーの仕組み
- ubiquitous: 環境設定
- radiance-contribs :インターフェイスの実装、他便利な機能
System Information
Definition Index
-
RADIANCE-CORE
- ORG.SHIRAKUMO.RADIANCE.CORE
- RADIANCE
- MODULARIZE.MOD.RADIANCE-CORE
No documentation provided.-
EXTERNAL SPECIAL-VARIABLE *DEBUGGER*
Whether the debugger should be invoked when an error occurs during a request execution. Can be one of the following values: :IF-SWANK-CONNECTED -- Only invoke the debugger if there is an active swank connection. T -- Always invoke the debugger. NIL -- Never invoke the debugger. See MAYBE-INVOKE-DEBUGGER See HANDLE-CONDITION See EXECUTE-REQUEST
-
EXTERNAL SPECIAL-VARIABLE *DEFAULT-API-FORMAT*
The API format to use if no specific one is requested. See *API-FORMATS*
-
EXTERNAL SPECIAL-VARIABLE *DEFAULT-CONTENT-TYPE*
The default content-type to use to send out the data. See RESPONSE
-
EXTERNAL SPECIAL-VARIABLE *DEFAULT-EXTERNAL-FORMAT*
The default external character encoding to use to send out the data. See RESPONSE
-
EXTERNAL SPECIAL-VARIABLE *MODULES-DIRECTORY*
Defines the path where modules should be created.
-
EXTERNAL SPECIAL-VARIABLE *RANDOM-STRING-CHARACTERS*
A string that contains all the characters that can form a random-string. See MAKE-RANDOM-STRING
-
EXTERNAL SPECIAL-VARIABLE *REQUEST*
Bound to the current request object in the context of a request. See EXECUTE-REQUEST See REQUEST
-
EXTERNAL SPECIAL-VARIABLE *RESPONSE*
Bound to the current response object in the context of a request. See EXECUTE-REQUEST See RESPONSE
-
EXTERNAL SPECIAL-VARIABLE *STARTUP-TIME*
-
EXTERNAL ROUTE DOMAIN
Ensures that top-level domains are stripped from the uri. Depends on *DOMAIN-INTERNALIZERS*
-
EXTERNAL ROUTE DOMAIN
Ensures that the appropriate top-level domain is added to the uri.
-
EXTERNAL ROUTE VIRTUAL-MODULE
Allows using a path of /!/module/path to simulate a call to a subdomain. This translates the path by prepending the module to the subdomains of the uri and resetting the path to the sub-path. The module is also stored in the request's data field called VIRTUAL-MODULE.
-
EXTERNAL ROUTE VIRTUAL-MODULE
Properly reverses the uri if the current request context was made under a virtual-module. Uses the request's data field called VIRTUAL-MODULE to know where we came from.
-
EXTERNAL OPTION HOOK
Adds a hook that is automatically triggered when the page is called. Unless otherwise specified, the hook is named the same as the page.
-
EXTERNAL RESOURCE-TYPE API
Returns an internal URI that is a representation of the path on which the given API endpoint can be called. It expects one or more arguments, where the first is the endpoint's name and the rest are key-value pairs of the arguments for the call.
-
EXTERNAL RESOURCE-TYPE DOMAIN
Returns an internal URI that is a representation of the domain on which the module operates.
-
EXTERNAL RESOURCE-TYPE PAGE
Returns an internal URI that points to the requested page. The following values are returned: 1. URI 2. QUERY-ALIST 3. FRAGMENT The QUERY-ALIST and FRAGMENT can be used as arguments to URI-TO-URL. By default a page with the name corresponding to the symbol of the given name in the module's package is used if available. However, a module or interface may special-case certain page names to provide a specified name to point to a page of particular interest.
-
EXTERNAL RESOURCE-TYPE STATIC
Returns an internal URI that is a representation of the requested static resource. Requires a single argument, namely the name of the resource.
-
EXTERNAL CLASS API-ENDPOINT
Container for an api endpoint. See NAME See HANDLER See ARGSLIST See REQUEST-HANDLER
-
EXTERNAL CLASS COOKIE
-
EXTERNAL CLASS DOCUMENTABLE
Superclass for all classes that can be documented. Use DOCUMENTATION to access the docstring. See CL:DOCUMENTATION See DEFINE-DOCUMENTABLE
-
EXTERNAL CLASS HOOK
No documentation provided. -
EXTERNAL CLASS MODULE
ASDF system subclass for modules. See MODULARIZE:MODULE
-
EXTERNAL CLASS OPTION
Container class for an option expander. See OPTION-TYPE See NAME See EXPANDER See OPTION
-
EXTERNAL CLASS REQUEST
Container class to represent a request that was made against radiance. See URI See HTTP-METHOD See BODY-STREAM See HEADERS See POST-DATA See GET-DATA See COOKIES See DOMAIN See REMOTE See DATA See ISSUE-TIME See REQUEST See USER-AGENT See REFERER See COOKIE See GET-VAR See POST-VAR See POST/GET See HEADER See FILE See REQUEST-RUN-TIME
-
EXTERNAL CLASS RESOURCE-TYPE
Container class for a resource type. See NAME See LOCATORS See RESOURCE-TYPE See DEFINE-RESOURCE-TYPE
-
EXTERNAL CLASS RESPONSE
Container class to represent a response that should be sent out for a request. See DATA See RETURN-CODE See CONTENT-TYPE See EXTERNAL-FORMAT See HEADERS See COOKIES See COOKIE See HEADER See REDIRECT See SERVE-FILE
-
EXTERNAL CLASS ROUTE
Container class for a URI translation route. See NAME See DIRECTION See PRIORITY See TRANSLATOR See ROUTE See REMOVE-ROUTE See LIST-ROUTES See DEFINE-ROUTE
-
EXTERNAL CLASS URI
Class to represent a URI in the system. URIs are used to access and define resources that should be accessible both internally and externally. If MATCHER is T, then the matcher is automatically set to the scanner created from the path or an empty string should the path be NIL. See DOMAINS See PORT See PATH See MATCHER See MAKE-URI See COPY-URI See URI< See URI> See URI= See URI-MATCHES See MERGE-URIS See REPRESENT-URI See URI-TO-URL
-
EXTERNAL CLASS URI-DISPATCHER
Container object for a link between a uri and a page function. A uri-dispatcher should be called from a request and is then responsible for generating the content of the response. See NAME See DISPATCH-FUNCTION See PRIORITY See DISPATCH See URI-DISPATCHER
-
EXTERNAL CLASS VIRTUAL-MODULE
No documentation provided. -
EXTERNAL CONDITION API-ARGUMENT-INVALID
Error signalled when an argument was not of a permitted value. Contains an ARGUMENT slot that holds the name of the invalid argument. See API-ERROR
-
EXTERNAL CONDITION API-ARGUMENT-MISSING
Error signalled when a required argument for the api endpoint was not supplied. Contains an ARGUMENT slot that holds the name of the missing argument. See API-ERROR
-
EXTERNAL CONDITION API-AUTH-ERROR
Error signalled when a request to an api endpoint was unauthorised. See API-ERROR
-
EXTERNAL CONDITION API-CALL-NOT-FOUND
Error signalled when an api endpoint was requested that does not exist. See API-ERROR
-
EXTERNAL CONDITION API-ERROR
Base condition class for api related errors. See REQUEST-ERROR
-
EXTERNAL CONDITION API-UNKNOWN-FORMAT
Error signalled when an api format was required that is unknown. Contains a FORMAT slot that holds the name of the requested but missing api format. See API-FORMAT See API-ERROR
-
EXTERNAL CONDITION API-UNSERIALIZABLE-OBJECT
Error signalled when an object was attempted to be serialized that cannot be. Contains an OBJECT slot that holds the object that could not be serialized. See API-ERROR
-
EXTERNAL CONDITION BACKWARDS-MIGRATION-NOT-ALLOWED
Error signalled when a migration from a later version to an earlier version is attempted. See MIGRATE See RADIANCE-ERROR
-
EXTERNAL CONDITION DEFINITION-FOR-SHARED-PACKAGE
Warning signalled when a definition is made on a symbol that may lead to unintentional clashes. This warning gives you an indication for when you might be accidentally exposing your definition to overrides by other systems. See RADIANCE-WARNING
-
EXTERNAL CONDITION ENVIRONMENT-NOT-SET
Error signalled when an action was performed that requires an initialised environment, but no environment has been configured yet. See ENVIRONMENT See RADIANCE-ERROR
-
EXTERNAL CONDITION FILE-TO-SERVE-DOES-NOT-EXIST
Error signalled when a file is attempted to be served that does not exist on the filesystem. Contains a FILE slot that holds the pathname of the requested file. See REQUEST-ERROR
-
EXTERNAL CONDITION INTERFACE-IMPLEMENTATION-NOT-SET
Error signalled when an implementation for an interface was attempted to be loaded, but no corresponding implementation is configured. See INTERFACE-CONDITION See RADIANCE-ERROR
-
EXTERNAL CONDITION INTERNAL-ERROR
Base condition class for internal errors that are unrecoverable. See RADIANCE-ERROR
-
EXTERNAL CONDITION NO-SUCH-POST-PARAMETER
Error signalled when a post parameter was requested that does not exist. Contains a PARAMETER slot that holds the name of the requested slot. See REQUEST-ERROR
-
EXTERNAL CONDITION POST-PARAMETER-NOT-A-FILE
Error signalled when a post parameter was attempted to be interpreted as a file, while it is not actually one. Contains a PARAMETER slot that holds the name of the requested slot. See REQUEST-ERROR
-
EXTERNAL CONDITION RADIANCE-CONDITION
Base condition class for all conditions related to radiance. Contains a MESSAGE slot that may hold a string that explains the reason around the condition in human- readable format. See MESSAGE
-
EXTERNAL CONDITION REQUEST-DENIED
Error signalled when a resource was requested that cannot be displayed to the requestor as they do not have sufficient permission. See REQUEST-ERROR
-
EXTERNAL CONDITION REQUEST-EMPTY
Error signalled when the reply body to the request was empty. See REQUEST-ERROR
-
EXTERNAL CONDITION REQUEST-ERROR
Base condition class for errors related to requests. Contains a REQUEST slot that holds the request that caused the issue. See RADIANCE-ERROR
-
EXTERNAL CONDITION REQUEST-NOT-FOUND
Error signalled when a resource was requested that does not exist. See REQUEST-ERROR
-
EXTERNAL CONDITION SYSTEM-HAS-NO-VERSION
Error signalled when an ASDF system does not store a version string. Without a version string, Radiance is incapable of tracking what the current version of a system is and is thus unable to automatically migrate it. This error should be continuable. See MIGRATE See RADIANCE-ERROR
-
EXTERNAL CONDITION UNPARSABLE-URI-STRING
Error signalled when a string was attempted to be turned into an URI object that could not be parsed according to the URI rules. Contains a STRING slot that holds the string that was attempted to be parsed. See URI See RADIANCE-ERROR
-
EXTERNAL HOOK ENVIRONMENT-CHANGE
This hook is triggered after the environment has been changed. At this point the environment is already set up and the configuration has been reloaded or purged as necessary.
-
EXTERNAL HOOK REQUEST
- REQUEST
- RESPONSE
This hook is triggered whenever a request is executed. It has two arguments: the request and the response object. Note that at this point dispatch has not yet happened, but the routing is already complete and the request's URI should be in the internal representation.
-
EXTERNAL HOOK SERVER-READY
This hook is triggered after the server has been started up and is ready to receive requests. Note that this is a sticky hook and will remain active until SERVER-STOP is triggered.
-
EXTERNAL HOOK SERVER-SHUTDOWN
This hook is triggered after the server has been stopped and is shut down. Note that this causes the SERVER-START hook to become unstickied. See SERVER-START
-
EXTERNAL HOOK SERVER-START
This hook is triggered right after the server interface has been loaded. At this point the server should be loaded to go, but not necessarily yet running. This hook in itself causes the server to start itself up. Note that this is a sticky hook and will remain active until SERVER-SHUTDOWN is triggered. See SERVER-READY See SERVER-SHUTDOWN
-
EXTERNAL HOOK SERVER-STOP
This hook causes the server to stop and shut down. Note that this causes the SERVER-READY hook to become unstickied. See SERVER-READY
-
EXTERNAL HOOK SHUTDOWN
This hook is triggered at the beginning of the shutdown sequence. At this point nothing has been shut down yet. Note that this causes the STARTUP hook to become unstickied. See STARTUP
-
EXTERNAL HOOK SHUTDOWN-DONE
This hook is triggered at the end of the shutdown sequence. At this point the sequence is complete and the system should be completely shut down.
-
EXTERNAL HOOK STARTUP
This hook is triggered early in the startup sequence. At this point the environment has been set and the logger interface has been loaded, but nothing else has been started yet. Note that this is a sticky hook and will remain active until SHUTDOWN is triggered. See SHUTDOWN
-
EXTERNAL HOOK STARTUP-DONE
This hook is triggered at the end of the startup sequence. At this point the sequence is complete and the system should be readily running.
-
EXTERNAL URI-DISPATCHER API
Standard page to handle and dispatch to API endpoints. Respects the "browser" post/get property, which if set to the string "true", causes a redirect to the referer on an api-error rather than displaying a machine-readable error output. See API-ENDPOINT See CALL-API-REQUEST
-
EXTERNAL URI-DISPATCHER FAVICON
Standard page for the favicon.ico root image.
-
EXTERNAL URI-DISPATCHER ROBOTS
Standard page for the robots.txt root file.
-
EXTERNAL URI-DISPATCHER STATIC
Standard delegate for static files. The address must be of the form /static/module/path where the path is translated to one relative to the module's static resource directory. See STATIC-FILE
-
EXTERNAL API-ENDPOINT Fallback api endpoint that signals an API-CALL-NOT-FOUND error.
-
EXTERNAL FUNCTION *REQUEST*
Returns the value of *REQUEST* See *REQUEST*
-
EXTERNAL FUNCTION *RESPONSE*
Returns the value of *RESPONSE* See *RESPONSE*
-
EXTERNAL FUNCTION ABORT-HANDLING
Aborts the current handling and continues dispatch. This is a wrapper function that simply invokes the ABORT-HANDLING restart. See DISPATCH
-
EXTERNAL FUNCTION ADD-DOMAIN
- DOMAIN
Adds a new top-level domain to the list of recognised domains. Adds the name to (MCONFIG :RADIANCE :SERVER :DOMAINS) The top-level domain as thought of by radiance is any domain that does not contain any subdomains in its name. For example, if your website is hosted on example.com then that would be a top-level domain. Or, if your domain is some.deep.thing.network.internal then that too would be a top-level domain. Radiance needs to know this in order to be able to distinguish when subdomains for its own purposes start and end since it is not generally predictable for an arbitrary domain name. See MCONFIG See REMOVE-DOMAIN
-
EXTERNAL FUNCTION API-ENDPOINT
- PATH
Accessor to the api-endpoint instances. See API-ENDPOINT See REMOVE-API-ENDPOINT See LIST-API-ENDPOINT
-
EXTERNAL FUNCTION (SETF API-ENDPOINT)
- PAGE
- PATH
No documentation provided. -
EXTERNAL FUNCTION API-FORMAT
- NAME
Accessor to the api formats. The api format function should accept a single argument, the object to translate, and should configure the response to output the correct data, or in the very least return an acceptable value for the response's data. The name must be a string designator. See *API-FORMATS* See REMOVE-API-FORMAT See LIST-API-FORMATS See DEFINE-API-FORMAT See API-OUTPUT
-
EXTERNAL FUNCTION (SETF API-FORMAT)
- PARSE-FUNC
- NAME
No documentation provided. -
EXTERNAL FUNCTION API-OUTPUT
- DATA
- &REST
- METADATA
- &KEY
- STATUS
- MESSAGE
- FORMAT
- &ALLOW-OTHER-KEYS
Emits the given data as a response. This function should be called for any and all return data from an api endpoint. It ensures the data proper structure, failure handling, and data translation to the desired output format. The proper structure for an API response from an endpoint should be an object/table/map with the following fields: status --- The HTTP status code. message --- A supplied human-readable message that describes the success or failure. data --- The data payload of the api output. The types of objects that can be serialised via this function are restricted to the following set: - REAL - (EQL NIL) - (EQL T) - STRING - LIST (proper ones) - VECTOR - HASH-TABLE An api format may support additional types, but is not required to. Thus, in order to be conforming, the data you pass to this function must not reference any values that have a type outside of this set. See API-FORMAT
-
EXTERNAL FUNCTION CALL-API
- API-ENDPOINT
- &REST
- ARGUMENTS
Calls the given api-endpoint directly with the supplied arguments. See HANDLER See ENSURE-API-ENDPOINT
-
EXTERNAL FUNCTION CALL-API-REQUEST
- API-ENDPOINT
- &OPTIONAL
- REQUEST
Calls the given api-endpoint with the given request. This rebinds *REQUEST*. See REQUEST-HANDLER See ENSURE-API-ENDPOINT
-
EXTERNAL FUNCTION CHECK-ENVIRONMENT
Checks whether the environment is properly configured. If no environment is present, an error of type ENVIRONMENT-NOT-SET is signalled. Two restarts will be present at the time: CONTINUE --- Sets the environment to "default" SET-ENVIRONMENT --- Sets the environment to the one passed in the argument. See ENVIRONMENT
-
EXTERNAL FUNCTION COOKIE
- NAME
- &OPTIONAL
- REQUEST/RESPONSE
Accesses the cookie instance of the request. The SETF function will construct the proper cookie instance for you. See COOKIES See COOKIE See *RESPONSE* See *REQUEST*
-
EXTERNAL FUNCTION (SETF COOKIE)
- VALUE
- NAME
- &KEY
- DOMAIN
- PATH
- TIMEOUT
- HTTP-ONLY
- SECURE
- RESPONSE
No documentation provided. -
EXTERNAL FUNCTION COOKIE-HEADER
- COOKIE
Returns a string representation of the cookie as a header. See COOKIE
-
EXTERNAL FUNCTION COPY-URI
- URI
-
EXTERNAL FUNCTION CREATE-MODULE
- NAME
- &KEY
- BASE-FILE
- DEPENDENCIES
- ROOT
Creates a new stub module. Creates the following files and directories: name/ name/static name/template name/name.asd name/name.lisp If Quicklisp is present, the local-projects are registered and the project is loaded after the files have been created. See *MODULES-DIRECTORY*
-
EXTERNAL FUNCTION DEFAULTED-MCONFIG
- DEFAULT
- MODULE
- &REST
- PATH
Sets the configuration variable to the given default if it has not been set previously and returns the value. See UBIQUITOUS:DEFAULTED-VALUE See MCONFIG-STORAGE
-
EXTERNAL FUNCTION DELETE-MODULE
- MODULE
Attempts to completely delete the given module. This first calls the delete hooks, then demodularizes the package, unbinds all symbols in the package from values and functions, and finally deletes the package.
-
EXTERNAL FUNCTION DESCRIBE-MODULE
- MODULE
- STREAM
Writes a human-readable description of the module to the stream. This is useful for inspection and debugging, to see a quick overview of what the module does or has. This function is called by DESCRIBE if it is called on a module. Signals an error if the argument cannot be coerced to a module. See MODULE-DOMAIN See MODULE-PERMISSIONS See MODULE-REQUIRED-INTERFACES See MODULE-REQUIRED-SYSTEMS See MODULE-PAGES See MODULE-API-ENDPOINTS See MODULARIZE:MODULE
-
EXTERNAL FUNCTION DISPATCH
- URI
Calls the appropriate uri-dispatcher that is set up to handle the given uri. Usually, only a single uri-dispatcher will be called, if any. In order for a dispatcher to be called, the uri must match the dispatcher's by URI-MATCHES. In the case where two uri-dispatchers have a matching uri, then the one with the higher priority will be executed. This is achived by simply following the order present in the *URI-PRIORITY* vector. A uri-dispatcher that has been dispatched may call the ABORT-HANDLING restart, in which case it is considered as not having matched, and the dispatching continues. If no matching uri-dispatcher is available, the function in *URI-FALLBACK* will be called instead. See URI-MATCHES See URI-DISPATCHER> See DISPATCH-FUNCTION See ABORT-HANDLING See *URI-PRIORITY* See *URI-FALLBACK*
-
EXTERNAL FUNCTION ENSURE-URI
- URI-ISH
-
EXTERNAL FUNCTION ENVIRONMENT
Accessor to the current environment. The environment decides the namespace for the configuration and data files of Radiance and all modules that use its system. Note that changing the environment after one has already been loaded and modules have been loaded with it, is currently not supported and will lead to strange behaviour. See *ENVIRONMENT* See CHECK-ENVIRONMENT See MCONFIG-PATHNAME
-
EXTERNAL FUNCTION (SETF ENVIRONMENT)
- ENVIRONMENT
No documentation provided. -
EXTERNAL FUNCTION ENVIRONMENT-MODULE-PATHNAME
- MODULE
- KIND
- PATHNAME
Returns a path within the module's file directory for the given kind. This simply performs a merge-pathnames call on the given pathname and the corresponding ENVIRONMENT-MODULE-DIRECTORY. See ENVIRONMENT-MODULE-DIRECTORY
-
EXTERNAL FUNCTION EXECUTE-REQUEST
- REQUEST
- &OPTIONAL
- RESPONSE
Directly executes the given request and response instances. If an error occurs during the execution, HANDLE-CONDITION is called to handle it. The REQUEST hook is called at the beginning of execution. Then the request is dispatched on and the result converted into data for the response if applicable. See RESPONSE See REQUEST See DISPATCH See HANDLE-CONDITION
-
EXTERNAL FUNCTION EXPAND-OPTIONS
- TYPE
- OPTIONS
- NAME
- BODY
- &REST
- ARGS
Expands all options of the given type. Returns two values, the new body forms and the list of forms to output before the actual definition. An error is signalled if an unknown option is used. See OPTION See DEFINE-OPTION
-
EXTERNAL FUNCTION EXTERNAL-URI
- URI
Modifies the URI by pushing it through all reversal routes so that it becomes an external URI. See *ROUTE-REVERSAL*
-
EXTERNAL FUNCTION FILE
- NAME
- &OPTIONAL
- REQUEST
-
EXTERNAL FUNCTION FILE-SIZE
- PATHSPEC
Returns the file size in bytes.
-
EXTERNAL FUNCTION FIND-ALL-MODULES
- DIRECTORY
Attempts to find all module systems in a directory. This works as follows: it scans the directory tree for all files with the type ASD. For each attempts of these, it attempts to find an ASDF system with the file's name, and if the system can be found and is of type VIRTUAL-MODULE, it is returned. See VIRTUAL-MODULE
-
EXTERNAL FUNCTION FIND-IMPLEMENTATION
- INTERFACE
- &OPTIONAL
- SYSTEM
Attempts to find a suitable implementation for the given interface. This checks for the value of the configuration in MCONFIG :RADIANCE :INTERFACES interface-name-as-keyword If SYSTEM is T, then the ASDF system object is returned otherwise the implementation's system name. If Quicklisp is available and the implementing system has not yet been installed, it is installed automatically. The system is not loaded, however. If no implementation has been configured for the interface, an INTERFACE-IMPLEMENTATION-NOT-SET error is signalled. You may SETF this place to a suitable implementation for the given interface. The implementation should be a virtual module designator.
-
EXTERNAL FUNCTION (SETF FIND-IMPLEMENTATION)
- IMPLEMENTATION
- INTERFACE
No documentation provided. -
EXTERNAL FUNCTION FORMAT-CLOCK-TIME
- STAMP
- &OPTIONAL
- STREAM
Returns a string representing the given timestamp in wall-clock time. Bot universal-time stamp and local-time:timestamp are accepted. The effective format is "hh:mm:ss" See FORMAT-MACHINE-DATE See FORMAT-HUMAN-DATE See FORMAT-FANCY-DATE
-
EXTERNAL FUNCTION FORMAT-FANCY-DATE
- STAMP
- &OPTIONAL
- STREAM
Returns a string representing the given timestamp in an extensive, fancy date. Bot universal-time stamp and local-time:timestamp are accepted. The effective format is "WEEKDAY, DAY of MONTH Y, H:MM:SS UTC" See FORMAT-CLOCK-TIME See FORMAT-MACHINE-DATE See FORMAT-HUMAN-DATE
-
EXTERNAL FUNCTION FORMAT-HUMAN-DATE
- STAMP
- &OPTIONAL
- STREAM
Returns a string representing the given timestamp in human-readable date. Bot universal-time stamp and local-time:timestamp are accepted. The effective format is "YYYY.MM.DD hh:mm:ss" See FORMAT-CLOCK-TIME See FORMAT-MACHINE-DATE See FORMAT-FANCY-DATE See FORMAT-TIME
-
EXTERNAL FUNCTION FORMAT-MACHINE-DATE
- STAMP
- &OPTIONAL
- STREAM
Returns a string representing the given timestamp in machine-readable date. Bot universal-time stamp and local-time:timestamp are accepted. The effective format is "YYYY-MM-DDThh:mm:ss" See FORMAT-CLOCK-TIME See FORMAT-HUMAN-DATE See FORMAT-FANCY-DATE
-
EXTERNAL FUNCTION FORMAT-ONLY-DATE
- STAMP
- &OPTIONAL
- STREAM
No documentation provided. -
EXTERNAL FUNCTION FORMAT-RELATIVE-TIME
- STAMP
- &OPTIONAL
- STREAM
Returns a string representing the given timestamp seconds as a relative time. Bot universal-time stamp and local-time:timestamp are accepted. It divides the time up into seconds, minutes, hours, days, weeks, months, years, decades, centuries, and finally æons. Example: 63 results in "1 minute 3 seconds" See FORMAT-TIME
-
EXTERNAL FUNCTION FORMAT-TIME
- STAMP
- &OPTIONAL
- RELATIVE-TIME-THRESHOLD
- STREAM
Returns a string representing the given timestamp in an intuitive way. If the difference from the current time is below the RELATIVE-TIME-THRESHOLD, the time is formatted relatively, otherwise absolutely. See FORMAT-RELATIVE-TIME See FORMAT-HUMAN-DATE
-
EXTERNAL FUNCTION FORMAT-URI
- URI-STRING
- &REST
- FORMAT-ARGS
A shorthand function to construct a URI with a format string. This is basically just the following: (parse-uri (format NIL ..)) See PARSE-URI
-
EXTERNAL FUNCTION GET-UNIX-TIME
Return the current time as a unix timestamp in seconds since 1970.
-
EXTERNAL FUNCTION GET-VAR
- NAME
- &OPTIONAL
- REQUEST
-
EXTERNAL FUNCTION HANDLE-CONDITION
- CONDITION
Responsible for handling a condition during a request execution. Might invoke the debugger depending on *DEBUGGER*. Otherwise invokes the SET-DATA restart with the return-value of calling RENDER-ERROR-PAGE. See *DEBUGGER* See MAYBE-INVOKE-DEBUGGER See EXECUTE-REQUEST See RENDER-ERROR-PAGE
-
EXTERNAL FUNCTION HEADER
- NAME
- &OPTIONAL
- REQUEST/RESPONSE
Accesses the value of the header in the request or response. This is case-insensitive See HEADERS See *REQUEST* See *RESPONSE*
-
EXTERNAL FUNCTION (SETF HEADER)
- VALUE
- NAME
- &OPTIONAL
- RESPONSE
No documentation provided. -
EXTERNAL FUNCTION HOOK
- NAME
- &OPTIONAL
- MODULE
- ERROR
No documentation provided. -
EXTERNAL FUNCTION (SETF HOOK)
- HOOK
- NAME
- &OPTIONAL
- MODULE
No documentation provided. -
EXTERNAL FUNCTION IMPLEMENTATION
- INTERFACE
Returns the currently active implementation of the interface.
-
EXTERNAL FUNCTION (SETF IMPLEMENTATION)
- IMPLEMENTATION
- INTERFACE
Attempts to set the implementation of an interface. Interfaces can only be implemented by modules and if a different module already implements the interface a condition is signalled. The following restarts are available: DELETE Deletes the old implementation through DELETE-MODULE. OVERRIDE Overrides the implementation and leaves the old module. ABORT Aborts the setting of the implementation completely. If the implementation setting was successful, TEST-INTERFACE is called. If the implementation is set to NIL, RESET-INTERFACE is called.
-
EXTERNAL FUNCTION IMPLEMENTS
- MODULE
Returns a list of interfaces this module implements.
-
EXTERNAL FUNCTION INTERFACE
- OBJECT
Returns the interface package module as identified by the object. See MODULE for more.
-
EXTERNAL FUNCTION INTERFACE-P
- OBJECT
Returns T if the passed object is or names an interface, otherwise NIL.
-
EXTERNAL FUNCTION INTERNAL-URI
- URI
Modifies the URI by pushing it through all mapping routes so that it becomes an internal URI. See *ROUTE-MAPPING*
-
EXTERNAL FUNCTION LIST-API-ENDPOINTS
Lists all known api page instances. See API-ENDPOINT
-
EXTERNAL FUNCTION LIST-API-FORMATS
No documentation provided. -
EXTERNAL FUNCTION LIST-HOOKS
- &OPTIONAL
- MODULE
No documentation provided. -
EXTERNAL FUNCTION LIST-MODULES
Returns a list of all modules in no particular order.
-
EXTERNAL FUNCTION LIST-OPTIONS
- TYPE
Lists all option instances that are registered. See OPTION See *OPTIONS* See REMOVE-OPTION
-
EXTERNAL FUNCTION LIST-RESOURCE-TYPES
Returns a list of names of defined resource types. See *RESOURCE-TYPES* See RESOURCE-TYPE See REMOVE-RESOURCE-TYPE
-
EXTERNAL FUNCTION LIST-ROUTES
Lists all the route instances that are registered. See *ROUTE-REGISTRY* See ROUTE See REMOVE-ROUTE
-
EXTERNAL FUNCTION LIST-URI-DISPATCHERS
Returns a list of all uri-dispatchers that are registered. See *URI-REGISTRY* See URI-DISPATCHER
-
EXTERNAL FUNCTION LOAD-IMPLEMENTATION
- INTERFACE
Attempts to silently load the implementation for the interface if necessary. This function is called whenever an interface is requested as a dependency in an ASDF system definition. See FIND-IMPLEMENTATION
-
EXTERNAL FUNCTION MAKE-RANDOM-STRING
- &OPTIONAL
- LENGTH
- CHARS
Constructs a string composed of random characters. See *RANDOM-STRING-CHARACTERS*
-
EXTERNAL FUNCTION MAKE-URI
- &KEY
- DOMAINS
- PORT
- PATH
- MATCHER
Creates a new URI instance according t o the given parts. See URI
-
EXTERNAL FUNCTION MAKE-URL
- &KEY
- DOMAINS
- PORT
- PATH
- SCHEMA
- QUERY
- FRAGMENT
- REPRESENTATION
A shorthand function for constructing URL strings. This basically encompasses the combination of a MAKE-URI and a URI-TO-URL rather directly. The representation is set to :EXTERNAL for convenience as that is usually the preferred option for use-cases of this function. See MAKE-URI See URI-TO-URL
-
EXTERNAL FUNCTION MAYBE-INVOKE-DEBUGGER
- CONDITION
- &OPTIONAL
- RESTART
- &REST
- VALUES
Might call INVOKE-DEBUGGER depending on the value of *DEBUGGER*. If the debugger is invoked, it is always invoked with a CONTINUE restart surrounding it to avoid handling the condition. If the debugger is not invoked, or declines to handle the condition via the CONTINUE restart, and the RESTART argument is given, then the given restart is automatically invoked with the remaining values. See *DEBUGGER*
-
EXTERNAL FUNCTION MCONFIG
- MODULE
- &REST
- PATH
Accesses a configuration variable for the given module's storage. See UBIQUITOUS:VALUE See MCONFIG-STORAGE
-
EXTERNAL FUNCTION (SETF MCONFIG)
- VALUE
- MODULE
- &REST
- PATH
No documentation provided. -
EXTERNAL FUNCTION MCONFIG-PATHNAME
- MODULE
- &OPTIONAL
- TYPE
Returns the proper pathname to the module according to the current environment. The path is constructed according to: :NAME Set to the downcased module-name. :TYPE Set to conf.TYPE with type downcased. :DEFAULTS ENVIRONMENT-MODULE-DIRECTORY for the given module and the :CONFIGURATION kind. An environment must have been configured prior to calling this function. See ENVIRONMENT-MODULE-DIRECTORY See ENVIRONMENT
-
EXTERNAL FUNCTION MCONFIG-STORAGE
- MODULE
Returns the storage object for the given module. The storage object is cached and will only be loaded if it has not previously been loaded. This means that unless explicit cache purging occurs, changes to the underlying configuration file will be lost on subsequent writes. The object is cached in the module-storage slot :CONFIG See MODULARIZE:MODULE-STORAGE See MCONFIG-PATHNAME See UBIQUITOUS:RESTORE See UBIQUITOUS:OFFLOAD
-
EXTERNAL FUNCTION MERGE-URIS
- URI
- &OPTIONAL
- DEFAULTS
Creates a new URI by merging the given two. See URI
-
EXTERNAL FUNCTION MERGE-URL
- URL
- &KEY
- SCHEMA
- DOMAINS
- PORT
- PATH
- PARAMETERS
- FRAGMENT
Rewrites the URL, merging the given parts where appropriate. Accepts a URL string, a URI, or a PURI:URI. In the case of a URI, the URI is treated as-is and no routing is performed. Returns the rewritten URL as a string. The meanings of the parameters are the same as for URIs URI-TO-URL respectively, namely: SCHEMA --- The schema or scheme of the url as a string. Overrides if already existing. DOMAINS --- A list of domains in order. Eg: (com example www) These domains are prepended in the rendered URL. Eg: "www"+"example.com" = "www.example.com" PORT --- The port as an integer. Overrides if already existing. PATH --- The directory path as a string. The path will appear appended in the rendered URL. Eg: "foo"+"/bar" = "/bar/foo" PARAMETERS --- Query GET parameters as an alist. The parameters are prepended in the rendered URL. Eg: "a=b"+"a=a" = "a=b&a=a" FRAGMENT --- The URL fragment or anchor as a string. Overrides if already existing. All of these parameters should /NOT/ be passed URL-ENCODED. This function will take care of the appropriate URL-ENCODING if necessary. This function can be especially useful for automating redirects. For instance, if you would like to redirect back but add a message that should be displayed, you can use APPEND-URL on the REFERER and add the message with the PARAMETERS argument. See URI See URI-TO-URL See REWRITE-URL
-
EXTERNAL FUNCTION MODULE
- &OPTIONAL
- IDENTIFIER
Coerces the requested module. See MODULARIZE:MODULE
-
EXTERNAL FUNCTION MODULE-API-ENDPOINTS
- MODULE
Returns the list of names of the api endpoints that the module has registered. Signals an error if the argument cannot be coerced to a module. See MODULARIZE:MODULE
-
EXTERNAL FUNCTION MODULE-DEPENDENCIES
- MODULE
Returns the list of dependencies for the given module. Signals an error if the argument cannot be coerced to a module. Signals an error if the module does not have an associated virtual module. See ASDF:SYSTEM-DEPENDS-ON See MODULARIZE:MODULE See MODULARIZE:VIRTUAL-MODULE
-
EXTERNAL FUNCTION MODULE-DOMAIN
- MODULE
Returns the domain on which the module acts primarily. Signals an error if the argument cannot be coerced to a module. Signals an error of type INTERFACE-IMPLEMENTATION-NOT-PRESENT if an interface was passed that does not have an implementation yet. If not explicit domain was configured, the module's name is returned. See MODULARIZE:MODULE
-
EXTERNAL FUNCTION MODULE-IDENTIFIER
- MODULE
Returns the identifier of the module.
-
EXTERNAL FUNCTION MODULE-NAME
- MODULE
Returns the name of the module.
-
EXTERNAL FUNCTION MODULE-P
- OBJECT
Returns non-NIL if the passed object is or resolves to a module package, otherwise NIL.
-
EXTERNAL FUNCTION MODULE-PAGES
- MODULE
Returns the list of URIs for pages that the module has registered. Signals an error if the argument cannot be coerced to a module. See MODULARIZE:MODULE
-
EXTERNAL FUNCTION MODULE-PERMISSIONS
- MODULE
Returns the list of permissions that are known to exist for the module. Signals an error if the argument cannot be coerced to a module. See PERM See MODULARIZE:MODULE
-
EXTERNAL FUNCTION (SETF MODULE-PERMISSIONS)
- LIST
- MODULE
No documentation provided. -
EXTERNAL FUNCTION MODULE-REQUIRED-INTERFACES
- MODULE
Returns the list of interfaces that the module depends on. Signals an error if the argument cannot be coerced to a module. See MODULE-DEPENDENCIES See MODULARIZE:MODULE
-
EXTERNAL FUNCTION MODULE-REQUIRED-SYSTEMS
- MODULE
Returns the list of systems that the module depends on. Signals an error if the argument cannot be coerced to a module. See MODULE-DEPENDENCIES See MODULARIZE:MODULE
-
EXTERNAL FUNCTION MODULE-STORAGE
- MODULE
- &OPTIONAL
- KEY
Accesses the module storage table of the module or a field from it if a key is passed.
-
EXTERNAL FUNCTION (SETF MODULE-STORAGE)
- VALUE
- MODULE
- &OPTIONAL
- KEY
No documentation provided. -
EXTERNAL FUNCTION MODULE-STORAGE-REMOVE
- MODULE
- KEY
Removes a key from the module storage table.
-
EXTERNAL FUNCTION OPTION
- TYPE
- NAME
Accessor to an option instance. See OPTION See *OPTIONS* See REMOVE-OPTION See LIST-OPTIONS
-
EXTERNAL FUNCTION (SETF OPTION)
- OPTION
- TYPE
- NAME
No documentation provided. -
EXTERNAL FUNCTION PARSE-PATH-SAFELY
- NAMESTRING
Parses the given namestring as a path that only understands relative directories, name, and type. Furthmore, no special path syntax is allowed and everything is parsed verbatim. This avoids exploits where an URL is turned into a pathname and uses special characters like ~ or ..
-
EXTERNAL FUNCTION PARSE-TIME
- TIME
- &KEY
- TIME-ZONE
- ERROR
- DEFAULT
No documentation provided. -
EXTERNAL FUNCTION PARSE-URI
- URI-STRING
Parses the given URI into a string if possible. Signals an error of type UNPARSABLE-URI-STRING if the string cannot be parsed. See URI
-
EXTERNAL FUNCTION POST-VAR
- NAME
- &OPTIONAL
- REQUEST
-
EXTERNAL FUNCTION POST/GET
- NAME
- &OPTIONAL
- REQUEST
-
EXTERNAL FUNCTION REDIRECT
- NEW-ADDRESS
- &OPTIONAL
- REPRESENTATION
- CODE
- RESPONSE
Sets the response up to cause a redirect to the given address. By default, if a URI instance is given, the URI is externalised. See URI-TO-URL See RETURN-CODE See *RESPONSE*
-
EXTERNAL FUNCTION REFERER
- &OPTIONAL
- REQUEST
-
EXTERNAL FUNCTION (SETF REFERER)
- VALUE
- &OPTIONAL
- REQUEST
No documentation provided. -
EXTERNAL FUNCTION RELOAD-ENVIRONMENT
Reloads the current environment from disk. Note that configuration files are reloaded lazily, with the exception of the radiance-core configuration. See CHECK-ENVIRONMENT See ENVIRONMENT
-
EXTERNAL FUNCTION REMMCONFIG
- MODULE
- &REST
- PATH
Removes the configuration place from the given module's configuration. See UBIQUITOUS:REMVALUE See MCONFIG-STORAGE
-
EXTERNAL FUNCTION REMOVE-API-ENDPOINT
- PATH
Removes the given api page again if it exists. See API-ENDPOINT
-
EXTERNAL FUNCTION REMOVE-API-FORMAT
- NAME
Removes the named api format if it exists. The name must be a string designator. See *API-FORMATS* See API-FORMAT
-
EXTERNAL FUNCTION REMOVE-DOMAIN
- DOMAIN
Removes a known top-level domain. See ADD-DOMAIN
-
EXTERNAL FUNCTION REMOVE-HOOK
- NAME
- &OPTIONAL
- MODULE
Removes the hook as named.
-
EXTERNAL FUNCTION REMOVE-OPTION
- TYPE
- NAME
Removes an option instance again, if it exists. See OPTION See *OPTIONS* See LIST-OPTIONS
-
EXTERNAL FUNCTION REMOVE-PAGE
- NAME
No documentation provided. -
EXTERNAL FUNCTION REMOVE-RESOURCE-TYPE
- TYPE
Removes the given resource type, if it exists. See *RESOURCE-TYPES* See RESOURCE-TYPE See LIST-RESOURCE-TYPES
-
EXTERNAL FUNCTION REMOVE-ROUTE
- NAME
- DIRECTION
Removes the specified route, if any. Automatically calls REBUILD-ROUTE-VECTORS See REBUILD-ROUTE-VECTORS See *ROUTE-REGISTRY* See ROUTE See LIST-ROUTES
-
EXTERNAL FUNCTION REMOVE-TRIGGER
- HOOK
- &OPTIONAL
- IDENT
- MODULE
Attempts to remove the trigger from the hook.
-
EXTERNAL FUNCTION REMOVE-URI-DISPATCHER
- NAME
Removes the named uri-dispatcher, if any. See *URI-REGISTRY* See URI-DISPATCHER
-
EXTERNAL FUNCTION RENDER-ERROR-PAGE
- CONDITION
This function is responsible for rendering an appropriate response for the given condition. A module is allowed to redefine this function to do as it sees fit. See HANDLE-CONDITION
-
EXTERNAL FUNCTION REPRESENT-URI
- URI
- REPRESENTATION
Returns a new URI that is represented accordingly. REPRESENTATION can be one of the following: :AS-IS NIL --- The URI is simply copied :EXTERNAL :REVERSE --- The URI is externalised :INTERNAL :MAP --- The URI is internalised See COPY-URI See EXTERNAL-URI See INTERNAL-URI
-
EXTERNAL FUNCTION REQUEST
- TO-URI
- &KEY
- REPRESENTATION
- HTTP-METHOD
- BODY-STREAM
- HEADERS
- POST
- GET
- COOKIES
- REMOTE
- RESPONSE
Handle a request to the given URI with the given parameters. This creates an appropriate request object, translates the URI object if necessary, and then calls EXECUTE-REQUEST to actually perform the request proper. See REQUEST See ENSURE-REQUEST-HASH-TABLE See REPRESENT-URI See EXECUTE-REQUEST
-
EXTERNAL FUNCTION REQUEST-RUN-TIME
- &OPTIONAL
- REQUEST
Returns the number of seconds since the request was issued. See ISSUE-TIME See *REQUEST*
-
EXTERNAL FUNCTION RESET-INTERFACE
- INTERFACE
Resets the interface by redefining it with stubs as per its component definitions.
-
EXTERNAL FUNCTION RESOLVE-BASE
- THING
Resolves the filesystem directory of the thing if possible.
-
EXTERNAL FUNCTION RESOURCE
- MODULE
- TYPE
- &REST
- ARGS
Returns the requested resource type on the given module. If the module does not have a specific locator, the default locator is called. If no default exists, an error is signalled. The applicable structure and number of the arguments is dependant on the locator being called. See LIST-RESOURCE-TYPES See DEFINE-RESOURCE-LOCATOR
-
EXTERNAL FUNCTION RESOURCE-LOCATOR
- TYPE
- IDENT
Accessor to a locator function on the given resource type. Signals an error if the ident is T and there is no default resource locator defined on the resource type. See RESOURCE-TYPE
-
EXTERNAL FUNCTION (SETF RESOURCE-LOCATOR)
- VALUE
- TYPE
- IDENT
No documentation provided. -
EXTERNAL FUNCTION RESOURCE-TYPE
- NAME
Accessor for the resource types. If the requested type does not exist, an error is signalled. See *RESOURCE-TYPES* See RESOURCE-TYPE See REMOVE-RESOURCE-TYPE See LIST-RESOURCE-TYPES See DEFINE-RESOURCE-TYPE
-
EXTERNAL FUNCTION (SETF RESOURCE-TYPE)
- TYPE
- NAME
No documentation provided. -
EXTERNAL FUNCTION REWRITE-URL
- URL
- &KEY
- SCHEMA
- DOMAINS
- PORT
- PATH
- PARAMETERS
- FRAGMENT
Rewrites the URL, replacing components with the given parts. Accepts a URL string, a URI, or a PURI:URI. In the case of a URI, the URI is treated as-is and no routing is performed. Returns the rewritten URL as a string. The meanings of the parameters are the same as for URIs URI-TO-URL respectively, namely: SCHEMA --- The schema or scheme of the url as a string. DOMAINS --- A list of domains in order. Eg: (com example www) PORT --- The port as an integer. PATH --- The directory path as a string. PARAMETERS --- Query GET parameters as an alist. FRAGMENT --- The URL fragment or anchor as a string. All of these parameters should /NOT/ be passed URL-ENCODED. This function will take care of the appropriate URL-ENCODING if necessary. If a parameter is passed as NIL, it means that the component should be absent from the URL. See URI See URI-TO-URL See MERGE-URL
-
EXTERNAL FUNCTION ROUTE
- NAME
- DIRECTION
Accesses the route instance of the given name and direction. Automatically calls REBUILD-ROUTE-VECTORS when a route is changed. See REBUILD-ROUTE-VECTORS See *ROUTE-REGISTRY* See REMOVE-ROUTE See LIST-ROUTES See ROUTE
-
EXTERNAL FUNCTION (SETF ROUTE)
- ROUTE
- NAME
- DIRECTION
No documentation provided. -
EXTERNAL FUNCTION SERVE-FILE
- PATHNAME
- &OPTIONAL
- CONTENT-TYPE
- RESPONSE
Sets the response up to serve the given file. If the file does not exist, an error of type FILE-TO-SERVE-DOES-NOT-EXIST is signalled. The content-type, if not explicitly given, is attempted to be automatically discovered by MIMES:MIME-LOOKUP and falls back to application/octet-stream. See FILE-TO-SERVE-DOES-NOT-EXIST See MIMES:MIME-LOOKUP See CONTENT-TYPE See DATA See *RESPONSE*
-
EXTERNAL FUNCTION SHUTDOWN
Stops Radiance and cleans up all connections. If Radiance is not already running, an error is signalled. The shutdown sequence proceeds as follows: 1. SHUTDOWN is triggered 2. SERVER-STOP is triggered 3. *RUNNING* is set to NIL 4. SERVER-SHUTDOWN is triggered 5. *STARTUP-TIME* is set to NIL 6. SHUTDOWN-DONE is triggered See STARTUP See STARTED-P
-
EXTERNAL FUNCTION STARTED-P
-
EXTERNAL FUNCTION STARTUP
- &OPTIONAL
- ENVIRONMENT
Starts up Radiance and prepares it for use. If Radiance is already running, an error is signalled. If ENVIRONMENT is not a string, an error is signalled. The startup sequence proceeds as follows: 1. *STARTUP-TIME* is saved 2. The environment is changed 3. STARTUP is triggered 4. The implementation for the LOGGER interface is loaded 5. The implementation for the SERVER interface is loaded 6. SERVER-START is triggered 7. *RUNNING* is set to T 8. SERVER-READY is triggered 9. The systems in the (MCONFIG :RADIANCE :STARTUP) configuration are loaded in sequence 10. STARTUP-DONE is triggered See SHUTDOWN See STARTED-P
-
EXTERNAL FUNCTION STATIC-FILE
- NAMESTRING
- &OPTIONAL
- BASE
Returns the static file for the given base. The base will usually be your local module. This function will return the path returned by ENVIRONMENT-MODULE-PATHNAME for the given base, :STATIC type, and namestring if the file exists, or otherwise merge the namestring with the static/ subdirectory within your module's source directory. For instance, a module named FOO asking for the BAR static file while the file is overridden would return a path like the following under default setups: ~/.local/share/radiance/default/static/foo/bar If this override file did not exist, the following path would be returned instead assuming FOO's project root is at ~/Projects/: ~/Projects/foo/static/bar See @STATIC
-
EXTERNAL FUNCTION SYNC-ENVIRONMENT
Forces the writing of all configuration files. This will cause the configuration file for every loaded module to be written to disk. Note that this will /not/ necessarily first try to load the files from disk, so changes to the files may be overwritten and lost by this operation. Typically configuration files are automatically synced to disc on write, so this function should not be necessary most of the time. See MODULARIZE:LIST-MODULES See MCONFIG-STORAGE
-
EXTERNAL FUNCTION TEMPLATE-FILE
- NAMESTRING
- &OPTIONAL
- BASE
Returns the template file for the given base. The base will usually be your local module. This function will return the path returned by ENVIRONMENT-MODULE-PATHNAME for the given base, :TEMPLATE type, and namestring if the file exists, or otherwise merge the namestring with the template/ subdirectory within your module's source directory. For instance, a module named FOO asking for the BAR template file while the file is overridden would return a path like the following under default setups: ~/.local/share/radiance/default/template/foo/bar If this override file did not exist, the following path would be returned instead assuming FOO's project root is at ~/Projects/: ~/Projects/foo/template/bar See @TEMPLATE
-
EXTERNAL FUNCTION TRIGGER
- HOOK
- &REST
- ARGS
Calls all triggers registered on the hook with the given arguments.
-
EXTERNAL FUNCTION UNIVERSAL-TO-UNIX-TIME
- UNIVERSAL-TIME
Translate the given universal-time to a unix-time See +UNIX-EPOCH-DIFFERENCE+
-
EXTERNAL FUNCTION UNIX-TO-UNIVERSAL-TIME
- UNIX-TIME
Translate the given unix-time to a universal-time See +UNIX-EPOCH-DIFFERENCE+
-
EXTERNAL FUNCTION UPTIME
Returns the amount of seconds that radiance has been started for, if at all. See STARTUP See SHUTDOWN See *STARTUP-TIME*
-
EXTERNAL FUNCTION URI-DISPATCHER
- NAME
Accessor to the registered uri-dispatcher instances. Setting this automatically invokes a rebuild of the *uri-priority* vector. See *URI-REGISTRY* See URI-DISPATCHER See REMOVE-URI-DISPATCHER See LIST-URI-DISPATCHERS See REBUILD-URI-PRIORITY
-
EXTERNAL FUNCTION (SETF URI-DISPATCHER)
- DISPATCHER
- NAME
No documentation provided. -
EXTERNAL FUNCTION URI-DISPATCHER>
- A
- B
Returns true if the uri-dispatcher A has a higher priority than B. If neither A nor B have a priority set, the comparison is the same as URI>. If only A has a priority set, then T is returned. If only B has a priority set, then NIL is returned. Otherwise T is returned if the priority of A is greater or equal to that of B. See URI>
-
EXTERNAL FUNCTION URI-MATCHES
- URI
- PATTERN-URI
Returns T if the URI matches the PATTERN-URI. Sepcifically, in order to match: The matcher of the pattern must match the path of the uri. All the domains must be in the same order and match by STRING-EQUAL. Either one of them does not have a port set, or the ports must match by =. See MATCHER See URI
-
EXTERNAL FUNCTION URI-STRING
- URI
Returns a parsable string representation of the URI. See URI
-
EXTERNAL FUNCTION URI-TO-URL
- URI
- &KEY
- REPRESENTATION
- SCHEMA
- QUERY
- FRAGMENT
Returns a URL representation of the URI. The QUERY argument takes an alist of keys and variables to be used in the query part of the resulting URL. The fragment is the optional fragment part. The schema is, unless explicitly given, automatically set to HTTPS if the translated URI's port is 443, the value of the X-Forwarded-Proto header if present, or HTTP otherwise. The path, query, and fragment are url-encoded as necessary. See REPRESENT-URI See URL-ENCODE See MAKE-URL
-
EXTERNAL FUNCTION URI<
- A
- B
Returns T if A logically precedes B in specificity. In more detail (short-circuiting top to bottom): T A does not have a port, but B does T A's number of domains is less than B's T A's length of the path is greater than B's NIL for everything else See URI
-
EXTERNAL FUNCTION URI=
- A
- B
Returns T if A and B represent the same URIs. Specifically: Ports must be EQL Paths must be EQUAL Domains must be the same order and be STRING-EQUAL See URI
-
EXTERNAL FUNCTION URI>
- A
- B
Returns T if A logically follows B in specificity. See URI<
-
EXTERNAL FUNCTION URL-ENCODE
- THING
- &KEY
- STREAM
- EXTERNAL-FORMAT
- ALLOWED
Encodes the given string to the stream in url-encoded format. This means that characters that are not one of a-Z 0-9 - . _ ~ are written down in percent-encoded schema.
-
EXTERNAL FUNCTION USER-AGENT
- &OPTIONAL
- REQUEST
-
EXTERNAL FUNCTION (SETF USER-AGENT)
- VALUE
- &OPTIONAL
- REQUEST
No documentation provided. -
EXTERNAL FUNCTION VIRTUAL-MODULE
- MODULE
No documentation provided. -
EXTERNAL GENERIC-FUNCTION API-SERIALIZE
- OBJECT
Cause the object to be serialised into a more favourable structure. This function should be used by api-format providers to transform objects that cannot be directly emitted into a structure that can. If the object is not serializable, an error of type API-UNSERIALIZABLE-OBJECT is signalled.
-
EXTERNAL GENERIC-FUNCTION ARGSLIST
- OBJECT
Accesses the lambda-list of the api-endpoint's handler. This describes the public interface's arguments. Arguments are usually received as GET or POST parameters of the same name as the argument symbol and it thus only makes sense for the lambda-list to contain required and optional arguments. See API-ENDPOINT
-
EXTERNAL GENERIC-FUNCTION (SETF ARGSLIST)
- NEW-VALUE
- OBJECT
No documentation provided. -
EXTERNAL GENERIC-FUNCTION BODY-STREAM
- OBJECT
Accesses the request's binary input stream for the HTTP body. This may return NIL, or a closed or empty stream if the HTTP request was made with a content-type that is either application/x-www-form-urlencoded or multipart/form-data. In that case, the POST-DATA table will be populated with the body contents instead. Otherwise, this stream will allow you to read the request body data and parse it as appropriate. If a stream is returned, it must have the element-type (UNSIGNED-BYTE 8). Consult the content-type and content-length headers for how to handle the data encoded in this stream. See REQUEST See HEADER
-
EXTERNAL GENERIC-FUNCTION (SETF BODY-STREAM)
- NEW-VALUE
- OBJECT
No documentation provided. -
EXTERNAL GENERIC-FUNCTION CONTENT-LENGTH
- REQUEST
Retrieves the HTTP content-length header. This returns the number of octets of content to be read from the BODY-STREAM, or NIL if the header was absent or malformed. Note that even if this header is set, you should not trust the returned number unconditionally as it could be arbitrarily forged. If you need to buffer the whole data from the body stream, you should make sure to check an upper bound on the content-length first. See HEADER See REQUEST See BODY-STREAM
-
EXTERNAL GENERIC-FUNCTION CONTENT-TYPE
- OBJECT
Accesses the HTTP content-type header. For a REQUEST object, this simply acts as a shorthand for (HEADER "content-type"), which should identify the type of content that the client sent to the server and how it should be decoded. For a RESPONSE object, this designates the content-type header to send out and defaults to *DEFAULT-CONTENT-TYPE*. See *DEFAULT-CONTENT-TYPE* See HEADER See REQUEST See RESPONSE
-
EXTERNAL GENERIC-FUNCTION (SETF CONTENT-TYPE)
- NEW-VALUE
- OBJECT
No documentation provided. -
EXTERNAL GENERIC-FUNCTION COOKIES
- OBJECT
-
EXTERNAL GENERIC-FUNCTION (SETF COOKIES)
- NEW-VALUE
- OBJECT
No documentation provided. -
EXTERNAL GENERIC-FUNCTION DATA
- OBJECT
-
EXTERNAL GENERIC-FUNCTION (SETF DATA)
- NEW-VALUE
- OBJECT
No documentation provided. -
EXTERNAL GENERIC-FUNCTION DIRECTION
- OBJECT
Accessor to the direction in which the route operates. Has to be one of :MAPPING :REVERSAL See ROUTE
-
EXTERNAL GENERIC-FUNCTION (SETF DIRECTION)
- NEW-VALUE
- OBJECT
No documentation provided. -
EXTERNAL GENERIC-FUNCTION DISPATCH-FUNCTION
- OBJECT
Accessor to the function that performs the actual response building of the dispatch. The function should not take any arguments. The body should either set the data of the *RESPONSE* object or return suitable data for it. See URI-DISPATCHER
-
EXTERNAL GENERIC-FUNCTION (SETF DISPATCH-FUNCTION)
- NEW-VALUE
- OBJECT
No documentation provided. -
EXTERNAL GENERIC-FUNCTION DOMAIN
- MODULE
-
EXTERNAL GENERIC-FUNCTION (SETF DOMAIN)
- NEW-VALUE
- OBJECT
No documentation provided. -
EXTERNAL GENERIC-FUNCTION DOMAINS
- OBJECT
Accesses the list of (sub)domains of the URI. The domains are in order of increasing specificity. This means they are the reverse of standard URL syntax. This is done for ease of matching and because it is honestly the more sensible way to represent a domain. See URI
-
EXTERNAL GENERIC-FUNCTION (SETF DOMAINS)
- NEW-VALUE
- OBJECT
No documentation provided. -
EXTERNAL GENERIC-FUNCTION ENSURE-DEPENDENCIES-READY
- SYSTEM
- FROM
This function should ensure that all dependencies of the given system are ready for the system to perform a migration away from the given version. By default this will call READY-DEPENDENCY-FOR-MIGRATION on all systems that are recorded in the system's defsystem-dependencies and regular dependencies, AND are virtual-module systems. The user should supply methods on this function in case it is necessary to perform actions on other systems for the migration to perform smoothly. See READY-DEPENDENCY-FOR-MIGRATION See ASDF:SYSTEM-DEFSYSTEM-DEPENDS-ON See ASDF:SYSTEM-DEPENDS-ON
-
EXTERNAL GENERIC-FUNCTION ENVIRONMENT-DIRECTORY
- ENVIRONMENT
- TYPE
Returns the base directory for the given environment and file kind. If the ENVIRONMENT parameter is T, it is treated as if it were the value of (ENVIRONMENT). The administrator is encouraged to provide specialised methods on this generic function in order to redefine the base directories used for the environment's files. The following KINDs are currently recognised internally, though the user may supply further kinds. :CONFIGURATION --- The base for configuration files. The MCONFIG/CONFIG functions access files in this base directory. :CACHE --- The base for temporary cache files that may be cleared out without consequence. :DATA --- The base for data files. Modules may use this directory to store data files for runtime caches, user data, etc. :TEMPLATE --- The base for template files. Administrators may use this directory to provide overrides for a module's template files. :STATIC --- The base for static files. Administrators may use this directory to provide overrides for a module's static files. By default the base paths are determined as follows: :CONFIGURATION 1. A root is discovered as one of the following alternatives: 1.1. The XDG_CONFIG_HOME environment variable is consulted. 1.2. On Windows the AppData environment variable is consulted. 1.3. On Windows the directory ~/Application Data/ is used. 1.4. The directory ~/.config/ is used. 2. A subdirectory called "radiance" is added to the root. 3. A subdirectory with the environment name is added to the root. :CACHE 1. A root is discovered as one of the following alternatives: 1.1 The XDG_CACHE_HOME environment variable is consulted. 1.2 On Windows the TEMP environment variable is consulted. 1.3 On Windows the directory ~/Local Settings/Temp/ is used. 1.4 The directory ~/.cache/ is used. 2. A subdirectory called "radiance" is added to the root. 3. A subdirectory with the environment name is added to the root. :DATA/:TEMPLATE/:STATIC 1. A root is discovered as one of the following alternatives: 1.1 The XDG_DATA_HOME environment variable is consulted. 1.2 On Windows the LocalAppData environment variable is consulted. 1.3 On Windows the directory ~/Local Settings/ is used. 1.4 The directory ~/.local/share/ is used. 2. A subdirectory called "radiance" is added to the root. 3. A subdirectory with the environment name is added to the root. 4. A subdirectory with the name of the type (data/template/static) is added to the root. For instance, the environment directory on a clean Linux system for the "default" environment and :configuration kind would be: ~/.config/radiance/default/ The same on a recent (Vista+) Windows system would be: ~/AppData/Roaming/radiance/default/ And on an older (XP-) Windows system it would be: ~/Application Data/radiance/default/
-
EXTERNAL GENERIC-FUNCTION ENVIRONMENT-MODULE-DIRECTORY
- MODULE
- TYPE
Returns the base directory for the given module and file kind. The administrator is allowed to supply custom methods to this function that specialise on specific modules to tightly control the behaviour. If the environment is unset, this function will signal an error. By default this simply retrieves the environment root directory for the requested file kind and adds a subdirectory named after the downcased module name. For instance, the module directory for the radiance-core module in the default environment for the :configuration kind on Linux would be: ~/.config/radiance/default/radiance-core/ See ENVIRONMENT-DIRECTORY See ENVIRONMENT See CHECK-ENVIRONMENT
-
EXTERNAL GENERIC-FUNCTION EXPANDER
- OBJECT
Accesses the actual expansion function of the object. See OPTION
-
EXTERNAL GENERIC-FUNCTION (SETF EXPANDER)
- NEW-VALUE
- OBJECT
No documentation provided. -
EXTERNAL GENERIC-FUNCTION EXPIRES
- OBJECT
Accesses when the cookie will expire, if at all. See COOKIE
-
EXTERNAL GENERIC-FUNCTION (SETF EXPIRES)
- NEW-VALUE
- OBJECT
No documentation provided. -
EXTERNAL GENERIC-FUNCTION EXTERNAL-FORMAT
- OBJECT
Accesses the external-format to use to serialise the text data. Defaults to *DEFAULT-EXTERNAL-FORMAT* See *DEFAULT-EXTERNAL-FORMAT* See RESPONSE
-
EXTERNAL GENERIC-FUNCTION (SETF EXTERNAL-FORMAT)
- NEW-VALUE
- OBJECT
No documentation provided. -
EXTERNAL GENERIC-FUNCTION GET-DATA
- OBJECT
Accesses the hash table of GET variables that the request received. keys are strings, case-insensitive. If the key ends with "[]", the value is a list of strings, otherwise a single string. If no GET parameter of the given key was passed on the request, the value is NIL. See GET-VAR See POST/GET See REQUEST
-
EXTERNAL GENERIC-FUNCTION (SETF GET-DATA)
- NEW-VALUE
- OBJECT
No documentation provided. -
EXTERNAL GENERIC-FUNCTION HANDLER
- OBJECT
Accesses the handler function of the api-endpoint. The handler-function must have the same lambda-list as the api-endpoint's ARGSLIST. It must call API-OUTPUT at some point during its evaluation to emit data. See API-ENDPOINT
-
EXTERNAL GENERIC-FUNCTION (SETF HANDLER)
- NEW-VALUE
- OBJECT
No documentation provided. -
EXTERNAL GENERIC-FUNCTION HEADERS
- OBJECT
-
EXTERNAL GENERIC-FUNCTION (SETF HEADERS)
- NEW-VALUE
- OBJECT
No documentation provided. -
EXTERNAL GENERIC-FUNCTION HTTP-METHOD
- OBJECT
Accesses the HTTP method that was used to request the page. Should be one of :GET :HEAD :POST :PUT :DELETE :TRACE :CONNECT See REQUEST
-
EXTERNAL GENERIC-FUNCTION (SETF HTTP-METHOD)
- NEW-VALUE
- OBJECT
No documentation provided. -
EXTERNAL GENERIC-FUNCTION HTTP-ONLY
- OBJECT
Accesses whether the cookie should get the http-only flag. See COOKIE
-
EXTERNAL GENERIC-FUNCTION (SETF HTTP-ONLY)
- NEW-VALUE
- OBJECT
No documentation provided. -
EXTERNAL GENERIC-FUNCTION ISSUE-TIME
- OBJECT
Accesses the universal-time at which the request was issued. See REQUEST
-
EXTERNAL GENERIC-FUNCTION (SETF ISSUE-TIME)
- NEW-VALUE
- OBJECT
No documentation provided. -
EXTERNAL GENERIC-FUNCTION LAST-KNOWN-SYSTEM-VERSION
- SYSTEM
Return the last known version of this system that had been migrated to. Returns the version as an encoded keyword or NIL if the system has not seen a migration previously. This version is automatically adapted after MIGRATE-VERSIONS on the system completes successfully. See MIGRATE-VERSIONS
-
EXTERNAL GENERIC-FUNCTION (SETF LAST-KNOWN-SYSTEM-VERSION)
- VERSION
- SYSTEM
No documentation provided. -
EXTERNAL GENERIC-FUNCTION LOCATORS
- OBJECT
Accessor to the resource type's locator functions.
-
EXTERNAL GENERIC-FUNCTION (SETF LOCATORS)
- NEW-VALUE
- OBJECT
No documentation provided. -
EXTERNAL GENERIC-FUNCTION MATCHER
- OBJECT
-
EXTERNAL GENERIC-FUNCTION (SETF MATCHER)
- NEW-VALUE
- OBJECT
No documentation provided. -
EXTERNAL GENERIC-FUNCTION MESSAGE
- CONDITION
Accessor to the message of the condition. See RADIANCE-CONDITION
-
EXTERNAL GENERIC-FUNCTION (SETF MESSAGE)
- NEW-VALUE
- CONDITION
No documentation provided. -
EXTERNAL GENERIC-FUNCTION MIGRATE
- SYSTEM
- FROM
- TO
Migrates the given system between the given versions. Sometimes when versions change, a migration of runtime data is required to ensure that the system still operates correctly on existing data. This function should ensure that this compatibility is achieved. The system should be a designator for an ASDF system. FROM may be one of the following: T --- The system is migrated from its last known version. NIL --- The system is migrated from a time before migrations. version --- The system is migrated from this specific version. TO may be one of the following: T --- The system is migrated to its current system version. version --- The system is migrated to this specific version. When this function is called it determines the list of concrete versions in the range of the specified FROM and TO versions. It then calls MIGRATE-VERSION on the system and each pair of versions in the computed range. For instance, if the list of versions is (1 2 3 4), then MIGRATE-VERSION is called with the pairs (1 2) (2 3) (3 4). If the target version is T and the system has no recorded version, an error of type SYSTEM-HAS-NO-VERSION is signalled. If the target version is considered less than the source version, an error of type BACKWARDS-MIGRATION-NOT-ALLOWED is signalled. Two restarts are established during migration: ABORT --- Aborts migration of the current system, leaving the last known system version the same. FORCE-VERSION --- Aborts the migration of the current system, but forces the last known system version to the requested target version. See ENSURE-PARSED-VERSION See VERSIONS See MIGRATE-VERSION See SYSTEM-HAS-NO-VERSION See BACKWARDS-MIGRATION-NOT-ALLOWED
-
EXTERNAL GENERIC-FUNCTION MIGRATE-VERSIONS
- SYSTEM
- FROM
- TO
Perform a migration of the system from the given source version to the given target version. If a system or module requires manual intervention to upgrade data or other parts in order to move between versions, the author of the system should specialise a method on this function that performs the requested upgrade step. FROM and TO should be encoded versions in keyword form. FROM can also be the NIL symbol, which is useful to migrate from previously unknown versions to another. Note that the version steps between migrate-version methods on the same system should be contiguous. This means that if a system has the concrete versions 1, 2, 3, and 4, then there should be methods (if necessary) to upgrade from 1 to 2, from 2 to 3, from 3 to 4. Migration steps with gaps, such as from 2 to 4, will not be triggered by the system. Also note that by default the list of concrete versions a system offers are inferred from the methods defined on this function. There is no need to further inform the system on available concrete versions of a system. A default method that performs no action is provided on this function, as in the majority of cases no migration step is required. As such, methods need only be added to this function if an action is required. Before the primary method is executed, ENSURE-DEPENDENCIES-READY is called on the system and the source version. This should ensure that dependant systems are on a required version for this system to perform its own actions. After the primary method has completed, the target version is recorded as the last known concrete system version. The user should NOT call this function. It is called by MIGRATE as appropriate. See DEFINE-VERSION-MIGRATION See VERSIONS See MIGRATE See ENSURE-DEPENDENCIES-READY See LAST-KNOWN-SYSTEM-VERSION
-
EXTERNAL GENERIC-FUNCTION NAME
- OBJECT
Accesses the name of the object. May be a symbol or a string depending on the object.
-
EXTERNAL GENERIC-FUNCTION (SETF NAME)
- NEW-VALUE
- OBJECT
No documentation provided. -
EXTERNAL GENERIC-FUNCTION OPTION-TYPE
- OBJECT
Accesses the type of option that this option object belongs to. See OPTION
-
EXTERNAL GENERIC-FUNCTION (SETF OPTION-TYPE)
- NEW-VALUE
- OBJECT
No documentation provided. -
EXTERNAL GENERIC-FUNCTION PATH
- OBJECT
-
EXTERNAL GENERIC-FUNCTION (SETF PATH)
- NEW-VALUE
- OBJECT
No documentation provided. -
EXTERNAL GENERIC-FUNCTION PORT
- OBJECT
Accesses the port of the URI. Must be of type (OR (INTEGER 0 65535) NULL) See URI
-
EXTERNAL GENERIC-FUNCTION (SETF PORT)
- NEW-VALUE
- OBJECT
No documentation provided. -
EXTERNAL GENERIC-FUNCTION POST-DATA
- OBJECT
Accesses the hash table of POST-body variables that the request received. keys are strings, case-insensitive. If the key ends with "[]", the value is a list of payloads, otherwise a single payload. If no POST parameter of the given key was passed on the request, the value is NIL. A payload is either a single data string, or if the request was performed with multipart/form-data and the parameter is a file upload, a list of (PATH ORIGINAL-FILENAME MIME-TYPE), the first being a pathname, the rest being strings. See POST-VAR See POST/GET See FILE See REQUEST
-
EXTERNAL GENERIC-FUNCTION (SETF POST-DATA)
- NEW-VALUE
- OBJECT
No documentation provided. -
EXTERNAL GENERIC-FUNCTION PRIORITY
- OBJECT
Accessor to the priority, which may be NIL or an INTEGER. See URI-DISPATCHER See DISPATCH See ROUTE
-
EXTERNAL GENERIC-FUNCTION (SETF PRIORITY)
- NEW-VALUE
- OBJECT
No documentation provided. -
EXTERNAL GENERIC-FUNCTION READY-DEPENDENCY-FOR-MIGRATION
- DEPENDENCY
- SYSTEM
- FROM
This function should ensure that the dependency conforms to the system's required state to migrate away from the given version. By default this will invoke MIGRATE on the dependency with both source and from versions being T. The user should supply methods on this function to customise the precise versions or features required to perform the migration of the system properly. See MIGRATE
-
EXTERNAL GENERIC-FUNCTION REMOTE
- OBJECT
Accesses the remote address that the request was sent out from. See REQUEST
-
EXTERNAL GENERIC-FUNCTION (SETF REMOTE)
- NEW-VALUE
- OBJECT
No documentation provided. -
EXTERNAL GENERIC-FUNCTION REQUEST-HANDLER
- OBJECT
Accesses the function to handle a direct request object and transform it into a proper api call. This function is usually automatically generated. It should read out the parameters from the request object and turn them into arguments for a call to the api-endpoint's handler function. The function only takes a single argument namely the request object to handle. See HANDLER See API-ENDPOINT
-
EXTERNAL GENERIC-FUNCTION (SETF REQUEST-HANDLER)
- NEW-VALUE
- OBJECT
No documentation provided. -
EXTERNAL GENERIC-FUNCTION RETURN-CODE
- OBJECT
Accesses the HTTP return code to send out. Defaults to 200. See RESPONSE
-
EXTERNAL GENERIC-FUNCTION (SETF RETURN-CODE)
- NEW-VALUE
- OBJECT
No documentation provided. -
EXTERNAL GENERIC-FUNCTION SECURE
- OBJECT
Accesses whether the cookie should get the secure flag. See COOKIE
-
EXTERNAL GENERIC-FUNCTION (SETF SECURE)
- NEW-VALUE
- OBJECT
No documentation provided. -
EXTERNAL GENERIC-FUNCTION TRANSLATOR
- OBJECT
Accessor to the route's translation function. The function should accept a single URI object as an argument and modify it as it sees fit. See ROUTE
-
EXTERNAL GENERIC-FUNCTION (SETF TRANSLATOR)
- NEW-VALUE
- OBJECT
No documentation provided. -
EXTERNAL GENERIC-FUNCTION URI
- OBJECT
Accesses the URI that the request operates on. Depending on the stage of the request, the URI may be either internal or external. See REQUEST
-
EXTERNAL GENERIC-FUNCTION (SETF URI)
- NEW-VALUE
- OBJECT
No documentation provided. -
EXTERNAL GENERIC-FUNCTION VALUE
- OBJECT
Accesses the cookie value. See COOKIE
-
EXTERNAL GENERIC-FUNCTION (SETF VALUE)
- NEW-VALUE
- OBJECT
No documentation provided. -
EXTERNAL GENERIC-FUNCTION VERSIONS
- SYSTEM
Returns a list of concrete version designators that are known for the given system. This list is deduplicated and sorted in such a way that lower versions come earlier in the list. By default this list is computed by inspecting the list of primary methods on MIGRATE-VERSION, extracting the version specifiers, and subsequently deduplicating and sorting the resulting list. The user may supply methods on this function in case the automatically computed list of versions is inadequate somehow. See VERSION< See MIGRATE See MIGRATE-VERSIONS
-
EXTERNAL GENERIC-FUNCTION VIRTUAL-MODULE-NAME
- OBJECT
Returns the module name associated with this virtual module.
-
EXTERNAL GENERIC-FUNCTION (SETF VIRTUAL-MODULE-NAME)
- NEW-VALUE
- OBJECT
No documentation provided. -
EXTERNAL MACRO @STATIC
- NAMESTRING
Expands to a pathname to the static file in the current module. This expands to a load-time-value form if the namestring is constant, ensuring that no expensive lookups are done at runtime. See STATIC-FILE
-
EXTERNAL MACRO @TEMPLATE
- NAMESTRING
Expands to a pathname to the template file in the current module. This expands to a load-time-value form if the namestring is constant, ensuring that no expensive lookups are done at runtime. See TEMPLATE-FILE
-
EXTERNAL MACRO API-ERROR
- FORMAT-STRING
- &REST
- FORMAT-ARGS
Shorthand for (ERROR 'API-ERROR :MESSAGE (FORMAT NIL ..)) See API-ERROR
-
EXTERNAL MACRO CONFIG
- &REST
- PATH
Shorthand to access the current module's configuration. This has to be a macro so that the current package can be captured. See MCONFIG
-
EXTERNAL MACRO CURRENT-MODULE
Macro that expands to the module in the current package. Useful to establish a module context.
-
EXTERNAL MACRO DEFAULTED-CONFIG
- DEFAULT
- &REST
- PATH
Shorthand to set/retrieve a defaulted value from the module's configuration. This has to be a macro so that the current package can be captured. See DEFAULTED-MCONFIG
-
EXTERNAL MACRO DEFINE-API
- NAME
- ARGS
- OPTIONS
- &BODY
- BODY
Defines a new api endpoint. NAME --- The name of the endpoint. This also designates where the endpoint will be reachable. By default any endpoint can be reached on a /api/[name] path. ARGS --- The lambda-list for the arguments to the api endpoint. Usually, unless a specific request-handler is used, only required and optional arguments can be used. Their names correspond to the names that will be used to read out their values from the POST/GET variables of a request. OPTIONS --- A list of options that modify the api endpoint in some way. BODY --- A number of body forms that compose the actual functionality of the api endpoint. Should call API-OUTPUT at some point. A standard uri-dispatcher called API is responsible for calling the api pages when the path /api/ is requested. Api definitions are transformed by options of the type API. See API-OUTPUT See API-ENDPOINT See HANDLER See REQUEST-HANDLER See CALL-API See CALL-API-REQUEST See EXPAND-OPTIONS
-
EXTERNAL MACRO DEFINE-API-FORMAT
- NAME
- ARGSVAR
- &BODY
- BODY
Define a new api format. You should configure the *RESPONSE* to output the properly serialised content of the argument you receive. Note that the structures must be recursively serialised and you may not error when encountering any of the types listed as permitted in API-OUTPUT. See API-FORMAT See API-OUTPUT
-
EXTERNAL MACRO DEFINE-DOCUMENTABLE
- NAME
- DIRECT-SUPERCLASSES
- DIRECT-SLOTS
- &REST
- OPTIONS
Defines a new documentable class. If the class-option :FIND-FUNCTION is given, shortcut functions for DOCUMENTATION are additionally created that allow using just the name of an instance to access the docstring. The find-function is called with a single argument, the name of the instance to find. See DOCUMENTABLE
-
EXTERNAL MACRO DEFINE-HOOK
- NAME
- ARGS
- &OPTIONAL
- DOCUMENTATION
Defines a new hook on which triggers can be defined. The name should be a symbol from the module that the hook should belong to.
-
EXTERNAL MACRO DEFINE-HOOK-SWITCH
- ON
- OFF
- ARGS
No documentation provided. -
EXTERNAL MACRO DEFINE-IMPLEMENT-TRIGGER
- INTERFACE
- &BODY
- BODY
Defines a trigger that will cause the body to be compiled and run once the interface becomes implemented. This is useful if you want to provide parts of a package that depend on an interface being implemented, but do not want to depend on the interface directly. Thus, using this you can achieve optional/soft dependencies. This depends on the IMPLEMENTED hook-switch present on every Radiance interface. Since it is a hook-switch, a trigger like this will be called automatically even if it is defined after the interface has already been implemented. Note that since the body is captured and quoted, and thus no compilation will occur until the hook is triggered. This means that you will potentially miss out on compilation errors or information until later. See DEFINE-INTERFACE
-
EXTERNAL MACRO DEFINE-INTERFACE
- NAME
- &BODY
- COMPONENTS
Define a new module interface. Unlike the native version of this macro, a hook-switch is always defined that provides an IMPLEMENTED and UNIMPLEMENTED hook, which will be called at the appropriate time. This lets you react to when an implementation becomes active and thus conditionally compile code without needing to incur a hard dependency. See MODULARIZE-INTERFACES:DEFINE-INTERFACE See DEFINE-IMPLEMENT-TRIGGER
-
EXTERNAL MACRO DEFINE-INTERFACE-EXTENSION
- NAME
- &BODY
- COMPONENTS
Currently not implemented.
-
EXTERNAL MACRO DEFINE-MATCHING-ROUTE
- NAME
- TYPE
- URIVAR
- DOMAINS
- PORT
- PATH
- &BODY
- BODY
Defines a route where the URI is bound to URIVAR and the body is only evaluated if the tests for the individual parts of the URI pass. See WITH-ROUTE-TEST-BINDINGS See DEFINE-ROUTE
-
EXTERNAL MACRO DEFINE-MODULE
- NAME
- &BODY
- OPTIONS
Defines a new module. This essentially defines a new package with the given name, calls MODULARIZE on it and then expands all options to extend the package/module.
-
EXTERNAL MACRO DEFINE-MODULE-EXTENSION
- MODULE-IDENTIFIER
- NAME
- &BODY
- OPTIONS
Defines a module extension. This gives the existing module new nicknames and expands the given options on it to add functionality.
-
EXTERNAL MACRO DEFINE-OPTION
- TYPE
- NAME
- ARGS
- &BODY
- BODY
Define a new option expander. Option expanders are used to present an extensible mechanism for adding functionality to various definition macros such as DEFINE-PAGE, DEFINE-API, etc. An option expander should return two values: 1. The new list of body forms to use 2. A single form to output before and outside of the definition. The argument list must be congruent with the one defined by the option type plus a final, optional value argument. Usually the arglist will look like so: NAME BODY ARGS* [VALUE] Where NAME is the definition name, BODY is the list of body forms, and ARGS is any number of additional arguments that the option type mandates. See OPTION See EXPAND-OPTIONS
-
EXTERNAL MACRO DEFINE-PAGE
- NAME
- URI
- OPTIONS
- &BODY
- BODY
Defines a new page that can be requested. NAME --- The name of the page. This is merely used to identify it uniquely. URI --- The actual URI on which the page will be found. This is an internal URI. The path is a regex. OPTIONS --- A list of options that modify the page definition in some way. BODY --- A number of body forms that compose the actual functionality of the page. Should set or return suitable data for the response. Page definitions are transformed by options of the type PAGE. See DEFINE-URI-DISPATCHER See EXPAND-OPTIONS
-
EXTERNAL MACRO DEFINE-RESOURCE-LOCATOR
- MODULE
- TYPE
- ARGS
- &BODY
- BODY
Define a resource locator for a given resource type. The arguments list can vary depending on the resource type and even between locators for the same resource. Ultimately the argument list is decided by the locator that ends up being called. Within the body, the local function CALL-DEFAULT-LOCATOR can be used to call the default locator for this resource type. If an attempt is made to define a locator for an inexistent resource type, an error is signalled. See DEFINE-RESOURCE-TYPE See RESOURCE
-
EXTERNAL MACRO DEFINE-RESOURCE-TYPE
- TYPE
- ARGS
- &BODY
- DEFAULT
Define a new resource type. A resource-type defines a way to retrieve a certain kind of information from a module. If DEFAULT is given, a fallback function is defined with it. You can retrieve this fallback by using T as the indent. The first argument of any resource call is always the module it was called for. See DEFINE-RESOURCE-LOCATOR See RESOURCE-TYPE See RESOURCE-LOCATOR See RESOURCE
-
EXTERNAL MACRO DEFINE-ROUTE
- NAME
- DIRECTION
- URIVAR
- &BODY
- BODY
Define a new route. DIRECTION has to be one of :MAPPING :REVERSAL where mapping routes transform URIs from the external to the internal representation and vice- versa. The body should modify the URI object it receives as it sees fit. While in general routes will be called in the context of a request, it is not absolutely necessary. See ROUTE See DEFINE-MATCHING-ROUTE See DEFINE-TARGET-ROUTE See DEFINE-STRING-ROUTE
-
EXTERNAL MACRO DEFINE-STRING-ROUTE
- NAME
- TYPE
- SOURCE
- TARGET
Defines a route where the URI is analysed by the given regex and translated into the interpolated string representation. The target string can reference regex capture groups. Note that the regexes are transformed in order to make the definition appear more "natural". Specifically, if no port is present in the source, it is prefixed with (?:[^/]*)? if no domain is present in source, it is prefixed with [^:/]* if the target does not contain a port, the port is not changed. The source is then surrounded by ^ and $. What this all does in effect is that it prevents regexes from matching too liberally for common URI changes. It allows something like this: /foo/bar => foo/bar to actually match and exchange an uri like this localhost:8080/foo/bar properly into the expected URI foo:8080/bar without changing a URI like this localhost:8080/bla/foo/bar as that would indeed not be what we expected to have specified. If you do not like these automatic changes to the regexes, you can easily enough define your own route that allows you full control. See CL-PPCRE:REGEX-REPLACE See DEFINE-ROUTE
-
EXTERNAL MACRO DEFINE-TARGET-ROUTE
- NAME
- TYPE
- DOMAINS
- PORT
- PATH
- TARGET-DOMAINS
- TARGET-PORT
- TARGET-PATH
Defines a route that attempts to automatically translate the URI according to the given test and result parts. The result parts can reference all variables introduced by the test parts. See DEFINE-MATCHING-ROUTE
-
EXTERNAL MACRO DEFINE-TRIGGER
- HOOK
- ARGS
- &BODY
- BODY
Defines a new trigger on the hook. A trigger can either accept no arguments or it has to match the hook in its arguments list. The name of the trigger defaults to the *PACKAGE*. If you want to have multiple triggers for the same hook in the same package, use a list of the following structure as the HOOK argument: (hook trigger-name hook-module)
-
EXTERNAL MACRO DEFINE-URI-DISPATCHER
- NAME
- URI
- &OPTIONAL
- PRIORITY
- &BODY
- BODY
Defines a new uri-dispatcher. The body forms will be evaluated if DISPATCH is called with a URI object that matches the URI given in the definition and if no other uri-dispatcher precedes this one in their priority. See URI-DISPATCHER See URI-DISPATCHER> See DISPATCH-FUNCTION See DISPATCH
-
EXTERNAL MACRO DEFINE-VERSION-MIGRATION
- SYSTEM
- FROM
- TO
- &BODY
- BODY
A shorthand to define a version migration method for a system. SYSTEM may be a string or symbol naming the ASDF system to define a migration action for. FROM may be NIL, a symbol, or a string naming the source version. TO may be a symbol or a string naming the target version. BODY should be a number of forms to be executed when the system is moved from the source version to the target version. See MIGRATE-VERSIONS
-
EXTERNAL MACRO OR*
- &REST
- VALS
Similar to OR, but treats empty strings as NIL. This is often handy in the context of query parameters from the outside world where an empty string represents no value.
-
EXTERNAL MACRO PERM
- &REST
- TREE
Macro to encompass a permission. You should use this wherever you reference a permission. Using this will ensure that the permission is registered with your module and thus inspectable from the outside.
-
EXTERNAL MACRO REMCONFIG
- &REST
- PATH
Shorthand to remove a place from the module's configuration This has to be a macro so that the current package can be captured. See REMMCONFIG
-
EXTERNAL MACRO WITH-ACTIONS
- ERROR
- INFO
- ACTION-CLAUSES
- &BODY
- BODY
A macro to help handle different actions in a submission context. ERROR and INFO are variables that hold objects that describe error and information messages that occurred during the handling of the action. First, the actual action is read out of the POST/GET variable "action". Then the matching action-clause, if any, is evaluated. If an error occurs during the evaluation thereof, the error is stored in the ERROR variable. After the action clause processing has finished, the body forms are evaluated. ACTION-CLAUSES ::= (clause body-form*) CLAUSE --- A string designator that names the action
-
ADMIN
- MODULARIZE.INT.ADMIN
- MODULARIZE.MOD.ADMIN
No documentation provided.-
EXTERNAL SPECIAL-VARIABLE *IMPLEMENTATION*
No documentation provided. -
EXTERNAL RESOURCE-TYPE PAGE
Returns an internal URI that points to the requested page. The following values are returned: 1. URI 2. QUERY-ALIST 3. FRAGMENT The QUERY-ALIST and FRAGMENT can be used as arguments to URI-TO-URL. By default a page with the name corresponding to the symbol of the given name in the module's package is used if available. However, a module or interface may special-case certain page names to provide a specified name to point to a page of particular interest.
-
EXTERNAL HOOK IMPLEMENTED
No documentation provided. -
EXTERNAL HOOK UNIMPLEMENTED
No documentation provided. -
EXTERNAL FUNCTION IMPLEMENTATION
No documentation provided. -
EXTERNAL FUNCTION (SETF IMPLEMENTATION)
- VALUE6
No documentation provided. -
EXTERNAL FUNCTION LIST-PANELS
Returns an alist of panel categories and their panels. See ADMIN:DEFINE-PANEL See ADMIN:REMOVE-PANEL
-
EXTERNAL FUNCTION REMOVE-PANEL
- CATEGORY
- NAME
Removes the specified panel if it exists. See ADMIN:DEFINE-PANEL
-
EXTERNAL MACRO DEFINE-PANEL
- CATEGORY
- NAME
- OPTIONS
- &BODY
- BODY
Defines a new administration panel. Category and panel names are case-insensitive. This is similar to DEFINE-PAGE, except it defines a panel within the administration interface. The body code should return HTML data to be emitted into the interface. Do not emit root elements such as <HTML> or <BODY>. The panel definition can be extended through the ADMIN:PANEL option. By default, the following options are guaranteed to exist: :ACCESS Will restrict access to it to users that pass the permission check. See USER:CHECK. :ICON Selects an icon to use for the panel in the administration's menu. The accepted range of values is implementation-dependant. :TOOLTIP A tooltip string to show when hovering over the panel entry in the administration's menu. In order to obtain the internal URI to an admin panel, use the PAGE resource with the category and panel names as arguments. See ADMIN:LIST-PANELS See ADMIN:REMOVE-PANEL
-
AUTH
- MODULARIZE.INT.AUTH
- MODULARIZE.MOD.AUTH
No documentation provided.-
EXTERNAL SPECIAL-VARIABLE *IMPLEMENTATION*
No documentation provided. -
EXTERNAL SPECIAL-VARIABLE *LOGIN-TIMEOUT*
The time, in seconds, for which an authenticated user should remain authenticated.
-
EXTERNAL RESOURCE-TYPE PAGE
Returns an internal URI that points to the requested page. The following values are returned: 1. URI 2. QUERY-ALIST 3. FRAGMENT The QUERY-ALIST and FRAGMENT can be used as arguments to URI-TO-URL. By default a page with the name corresponding to the symbol of the given name in the module's package is used if available. However, a module or interface may special-case certain page names to provide a specified name to point to a page of particular interest.
-
EXTERNAL HOOK ASSOCIATE
- SESSION
This hook is called when a session is associated with a user. The hook has an argument, the session object. You can retrieve the associated user through AUTH:CURRENT. See AUTH:CURRENT
-
EXTERNAL HOOK IMPLEMENTED
No documentation provided. -
EXTERNAL HOOK NO-ASSOCIATED-USER
This hook is called when AUTH:CURRENT is called but no user is found in the session. The hook has an argument, the session object. Triggers on this hook may associate new users at this time by using AUTH:ASSOCIATE. If a new user is associated by this hook, this user is returned by the original AUTH:CURRENT call. This allows third-party libraries to implement additional authentication mechanisms. See AUTH:CURRENT
-
EXTERNAL HOOK UNIMPLEMENTED
No documentation provided. -
EXTERNAL FUNCTION ASSOCIATE
- USER
- &OPTIONAL
- SESSION
Associates (authenticates) the user with the given session. If no session is passed, the one of the current request is retrieved by SESSION:GET. This effectively logs the session in as the user and makes it gain all permissions the user has. If the session was associated with a user already, the associated user is replaced. The auth interface must also provide a way for a user to authenticate themselves through a page. You can gain an internal URI to that page by the page resource and the page name "login". It accepts a single extra argument, which is t he URI or URL to redirect to after a successful login. If this argument is the string "#" the value of the current request's REFERER is used. The exact means by which a user can authenticate themselves on said page are implementation dependant. See SESSION:GET See AUTH:CURRENT
-
EXTERNAL FUNCTION CURRENT
- &OPTIONAL
- DEFAULT
- SESSION
Returns the user object that is authenticated with the given session. If no session is passed, the one of the current request is retrieved by SESSION:GET. If the session is not authenticated, the user designated by DEFAULT is returned instead, if given. If DEFAULT is NIL, then NIL is returned. See SESSION:GET See AUTH:ASSOCIATE
-
EXTERNAL FUNCTION IMPLEMENTATION
No documentation provided. -
EXTERNAL FUNCTION (SETF IMPLEMENTATION)
- VALUE3
No documentation provided.
-
BAN
- MODULARIZE.INT.BAN
- MODULARIZE.MOD.BAN
No documentation provided.-
EXTERNAL SPECIAL-VARIABLE *IMPLEMENTATION*
No documentation provided. -
EXTERNAL HOOK IMPLEMENTED
No documentation provided. -
EXTERNAL HOOK UNIMPLEMENTED
No documentation provided. -
EXTERNAL FUNCTION IMPLEMENTATION
No documentation provided. -
EXTERNAL FUNCTION (SETF IMPLEMENTATION)
- VALUE3
No documentation provided. -
EXTERNAL FUNCTION JAIL
- IP
- &KEY
- DURATION
Ban the given IP. The IP may be in IPv4 or IPv6 format as a string. The duration must be either an integer denoting the number of seconds to ban for, or T in which case the duration is taken as being infinite. If no duration is given, an implementation-dependant default is chosen. If the IP is already banned, the ban duration is extended by the given amount. See BAN:LIST See BAN:RELEASE
-
EXTERNAL FUNCTION JAIL-TIME
- &OPTIONAL
- IP
Returns the number of seconds the IP has left on its ban, T for infinity, or NIL for none. See BAN:JAIL See BAN:RELEASE
-
EXTERNAL FUNCTION LIST
Returns a list of banned IP addresses. See BAN:JAIL-TIME
-
EXTERNAL FUNCTION RELEASE
- IP
No documentation provided.
-
CACHE
- MODULARIZE.INT.CACHE
- MODULARIZE.MOD.CACHE
No documentation provided.-
EXTERNAL SPECIAL-VARIABLE *IMPLEMENTATION*
No documentation provided. -
EXTERNAL HOOK IMPLEMENTED
No documentation provided. -
EXTERNAL HOOK UNIMPLEMENTED
No documentation provided. -
EXTERNAL FUNCTION GET
- NAME
- &OPTIONAL
- VARIANT
Returns the contents cached under the given name and variant, if any. See CACHE:WITH-CACHE
-
EXTERNAL FUNCTION IMPLEMENTATION
No documentation provided. -
EXTERNAL FUNCTION (SETF IMPLEMENTATION)
- VALUE3
No documentation provided. -
EXTERNAL FUNCTION RENEW
- NAME
- &OPTIONAL
- VARIANT
Clears out the cache under the given name and variant and potentially refreshes it. The refresh may be deferred until the next time the associated WITH-CACHE form is evaluated. See CACHE:GET See CACHE:WITH-CACHE
-
EXTERNAL MACRO WITH-CACHE
- NAME
- &OPTIONAL
- VARIANT
- TEST-FORM
- &BODY
- REQUEST-GENERATOR
Caches the return value produced by the body under the name. The name is not evaluated and must be a direct symbol, but the variant is evaluated. Every time this form is evaluated, the TEST-FORM is evaluated. If it returns non-NIL, the body is evaluated and its return value is cached under the given name. If it returns T and the body has not yet been cached, then it is evaluated as well. Otherwise, the body is not evaluated and the cached value is returned instead. See CACHE:RENEW See CACHE:GET
-
DATABASE
- DB
- MODULARIZE.INT.DATABASE
- MODULARIZE.MOD.DATABASE
No documentation provided.-
EXTERNAL SPECIAL-VARIABLE *IMPLEMENTATION*
No documentation provided. -
EXTERNAL CONDITION COLLECTION-ALREADY-EXISTS
Error signalled when a new collection is attempted to be created where an old one already exists. See DATABASE:COLLECTION-CONDITION
-
EXTERNAL CONDITION COLLECTION-CONDITION
Base condition type for collection related conditions. See DATABASE:CONDITION See DATABASE:INVALID-COLLECTION See DATABASE:COLLECTION-ALREADY-EXISTS See DATABASE:INVALID-FIELD
-
EXTERNAL CONDITION CONDITION
Base condition type for all database related conditions. See DATABASE:CONNECTION-FAILED See DATABASE:CONNECTION-ALREADY-OPEN See DATABASE:COLLECTION-CONDITION See DATABASE:INVALID-COLLECTION See DATABASE:COLLECTION-ALREADY-EXISTS See DATABASE:INVALID-FIELD
-
EXTERNAL CONDITION CONNECTION-ALREADY-OPEN
Warning signalled when a new connection is established while an old one was already open. See DATABASE:CONDITION
-
EXTERNAL CONDITION CONNECTION-FAILED
Error signalled upon a failed connection attempt. See DATABASE:CONDITION
-
EXTERNAL CONDITION INVALID-COLLECTION
Error signalled when an invalidly named, or inexistent collection is accessed. See DATABASE:COLLECTION-CONDITION
-
EXTERNAL CONDITION INVALID-FIELD
Error signalled when an invalid field name or type is used. See DATABASE:COLLECTION-CONDITION
-
EXTERNAL TYPE-DEFINITION ID
Effective type of values for ID-type fields in a collection. See DATABASE:ENSURE-ID
-
EXTERNAL HOOK CONNECTED
- NAME
This hook is triggered after the database has been connected. The name of the connection is passed as an argument. Note that this is a sticky hook and will remain active until DATABASE:DISCONNECTED is triggered.
-
EXTERNAL HOOK DISCONNECTED
- NAME
This hook is triggered after the database has been disconnected. The name of the connection is passed as an argument. Note that this causes the DATABASE:CONNECTED hook to become unstickied.
-
EXTERNAL HOOK IMPLEMENTED
No documentation provided. -
EXTERNAL HOOK UNIMPLEMENTED
No documentation provided. -
EXTERNAL FUNCTION COLLECTION-EXISTS-P
- COLLECTION
Returns true if a collection of the given name already exists. Signals an error of type INVALID-COLLECTION if the name is not of the proper collection name format. See DATABASE:CREATE
-
EXTERNAL FUNCTION COLLECTIONS
Returns a list of names for all known collections. The names may be either symbols or strings. See DATABASE:CREATE
-
EXTERNAL FUNCTION CONNECT
- DATABASE-NAME
Establishes a connection to the database of the given name. The database connection must be configured by some implementation-defined manner beforehand. If the implementation cannot automatically configure itself, or cannot find a database of the requested name, an error of type DATABASE:CONNECTION-FAILED is signalled. If a previous connection is already open and a new one is attempted, a warning of type DATABASE:CONNECTION-ALREADY-OPEN is signalled, the previous connection is closed, and the new one is opened. If the connection fails for some other reason, an error of type DATABASE:CONNECTION-FAILED is signalled. Upon successful connection, the DATABASE:CONNECTED hook is triggered. Attempting to perform any database operations aside from connecting or disconnecting before a connection has been established results in undefined behaviour. See DATABASE:CONNECTED See DATABASE:DISCONNECT See DATABASE:CONNECTION-FAILED See DATABASE:CONNECTION-ALREADY-OPEN
-
EXTERNAL FUNCTION CONNECTED-P
Returns true if the database is currently connected. See DATABASE:CONNECT See DATABASE:DISCONNECT
-
EXTERNAL FUNCTION COUNT
- COLLECTION
- QUERY
Returns the number of records in the collection that match the query. The QUERY must be a value returned by the DATABASE:QUERY macro. If an invalid or inexistent collection name is passed, an error of type DATABASE:INVALID-COLLECTION is signalled. See DATABASE:CREATE See DATABASE:QUERY See DATABASE:INVALID-COLLECTION
-
EXTERNAL FUNCTION CREATE
- COLLECTION
- STRUCTURE
- &KEY
- INDICES
- IF-EXISTS
Creates a new collection on the database. COLLECTION must be a valid collection name. Namely, it must be either a symbol or a string, limited to the following set of characters: ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz 0123456789-_/ Symbol names are coerced to string names in the following manner: A slash and the name of the symbol's package are prepended to the symbol's name. Thus, a symbol's name and package must be limited to the above set of characters in order to be usable as a collection name. The structure denotes the schema of the collection and must be of the following structure: STRUCTURE ::= (FIELD*) FIELD ::= (NAME TYPE) TYPE ::= ID | :text | :float | :boolean | VARCHAR | INTEGER ID ::= :id | (:id COLLECTION) INTEGER ::= :integer | (:integer BYTES) VARCHAR ::= (:varchar LENGTH) A valid name can be either a symbol or a string, where the symbol's name/string must underlie the same character restrictions as a collection name. The types of a field are specified as follows: :ID An implementation-defined type that is used to uniquely identify a record within a collection. :TEXT A string of arbitrary length. :FLOAT A double-float. :BOOLEAN A boolean (NIL or T) value. :INTEGER A signed integer within the range denoted by the number of bytes of its size in one's complement. Attempting to store a value outside of this range leads to undefined behaviour. The default number of bytes is 4. The maximum number of bytes that can be requested is 8. :VARCHAR A string of variable size but with a maximum length. Attempting to store a string beyond that length leads to undefined behaviour. If an invalid field name or field type is specified, an error of type DATABASE:INVALID-FIELD is signalled. The implementation is allowed to upgrade any field type to a type that can encompass the specified range and more. For example, an implementation is permitted to upgrade an (:integer 4) to an (:integer 8) or a (:varchar 5) to :text. If a COLLECTION is passed to an :ID field, the field is called a "reference field", and the ID must be of a record in the referenced collection. Upon inserting or updating a record with a reference field, the implementation may check that the referenced record does exist and, if it does not exist, will signal an error. Similarly, an implementation may delete records with a reference field if the record being referenced is deleted. This is commonly referred to as cascading deletes. Note that an implementation either must always perform the check or never, and must always perform the cascading delete or never. It must be predictable in the behaviour, if the behaviour is specified. The implementation may support additional field types not specified here. The implementation may or may not permit you to store data in fields outside of the ones specified in the structure of the collection. Each collection will always include a field called "_id" of type :ID that is filled by the implementation on record creation. IT stores the unique ID of the record within the collection. The concrete type of the ID is implementation- dependant. INDICES is a list of field names that should be indexed for fast access. The implementation is urged to optimise access to the fields, but is not required to. IF-EXISTS denotes the behaviour in case a collection of the same name already exists. The behaviour is as follows: :IGNORE Return NIL. This is the default. :ERROR Signal an error of type DATABASE:COLLECTION-ALREADY-EXISTS. :SUPERSEDE Drop the old collection and create a new one. If a new collection is created successfully, a non-NIL value is returned. See DATABASE:ID See DATABASE:STRUCTURE See DATABASE:COLLECTIONS See DATABASE:COLLECTION-EXISTS-P See DATABASE:DROP See DATABASE:INVALID-COLLECTION See DATABASE:COLLECTION-ALREADY-EXISTS See DATABASE:INVALID-FIELD
-
EXTERNAL FUNCTION DISCONNECT
Closes the current database connection, if any. Upon successful disconnect, the DATABASE:DISCONNECTED hook is triggered. See DATABASE:CONNECT See DATABASE:DISCONNECTED
-
EXTERNAL FUNCTION DROP
- COLLECTION
Deletes the collection entirely, including all of its data. If an invalid or inexistent collection name is passed, an error of type DATABASE:INVALID-COLLECTION is signalled. See DATABASE:CREATE
-
EXTERNAL FUNCTION EMPTY
- COLLECTION
Clears all records from the collection, making it empty. If an invalid or inexistent collection name is passed, an error of type DATABASE:INVALID-COLLECTION is signalled. Note that this may also clear the ID sequence, meaning that IDs produced for records after the emptying of the collection may be equal to IDs produced before the emptying. See DATABASE:CREATE
-
EXTERNAL FUNCTION ENSURE-ID
- ID-ISH
Coerces the given string into an ID, if possible. May signal an error on invalidly structured or invalid ID. The return value is of type DATABASE:ID See DATABASE:ID
-
EXTERNAL FUNCTION IMPLEMENTATION
No documentation provided. -
EXTERNAL FUNCTION (SETF IMPLEMENTATION)
- VALUE3
No documentation provided. -
EXTERNAL FUNCTION INSERT
- COLLECTION
- DATA
Inserts a new record into the collection. The DATA can be formatted as either an alist or a hash- table. If the data includes fields that are not defined in the structure of the collection, the implementation may signal an error of type DATABASE:INVALID-FIELD. If the data does not include a field that is defined in the structure of the collection, the field's value is set to NIL. If a data value is specified that does not match the field's type, an error of type DATABASE:INVALID-FIELD may be signalled. If the insertion of the record fails for whatever reason, an error of type DATABASE:CONDITION is signalled. On successful insert, the value of the "_id" field for the newly created record is returned. If an invalid or inexistent collection name is passed, an error of type DATABASE:INVALID-COLLECTION is signalled. See DATABASE:CREATE See DATABASE:CONDITION See DATABASE:INVALID-COLLECTION
-
EXTERNAL FUNCTION ITERATE
- COLLECTION
- QUERY
- FUNCTION
- &KEY
- FIELDS
- SKIP
- AMOUNT
- SORT
- UNIQUE
- ACCUMULATE
Iterates over the records in the collection that match the clauses. Effectively, FUNCTION is called with a single argument-- a hash-table filled with the requested field values-- for each record in the collection that satisfies the QUERY. The fields in the table are keyed by their name as a string with the case converted downwards. The consequences of calling another DATABASE function from within the FUNCTION are implementation dependant. The QUERY must be a value returned by the DATABASE:QUERY macro. If FIELDS is NIL, all fields are included. Otherwise it can be a list of field names to include in each record. The database may store more fields than were requested, but never less. If UNIQUE is non-NIL and FIELDS is a list of at least one field, records are only considered to match if the same record (each field compared under EQUAL) has not appeared previously. If SORT is NIL, the order in which the records are passed is unpredictable and may be random with every call. Otherwise, SORT should be a list of lists, where each inner list should contain the name of a field, and either :ASC or :DSC for ascending or descending order. SKIP specifies the number of matching records to skip. If AMOUNT is NIL, all matching records are passed. Otherwise it poses an upper bound on the number of records that the function is called with. If ACCUMULATE is non-NIL, then the values returned by the function call are accumulated into a list and returned by the DATABASE:ITERATE call. If an invalid or inexistent field name is specified, an error of type DATABASE:INVALID-FIELD is signalled. If an invalid or inexistent collection name is passed, an error of type DATABASE:INVALID-COLLECTION is signalled. See DATABASE:CREATE See DATABASE:SELECT See DATABASE:QUERY See DATABASE:INVALID-COLLECTION See DATABASE:INVALID-FIELD
-
EXTERNAL FUNCTION REMOVE
- COLLECTION
- QUERY
- &KEY
- SKIP
- AMOUNT
- SORT
Removes the records in the collection that match the clauses. See DATABASE:ITERATE for an explanation of the options. If the removal of the records fails for whatever reason, an error of type DATABASE:CONDITION is signalled. If an invalid or inexistent collection name is passed, an error of type DATABASE:INVALID-COLLECTION is signalled. See DATABASE:CREATE See DATABASE:ITERATE See DATABASE:INVALID-COLLECTION
-
EXTERNAL FUNCTION SELECT
- COLLECTION
- QUERY
- &KEY
- FIELDS
- SKIP
- AMOUNT
- SORT
- UNIQUE
Returns a list of hash-tables for the records that match the clauses. See DATABASE:ITERATE for an explanation of the options. The QUERY must be a value returned by the DATABASE:QUERY macro. If an invalid or inexistent field name is requested, an error of type DATABASE:INVALID-FIELD is signalled. If an invalid or inexistent collection name is passed, an error of type DATABASE:INVALID-COLLECTION is signalled. See DATABASE:CREATE See DATABASE:ITERATE See DATABASE:QUERY See DATABASE:INVALID-COLLECTION See DATABASE:INVALID-FIELD
-
EXTERNAL FUNCTION STRUCTURE
- COLLECTION
Returns the structure of the collection. If an invalid or inexistent collection name is passed, an error of type DATABASE:INVALID-COLLECTION is signalled. Note that the value returned by this does not have to be identical to the structure used to create the collection. The types in the returned structure may be upgraded variants of the defined types. The types returned do not have to correspond to the concrete types used to actually store the data. See DATABASE:CREATE
-
EXTERNAL FUNCTION UPDATE
- COLLECTION
- QUERY
- DATA
- &KEY
- SKIP
- AMOUNT
- SORT
Updates the records in the collection that match the clauses with the new data. See DATABASE:ITERATE for an explanation of the options. The DATA can be formatted as either an alist or a hash- table. If the data includes fields that are not defined in the structure of the collection, the implementation may signal an error of type DATABASE:INVALID-FIELD. If the data does not include a field that is defined in the structure of the collection, the field's value is not changed. If a data value is specified that does not match the field's type, an error of type DATABASE:INVALID-FIELD may be signalled. If the updating of the records fails for whatever reason, an error of type DATABASE:CONDITION is signalled. If an invalid or inexistent collection name is passed, an error of type DATABASE:INVALID-COLLECTION is signalled. See DATABASE:CREATE See DATABASE:ITERATE See DATABASE:INVALID-COLLECTION
-
EXTERNAL MACRO QUERY
- QUERY-FORM
Constructs a value to be used for the QUERY argument in database operations. The query form must be of the following structure: FORM ::= COMBINE | CLAUSE | :all COMBINE ::= (:and FORM*) | (:or FORM*) | (:not FORM) CLAUSE ::= (OPERATOR VALUE VALUE) | (:in VALUE VALUE*) | (:NULL VALUE) OPERATOR ::= := | :/= | :> | :< | :<= | :>= | :MATCHES | :MATCHES* VALUE ::= (:field NAME) | 'NAME | LFORM NAME --- A field name. LFORM --- A lisp form that evaluates to a lisp value. Where the combinators have the following effect: :AND The form is true if all of the subforms are true. :OR The form is true if one of the subforms is true. :NOT The form is true if the subform is not true. And the clauses have the following comparison behaviour: := True if the two values are EQUAL. :/= True if the two values are not EQUAL. :> True if the two values are > if they are both of type :integer or :float, or STRING> if they are both of type :varchar or :text. :< True if the two values are < if they are both of type :integer or :float, or STRING< if they are both of type :varchar or :text :<= True if the two values are <= if they are both of type :integer or :float, or STRING<= if they are both of type :varchar or :text :>= True if the two values are > if they are both of type :integer or :float, or STRING>= if they are both of type :varchar or :text :NULL True if the value is unset. :MATCHES True if the first value matches the regular expression of the second value. The extent of regular-expression syntax support is up to the implementation, but the following basic operators must be understood: . [] [^] * + ? () {} \ ^ $ | The following character classes must be understood as well: \d \w \s \D \W \S :MATCHES* Same as :MATCHES except the match is performed in case insensitive mode. :IN True if the first value is EQUAL to one of the remaining values. If the form does not correspond to the above description, an error is signalled at macro expansion time. Note that a special exception is made in the case of fields of type ID, where the equality comparison (:=, :!=, :IN) is performed in an implementation-dependant manner. The other comparison operators cannot be used with ID type fields. If the form is simply :all, all records in the collection are returned. Examples for queries: (db:query (:= 'name "Hans")) Matches all records with a name field of "Hans". (db:query (:= '_id id)) Matches the record with the ID equivalent to the one stored in the ID variable. (db:query (:and (:= 'health 0) (:= 'lives 0))) Matches all records where the health and lives fields are 0. (db:query (:IN 'name "Guybrush" "Elaine" "LeChuck")) Matches all records where the name is one of "Guybrush", "Elaine", or "LeChuck". (db:query (:MATCHES 'tags "^foo$|^foo,|,foo$|,foo,")) Matches all records whose tags includes the "foo" tag. See DATABASE:CREATE See DATABASE:ITERATE See DATABASE:SELECT See DATABASE:COUNT See DATABASE:REMOVE See DATABASE:UPDATE
-
EXTERNAL MACRO WITH-TRANSACTION
- &BODY
- BODY
Performs the database operations in its body within a transaction that ensures coherence. If two transactions occur in parallel that would each modify the same set of data and conflict in some manner, one of the two transactions must be aborted by way of an error being signalled. If the transaction body is exited abnormally, which is to say exited before the last form in the body has finished execution and can return its value, all the database operations that were performed within the body are reverted in such a way that it appears as if they had never been performed in the first place.
-
RELATIONAL-DATABASE
- RDB
- MODULARIZE.INT.RELATIONAL-DATABASE
- MODULARIZE.MOD.RELATIONAL-DATABASE
No documentation provided.-
EXTERNAL SPECIAL-VARIABLE *IMPLEMENTATION*
No documentation provided. -
EXTERNAL HOOK IMPLEMENTED
No documentation provided. -
EXTERNAL HOOK UNIMPLEMENTED
No documentation provided. -
EXTERNAL FUNCTION IMPLEMENTATION
No documentation provided. -
EXTERNAL FUNCTION (SETF IMPLEMENTATION)
- VALUE3
No documentation provided. -
EXTERNAL FUNCTION SQL
- QUERY
- &REST
- VARS
Execute a raw SQL prepared statement. SQL should be a SQL query in string form, with placeholder variables being denoted as a question mark (?). Those variables must be provided in the &rest arguments of the call. The return value is the same as for a DB:SELECT call, meaning all matched rows are returned as a list of hash tables. Please note that the exact set of supported SQL features, operators, types, and syntax are implementation-dependant. In order to ensure compatibility with different implementations, you should restrict your queries to standard SQL. An implementation MAY rewrite your query. For the proper name conversion of collections to table names, please see DATABASE:CREATE. See DATABASE:SELECT See DATABASE:CREATE
-
EXTERNAL MACRO JOIN
- LEFT-COLLECTION
- LEFT-FIELD
- RIGHT-COLLECTION
- RIGHT-FIELD
- &OPTIONAL
- TYPE
Constructs a value to be used for the COLLECTION argument in database operations. Using this for a COLLECTION is as if there were a real collection that had the joined records as designated by this construct. LEFT-COLLECTION and RIGHT-COLLECTION must follow this syntax: COLLECTION ::= NAME | (OPERAND OPERAND &optional TYPE) TYPE ::= :INNER | :LEFT | :RIGHT | :OUTER OPERAND ::= (COLLECTION FIELD) NAME --- A collection name. FIELD --- A field name. The COLLECTION recursion allows joining more than two collections together. TYPE designates the type of join and may take the following values: :INNER --- Only records that match in both left and right are included in the result. :LEFT --- Include all records from the left table and those that match in the right collection. Fields from the right side on records that did not match will be NIL. :RIGHT --- Include all records from the right collection and those that match in the left collection. Fields from the left side on records that did not match will be NIL. :OUTER --- Include all records from the left and right collections. Fields from the left or right side on records that do not have a matching left or right side will be NIL. The matching mentioned here only relates to the respective FIELD of both sides being considered equal (by := of a QUERY), not to any possible additional constraint on the records imposed by a QUERY argument passed to the database operation the JOIN was passed to. Fields from both the left and right hand side of a join are merged into the same namespace. The consequences of accessing a field, be that through a QUERY or by reading it out of the resulting records, with a name that exists in both the left and right collections is implementation dependant. See DATABASE:QUERY See DATABASE:ITERATE See DATABASE:SELECT See DATABASE:COUNT See DATABASE:REMOVE See DATABASE:UPDATE
-
LOGGER
- L
- MODULARIZE.INT.LOGGER
- MODULARIZE.MOD.LOGGER
No documentation provided.-
EXTERNAL SPECIAL-VARIABLE *IMPLEMENTATION*
No documentation provided. -
EXTERNAL HOOK IMPLEMENTED
No documentation provided. -
EXTERNAL HOOK UNIMPLEMENTED
No documentation provided. -
EXTERNAL FUNCTION DEBUG
- CATEGORY
- LOG-STRING
- &REST
- FORMAT-ARGS
Logs the given message in the category as a debug message. See LOGGER:LOG
-
EXTERNAL FUNCTION ERROR
- CATEGORY
- LOG-STRING
- &REST
- FORMAT-ARGS
Logs the given message in the category as an error message. See LOGGER:LOG
-
EXTERNAL FUNCTION FATAL
- CATEGORY
- LOG-STRING
- &REST
- FORMAT-ARGS
Logs the given message in the category as a fatal message. See LOGGER:LOG
-
EXTERNAL FUNCTION IMPLEMENTATION
No documentation provided. -
EXTERNAL FUNCTION (SETF IMPLEMENTATION)
- VALUE3
No documentation provided. -
EXTERNAL FUNCTION INFO
- CATEGORY
- LOG-STRING
- &REST
- FORMAT-ARGS
Logs the given message in the category as an information message. See LOGGER:LOG
-
EXTERNAL FUNCTION LOG
- LEVEL
- CATEGORY
- LOG-STRING
- &REST
- FORMAT-ARGS
Logs the given message under the level. LEVEL has to be one of :TRACE :DEBUG :INFO :WARN :ERROR :SEVERE :FATAL. Note that the exact means by which the message is presented or logged is up to the implementation. See LOGGER:TRACE See LOGGER:DEBUG See LOGGER:INFO See LOGGER:WARN See LOGGER:ERROR See LOGGER:SEVERE See LOGGER:FATAL
-
EXTERNAL FUNCTION SEVERE
- CATEGORY
- LOG-STRING
- &REST
- FORMAT-ARGS
Logs the given message in the category as a severe message. See LOGGER:LOG
-
EXTERNAL FUNCTION TRACE
- CATEGORY
- LOG-STRING
- &REST
- FORMAT-ARGS
Logs the given message in the category as a trace message. See LOGGER:LOG
-
EXTERNAL FUNCTION WARN
- CATEGORY
- LOG-STRING
- &REST
- FORMAT-ARGS
Logs the given message in the category as a warning message. See LOGGER:LOG
-
MAIL
- MODULARIZE.INT.MAIL
- MODULARIZE.MOD.MAIL
No documentation provided.-
EXTERNAL SPECIAL-VARIABLE *IMPLEMENTATION*
No documentation provided. -
EXTERNAL HOOK IMPLEMENTED
No documentation provided. -
EXTERNAL HOOK SEND
- TO
- SUBJECT
- MESSAGE
This hook is triggered right before a mail is sent out. The recipient, subject, and body text are passed as arguments. See MAIL:SEND
-
EXTERNAL HOOK UNIMPLEMENTED
No documentation provided. -
EXTERNAL FUNCTION IMPLEMENTATION
No documentation provided. -
EXTERNAL FUNCTION (SETF IMPLEMENTATION)
- VALUE3
No documentation provided. -
EXTERNAL FUNCTION SEND
- TO
- SUBJECT
- MESSAGE
Sends an email to the specified address. If the sending of the email should fail, an error must be signalled. This function may be extended with additional keyword arguments if the implementation supports extraneous information, such as additional headers, attachments, and so forth.
-
PROFILE
- MODULARIZE.INT.PROFILE
- MODULARIZE.MOD.PROFILE
No documentation provided.-
EXTERNAL SPECIAL-VARIABLE *IMPLEMENTATION*
No documentation provided. -
EXTERNAL RESOURCE-TYPE PAGE
Returns an internal URI that points to the requested page. The following values are returned: 1. URI 2. QUERY-ALIST 3. FRAGMENT The QUERY-ALIST and FRAGMENT can be used as arguments to URI-TO-URL. By default a page with the name corresponding to the symbol of the given name in the module's package is used if available. However, a module or interface may special-case certain page names to provide a specified name to point to a page of particular interest.
-
EXTERNAL HOOK IMPLEMENTED
No documentation provided. -
EXTERNAL HOOK UNIMPLEMENTED
No documentation provided. -
EXTERNAL FUNCTION ADD-FIELD
- NAME
- &KEY
- TYPE
- DEFAULT
- EDITABLE
Adds a custom profile field that is visible on the user's profile. These fields can be used to store public information such as counters, stats, birthday, bio, etc. If EDITABLE is non-NIL, the user is allowed to change the field themselves. TYPE can be one of the following: text textarea password email url time date datetime-local month week color number range checkbox radio file tel The type is mostly useful for the display presentation to the user. The actual lisp data type used to store the field is a string. Note that this only stores the intended interpretation of a field, not the field itself. See PROFILE:FIELDS See PROFILE:REMOVE-FIELD
-
EXTERNAL FUNCTION AVATAR
- USER
- SIZE
Returns a full URL to an avatar image for the user. The size of the image should approximate the one passed as an argument, in pixels. It must however not be exact. You have to take care to scale the image to the appropriate size on the client regardless. The size specified here is only useful to optimise the image size for transfer speed.
-
EXTERNAL FUNCTION FIELDS
Returns a list of defined fields. Each field is an alist with the following keys defined: :NAME :TYPE :DEFAULT :EDITABLE The actual value of the fields can be accessed through the USER:FIELD accessor. See PROFILE:ADD-FIELD See PROFILE:REMOVE-FIELD See USER:FIELD
-
EXTERNAL FUNCTION IMPLEMENTATION
No documentation provided. -
EXTERNAL FUNCTION (SETF IMPLEMENTATION)
- VALUE3
No documentation provided. -
EXTERNAL FUNCTION LIST-PANELS
Returns a list of profile panel names. See PROFILE:REMOVE-PANEL See PROFILE:DEFINE-PANEL
-
EXTERNAL FUNCTION NAME
- USER
Returns the "display name" of the user. The display name is a name that, unlike the username, can be changed and the user deems preferable over the username.
-
EXTERNAL FUNCTION REMOVE-FIELD
- NAME
Removes the given field information, if it exists. See PROFILE:ADD-FIELD See PROFILE:FIELDS
-
EXTERNAL FUNCTION REMOVE-PANEL
- NAME
Removes the panel of the given name. See PROFILE:LIST-PANELS See PROFILE:DEFINE-PANEL
-
EXTERNAL MACRO DEFINE-PANEL
- NAME
- OPTIONS
- &BODY
- BODY
Defines a new panel to be shown on the user profile. This is similar to DEFINE-PAGE, except it defines a panel within the user profile interface. The body code should return HTML data to be emitted into the interface. Do not emit root elements such as <HTML> or <BODY>. The panel definition can be extended through the PROFILE:PANEL option. By default, the following options are guaranteed to exist: :ACCESS Will restrict access to it to users that pass the permission check. See USER:CHECK. In order to obtain the internal URI to a profile panel, use the PAGE resource with the user and panel name as arguments. See PROFILE:LIST-PANELS See PROFILE:REMOVE-PANEL
-
RATE
- MODULARIZE.INT.RATE
- MODULARIZE.MOD.RATE
No documentation provided.-
EXTERNAL SPECIAL-VARIABLE *IMPLEMENTATION*
No documentation provided. -
EXTERNAL HOOK IMPLEMENTED
No documentation provided. -
EXTERNAL HOOK UNIMPLEMENTED
No documentation provided. -
EXTERNAL FUNCTION IMPLEMENTATION
No documentation provided. -
EXTERNAL FUNCTION (SETF IMPLEMENTATION)
- VALUE3
No documentation provided. -
EXTERNAL FUNCTION LEFT
- RATE
- &KEY
- IP
Returns two values, the number of attempts left, and the number of seconds left until the timeout is over. The user is rate limited if the number of attempts left is zero.
-
EXTERNAL MACRO DEFINE-LIMIT
- NAME
- TIME-LEFT
- &KEY
- TIMEOUT
- LIMIT
- &BODY
- ON-LIMIT-EXCEEDED
Define the behaviour for a rate limitation. TIME-LEFT will be bound to the number of seconds left until the timeout is lifted. The body is the code that will be evaluated when the rate limit was hit. It should probably display an error page and perhaps record the infraction. TIMEOUT should be the interval of rate limiting. LIMIT is the number of attempts that can be made within the TIMEOUT. More straight-forwardly put: A timeout of 30 and limit of 3 means a user can make 3 attempts within 30 seconds. If he tries to make more, he is blocked until the time since the last attempt has reached TIMEOUT seconds. See RATE:LEFT See RATE:WITH-LIMITATION
-
EXTERNAL MACRO WITH-LIMITATION
- LIMIT
- &BODY
- BODY
Evaluates the body within a rate limited environment. The limit must be defined beforehand. The rules defined by the named limit are applied. If the user exceeds the allowed number of attempts and is within rate limitation, the body is not evaluated. See RATE:LEFT See RATE:DEFINE-LIMIT
-
SERVER
- MODULARIZE.INT.SERVER
- MODULARIZE.MOD.SERVER
No documentation provided.-
EXTERNAL SPECIAL-VARIABLE *IMPLEMENTATION*
No documentation provided. -
EXTERNAL HOOK IMPLEMENTED
No documentation provided. -
EXTERNAL HOOK STARTED
- NAME
- &KEY
This hook is triggered right after the server has been started. Note that this is a sticky hook and will remain active until SERVER:STOPPED is triggered.
-
EXTERNAL HOOK STOPPED
- NAME
- &KEY
This hook is triggered right after the server has been stopped. Note that this causes the SERVER:STARTED hook to become unstickied.
-
EXTERNAL HOOK UNIMPLEMENTED
No documentation provided. -
EXTERNAL FUNCTION IMPLEMENTATION
No documentation provided. -
EXTERNAL FUNCTION (SETF IMPLEMENTATION)
- VALUE3
No documentation provided. -
EXTERNAL FUNCTION LISTENERS
Returns a list of active listener instances. See SERVER:START See SERVER:STOP
-
EXTERNAL FUNCTION START
- NAME
- &KEY
Starts a listener server. The name must be a keyword. Note that the implementation must include additional keyword arguments that specify the actual instance behaviour such as the port, address, and so forth. However, in order to also allow exotic servers such as pipe-based ones, no such arguments are specified. See the documentation of your implementation of choice. If a server that is similar to the requested one (by name or the provided options), is already started, an error is signalled. On successful start, the SERVER:STARTED hook is triggered. On unsuccessful start, an error is signalled. The server implementation must take care to invoke REQUEST with the proper arguments on an incoming HTTP request, and to send the data contained in the returned response object back. See SERVER:STOP See SERVER:LISTENERS See REQUEST See RESPONSE
-
EXTERNAL FUNCTION STOP
- NAME
Stops the listener server on the given PORT. The name must be a keyword. If no listener with the requested name is found, an error may be signalled. On successful stop, the SERVER:STOPPED hook is triggered. On unsuccessful stop, an error is signalled. See SERVER:START See SERVER:LISTENERS
-
SESSION
- MODULARIZE.INT.SESSION
- MODULARIZE.MOD.SESSION
No documentation provided.-
EXTERNAL SPECIAL-VARIABLE *DEFAULT-TIMEOUT*
The default number of seconds a session can stay live for without being used. See SESSION:TIMEOUT
-
EXTERNAL SPECIAL-VARIABLE *IMPLEMENTATION*
No documentation provided. -
EXTERNAL CLASS SESSION
The session object that encapsulates the connection a particular client has to the system. A session uniquely identifies a "client" that connects to the server. The means by which clients are distinguished from each- other and the means by which associated sessions are tracked are implementation-dependant. A session is "active" for a certain period of time. This timeout is reset every time a request is made to the server by the client that is tied to the session. Once the timeout is reached, the session object is no longer considered active and may be removed entirely at any time. Sessions must be able to store arbitrary fields that can be used to store data associated with the session. Each session also has a globally unique ID string that can be used to coerce session objects to storage. See SESSION:= See SESSION:GET See SESSION:LIST See SESSION:ID See SESSION:FIELD See SESSION:TIMEOUT See SESSION:END See SESSION:ACTIVE-P
-
EXTERNAL HOOK CREATE
- SESSION
This hook is triggered when a new session object is started. The session object is passed as an argument.
-
EXTERNAL HOOK IMPLEMENTED
No documentation provided. -
EXTERNAL HOOK UNIMPLEMENTED
No documentation provided. -
EXTERNAL FUNCTION =
- SESSION-A
- SESSION-B
Compares the two session objects and returns true if they represent the same session identity. See SESSION:SESSION
-
EXTERNAL FUNCTION ACTIVE-P
- &OPTIONAL
- SESSION
Returns whether the session is currently active or not. An inactive session will no longer be tied to any future client requests and may be removed at any time. See SESSION:SESSION
-
EXTERNAL FUNCTION END
- &OPTIONAL
- SESSION
Ends the session immediately, making it inactive. See SESSION:SESSION See SESSION:START See SESSION:ACTIVE-P
-
EXTERNAL FUNCTION FIELD
- SESSION/FIELD
- &OPTIONAL
- FIELD
Accessor to an arbitrary data storage field for a session object. If no SESSION-ID is given, the session associated with the current client is used. The keys must be objects comparable under EQL. When a session field is set, the session is automatically started and thus persistently associated with the client as much as possible. See SESSION:SESSION
-
EXTERNAL FUNCTION (SETF FIELD)
- VALUE
- SESSION/FIELD
- &OPTIONAL
- FIELD
No documentation provided. -
EXTERNAL FUNCTION GET
- &OPTIONAL
- SESSION-ID
Retrieves the current session, or a particular one. If no SESSION-ID is given, the session associated with the current client is returned, if any. The SESSION-ID must be a string that is STRING= to one previously obtained by a call to SESSION:ID. See SESSION:SESSION See SESSION:ID
-
EXTERNAL FUNCTION ID
- &OPTIONAL
- SESSION
Returns the globally unique ID of the session as a string. If no SESSION-ID is given, the session associated with the current client is used. The ID must be unique in such a way that no two sessions that are known to the implementation at any time may have the same ID. See SESSION:SESSION
-
EXTERNAL FUNCTION IMPLEMENTATION
No documentation provided. -
EXTERNAL FUNCTION (SETF IMPLEMENTATION)
- VALUE3
No documentation provided. -
EXTERNAL FUNCTION LIST
Returns a fresh list of all known session objects. The sessions may not all be active. Invoking this function may be expensive. See SESSION:SESSION See SESSION:ACTIVE-P
-
EXTERNAL FUNCTION START
Starts a new session in the current request context and returns it. If the request already has a session associated with it, it is not replaced. Once a session has been started, the client must receive the same session on future requests to the server. How this client tracking is achieved is implementation-dependant. See SESSION:SESSION See SESSION:GET See SESSION:END
-
EXTERNAL FUNCTION TIMEOUT
- &OPTIONAL
- SESSION
Accessor to the timeout, in seconds, of the session object. If no SESSION-ID is given, the session associated with the current client is used. See SESSION:SESSION See SESSION:ACTIVE-P
-
EXTERNAL FUNCTION (SETF TIMEOUT)
- SECONDS
- &OPTIONAL
- SESSION
No documentation provided.
-
USER
- MODULARIZE.INT.USER
- MODULARIZE.MOD.USER
No documentation provided.-
EXTERNAL SPECIAL-VARIABLE *IMPLEMENTATION*
No documentation provided. -
EXTERNAL CLASS USER
Container for a user. A user is an object that represents a certain person with access to the system. Each user has a uniquely identifying username string of 1-32 case-insensitive characters of the following range: "abcdefghijklmnopqrstuvwxyz0123456789_-." Each user object can store arbitrary information in fields. A user has a set of permissions that describe which protected resources the user should be granted access to. These permissions are laid out in the form of trees, where each permission describes a certain path down a tree. For example, the following permission foo.bar would grant access to the permissions foo.bar, foo.bar.baz and so forth, but not to foo or foo.bam . Permissions can be denoted by either dot-delimited strings, or lists. Note that the user system may need to be readied up first before it can be reliably used. Attempting to perform any user operations before the USER:READY hook has been triggered or after the USER:UNREADY hook has been triggered will result in undefined behaviour. A user object is not required to sync with the backend, and in fact does not need to be identical according to EQ to another user object for the same user. It is thus not a good idea to retain and cache user objects, as the user's attributes might change asynchronously, causing a previous instance to become outdated. See PERM See USER:= See USER:LIST See USER:GET See USER:ID See USER:USERNAME See USER:FIELDS See USER:FIELD See USER:REMOVE See USER:CHECK See USER:GRANT See USER:REVOKE
-
EXTERNAL CONDITION CONDITION
Base condition type for conditions related to the user interface.
-
EXTERNAL CONDITION NOT-FOUND
Condition signalled when an unknown user was requested. See USER:CONDITION See USER:GET
-
EXTERNAL HOOK CREATE
- USER
This hook is triggered when a new user is created. The user object is passed as an argument.
-
EXTERNAL HOOK IMPLEMENTED
No documentation provided. -
EXTERNAL HOOK READY
This hook is called when the user system has become ready and users can be accessed. You should refrain from performing user operations while this hook is untriggered. Note that this is a sticky hook and will remain active until USER:UNREADY is triggered.
-
EXTERNAL HOOK REMOVE
- USER
This hook is triggered when an existing user is removed. The user object is passed as an argument.
-
EXTERNAL HOOK UNIMPLEMENTED
No documentation provided. -
EXTERNAL HOOK UNREADY
This hook is called when the user system is no longer ready and users can no longer be accessed. Note that this causes the USER:READY hook to become unstickied.
-
EXTERNAL FUNCTION =
- USER-A
- USER-B
Compares two user object to see if they denote the same user. See USER:USER
-
EXTERNAL FUNCTION ADD-DEFAULT-PERMISSIONS
- &REST
- BRANCH
Adds the given branches as default permissions to be granted to newly created users. Note that this will not retroactively grant permissions and only comes into effect for users created after a call to this has been run. See USER:USER See USER:GRANT
-
EXTERNAL FUNCTION CHECK
- USER
- BRANCH
Checks whether the user is permitted access to the given permission branch. See USER:USER for a description of permission branches. Note that a permission is granted as long as there is a granted permission on the user that is /higher/ than that which is checked against. Eg, if the user has the permission of foo granted, then checking whether any of foo.bar, foo.bar.baz, etc. are granted will yield true. See USER:USER See USER:GRANT See USER:REVOKE
-
EXTERNAL FUNCTION FIELD
- FIELD
- USER
Accessor to a field on the user. Keys must be strings of a maximum length of 64. Values must be strings, but can be of arbitrary length. See USER:USER See USER:REMOVE-FIELD See USER:FIELDS
-
EXTERNAL FUNCTION (SETF FIELD)
- VALUE
- FIELD
- USER
No documentation provided. -
EXTERNAL FUNCTION FIELDS
- USER
Returns an alist of field names to values of the user. See USER:USER See USER:FIELD See USER:REMOVE-FIELD
-
EXTERNAL FUNCTION GET
- USERNAME/ID
- &KEY
- IF-DOES-NOT-EXIST
Returns the requested user object. The user can be referenced by either a username as a string, or a user ID as an integer. IF-DOES-NOT-EXIST may be one of the following values, which decides on the behaviour in the case where the requested user is not known. :CREATE The user is created. :ERROR An error of type USER:NOT-FOUND is signalled. :ANONYMOUS The anonymous standard user is returned. NIL NIL is returned. The :CREATE option is only valid if the given identifier is a string denoting a username. If :CREATE is used with a user ID, an error is signalled. When a new user is created, the USER:CREATE hook is triggered. The user named "anonymous" must always exist and is automatically created by the implementation. It is intended to be used for unauthenticated users. Note that fetching users while the user system is not yet ready will result in undefined behaviour. See USER:READY See USER:UNREADY See USER:USER
-
EXTERNAL FUNCTION GRANT
- USER
- &REST
- BRANCHES
Grants the user access to the given permission branches. See USER:USER See USER:CHECK See USER:REVOKE
-
EXTERNAL FUNCTION ID
- USER
Returns the integer ID of the user object. This is useful for references to user accounts from database records, as storing the full username is both wasteful and inefficient for searching. See USER:USER
-
EXTERNAL FUNCTION IMPLEMENTATION
No documentation provided. -
EXTERNAL FUNCTION (SETF IMPLEMENTATION)
- VALUE3
No documentation provided. -
EXTERNAL FUNCTION LIST
Returns a fresh list of all known user objects. This may be a very costly operation. See USER:USER
-
EXTERNAL FUNCTION REMOVE
- USER
Removes the given user. This deletes all associated data of the user. On successful deletion, the USER:REMOVE hook is triggered. See USER:USER
-
EXTERNAL FUNCTION REMOVE-FIELD
- FIELD
- USER
Removes the requested field from the user. See USER:USER See USER:FIELD See USER:FIELDS
-
EXTERNAL FUNCTION REVOKE
- USER
- &REST
- BRANCHES
Revokes access from the given permission branches. See USER:USER See USER:CHECK See USER:GRANT
-
EXTERNAL FUNCTION USERNAME
- USER
Returns the username of the requested user. See USER:USER