Perl 为什么会有一个;通过调用连接方法“清除0”;DBI_跟踪中的警告?

Perl 为什么会有一个;通过调用连接方法“清除0”;DBI_跟踪中的警告?,perl,dbi,suppress-warnings,Perl,Dbi,Suppress Warnings,我想知道为什么在连接到任何数据库时使用DBI_TRACE=1时会出现警告。额外的好处是,可以编写干净的代码,而不会显示出来 我说的是!!警告:0已通过调用似乎无害的连接方法清除, 因为代码确实按预期工作。请注意,如果没有设置DBI跟踪模式,它不会出现 示例Perl代码(使用SQLite): 样本输出: DBI 1.612-ithread default trace level set to 0x0/1 (pid 12814 pi 1ddd010) at DBI.pm line 275 v

我想知道为什么在连接到任何数据库时使用
DBI_TRACE=1
时会出现警告。额外的好处是,可以编写干净的代码,而不会显示出来

我说的是
!!警告:0已通过调用似乎无害的连接方法
清除, 因为代码确实按预期工作。请注意,如果没有设置DBI跟踪模式,它不会出现

示例Perl代码(使用SQLite):

样本输出:

    DBI 1.612-ithread default trace level set to 0x0/1 (pid 12814 pi 1ddd010) at DBI.pm line 275 via test.pl line 2
    -> DBI->connect(dbi:SQLite:dbname=test.sqlite, , ****)
    -> DBI->install_driver(SQLite) for linux perl=5.010001 pid=12814 ruid=1000 euid=1000
       install_driver: DBD::SQLite version 1.29 loaded from /usr/lib/perl5/DBD/SQLite.pm
    <- install_driver= DBI::dr=HASH(0x204da38)
    !! warn: 0 CLEARED by call to connect method
    <- connect('dbname=test.sqlite', '', ...)= DBI::db=HASH(0x204e278) at DBI.pm line 662
    <- STORE('PrintError', 1)= 1 at DBI.pm line 714
    <- STORE('AutoCommit', 1)= 1 at DBI.pm line 714
    <- STORE('PrintWarn', 0)= 1 at DBI.pm line 717
    <- FETCH('PrintWarn')= '' at DBI.pm line 717
    <- STORE('Warn', 0)= 1 at DBI.pm line 717
    <- FETCH('Warn')= '' at DBI.pm line 717
    <- STORE('Username', '')= 1 at DBI.pm line 717
    <> FETCH('Username')= '' ('Username' from cache) at DBI.pm line 717
    <- connected('dbi:SQLite:dbname=test.sqlite', '', ...)= undef at DBI.pm line 723
    <- connect= DBI::db=HASH(0x204e278)
    <- STORE('dbi_connect_closure', CODE(0x204da08))= 1 at DBI.pm line 732
    <- DESTROY(DBI::db=HASH(204e1d0))= undef
    <- disconnect_all= '' at DBI.pm line 740
!   <- DESTROY(DBI::dr=HASH(204da38))= undef during global destruction
DBI 1.612-ithread默认跟踪级别设置为0x0/1(pid 12814 pi 1DD010),在DBI.pm行275处通过test.pl行2
->DBI->connect(DBI:SQLite:dbname=test.SQLite,***)
->DBI->install_驱动程序(SQLite)for linux perl=5.010001 pid=12814 ruid=1000 euid=1000
安装驱动程序:DBD::SQLite 1.29版,从/usr/lib/perl5/DBD/SQLite.pm加载

它来自DBI中包含的以下XS代码:

if (!keep_error && meth_type != methtype_set_err) {
    SV *err_sv;
    if (trace_level && SvOK(err_sv=DBIc_ERR(imp_xxh))) {
        PerlIO *logfp = DBILOGFP;
        PerlIO_printf(logfp, "    !! %s: %s CLEARED by call to %s method\n",
            SvTRUE(err_sv) ? "ERROR" : strlen(SvPV_nolen(err_sv)) ? "warn" : "info",
            neatsvpv(DBIc_ERR(imp_xxh),0), meth_name);
    }
    DBIh_CLEAR_ERROR(imp_xxh);
} 
else {      /* we check for change in ErrCount during call */
    ErrCount = DBIc_ErrCount(imp_xxh);
}
它只是打印到跟踪文件的字符串“warn”,而不是发出的警告。我认为这是在您的情况下发生的,因为connect方法是SQLite,它将DBI的err设置为“0”,所以它是false,但不是零长度


但是,我看到它发生在多个DBD上(包括DBD::ODBC)。

很有趣。那么修复应该在DBD::SQLite中?我一开始是这么想的,但似乎有多个DBD输出跟踪字符串-包括我维护的DBD::ODBC,我不知道做了什么特殊的事情。我认为这是驱动程序中的一个缺陷。在这一点上,我不认为这是驱动程序中的一个缺陷,因为我通过DBD::ODBC和D::O跟踪它,从来没有设置“0”,只是“. 然而,我还不能在DBI中找到它。调用DBIh\u SET\u ERR\u CHAR时为“”,但在输出该消息时为“0”。即使使用perl-MDBI-le'my$h=DBI->connect(“DBI:scape:”),也会将ERR设置为“0”
if (!keep_error && meth_type != methtype_set_err) {
    SV *err_sv;
    if (trace_level && SvOK(err_sv=DBIc_ERR(imp_xxh))) {
        PerlIO *logfp = DBILOGFP;
        PerlIO_printf(logfp, "    !! %s: %s CLEARED by call to %s method\n",
            SvTRUE(err_sv) ? "ERROR" : strlen(SvPV_nolen(err_sv)) ? "warn" : "info",
            neatsvpv(DBIc_ERR(imp_xxh),0), meth_name);
    }
    DBIh_CLEAR_ERROR(imp_xxh);
} 
else {      /* we check for change in ErrCount during call */
    ErrCount = DBIc_ErrCount(imp_xxh);
}