您可以通过以下例行程序来访问 Net.Data 服务:
dtw_execute() 例行程序是仅有的必须由语言环境提供的例行程序。
当调用 Net.Data 来处理一个 Net.Data 宏,并且它遇到用语言环境调用 函数时,则执行以下这些步骤:
Net.Data 将一个语言环境接口结构(dtw_lei)传递到它调用的一个语言环境例行 程序中。 此结构包括一个参数数据数组和其它的一些值,在这个参数数组中则包 含要传递到语言环境例行程序的参数列表。 由 Net.Data 调用的例行程序用于处 理请求、更新参数数据数组中的参数(如果适用的话)并返回到 Net.Data。 然后 Net.Data 将搜索这个参数数据数组,更新它的参数副本来反映出由语言环境例行 程序设置的新值,并且继续对 Net.Data 宏的处理。 一旦 Net.Data 宏完成处理, Net.Data 对于所有语言环境都调用 dtw_cleanup()(如果它适用于这些语言环境), 然后返回到 Web 浏览器。
以下章节说明了 Net.Data 语言环境接口,包括接口结构和各种语言环境接口程 序怎样与 Net.Data 进行交互。
Net.Data 使用两个结构类型与语言环境进行交互:dtw_lei 和 dtw_parm_data。
每种语言环境的接口程序接收到一个指向 dtw_lei 结构的指针:
typedef struct dtw_lei { /* Lang. Env. Interface */
char *function_name; /* Function block name */
int flags; /* Lang. Env. Interface flags */
char *exec_statement; /* Lang. Env. statement(s) */
dtw_parm_data_t *parm_data_array; /* Parameter array */
char *default_error_message; /* Default message */
void *le_opaque_data; /* Lang. Env. specific data */
void *row; /* For row-at-a-time processing*/
char reserved[64]; /* Reserved */
} dtw_lei_t;
dtw_lei_t 字段在稍后讨论。function_name 字段包含一个指向函数模块名称字符串的 指针。这在由语言环境显示的错误信息中很有用。
Net.Data 使用 flags 字段与语言环境进行通信。 通过使用以下常量执行一个 OR 操作来设置 flags 字段:
exec_statement 字段包含一个指针,此指针指向一个包含 FUNCTION 模块 中可执行语句(在变量替换之后)的字符串,或者指向一个包含文件名和 EXEC 语句中 参数的字符串。
parm_data_array 字段包含一个指向 dtw_parm_data 结构中一个数组的 指针。此数组以一个包含零的 parm_data 结构结束。 dtw_parm_data 结构由 Net.Data 用来将变量和相关的值传递到一个语言环境 并且检索可能由语言环境对此变量值所作的任何更改。在以下章节中可找到关于这个结构 的更多信息。
default_error_message 字段可由语言环境设置成一个描述错误条件的字 符串。 依赖于从一个对语言环境接口函数调用的返回值,如果此函数调用的返回 值不为零并且此返回值不匹配消息块中消息的值,则显示缺省消息。 否则,显示 从消息块中选择的消息。
le_opaque_data 字段可以由任何一个 language_environment 的 接口程序来设置。 Net.Data 保存此指针并将此指针传递到一个它所调用语言环境的接口 程序。处理完 Web 宏之后,在返回到 Net.Data 的调用程序之前,此指针被设置成 NULL。此 字段是特定于线程的,因此语言环境可以存储特定线程的数据。只有在具有 dtw_cleanup() 例行 程序的情况下才使用这个字段,以便此例行程序能够释放与 le_opaque_data 字段相关的存储器。
row 字段由 Net.Data 设置成一个行对象,在调用 language_environment 的 dtw_getNextRow() 函数 之前设置。dtw_getNextRow() 例行程序使用 Net.Data 的行实用例行程序在对象中插入一行表格 数据。 然后 Net.Data 处理此行,并且调用 dtw_getNextRow(),直到没有要处理的行为止。
dtw_parm_data 结构由 Net.Data 用于将参数传递到一个语言环境。参数有三个来源:
先传递显式参数,后面跟 ENVIRONMENT 语句中指定的参数,然后是返回参数。
dtw_parm_data 结构具有以下格式:
typedef struct dtw_parm_data { /* Parameter data */
int parm_descriptor; /* Parameter descriptor */
char *parm_name; /* Parameter name */
char *parm_value; /* Parameter value */
void *res1; /* Reserved */
void *res2; /* Reserved */
} dtw_parm_data_t;
parm_descriptor 字段描述了此参数的类型和用法。Net.Data 通过使用以下常量执行 一个 OR 操作来设置此字段:
Net.Data 总是将 parm_descriptor 字段设置成 DTW_IN、DTW_OUT 或 DTW_INOUT, 并且与 DTW_STRING 和 DTW_TABLE 进行逻辑或运算。
parm_name 字段是一个指向包含参数名的一个字符串的指针。如果此参数是一个文字串, Net.Data 把这个指针设置成空。
parm_value 字段是一个指向包含参数值的一个对象的指针。如果此参数是一个未定义的变量, Net.Data 把这个指针设置成空。
res1 和 res2 字段是保留字段。
parm_name 和 parm_value 指针都指向一个从 Net.Data 运行时堆栈分配的对象。如果 一个 parm_name 或 parm_value 用另一个字符串代替了,则必须释放原始字符串并且用一个 指向 Net.Data 堆栈中所分配字符串的指针来代替原始字符串。 使用 dtw_malloc() 和 dtw_free() 来 做这一步。
一个语言环境必须包含有一个 dtw_execute() 例行程序。其它的例行程序都是可选 的。如果一个 Net.Data 宏引用一个不含有 dtw_execute() 例行程序的语言环境, 则 Net.Data 返回一条错误消息并停止处理 Net.Data 宏。
语言环境必须在正被处理、要被调用的 Net.Data 宏中引用。 必须以以下顺序调用 语言环境例行程序:
在处理一个 Net.Data 请求的作用域内,Net.Data 只调用语言环境的 dtw_initialize() 函数 (如果它被定义了的话)一次,并且是在第一次调用引用该语言环境的函数块的时侯。对该语言环境 的后继引用都忽略这个对 dtw_initialize() 函数的调用。
此函数不影响消息块处理。 回归码为正的或者零表示处理继续;返回码为负的表示处理不再 继续。 如果返回码为非零并且在 default_error_message 字段中定义了一条缺省消息,则发出 这条缺省消息;如果没有缺省消息,Net.Data 则发出一条错误消息。
每当一个 Net.Data 宏处理一个 FUNCTION模块时,就调用 dtw_execute() 语言环境 接口函数。当 dtw_execute() 函数完成时,接下去要执行的操作取决于 dtw_lei 结构 中的 DTW_LE_CONTINUE 标志是否由 dtw_execute() 函数设置过了。
如果 DTW_LE_CONTINUE 标志被设置了,则 Net.Data 执行以下步骤:
当 dtw_execute() 函数完成了产生报表块处理输入所需的所有处理时,性能通常 都是优化过了的。例如,SQL 语言环境的 dtw_execute 例行程序生成了要 在报表块阶段处理的整个表格时,则其性能是经过优化了的。
当以下这些条件满足时,调用 dtw_getNextRow() 语言环境接口函数:
当调用了 dtw_getNextRow() 函数时,dtw_lei 结构中的 row 字段被设置为指向 一个行对象。 要处理行对象,应当使用 Net.Data 实用例行程序 dtw_row_SetCols() 和 dtw_row_SetV()。 假定在第一次调用 dtw_getNextRow() 例行程序之后,行对象就包含了列标题。 后继的调用应当 包含实际的表格数据。
只要设置了 DTW_LE_CONTINUE 标志,就一直继续调用 dtw_getNextRow() 函数 (除非消息块处理另有说明)。
当处理一个 Net.Data 请求时,Net.Data 调用语言环境的 dtw_cleanup() 函数 (如果定义了此函数的话)。只有在 Net.Data 处理了引用该语言环境的 Net.Data 宏,并且 这个 Net.Data 处理正常结束或者一个错误阻止 Net.Data 继续处理这个 Net.Data 宏的情况 下,才调用此函数。
如果清除处理异常终止,则 Net.Data 将 dtw_lei 结构中的 flags 字段设置 成 DTW_END_ABNORMAL。以下是几个异常条件的例子:
如果一个语言环境的接口程序已设置了 le_opaque_data 字段,则应当使用 dtw_cleanup() 例行程序来释放它。
此调用不影响消息块处理。 如果返回值为非零并且存在一条要发出的缺省消息,则发出 这条缺省消息;如果没有缺省消息,宏处理器则发出一条警告消息。
Net.Data 实用函数分成 4 类:
存储管理函数用来分配要被 Net.Data 占用的存储器,并且释放由 Net.Data 使
用 Net.Data 运行时程序库分配的存储器。 以下例子说明了这些接口的必要性。
假定 Net.Data 是用编译程序 A 编写的,带有其相应的运行时程序库。一个程序员
编写了一个新的语言环境,但使用了具有一个不同运行时程序库的编译程序 B。由于
这两个运行时程序库之间潜在的不兼容性,新的语言环境不能释放由 Net.Data 分配
的存储器,并且 Net.Data 也不能释放由新语言环境分配的存储器。
| Missing value | 使用 Net.Data 运行时程序库从 Net.Data 运行时堆中 分配存储器。 |
| Missing value | 使用 Net.Data 运行时程序库释放从 Net.Data 运行时堆中 分配的存储器。 |
| Missing value | 使用 Net.Data 运行时程序库从 Net.Data 运行时堆中 分配存储器,并将指定的字符串复制到已分配的存储器中。 |
用于配置变量的管理函数允许语言环境访问存储在 Net.Data 初始化文件中的配置信息。
这些函数让所有的语言环境都共享 Net.Data 初始化文件并使用它里面的信息来
配置语言环境。
| Missing value | 在 Net.Data 初始化文件中检索配置变量的值。 |
| Missing value | 在 Net.Data 初始化文件中设置配置变量的值。 |
表格函数用来处理任何传递到语言环境中的 Net.Data 宏表格变量。
| Missing value | 创建一个表格对象。 |
| Missing value | 删除一个表格对象。 |
| Missing value | 设置一个表格的宽度并为列标题分配存储器。 |
| Missing value | 检索一个表格行/列的值。 |
| Missing value | 设置一个表格行/列的值。 |
| Missing value | 检索一个表格列标题。 |
| Missing value | 设置一个表格列标题。 |
| Missing value | 获取当前表格中的行数。 |
| Missing value | 获取当前表格中的列数。 |
| Missing value | 获取表格中允许的最大行数。 |
| Missing value | 获取一个列标题的列号。 |
| Missing value | 将一行或多行添加到一个表格的结尾。 |
| Missing value | 在表格中插入一行或多行。 |
| Missing value | 从表格中删除一行或多行。 |
| Missing value | 在表格中插入一列或多列。 |
| Missing value | 在表格中删除一列或多列。 |
当按顺序处理行时,行函数处理传递到语言环境 dtw_getNextRow() 函数中的行对象。
| Missing value | 设置一行的宽度。 |
| Missing value | 设置一行/列的值。 |
用法
使用 Net.Data 运行时程序库释放从 Net.Data 运行时堆中分配的存储器。buffer 指向 要释放的已分配存储器。
语法
void dtw_free(void *buffer)
参数
| buffer | 指向要释放的已分配存储器的一个指针。 |
例子
char *myBuf; long nbytes = 8192; myBuf = (char *)dtw_malloc(nbytes); dtw_free((void *)myBuf);dtw_getvar()
用法
在 Net.Data 初始化文件中检索由 var_name 指定的配置变量的值。
语法
char *dtw_getvar(char *var_name)
参数
| var_name | 要检索的配置变量的名称。 |
例子
char *myBindFile;
myBindFile = dtw_getvar("BIND_FILE");
dtw_malloc()
用法
此函数返回一个指向使用 Net.Data 运行时程序库从 Net.Data 运行时堆中分配的 存储器的指针。 这块存储器的长度为 nbytes 字节。如果请求的存储器不能被返回, 则返回一个 NULL 指针。
语法
void *dtw_malloc(long nbytes)
参数
| nbytes | 要分配的字节数。 |
例子
char *myBuf; long nbytes = 8192; myBuf = (char *)dtw_malloc(nbytes);dtw_row_SetCols()
用法
此函数用于设置行的宽度,并为列标题分配存储器。 对于每一行可以使用一次 dtw_row_SetCols() 函数。
语法
int dtw_row_SetCols(void *row, int cols)
参数
| row | 指向一个新近创建的行,还没有为它分配任何列。 |
| cols | 在新行中要分配的初始列数。 |
例子
void *myRow; rc = dtw_row_SetCols(myRow, 5);dtw_row_SetV()
用法
此函数设置一个字段值。分配的值应当是一个指向用 dtw_malloc() 或 dtw_strdup() 分配的 这个字符串的指针,或者是 NULL 表示删除一个字段值。
语法
int dtw_row_SetV(void *row, char *src, int col)
参数
| row | 一个指向要修改行的指针。 |
| src | 一个字符串,其中包含了要设置的新值。 |
| col | 要设置的列号值。 |
例子
void *myTable; char *myFieldValue = "newValue"; rc = dtw_row_SetV(myRow, myFieldValue, 3);dtw_setvar()
用法
此函数用于更改 Net.Data 初始化文件中由 var_name 指定的配置变量的值。该变量 的新值被设置成 new_value 指定的值。
语法
void dtw_setvar(char *var_name, char *new_value)
参数
| var_name | 要修改的配置变量的名称。 |
| new_value | var_name 要设置成的新值。 |
例子
char *myVariableValue = "new variable value";
dtw_setvar("MY_VARIABLE", myVariableValue);
dtw_strdup()
用法
此函数使用 Net.Data 的运行时程序库从 Net.Data 的运行时堆栈中分配存储器 并将 string 所指定的字符串复制到已分配的存储器中。 如果请求的存储器不能被返回, 则返回一个 NULL 指针。
语法
char *dtw_strdup(char *string)
参数
| string | 指向要复制到已分配存储器的字符串值的一个指针。 |
例子
char *myString = "This string will be duplicated."; char *myDupString; myDupString = dtw_strdup(myString);dtw_table_AppendRow()
用法
此函数将一行或多行添加到表格的尾端。 在添加新行之后,必须 使用 dtw_table_SetV() 来设置这些新行的字段值。
语法
int dtw_table_AppendRow(void *table, int rows)
参数
| table | 一个指向要追加的表格的指针。 |
| rows | 要追加的行数。 |
例子
void *myTable; rc = dtw_table_AppendRow(myTable, 10);dtw_table_Cols()
用法
返回表格中的当前列数。
语法
int dtw_table_Cols(void *table)
参数
| table | 指向要返回其当前行数的表格的一个指针。 |
例子
void *myTable; int currentColumns; currentColumns = dtw_table_Cols(myTable);dtw_table_Delete()
用法
此函数删除所有的列标题和字段值,然后删除这个表格对象。
语法
int dtw_table_Delete(void *table)
参数
| table | 一个指向要删除的表格的指针。 |
例子
void *myTable; rc = dtw_table_Delete(myTable);dtw_table_DeleteCol()
用法
此函数删除从由 start_col 指定的列处开始的一个或多个列。要删除一个表格 中的所有行和列,使用 dtw_table_DeleteCol(table, 1, dtw_table_Cols());。
语法
int dtw_table_DeleteCol(void *table, int start_col, int cols)
参数
| table | 一个指向要修改的表格的指针。 |
| start_col | 要删除的第一列的列号。 |
| rows | 要删除的行数。 |
例子
void *myTable; rc = dtw_table_DeleteCol(myTable, 1, 10);dtw_table_DeleteRow()
用法
此函数删除从 start_row 指定的行处开始的一行或多行。
语法
int dtw_table_DeleteRow(void *table, int start_row, int rows)
参数
| table | 一个指向要修改的表格的指针。 |
| start_row | 要删除的第一行的行号。 |
| rows | 要删除的行数。 |
例子
void *myTable; rc = dtw_table_DeleteRow(myTable, 3, 10);dtw_table_GetN()
用法
检索一个列标题。dtw_tableSetN 函数中只有通过将 NULL 赋给列标题才能删除 返回的字符串。
语法
int dtw_table_GetN(void *table, char **dest, int col)
参数
| table | 指向从中检索列标题的表格的一个指针。 |
| dest | 指向用于包含列标题的字符串的一个指针。 |
| col | 列标题的列号。 |
例子
void *myTable; char *myColumnHeading; rc = dtw_table_GetN(myTable, &myColumnHeading, 5);dtw_table_GetV()
用法
此函数从一个表格中检索一个字段值。dtw_tableSetV 函数中只有通过将 NULL 赋给 字段值才能删除返回的字符串。
语法
int dtw_table_GetV(void *table, char **dest, int row, int col)
参数
| table | 指向要从中检索一个值的表格的一个指针。 |
| dest | 指向用于包含此值的字符串的一个指针。 |
| row | 要检索的值所在的行号。 |
| col | 要检索的值所在的列号。 |
例子
void *myTable; char *myTableValue; rc = dtw_table_GetV(myTable, &myTableValue, 3, 5);dtw_table_InsertCol()
用法
此函数在指定的列之后插入一列或多列。
语法
int dtw_table_InsertCol(void *table, int after_col, int cols)
参数
| table | 一个指向要修改的表格的指针。 |
| after_col | 在其后插入新列的列号。若要在表格的开始处插入列, 则指定 0。 |
| cols | 要插入的列数。 |
例子
void *myTable; rc = dtw_table_InsertCol(myTable, 3, 10);dtw_table_InsertRow()
用法
此函数在指定的行之后插入一行或多行。
语法
int dtw_table_InsertRow(void *table, int after_row, int rows)
参数
| table | 一个指向要修改的表格的指针。 |
| after_row | 在其后插入新行的行号。要在表格的开始处插入行, 可以指定这个参数为 0。 |
| rows | 要插入的行数。 |
例子
void *myTable; rc = dtw_table_InsertRow(myTable, 3, 10);dtw_table_MaxRows()
用法
返回表格中允许的最大行数。
语法
int dtw_table_MaxRows(void *table)
参数
| table | 指向要返回其最大行数的表格的一个指针。 |
例子
void *myTable; int maximumRows; maximumRows = dtw_table_MaxRows(myTable);dtw_table_New()
用法
此函数创建一个表格对象,并将所有的列标题和字段值初始化为 NULL。调用它的 程序必须指定行和列的初始数目,指定最大行数。如果行、列的初始数为 0,则在任何 表格函数调用之前,dtw_table_SetCols() 函数必须设置一行中的字段数。
语法
int dtw_table_New(void **table, int rows, int cols, int row_lim)
参数
| table | 一个指向要创建的表格的指针。 |
| rows | 在新表格中要分配的初始行数。 |
| cols | 在新表格中要分配的初始列数。 |
| row_lim | 此表格中可以分配的最大行数。 |
例子
void *myTable; rc = dtw_table_New(&myTable, 20, 5, 100);dtw_table_QueryColnoNj()
用法
返回一个列标题的列号。
语法
int dtw_table_QueryColnoNj(void *table, char *name)
参数
| table | 一个指向要查询的表格的指针。 |
| name | 指定列标题的一个字符串,对于这个列标题返回其 列号。如果表格中不存在这个列标题,则返回 0。 |
例子
void *myTable; int columnNumber; columnNumber = dtw_table_QueryColnoNj(myTable, "column 1");dtw_table_Rows()
用法
返回当前表格中的行数。
语法
int dtw_table_Rows(void *table)
参数
| table | 指向要返回其当前行数的表格的一个指针。 |
例子
void *myTable; int currentRows; currentRows = dtw_table_Rows(myTable);dtw_table_SetCols()
用法
此函数设置表格的列数并为列标题分配存储器。 在创建表格时指定列标题,否则 必须在使用其它任何表格函数之前通过调用这个函数来指定列标题。 一个表格只能使用 dtw_table_SetCols() 函数一次。 此后,应该 使用 dtw_table_DeleteCol() 或 dtw_table_InsertCol() 函数。
语法
int dtw_table_SetCols(void *table, int cols)
参数
| table | 指向还未分配行或列的新表格的一个指针。 |
| cols | 在新表格中要分配的初始列数。 |
例子
void *myTable; rc = dtw_table_SetCols(myTable, 5);dtw_table_SetN()
用法
此函数设置一个列标题。 分配的值应当是一个指向用 dtw_malloc() 或 dtw_strdup() 所 分配字符串的指针,或者是 NULL 表示删除一个列标题。
语法
int dtw_table_SetN(void *table, char *src, int col)
参数
| table | 指向要设置其列标题的表格的一个指针。 |
| src | 一个字符串,其中包含了要设置的新的列标题。 |
| col | 返回要设置的列标题的列号。 |
例子
void *myTable; char *myColumnHeading = "newColumnHeading"; rc = dtw_table_SetN(myTable, myColumnHeading, 5);dtw_table_SetV()
用法
此函数设置一个字段值。 分配的值应当是一个指向用 dtw_malloc() 或 dtw_strdup() 所 分配字符串的指针,或者是 NULL 表示删除一个字段值。
语法
int dtw_table_SetV(void *table, char *src, int row, int col)
参数
| table | 指向要设置其值的表格的一个指针。 |
| name | 一个包含有新值的字符串。 |
| row | 新值的行号。 |
| col | 新值的列号。 |
例子
void *myTable; char *myTableValue = "newValue"; rc = dtw_table_SetV(myTable, myTableValue, 3, 5);