2013-09-24 5 views
2

이 어떤 DB에 연결할 때 DBI_TRACE=1을 사용할 때이 표시되는지 궁금합니다. 보너스 포인트 을 표시하지 않는 코드를 작성하는 방법을 가리 킵니다.DBI_TRACE에서 "메서드 호출에 의한 호출이 취소되었습니다"라는 경고가 나타나는 이유는 무엇입니까?

코드가 의도 한대로 작동하므로 무해한 것으로 보이는 !! warn: 0 CLEARED by call to connect method에 대해 말하고 있습니다. DBI 추적 모드를 설정하지 않으면 나타나지 않습니다.

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); 
} 

그것은 단순히 :

샘플 펄 코드 (사용 SQLite는)

use warnings; 
use DBI; 
DBI->connect("dbi:SQLite:dbname=test.sqlite","","") or die $DBI::errstr; 

샘플 출력 :

그것은 다음 XS 코드에서 유래
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 

답변

2

가 DBI에 포함 문자열 "warn"의 추적 파일에 인쇄하면 발행 된 경고가 아닙니다. SQLite는 DBI의 오류를 '0'으로 설정하여 연결 방법이 잘못 되었기 때문에 발생하는 것으로 생각합니다. 그러나 길이가 0이 아닌 거짓입니다.

그러나 여러 DBD (DBD :: ODBC 포함)에서 발생합니다.

+0

흥미 롭습니다. 그래서 수정은 DBD :: SQLite에 있을까요? –

+0

처음에는 그렇게 생각했지만 DBD :: ODBC를 비롯한 여러 DBD 출력이 해당 추적 문자열로 출력되는 것처럼 보였습니다. 유지 관리하는 DBD :: ODBC는 특별한 작업을하지 않습니다. – bohica

+0

나는 그것이 운전자의 버그라고 생각한다. –