On 23-Feb-2005 Walter Obermiller wrote:
> Martin,
> 
> this is because as I said in my last mail, the program
> loses itself in an endless loop. The sql.log file (20 mb) for this
> execution shows a couple of zillion messages complaining about the
> adabas driver receiving an empty password....
> 
> The question is: what is tacking an empty UID=;PWD=; onto the end of the 
> connection string, past the actual password and uid ?

I don't know. It must be DBD::ODBC but there is something strange about the
DBD::ODBC you are using because the trace does not contain "Driver connect".
Did you build DBD::ODBC yourself and if so can you check dbdimp.c to make sure
it contains:

if (DBIc_DEBUGIV(imp_dbh) >= 8)
  PerlIO_printf(DBIc_LOGPIO(imp_dbh), "Driver connect '%s',
  '%s', '%s'\n", dbname, uid, pwd);

just before the SQLDriverConnect call. If it doesn't, I don't know what you
have as my copy of DBD::ODBC 1.06 does have this.

The only way I can see the behavior you experience happening is if
dsnHasUIDorPWD(dbname) is returning NULL and I don't see that happening:

int dsnHasUIDorPWD(char *dsn) {

    char upper_dsn[512];
    char *cp = upper_dsn;
    strncpy(upper_dsn, dsn, sizeof(upper_dsn)-1);
    upper_dsn[sizeof(upper_dsn)-1] = '\0';
    while (*cp != '\0') {
        *cp = toupper(*cp);
        cp++;
    }
    return (strstr(upper_dsn, "UID=") != 0 || strstr(upper_dsn, "PWD=") != 0);
}

If the above returns NULL the following code would cause what you are
seeing:

if (strlen(dbname) > SQL_MAX_DSN_LENGTH || dsnHasDriverOrDSN(dbname) && 
    !dsnHasUIDorPWD(dbname)) {
       sprintf(dbname_local, "%s;UID=%s;PWD=%s;", dbname, uid, pwd);

Martin
--
Martin J. Evans
Easysoft Ltd, UK
Development

> --------------sql.log----------------------------------------------
>     [ODBC][25635][SQLAllocHandle.c][464]
>                     Exit:[SQL_SUCCESS]
>                          Output Handle = 0x82ced58
>     [ODBC][25635][SQLDriverConnect.c][666]
>                     Entry:
>                          Connection = 0x82ced58
>                          Window Hdl = (nil)
>                          Str In =
>     [DSN=emanuel-sbart;UID=walter;PWD=***;;UID=;PWD=;][length = 48]
>                                        ^^^^^^^^^^-----------PROBLEM!!
>                          Str Out = 0xbfffe020
>                          Str Out Max = 2048
>                          Str Out Ptr = 0xbfffe01e
>                          Completion = 0
>                          UNICODE Using encoding ASCII 'ISO8859-1' and
>                          UNICODE 'UCS-2LE'
> 
>      DIAG [08001] [SOFTWARE AG][ODBCLIB A][ADABAS]Client
>          unable to establish connection;-715 MISSING USERNAME OR
>          PASSWORD FOR CONNECT.
> 
>       DIAG [08001] [SOFTWARE AG][ODBCLIB A][ADABAS]Client
>          unable to establish connection;-715 MISSING USERNAME OR
>          PASSWORD FOR CONNECT. <thousands of these messages deleted>
> --------------sql.log---------------------------------------------------
> 
> 
> I'm wondering whether it might be helpful to upgrade to the newest DBI 
> and DBI::ODBC versions ?
> 
>       -walt
> 
> 
> 
> 
> Martin J. Evans wrote:
>> I'd certainly use -w:
>>      Note: perl is running without the recommended perl -w option
>> 
>> There appears to be a bit missing from your trace. It should show
>> something like:
>> 
>> "Driver connect 'DSN=test;uid=Martin_Evans;pwd=easysoft;', '', 'xxxx'"
>> 
>> after
>> 
>>     dbih_setup_attrib(DBI::db=HASH(0x8248c00), HandleError,
>>         DBI::dr=HASH(0x81b08 44)) undef (not defined)
>>     the last line of your log file.
>> 
>> The 1.0.6 code has this print as:
>> 
>> if (DBIc_DEBUGIV(imp_dbh) >= 8)
>>  PerlIO_printf(DBIc_LOGPIO(imp_dbh), "Driver connect '%s',
>>  '%s', '%s'\n", dbname, uid, pwd);
>> 
>> and it is not appearing in your log.
>> 
>> BTW I only pointed out you can used "dbi:ODBC:DSN=x;UID=y;PWD=z;" because
>> you were mentioning the dsn not found and no default data source message.
>> Does the plain old DBI->connect('dbi:ODBC:fred', 'user', 'pass') work?
>> 
>> Martin
>> --
>> Martin J. Evans
>> Easysoft Ltd, UK
>> Development
>> 
>> On 22-Feb-2005 Walter Obermiller wrote:
>> 
>>>Martin,
>>>
>>>thanks for your patience.
>>>
>>>Martin J. Evans wrote:
>>>
>>>>On 22-Feb-2005 Walter Obermiller wrote:
>>>>
>>>>
>>>>>Martin,
>>>>>
>>>>>
>>>>>
>>>>>Martin J. Evans wrote:
>>>>>
>>>>>
>>>>>>The DontDlClose was a suggestion to stop the seg faulting on exit.
>>>>>>
>>>>>>When I said you can use DSN=emanuel-sbart;UID=*;PWD=*; I did of course
>>>>>>mean
>>>>>>to
>>>>>>say you need to keep the 'dbi:ODBC' on the front. i.e.
>>>>>>
>>>>>>'dbi:ODBC:DSN=emanuel-sbart;UID=*;PWD=*;'
>>>>>
>>>>>blush :-)
>>>>>
>>>>>I have fixed that now.
>>>>
>>>>
>>>>You haven't actually shown your DBI->connect now. With DBD::ODBC 1.13 if I
>>>>do:
>>>
>>>here's what I do, and I think it is consistent with what you suggested:
>>>
>>>   my $dbh
>>>       = DBI->connect('dbi:ODBC:DSN=emanuel-sbart;UID=**;PWD=**;')
>>>             || die "can't connect to $data_source: $DBI::errstr";
>>>       $rc = $dbh->disconnect;
>>>   exit();
>>>
>>>
>>>
>>>>perl -e 'use DBI;my $dbh =
>>>>DBI->connect("dbi:ODBC:DSN=test;UID=Martin_Evans;PWD=easysoft;");'
>>>>omitting the username/password arguments
>>>>
>>>>OR
>>>>
>>>>perl -e 'use DBI;my $dbh =
>>>>DBI->connect("dbi:ODBC:DSN=test;UID=Martin_Evans;PWD=easysoft;","","");'
>>>>specifying empty username/password arguments
>>>>
>>>>it works fine:
>>>>
>>>>Str In = [DSN=test;UID=Martin_Evans;PWD=********;][length = 39] 
>>>>
>>>>Looking at the code in DBD::ODBC it just passes the string straight through
>>>>if
>>>>it finds a DSN/UID/PWD. I compared DBD::ODBC 1.13 and 1.06 and I can't see
>>>>this
>>>>has changed but you never know. Running with:
>>>>
>>>>DBI_TRACE=8=dbitrace.log perl myscript.pl
>>>
>>>Thats what the tracefile looks like:
>>>
>>>  DBI 1.43-ithread default trace level set to 0x0/8 (pid 26246)
>>>     Note: perl is running without the recommended perl -w option
>>>     -> DBI->connect(dbi:ODBC:DSN=emanuel-sbart;UID=walter;PWD=foo;, , ****)
>>>     -> DBI->install_driver(ODBC) for linux perl=5.008005 pid=26246 
>>>ruid=100 euid=100
>>>        install_driver: DBD::ODBC version 1.06 loaded from 
>>>/usr/lib/perl5/vendor_perl/5.8.5/i586-linux-thread-multi/DBD/ODBC.pm
>>>     New DBI::dr (for DBD::ODBC::dr, parent=, id=)
>>>     dbih_setup_handle(DBI::dr=HASH(0x8251c10)=>DBI::dr=HASH(0x82ce1a0), 
>>>DBD::ODBC::dr, 0, Null!)
>>>     dbih_make_com(Null!, 0, DBD::ODBC::dr, 92, 0) thr#8151008
>>>     dbih_setup_attrib(DBI::dr=HASH(0x82ce1a0), Err, Null!) 
>>>SCALAR(0x820c66c) (already defined)
>>>     dbih_setup_attrib(DBI::dr=HASH(0x82ce1a0), State, Null!) 
>>>SCALAR(0x82b2520) (already defined)
>>>     dbih_setup_attrib(DBI::dr=HASH(0x82ce1a0), Errstr, Null!) 
>>>SCALAR(0x82b24fc) (already defined)
>>>     dbih_setup_attrib(DBI::dr=HASH(0x82ce1a0), TraceLevel, Null!) 0 
>>>(already defined)
>>>     dbih_setup_attrib(DBI::dr=HASH(0x82ce1a0), FetchHashKeyName, Null!) 
>>>'NAME' (already defined)
>>>     <- install_driver= DBI::dr=HASH(0x8251c10)
>>>     !! warn: 0 CLEARED by call to default_user method
>>>     -> default_user in DBD::_::dr for DBD::ODBC::dr 
>>>(DBI::dr=HASH(0x8251c10)~0x82ce1a0 undef undef HASH(0x821d77c)) thr#8151008
>>>     <- default_user= ( undef undef ) [2 items] at 
>>>/usr/lib/perl5/vendor_perl/5.8.5/i586-linux-thread-multi/DBI.pm line 577 
>>>via odbc-emanuel-test.pl line 17
>>>     -> connect for DBD::ODBC::dr (DBI::dr=HASH(0x8251c10)~0x82ce1a0 
>>>'DSN=emanuel-sbart;UID=**;PWD=**;' undef **** HASH(0x82cf4d0)) thr#8151008
>>>     New DBI::db (for DBD::ODBC::db, parent=DBI::dr=HASH(0x82ce1a0), id=)
>>>     dbih_setup_handle(DBI::db=HASH(0x82ce164)=>DBI::db=HASH(0x82cf4c4), 
>>>DBD::ODBC::db, 824edf8, Null!)
>>>     dbih_make_com(DBI::dr=HASH(0x82ce1a0), 82b5ce0, DBD::ODBC::db, 220, 
>>>0) thr#8151008
>>>     dbih_setup_attrib(DBI::db=HASH(0x82cf4c4), Err, 
>>>DBI::dr=HASH(0x82ce1a0)) SCALAR(0x8256234) (already defined)
>>>     dbih_setup_attrib(DBI::db=HASH(0x82cf4c4), State, 
>>>DBI::dr=HASH(0x82ce1a0)) SCALAR(0x8256294) (already defined)
>>>     dbih_setup_attrib(DBI::db=HASH(0x82cf4c4), Errstr, 
>>>DBI::dr=HASH(0x82ce1a0)) SCALAR(0x8256264) (already defined)
>>>     dbih_setup_attrib(DBI::db=HASH(0x82cf4c4), TraceLevel, 
>>>DBI::dr=HASH(0x82ce1a0)) 0 (already defined)
>>>     dbih_setup_attrib(DBI::db=HASH(0x82cf4c4), FetchHashKeyName, 
>>>DBI::dr=HASH(0x82ce1a0)) 'NAME' (already defined)
>>>     dbih_setup_attrib(DBI::db=HASH(0x82cf4c4), HandleSetErr, 
>>>DBI::dr=HASH(0x82ce1a0)) undef (not defined)
>>>     dbih_setup_attrib(DBI::db=HASH(0x82cf4c4), HandleError, 
>>>DBI::dr=HASH(0x82ce1a0)) undef (not defined)
>>>-------------
>>>
>>>
>>>
>>>
>>>
>>>>will provide a trace which should show what DBD::ODBC is using.
>>>>
>>>>I'd still like to see your DBI->connect call though.
>>>
>>>Thanks,
>>>
>>>      -walt
>> 
>> 
>> <snipped previous history - getting too long for me>
>> 

Reply via email to