gpt4 book ai didi

sql - 使用铆钉的 Informix 提取不返回查询结果的结尾

转载 作者:太空宇宙 更新时间:2023-11-04 03:18:54 26 4
gpt4 key购买 nike

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

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

当我们使用 Rivet 从浏览器运行相同的脚本时,Informix C 库 fetch 在获取最后一行结果后不会将 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

这段代码陷入了无尽的 while 循环,因为它永远不会得到 ""返回来自 tclsql C 库。

我们在同一个 LINUX 机器上使用相同版本的操作系统编译了 rivet、TCL 和 Informix,并使用 lampp 包安装了 Apache。

这里是环境:

OS: Linux dev-ncrs-web4 3.10.0-693.el7.x86_64 #1 SMP Thu Jul 6 19:56:57 EDT 2017 x86_64 x86_64 x86_64 GNU/Linux
Apache version: 2.4.27
Rivet version: 2.3.4
TCL version: 8.6.6
Informix version: 4.10

以下是 libtclsql.so、libsqlinf.o 和 mod_rivet.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 文件se。

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

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

这是设置从 sqlinf.ec sql_fetch 函数返回值到 tclsqlc tcl_sql_fetch 函数的代码 ionic :

ret = sqlca.sqlcode;
chk_status("FETCH(OPEN)", ssql[fd].cmd);
return ret;

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

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

int bnc_sql_fetch(fd, bnc_fetch_count)

我在名为 bnc_fetch_count 的 tclsql.c 文件中添加了一个静态整数。 bnc_fetch_count static 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;
}

这解决了问题。

关于sql - 使用铆钉的 Informix 提取不返回查询结果的结尾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48512021/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com