Sql 使用铆钉的Informix获取不返回查询结果的结尾

Sql 使用铆钉的Informix获取不返回查询结果的结尾,sql,c,apache,tcl,informix,Sql,C,Apache,Tcl,Informix,我们在使用铆钉和Informix从网页运行Tclsql代码时遇到问题 当我们运行从命令行脚本执行查询的TCL代码时,它就工作了。Informix C库fetch在获取最后一行数据后,将sqlca.sqlcode的值设置为100。然后,tclsql C库将结果字符串设置为“”,这是命令行TCL脚本用来确定所有结果都已获取的内容 当我们使用铆钉从浏览器运行相同的脚本时,Informix C库获取在获取最后一行结果后不会将sqlca.sqlcode值设置为100。相反,它将其设置为0,表示有更多结果,

我们在使用铆钉和Informix从网页运行Tclsql代码时遇到问题

当我们运行从命令行脚本执行查询的TCL代码时,它就工作了。Informix C库fetch在获取最后一行数据后,将sqlca.sqlcode的值设置为100。然后,tclsql C库将结果字符串设置为“”,这是命令行TCL脚本用来确定所有结果都已获取的内容

当我们使用铆钉从浏览器运行相同的脚本时,Informix C库获取在获取最后一行结果后不会将sqlca.sqlcode值设置为100。相反,它将其设置为0,表示有更多结果,并将最后一个查询结果返回到tclsql C库,然后该库将最后一个查询结果返回到我们从浏览器运行的TCL脚本(而不是“”)

下面是我们从命令行运行的脚本:

#!/bin/sh

# Next line restarts using tclsh \
exec /BSG/local/bin/tclsh "$0" "$@"

package require Tclsql

sql database devncrs

set query "SELECT count(*) FROM district"

set cur [sql open $query]

while { [set result [sql fetch $cur 1]] != "" } {
    puts $result
}

sql close $cur
查询应该向上面的TCL脚本返回110(这是表的计数),然后返回一个“”,它会这样做

以下是我们从浏览器运行的脚本:

package require Tclsql

sql database devncrs

set query "SELECT count(*) FROM district"

set cur [sql open $query]

while { [set result [sql fetch $cur 1]] != "" } {
    puts "<br>result = '$result`"
}

sql close $cur
以下是libtclsql.so、libsqlinf.o和mod_rive.so正在使用的库

ldd libsqlinf.so
    linux-vdso.so.1 =>  (0x00007ffe691e0000)
    libixsql.so => /usr/informix/lib/esql/libixsql.so (0x00007f6426bab000)
    libixasf.so => /usr/informix/lib/libixasf.so (0x00007f6426962000)
    libixgen.so => /usr/informix/lib/esql/libixgen.so (0x00007f64266fe000)
    libixos.so => /usr/informix/lib/esql/libixos.so (0x00007f64264dd000)
    libixgls.so => /usr/informix/lib/esql/libixgls.so (0x00007f642628a000)
    libcrypt.so.1 => /usr/lib64/libcrypt.so.1 (0x00007f6426053000)
    libm.so.6 => /usr/lib64/libm.so.6 (0x00007f6425d51000)
    libc.so.6 => /usr/lib64/libc.so.6 (0x00007f642598d000)
    libfreebl3.so => /usr/lib64/libfreebl3.so (0x00007f642578a000)
    /lib64/ld-linux-x86-64.so.2 (0x000055862238b000)
    libdl.so.2 => /usr/lib64/libdl.so.2 (0x00007f6425586000)

ldd libtclsql.so
    linux-vdso.so.1 =>  (0x00007ffe22fc5000)
    libsqlinf.so (0x00007ff9a85b0000)
    libtcl8.6.so => /BSG/local/lib/libtcl8.6.so (0x00007ff9a8201000)
    libixsql.so => /usr/informix/lib/esql/libixsql.so (0x00007ff9a7fad000)
    libixasf.so => /usr/informix/lib/libixasf.so (0x00007ff9a7d65000)
    libixgen.so => /usr/informix/lib/esql/libixgen.so (0x00007ff9a7b00000)
    libixos.so => /usr/informix/lib/esql/libixos.so (0x00007ff9a78df000)
    libixgls.so => /usr/informix/lib/esql/libixgls.so (0x00007ff9a768d000)
    libcrypt.so.1 => /usr/lib64/libcrypt.so.1 (0x00007ff9a7455000)
    libm.so.6 => /usr/lib64/libm.so.6 (0x00007ff9a7153000)
    libdl.so.2 => /usr/lib64/libdl.so.2 (0x00007ff9a6f4f000)
    libz.so.1 => /usr/lib64/libz.so.1 (0x00007ff9a6d38000)
    libpthread.so.0 => /usr/lib64/libpthread.so.0 (0x00007ff9a6b1c000)
    libc.so.6 => /usr/lib64/libc.so.6 (0x00007ff9a6759000)
    libfreebl3.so => /usr/lib64/libfreebl3.so (0x00007ff9a6555000)
    /lib64/ld-linux-x86-64.so.2 (0x000055873ec47000)

ldd mod_rivet.so
    linux-vdso.so.1 =>  (0x00007ffdbfbf2000)
    libtcl8.6.so => /BSG/local/lib/libtcl8.6.so (0x00007fcd949e0000)
    libdl.so.2 => /usr/lib64/libdl.so.2 (0x00007fcd947db000)
    libz.so.1 => /usr/lib64/libz.so.1 (0x00007fcd945c5000)
    libpthread.so.0 => /usr/lib64/libpthread.so.0 (0x00007fcd943a9000)
    libm.so.6 => /usr/lib64/libm.so.6 (0x00007fcd940a6000)
    libc.so.6 => /usr/lib64/libc.so.6 (0x00007fcd93ce3000)
    /lib64/ld-linux-x86-64.so.2 (0x000056435fdca000)

有没有其他人遇到过这个问题,或者知道是什么原因导致通过铆钉执行的提取在提取最后一个结果后没有将sqlca.sqlcode的值设置为100?当我们运行一个返回多行的查询时,我们得到了类似的结果。

我找到了这个问题的解决方法。我修改了我们使用的tclsql.c和sqlinf.ec文件 嗯

TCL SQL“SQL fetch”调用ISQLTC4.0库tclsql.c文件中名为TCL_SQL_fetch的函数。 tcl_sql_fetch函数调用isqltc4.0库sqlinf.ec文件中名为sql_fetch的函数

sql_fetch函数在Informix数据库服务器上执行fetch,然后获取一行。如果没有m 要获取更多行,sql server代码应将sqlca.sqlcode的值设置为100。当我们从 TCL脚本从命令行运行,运行良好。当我们使用铆钉和 pache,sqlca.sqlcode的值始终设置为0。这导致tclsql.c tcl_sql_fetch函数中的代码 认为有更多行要获取,并且它没有返回空的结果字符串“”。相反,它返回las 一次又一次地获取t值。因此,TCL脚本while循环从未停止过

下面是设置从sqlinf.ec sql_fetch函数返回值到tclsqlc tcl_sql_fetch函数的代码 离子:

从浏览器运行脚本时,sqlca.sqlcode从未设置为100

为了解决这个问题,我在sqlinf.ec中添加了一个名为“bnc_sql_fetch”的新sql_fetch函数,并向它传递了一个整数值

int bnc_sql_fetch(fd, bnc_fetch_count)
我在tclsql.c文件中添加了一个名为bnc_fetch_count的静态整数。bnc_fetch_count静态int变量在tclsql.c中的tcl_sql_open函数中初始化为0,并在每次调用bnc_sql_fetch函数时递增1

然后,在bnc_sql_fetch函数中,我将bnc_fetch_count的值与整数数组sqlca.sqlerrd中第一个元素的值进行检查,该数组包含要提取的行总数。如果大于要获取的行总数,则最后一行已被获取,并返回100

if ( bnc_fetch_count > sqlca.sqlerrd[0] ) {
    ret = 100;
    chk_status("FETCH(OPEN)", ssql[fd].cmd);
    return ret;
}

这解决了问题。

web服务器可能以其他用户的身份运行。该用户是否具有连接到DB的正确环境?您可以尝试获取这两种情况的SQLIDEBUG跟踪,并比较输出。SQLIDEBUG将捕获服务器和客户端之间发送的每个包,SQLCODE 100应该在那里(在SQ_获取的末尾)。要启用,只需将SQLIDEBUG env变量设置为类似“2:/tmp/sqli”的值。这里的更多信息:Glenn,我再次使用SQLIDEBUG运行查询,并使用SQLIPRINT查看SQLIDEBUG输出。我的评论空间非常有限。我可以直接给你发电子邮件告诉你结果是什么吗?如果是这样,请将您的电子邮件发送给norris。george@yahoo.com. 一旦我解决了这个问题,我将确保解决方案回到这里。
int bnc_sql_fetch(fd, bnc_fetch_count)
if ( bnc_fetch_count > sqlca.sqlerrd[0] ) {
    ret = 100;
    chk_status("FETCH(OPEN)", ssql[fd].cmd);
    return ret;
}