baserunner

语法与配置

 

创建一个 baserunner应用程序需要三个基本的元素:一个或多个数据库,配置文件与HTML代码。在构建一个baserunner程序时,对台何将参数传递给baserunner有一点限制。baserunner需要使用一些固定的变量来传递消息,以便分析HTML代码和处理HTML代码,并将信息发送到用户端。这些变量通过配置文件或命令行或HTML表单或者是cookies传递给baserunner, baserunner在传递所需的参时是非常灵活的。

所有传递给baserunner的变量,除非是直接引用数据库的字段(域),都带有一个下划线"_"前缀字符。

对 baserunner的第一个调用应该通过_cfg变量告诉baserunner所要应用程序使要用的配置文件。当baserunner处理一个带有_cfg变量的调用时,它就建立一个新的用户会话。

所有其他的调用必须通过_ses变量传递一个用户会话的名称(通常由第一次调用产生)。_ses变量中包含的是会话的值,这个值由baserunner给定,而用对一个用户来说它在baserunner系统中是唯一的。

根据上面的两条规则,baserunner允许你在模板内大范围内的它。

一个baserunner应用程序需要两个配置文件。配置文件中包含许多baserunner运行时所需要的变量。一旦baserunner启动之后,对变量的处理是没有区别的了,无论这些变量是来自配置文件或者是命令行或者是表单。每个变量都以下划线作为第一个字符,赋值语句的格式为 :_variable=value。在配置文件中没有以下划线打头的变量将被忽略。配置文件在DOS与Linux具有不同的格式,但是baserunner在Linux系统下将会正常的处理DOS格式的配置文件。

在Linuxg下配置文件必须以空行结束

在Windows系统下,配置文件的行不能超过254个字符

包含在配置文件中的变量也可以通过命令行或表单传递给baserunner。通过,在程序运行时不变值的变量一般都放在配置文件中。但即便是在应用程序的配置文件中定义的变量,在运行时也可能被通过命令行或表单传来的参数覆盖掉。 但是在baserunner的配置文件中的变量是不能被覆盖的。

不管变量是通过何种方式传递给baserunner系统的,这的处理都是一样的,baserunner给予变量的优先级是(1最高,5最低):

  1. 系统配置文件baserun.cfg.
  2. 命令行(GET).
  3. 表单变量(POST).
  4. http cookie信息.
  5. 应用程序配置文件.

具有高优先级的变量将覆盖低优先级的变量,如: 通过命令行传递的 _dbf 变量将优先于应用程序配置文件中的具有相同名字的变量。主要有以下几种类型的变量:

类型(Value) 描述
Path 根据不同的文件系统,需要在变量值的最后加上"\" 或 "/"
File name 存储带有后缀的文件名。如果在baserun.cfg文件中没有PATH变量,则应该是带的完全路径的文件名。
Text Text变量需要一个文字字符串的值。一些需要文件名的变量可能被设置为TEXT类型的。
Integer 包含数据值的变量.
Expression 表达式变量包含着一个有效的xBase表达式。这种类型的表达式与特定的变量相关。如果表达式是通过命令行(通过带有一个_fil变量)传递的,它必需按照URL格式进行编写。这通过将表达式放在一对<%. . .%>之中来实现。
Field name 代表当前数据库中的一个字段的值
Logical 可能有很多值,但通过都只有一个值,如果它存在就为true,这种类型的变量不能被覆盖。

baserunner 系统配置文件

这个配置文件在所有的baserunner中都可以使用,它的名称是baserun.cfg(注: 这个文件名应该与baserunner执行文件名相当,如果你修改了执行文件名,则配置文件名也应该作相应的修改,例如你将执行文件名改为atabase.exe,则配置文件名应为atabase.cfg),配置文件必须与执行文件在同一个目录,通过是cgi_bin目录,但根据你服务器的配置,它也可在WEB根目录之下。是否使用这个配置文件由你自己决定,但我强烈建议你使用它(参见后面的全性一章)。baserun.cfg可以包含在所有应用程序中都可以使用的变量。在该配置文件中的变量是不能被通过其他方式传递来的参覆盖掉的。

变量 类型 描述
_expired Text TEXT类型的变量,当用户的会话过期后,baserun将会把它的值传递给用户。如果没有设置这个变量,baserun将发送缺省的消息"Session Expired."
_sessionpath Path 会话数据库所在目录
_configpath Path 应用程序配置文件所在目录
_datapath Path 应用程序数据库文件所在目录
_templatepath Path 应用程序模板(HTML文件)所在目录,一般说来,这个变量必须定义。

例子:

_sessionpath=c:\inetpub\my directory\sessions\
_configpath=c:\inetpub\my directory\configs\
_datapath=c:\inetpub\my directory\database\
_templatepath=c:\inetpub\my directory\html\
_expired=Your baserunner session has expired!
_sessionpath=/home/mydir/www/cgi-bin/sessions/
_configpath=/home/mydir/www/cgi-bin/configs/
_datapath=/home/mydir/www/cgi-bin/database/
_templatepath=/home/mydir/www/cgi-bin/html/
_expired=Your baserunner session has expired!

注: 根据你所使用的服务器不同,在这些变量的值的最后都必须加上 "\" 或 "/"。这些路径必须使用真正的物理路径而不是在URL中使用的虚拟路径。如果没有使用这些路径变量,在你的应用程序或命令行中必须为文件指定的完整的路径名。还可以在配置文件中使用定义其他的变量。在这里定义的变量是具有最高的优先级,因而它不能被用其他方式传递来的变量覆盖。全部的baserunner程序都可以使用在这个配置文件中定义的变量。

应用程序配置文件

应用程序配置文件决定的应用程序的大多数特性。与baserun.cfg不同,你可以为应用程序配置文件任意设置文件名(包含扩展名)。 在baserunner中可以使用的应用程序配置文件的数量是没有限制折,其格式与baserun.cfg的格式相同。

每个应用程序都应该有一个配置文件。 任何需要缺省值的变量都应该在应用程序配置文件中进行定义。有一些变量只是通过命令行或表单传递给baserunner.在应用程序配置文件中的最常见的变量见下表。下表中是黑体的变量的名字可以任意的名字(当然不能与其他的变量名相冲突)。

CFG = 可能包含在系统配置文件之中。
CL=可能包含在命令行或表单之中。

变量 类型 描述 CFG CL
_dbf File name 在应用程序的配置文件中,这个变量用来设置应用程序使用的缺省数据库。 它的值是baserunner要使用的数据库的名称,如果需要的话,它还可能包含路径名。 X X
_defhtml File name
Variable

这个变量用来指定程序第一次被请求时baserunner打开并分析的第一个HTML模板文件。其值是文件的名称,可以包含路径,也可以是指向一个目标变量的引用。

X  
_positionfail File name
Text
Variable
其值可能是字符串也可以指向一个模板文件(文件名或目标变量),当baserunner不能定位到一个有效的记录时,这个值(字符串或文件)将发送到用户端。不通过用于响应用户查询记录而没有找到记录这种情况。 X X
_minutes Integer 设置用户会话的有效时间长度,若没有指定则为10分钟。 X  
_display Integer 当使用<!--repeat-->指令时,用来指定可能显示的记录数的缺省值。 X X
_deffilter Expression

对数据库来说,过滤总是会产生效果的。即使用户使用了一个新的查询,它还会起作用。这可能用来过隐藏掉一些没有用的记录(如被删除的,不再有审核标志的记录),它的值必须是有效的xBase表达式。 使用它的主要缺点是数据库总是被过滤掉,除非你使用了块命令<!--filter--> 与 <!--nofilter--> 。

X
_defpassword Text 覆盖包含在数据库中任何用户口令的缺省口令,参见Password. X
_passfield Field name 包含用户口令的字段名,参见 Password. X
_dateformat Text

程序中日期数据的缺省显示格式。用YMD来表示年月日,C表示世纪,其中可以使用其他任意的你选定的分隔符。如MM/DD/CCYY或DD.MM.CCYY等。但你需要确保你使用的数据库能正确地解决2000年问题,在年份后带上世纪是一个好的习惯。

X X
_entrypass
_entryfail
_editpass
_editfail
_passwordpass
_passwordfail
_deletepass
_deletefail
_mailpass
_mailfail
File name
Text
Variable

如果使用了相关的操作,这些变量必须成对的包含在配置文件之中。相关的操作或者成功或者失败,如果成功,在_*pass中包含的模板或字符串将发送到客户端。如果失败,_*fail中包含的模块或字符将被发送。 另外,在命令行或表单中的_tar将覆盖这些变量值。

X X
_target_variable Text 可以加入到配置文件中的命名变量,它可以在命令行中使用。 X
_menu_variable Expression

当使用_fil命令时,可在菜单项中使用其值的变量。

X  
_list_name Expression 列表项 X X
_unique_list_name Expression 具有唯一性的列表项。 X X
_variable Text
Expression
你自己的任意变量,它必须以下划线为前缀。 X X
_hidedeleted Logical

如果在配置文件中包含这个变量,所有带有删除标志的记录将被隐藏起来。变量的值无所谓,只要有值就行。如果使用了这个变量,在baserunner内部将不会设置过滤标志。

X X
_memolength Integer 这个变量决定memo类型的字段显示的字节数。缺省值是1024,超过这个值长度的内容在显示时将被截去。在查询时,也只有指定长度的内容被查询。 X X
_showtime Text 如果包含该变量,在baserunner生成每一个页面时都将显示其所花费的时间,并将这个变量的值显示在时间的前面。如其值是:lapsed time:, baserunner将产生在页页的底部类似下面的输出:Elapsed time: 0.089 X X
_translatehtml Logical 如果有这个变量,baserunner产生的所有输出都将处理成与HTML相同的代码字 符,这在非英语国家中使用可能会有问题。 X  
_stripreturns Logical
Text
参见 Entry & editing X X
_striphtml Logical 参见 Entry & editing X X
_modhtml Logical 参见 Entry & editing X X
_nodelete Logical 如果有这个变量,删除操作永远不会成功。 X  
_noedit Logical 如果有这个变量,编辑操作不能进行。 X  
_noentry Logical 如果有这个变量,进入操作不能进行。 X  
_nodebug Logical 如果有这个变量,可以防止将调试操作送到用户端。 X  
_nocache Logical 如果有这个变量,可以不使用baserunner的内部CACHE。 X  
_nopack Logical 如果有这个变量,就不能使用pack操作。建议你在所有的应用程序配置都加上这个变量,只允许系统管理人员使用这个功能,就更安全。 X  
_mailhost Text 设置SMTP邮件主机的名字或者在发送邮件的路径。参见 Mail configuration. X X
_mailto Text 邮件发送的对象 参见 Mail configuration X X
_mailcc Text 邮件抄送对象 参见 Mail configuration X X
_mailbcc Text 邮件密送对象 参见 Mail configuration X X
_mailfrom Text 邮件发送人 参见 Mail configuration X X
_mailsubject Text 邮件主题 参见 Mail configuration X X
_mailtarget File name 该变量以模块名为值。当发送邮件时,模板用来构造要发送的消息。 参见 Mail configuration X X
_mailonentry File name 该变量以模块名为值。当发送邮件时,每次使用模板中的一个录来构造要发送的消息。 参见 Mail configuration X X
_mailonedit File name 该变量以模块名为值。当发送邮件时,每次使用模板中的一个录来编辑要发送的消息。 参见 Mail configuration X X
_use_iis_sort Logical

在Windows NT下的Microsoft IIS服务器,在排序时,使用标准的记录定位代码不能正常工作,因而baserunner需要使用不同于其他系统下的记录定位代码, basserunner自动检测是否使用IIS作服务器,Windows系统下的其他服务器都使用正常的排序 代码。然而,由于可能有许多的服务器没有经过baserunner的测试,有些服务器下可能还是得使用IIS的排序代码 ,当然你可以进行一系列的测试工作来确定是否是这样的。例如你可以在数据库上设置_sortorder变量,然后使用back操作,如果将你的程序挂起了,则需要IIS排序代码。

X  

表单与命令行变量

baserunner可能通过使用标准的链接传递一个命令行或者表单来调用。传递给baserunner的变量告诉baserunner系统用户名、打开模板之前需要执行的操作以及其他所需要的信息。虽然CGI程序是标准的,但各种服务处理用户传递的数据的方法却各不相同。有些调用baserunner程序的方法可能在另外一些服务器配置上就不能正常运行。通常,如果你使用一种方法来调用baserunner时出现异常,你可以试一试其他的方法,例如,你通过命令行传递时出现异常,可以写一个小的HTML表单进行测试。进行试验与排错是找到它如何工作的最好方法。当然,多数服务都能使用任何一种方法而不出现错误。

对baserunner的第一次调用需要传递给它一个配置文件名称,这时通常仅需要这一个参数就行了,如果没有指定_tar变量,程序将打开缺省的目标文件_defhtml.

<a href="/cgi-bin/baserun.exe?_cfg=[configuration file]"></a>

或者使用一个表单来启动baserunner:

<form action="/cgi-bin/baserun.exe" method="GET">
<input type="hidden" name="_cfg" value="
[configuration file]">
<input type="submit" value="Start">
</form>

首次调用时指定的应用程序的配置文件名,baserunner将创建一个会话记录,并给用户分配一个具有唯一性的会话名称。在其后的调用之中,经常要使用这三个变量:_ses (会话), _act (行为/动作), 与 _tar (目标模板)。

对于第一次调用后的每次调用,需要使用会话变量将会话名传递给baserunner软件:_ses={session}。_tar变量用于指定baserunner将要处理的模板,如果当前模板需要再次使用的话,_tar变量的值将被忽略。_act变量用于告诉baserunner在分析当前模板(或读提交的表单)时需要采取的操作。如果你只是打开另一个模板而不重新定位记录指针的话,可以仅指定_tar变量而忽略_act变量。_ses,_act与_tar是最常见的变量。其他变量也可以通过命令行或表单进行传递。如果一个变量通过命令行或表单传递给baserunner,在应用程序中定义的具有相同名字的变量将被覆盖。下表中的黑体变量名是当前数据库中的字段名,这也是系统中唯一不以下划线打头的变量名。

CFG = 可能包含在系统配置文件之中。
CL=可能包含在命令行或表单之中。

变量 类型 描述 CFG CL
_cfg File Name 指定baserunner要读取的配置文件名。当第一次调用时需要指定它。如果没有指定_configpath路径,而且配置文件又不在当前目录之中,则需要写出完整的路径名。   X
_ses {session} 在第一次调用之后都需要使用这个参数,用来指定用户的会话名称。   X
_tar File Name 用来指定baserunner在响应命令时进行分析时所使用的模板文件名,如果没有指定表示使用原来的。如果没有指定在baserun.cfg中指定_templatepath,并且在配置文件没有在baserunner的目录之中,则需要指定完整的路径名。   X
_act Action 指定baserunner需要进行的操作。在第一次调用时时不需要指定。   X
_fil Expression 数据库过滤条件。其值必须是合法xBase表达式。在命令行中,_fil变量将为数据库设置一个新的过滤条件。在查询表单中,建立一个新的查询时可能有多个_fil表达式要处理。在大多数情况下,_fil的值应包括在一个URL之中,如_fil=<%expression%>.

如果给_fil值为0,当前的查询将被清掉。

  X
_tempfil Expression 基本与上一个相同,只是当一个调用完成之后,原来的过滤条件就恢复了,而且记录指针不会改变。   X
_dbf File name 应用程序使用的数据库文件名。如果需要的话,你还应该为它指定路径名。关于使用多个数据库的方法可见有关章节。 X X
_display Integer 当使用<!--repeat-->指令时,用来指定可能显示的记录数的缺省值。 X X
_password Text 参见Password.   X
Field Name Text 用于查询、数据输入或编辑的字段名   X
Field List Text

用于查询的字段名列表,每个字段之间用空格分开。参见 Query

  X
%Field Name Expression

字段名前带一个%,其值用于在数据输入或编辑表单中对字段内容进行有效性验证。参见entry and editing.

  X
_case Logical 查询数据时区分大小写. See Query. X X
_matchall Logical 查询时进行完全匹配检查 See Query. X X
_sortorder Expression

数据库查询或排序时所用的表达式,它也可以存在于应用程序配置文件之中,这样对整个应用程序都有效。如果它的值为0,则清除当前的排序表达式。

X X
_exact Logical 它具有当_matchall和_case同时使用时的效果。即区分大小写的完全匹配。参见 Query. X X
_tagstart Text 设置baserunner标志间的起始分隔符,缺省省为"{"。 X X
_tagend Text 设置baserunner标志间的终止分隔符,缺省省为"}"。 X X
_uencodestart Text 用于设置baserunner中模板内URL地址的分隔符,缺省情况是"<%"。 X X
_uencodeend Text 用于设置baserunner中模板内URL地址的分隔符,缺省情况是"%>"。 X X

你还可以定义在表单或命令行中使用的其他参数,每个变量名的第一个字符应该是下划线,这些变量可能被赋值,也可以读取它的值。

当要传递带有表达式的变量值时(或者是与HTML有冲突的值时),你应该使用URL分隔符,这时你应该使用<%...%>来分隔。在使用命令时,任何不是字母与数据的值都应该包含在一对<%...%>之中,而在配置文件中不是需要使用分隔符的。

baserunner可识别的操作现后面的表格。在命令行中,变量之间用"%"分隔开,命令行中也可以包含URL分隔符信息。

<a href="/cgi-bin/baserun.exe?_ses={session}&_act=[action]&_tar=[template]"></a>

当在表单中传递参数时,所有的参数都应该使用hidden类型的表单体来表示,这样可以将变量隐藏起来不让用户看见。表单提交时可以使用POST与可以使用GET方法。一般说来,在数据查询、输入与编辑时使用POST,而在其他情况下使用GET。

<form action="/cgi-bin/baserun.exe" method="GET">
<input type="hidden" name="_ses" value="{session}">
<input type="hidden" name="_act" value="[action]">
<input type="hidden" name="_tar" value="[template]">
<input type="submit" value="Submit">
</form>

如果你使用POST方法进行提交,你即可以通过表单传递变量也可以使用命令行来传递参数:

<form action="/cgi-bin/baserun.exe?_ses={session}&_act=[action]&_tar=[template]" method="POST">
<HTML Form Variables>
<input type="submit" value="Submit">
</form>

操作

_act变量可以是下表中的任何值:

top 将记录指针定位到数据库或查询的第一个记录。
back

将记录指针向前移动一个,若已经是第一个则不移动。如果有显示了多个数据库的记录,可以使用back X来确定移动那一个数据库记录的指针。

next 将记录指针向后移动一个,若已经是最后个则不移动。如果有显示了多个数据库的记录,可以使用back X来确定移动那一个数据库记录的指针。
end 将记录指针向后移到最后的记录之上。如果有显示了多个数据库的记录,可以使用back X来确定移动那一个数据库记录的指针。
integer 将记录指针移到到指定的位置。
delete 给当前数据库的记录做删除标志(或恢复删除标志)。只有当退出软件或进进了Pack操作后,记录才真正的从数据库中删除。
pack

从当前数据库中删除已经作了删除标志的记录,若数据库较大或者带有大的memo字段,这个操作可能要费一段时间同时间,同时数据库将被加锁一段时期。但如果设置了_onpack变量,则删除操作不会进行。

mail 参见 Mail configuration.
debug 将baserunner当前的全部变量传递给用户。当使用这个操作时,baserunner不处理模板。
password 参见 Password.
display

用来重新设置一页中显示的记录数。它将修改配置文件中的_display的值,当使用这个操作时,需要在表单中增加一个_display变量才行。{setdisplya}可以将当前的显示数目传递给_display变量。一个无效的值将会使_display的值设值为1。例子:

<form action="/cgi-bin/baserun.exe method="GET">
<input type="hidden" name="_ses" value="{session}">
<input type="hidden" name="_act" value="display">
<input type="text" size="3" name="_display" value="{setdisplay}">
<input type="submit" value=" Show "></p>
</form>

sort 根据_sortorder中的字段(或表达式)进行排序。

例子:

<form action="/cgi-bin/baserun.exe" method="GET">
<input type = "hidden" name="_ses" value="{session}">
<input type = "hidden" name="_act" value="sort">
<input type = "hidden" name="_tar" value="[template]">
<select name="_sortorder" size="1">
<option> </option>
<option value="(studio+title)">Studio</option>
<option value="(ascend(title))">Title (ascending)</option>
<option value="(descend(title))">Title (descending)</option>
<option value="(ascend(price))">Price (ascending)</option>
<option value="(descend(price))">Price (descending)</option>
</select>
<input type="submit" value="Sort">
</form>

排序操作将显著地降低应用程序性能,一般来说最好只对小的数据库或一个大的数据库中的一个小的子集进行排序。

query 参见 query.
refine 参见 query.
revert 参见 query.
edit 参见 entry and editing.
entry 参见 entry and editing.

安全性

关于使用CGI程序的安全性问题的讨论请参见w3.org。使用任何CGI程序都存在安全性问题。但baserunner已经将这些安全性问题减少到最小。通过设置适当的变量并使用服务器的管理工具,可以使baserunner更加安全。

baserunner需要对服务器文件的写权限。baserunner仅仅创建会话数据库及其相关的备注文件。另外 ,baserunner还需要写应用程序的数据库文件。除此之下,baserunner不需要任何权限。

对于输入数据到数据库的HTML代码,尤其是当服务器允许使用SSI时,需要对这些代码进行严密的监控。 baserunner需要应用程序来对录入的数据进行有效性验证。当在表单中输入数据时,baserunner将忽略用户输入的不正确的数据。baserunner使用动态的方法来管理变量的存储空间。

在Linux系统下,为了防止有人恶意使用邮件功能,可以在调用baserunner中的sendmail程序时带上-t选项。

当在基于Linux系统下使用baserunner时,只给目录或文件设置能使应用程序运行所需要的最少权限即可。在Windows系统下,其权限设置就没有这么复杂,因此它的权限设置就没有Linux系统下灵活。

任何包含机密资料的数据库或配置文件都应该放在具有口令保护的目录之中。baserunner仅仅是将文件安装在硬盘上,它不能控制用户从服务器下载数据库或配置文件。聪明的用户可能会找到你服务器上的各种文件,如果你没有为它设置口令,用户要下这些文件就会很容易。如果你对服务器上的安全性设置有问题的话,可以也与服务器系统管理员联系。

使用"baserun.cfg"文件来保存你应用程序各种文件的路径可能是你可以采取的最简单的也是最重要的安全性措施。由于在配置文件中的路径用于所有找开的文件,这样就可以排除用户通过命令行来使用baserunner中的文件。在一个配置好的服务器上,安全性是没有问题的。如果你使用绝对路径访问baserunner系统,这是很不安全的。

Cookies

使用cookies来保存一些变量,尤其是会话名,可提供附加的安全性,这是因为应用程序不必依靠隐藏的变量(隐藏的变量可能会由用户在提交表单前被修改)。Cookies还可能简单在baserunner的调用中使用全局变量(像配置文件中的变量一样,除非这些变量在是运行时动态产生的)。处理Cookies的最好办法是使用 JavaScript。 下面是一个简单的例子:

 

<script language="JavaScript">
<!--
function SetCookie(name, value)
{
   document.cookie = name + "=" + escape(value);
}
SetCookie("_ses", [session]);
SetCookie("_myvariable", "My value");
// -->
</script>

很显然,为了使用这段脚本,需要将_tagstart与_tagend变量分别设置为"[" 与 "]" 。这段脚本需要包含在由_defhtml所指定的模板之中。(至少应使_see变量在应用程序的其他部分可用)