IBM Books

Net.Data 语言环境指南


语言环境接口

您可以通过以下例行程序来访问 Net.Data 服务:

dtw_execute() 例行程序是仅有的必须由语言环境提供的例行程序。

当调用 Net.Data 来处理一个 Net.Data 宏,并且它遇到用语言环境调用 函数时,则执行以下这些步骤:

  1. 如果对于语言环境存在 dtw_initialize() 函数并且先前没有调用过它时, 则调用 dtw_initialize()。

  2. 调用 dtw_execute()。

  3. 当 dtw_execute() 成功返回时,如果 dtw_execute() 指明应当调用 dtw_getNextRow(), 则调用 dtw_getNextRow()。

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

每种语言环境的接口程序接收到一个指向 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(),直到没有要处理的行为止。

reserved 字段是为 IBM 使用而保留的。

dtw_parm_data

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 宏中引用。 必须以以下顺序调用 语言环境例行程序:

  1. dtw_initialize()
  2. dtw_execute()
  3. dtw_getNextRow()
  4. dtw_cleanup()

下一节描述了这些例行程序。

例行程序 dtw_initialize()

在处理一个 Net.Data 请求的作用域内,Net.Data 只调用语言环境的 dtw_initialize() 函数 (如果它被定义了的话)一次,并且是在第一次调用引用该语言环境的函数块的时侯。对该语言环境 的后继引用都忽略这个对 dtw_initialize() 函数的调用。

此函数不影响消息块处理。 回归码为正的或者零表示处理继续;返回码为负的表示处理不再 继续。 如果返回码为非零并且在 default_error_message 字段中定义了一条缺省消息,则发出 这条缺省消息;如果没有缺省消息,Net.Data 则发出一条错误消息。

例行程序 dtw_execute()

每当一个 Net.Data 宏处理一个 FUNCTION模块时,就调用 dtw_execute() 语言环境 接口函数。当 dtw_execute() 函数完成时,接下去要执行的操作取决于 dtw_lei 结构 中的 DTW_LE_CONTINUE 标志是否由 dtw_execute() 函数设置过了。

如果 DTW_LE_CONTINUE 标志被设置了,则 Net.Data 执行以下步骤:

  1. 针对 dtw_execute() 函数的返回值来处理消息块。

  2. 调用语言环境的 dtw_getNextRow() 函数。

  3. 处理报表块。

  4. 针对 dtw_getNextRow() 函数的返回值来处理消息块。

  5. 如果 dtw_getNextRow() 已经设置了 DTW_LE_CONTINUE 标志,则继续处理第二步 中的 dtw_getNetxtRow() 函数;否则结束一次一行处理方式,Net.Data 继续处理 Net.Data 宏。

当 dtw_execute() 函数完成了产生报表块处理输入所需的所有处理时,性能通常 都是优化过了的。例如,SQL 语言环境的 dtw_execute 例行程序生成了要 在报表块阶段处理的整个表格时,则其性能是经过优化了的。

例行程序 dtw_getNextRow()

当以下这些条件满足时,调用 dtw_getNextRow() 语言环境接口函数:

当调用了 dtw_getNextRow() 函数时,dtw_lei 结构中的 row 字段被设置为指向 一个行对象。 要处理行对象,应当使用 Net.Data 实用例行程序 dtw_row_SetCols() 和 dtw_row_SetV()。 假定在第一次调用 dtw_getNextRow() 例行程序之后,行对象就包含了列标题。 后继的调用应当 包含实际的表格数据。

只要设置了 DTW_LE_CONTINUE 标志,就一直继续调用 dtw_getNextRow() 函数 (除非消息块处理另有说明)。

例行程序 dtw_cleanup()

当处理一个 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 也不能释放由新语言环境分配的存储器。

表 2. 存储管理实用函数
Missing value 使用 Net.Data 运行时程序库从 Net.Data 运行时堆中 分配存储器。
Missing value 使用 Net.Data 运行时程序库释放从 Net.Data 运行时堆中 分配的存储器。
Missing value 使用 Net.Data 运行时程序库从 Net.Data 运行时堆中 分配存储器,并将指定的字符串复制到已分配的存储器中。

用于配置变量的管理函数允许语言环境访问存储在 Net.Data 初始化文件中的配置信息。 这些函数让所有的语言环境都共享 Net.Data 初始化文件并使用它里面的信息来 配置语言环境。

表 3. 配置实用函数
Missing value 在 Net.Data 初始化文件中检索配置变量的值。
Missing value 在 Net.Data 初始化文件中设置配置变量的值。

表格函数用来处理任何传递到语言环境中的 Net.Data 宏表格变量。

表 4. 表格实用函数
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() 函数中的行对象。

表 5. 行实用函数
Missing value 设置一行的宽度。
Missing value 设置一行/列的值。
dtw_free()

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()

Missing value

用法

在 Net.Data 初始化文件中检索由 var_name 指定的配置变量的值。

语法

char *dtw_getvar(char *var_name)

参数
var_name 要检索的配置变量的名称。

例子

char *myBindFile;
 
myBindFile = dtw_getvar("BIND_FILE");
dtw_malloc()

Missing value

用法

此函数返回一个指向使用 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()

Missing value

用法

此函数用于设置行的宽度,并为列标题分配存储器。 对于每一行可以使用一次 dtw_row_SetCols() 函数。

语法

int dtw_row_SetCols(void *row, int cols)

参数
row 指向一个新近创建的行,还没有为它分配任何列。
cols 在新行中要分配的初始列数。

例子

void *myRow;
 
rc = dtw_row_SetCols(myRow, 5);
dtw_row_SetV()

Missing value

用法

此函数设置一个字段值。分配的值应当是一个指向用 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()

Missing value

用法

此函数用于更改 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()

Missing value

用法

此函数使用 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()

Missing value

用法

此函数将一行或多行添加到表格的尾端。 在添加新行之后,必须 使用 dtw_table_SetV() 来设置这些新行的字段值。

语法

int dtw_table_AppendRow(void *table, int rows)

参数
table 一个指向要追加的表格的指针。
rows 要追加的行数。

例子

void *myTable;
 
rc = dtw_table_AppendRow(myTable, 10);
dtw_table_Cols()

Missing value

用法

返回表格中的当前列数。

语法

int dtw_table_Cols(void *table)

参数
table 指向要返回其当前行数的表格的一个指针。

例子

void *myTable;
int currentColumns;
 
currentColumns = dtw_table_Cols(myTable);
dtw_table_Delete()

Missing value

用法

此函数删除所有的列标题和字段值,然后删除这个表格对象。

语法

int dtw_table_Delete(void *table)

参数
table 一个指向要删除的表格的指针。

例子

void *myTable;
 
rc = dtw_table_Delete(myTable);
dtw_table_DeleteCol()

Missing value

用法

此函数删除从由 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()

Missing value

用法

此函数删除从 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()

Missing value

用法

检索一个列标题。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()

Missing value

用法

此函数从一个表格中检索一个字段值。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()

Missing value

用法

此函数在指定的列之后插入一列或多列。

语法

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()

Missing value

用法

此函数在指定的行之后插入一行或多行。

语法

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()

Missing value

用法

返回表格中允许的最大行数。

语法

int dtw_table_MaxRows(void *table)

参数
table 指向要返回其最大行数的表格的一个指针。

例子

void *myTable;
int maximumRows;
 
maximumRows = dtw_table_MaxRows(myTable);
 
dtw_table_New()

Missing value

用法

此函数创建一个表格对象,并将所有的列标题和字段值初始化为 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()

Missing value

用法

返回一个列标题的列号。

语法

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()

Missing value

用法

返回当前表格中的行数。

语法

int dtw_table_Rows(void *table)

参数
table 指向要返回其当前行数的表格的一个指针。

例子

void *myTable;
int currentRows;
 
currentRows = dtw_table_Rows(myTable);
dtw_table_SetCols()

Missing value

用法

此函数设置表格的列数并为列标题分配存储器。 在创建表格时指定列标题,否则 必须在使用其它任何表格函数之前通过调用这个函数来指定列标题。 一个表格只能使用 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()

Missing value

用法

此函数设置一个列标题。 分配的值应当是一个指向用 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()

Missing value

用法

此函数设置一个字段值。 分配的值应当是一个指向用 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);


[ 页的顶部 | 上一页 | 下一页 | 内容表 | 索引 ]