Почему этот код Perl возвращает разные типы данных при запуске на разных машинах? - PullRequest
1 голос
/ 06 декабря 2011

Я являюсь началом контракта на обслуживание, я никогда раньше не делал Perl, и это то, что я нашел.

У меня есть:

sub record {
    my ( $dbh, $sth, $sql, %rs, %arg, @alias, $key, %default );
    %default = ( db => '*', tabla => '*', campos => '*', condicion => '', campos => '*', alias => '*', visible => 'si' );
    %arg = @_;

    if ( $arg{campos} ) { $default{alias} = $arg{campos}; }
    foreach $key ( keys %default ) {
        if ( !exists $arg{$key} ) { $arg{$key} = $default{$key}; }
        if ( exists $arg{$key} && $arg{$key} eq '' ) { $arg{$key} = $default{$key}; }
        if ( $arg{$key} eq '*' ) { &msj( "Error !!!", "$key is needed" ); return; }
    }

    @alias = split /,/, $arg{alias};

    $dbh = DBI->connect( "dbi:Pg:dbname=$arg{db}; host=$ipserver; port=5432", "postgres", "xxxx" ) or die "Error: $DBI::errstr";

    if ( !$DBI::errstr ) {
        $sql = "SELECT $arg{campos} FROM $arg{tabla} $arg{condicion}";
        if ( $arg{visible} eq 'si' ) { &msj( "Consulta a la base de datos $arg{db}", $sql ); }
        $sth = $dbh->prepare($sql) or die "No se ha preparado: $DBI::errstr";
        $sth->execute;
        @rs{@alias} = ();
        if ( $DBI::rows > 0 ) {
            $sth->bind_columns( map { \$rs{$_} } @alias );
        }
        return ( \%rs, sub { $sth->fetch() } );
        $sth->finish;
        $dbh->disconnect;
    } else {
        &mensaje( "Error !!!!", "No access to $arg{db}" );
        exit;
    }
   }

Чтобы использовать это у меня есть что-то вроде

( $rs, $fetch ) = record( db => "infodfsisadmon", tabla => "login", condicion => "where usuario='$FORM{usuario}' and clave='$FORM{clave}'", campos => "acceso,referencia,id_modulo,uaa,nivel_acceso,privilegios,activo,correo", visible => "si" );
# Show me the record
print "rs ->" . Dumper $rs;

Когда я запускаю это на сервере с Centos 5.6, я получаю:

rs ->$VAR1 = { 
    'nivel_acceso' => '{"",NL,NL,NL,NL,"","","","","","","","","","","","","","","","","","","","","","","","",""}', 
    'correo' => 'xxxx@gmail.com', 
    'privilegios' => '{ADM,ADMINISTRADOR,ADM,ADM,1:AMEI:2:AMEI:3:AMEI:4:AMEI:5:AMEI,"","","","","","","","","","","","","","","","","","","","","",""," ","",""}', 
    'acceso' => '{t,t,t,t,t,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f}', 
    'referencia' => '{/cgi-bin/infodf/nomina/index.cgi,/cgi-bin/infodf/contable/index0.cgi,/cgi-bin/infodf/presupuesto/index0.cgi,/cgi-bin/infodf/nomina_fonacot/index.cgi,/cgi-bin/infodf/recmat/index.cgi,"","","","","","","","","","","","","","","","","","","","","","","","",""}', 
    'id_modulo' => '{1,2,3,4,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}', 
    'uaa' => '{"",002,002,002,002,"","","","","","","","","","","","","","","","","","","","","","","","",""}', 
    'activo' => '{t,t,t,t,t,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f}' 
    };

Когда я запускаю его на Centos 5.7, я получаю:

rs ->$VAR1 = { 
    'nivel_acceso' => [ 'NL', 'NL', 'NL', 'NL', 'NL', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '' ], 
    'correo' => 'rigoaj@hotmail.com', 
    'privilegios' => [ 'ADM', 'ADMINISTRADOR', 'ADM', 'ADM', '1:AMEI:2:AMEI:3:AMEI:4:AMEI:5:AMEI', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', ' ', '', '' ], 
    'acceso' => [ 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], 
    'referencia' => [ '/cgi-bin/infodf/nomina/index.cgi', '/cgi-bin/infodf/contable/index0.cgi', '/cgi-bin/infodf/presupuesto/index0.cgi', '/cgi-bin/infodf/nomina_fonacot/index.cgi', '/cgi-bin/infodf/recmat/index.cgi', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '' ], 
    'id_modulo' => [ 1, 2, 3, 4, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], 
    'uaa' => [ 'CONS', '002', '002', '002', '002', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '' ], 
    'activo' => [ 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ] 
};

Perl в Centos 5.6 - это perl5 (версия 5, версия 8, subversion 8), в Centos 5.7 - это perl5 (версия 5, версия 8, subversion 8), но в 5.7 - 64 бита, а в 5.6 - 32.

На обоих серверах работает postgresql-8.1, установлены rpms:

5,6
PostgreSQL-8.1.22-1.el5_5.1
PostgreSQL-вно-8.1.22-1.el5_5.1
PostgreSQL-документы-8.1.22-1.el5_5.1
PostgreSQL-JDBC-8.1.407-1jpp.4
PostgreSQL-LIBS-8.1.22-1.el5_5.1
PostgreSQL-ODBC-08.01.0200-3.1
PostgreSQL-пл-8.1.22-1.el5_5.1
PostgreSQL-питон-8.1.22-1.el5_5.1
PostgreSQL-сервера 8.1.22-1.el5_5.1
postgresql-test-8.1.22-1.el5_5.1

5,7
PostgreSQL-8.1.23-1.el5_7.3
PostgreSQL-разви-8.1.23-1.el5_7.3
PostgreSQL-LIBS-8.1.23-1.el5_7.3
postgresql-server-8.1.23-1.el5_7.3

По состоянию на DBI и DBD: Pg:
5,6
DBI 1,52
DBD :: Pg 1.49

5,7
DBI 1,52
DBD :: Pg 2.18.1

Понятия не имею, почему разница. Ваши советы, подсказки и объяснения приветствуются.

1 Ответ

7 голосов
/ 06 декабря 2011

Я скромно уверен, что у вас есть разница версий между двумя машинами в программном стеке, который состоит из:

  • Perl
  • DBI
  • DBD :: Pg (PostgreSQL)
  • Клиентская библиотека PostgreSQL (ODBC или любая другая)
  • СУБД PostgreSQL

По крайней мере один и, возможно, несколько из этих слоев отличаются. Вы заявляете, что на обоих серверах установлен PostgreSQL 8.1; это предполагает, что проблема находится в клиентской библиотеке или DBD :: Pg. Относительно маловероятно, что это проблема с версией Perl или версией DBI, но это может немного зависеть от того, насколько различаются две версии (Perl и DBI). Маловероятно, что разница связана с версией o / s.

Старый код (в Centos 5.6) возвращает строковую форму данных в массивах. Более новый код обрабатывает массивы более естественно. Это все еще не объясняет разницу между $rs->uaa->[0] в новом и первом (пустом) поле в старом, но учитывает большую часть остальных.


Perl DBI необычайно требователен из-за большого количества версий, которые могут иметь отношение к делу. Тем не менее, я думаю, что ваши проблемы проистекают из старого DBD::Pg модуля.

Согласно http://search.cpan.org/,

  • DBD :: Pg : последняя версия CPAN - 2.99.9_1 с июня 2011 г .; 2,18 с мая 2011 года; 1.49 отсутствует на CPAN, но 1.32 - от февраля 2004 года и 2.5.0 от марта 2008 года).
  • DBI : последняя версия CPAN - 1.616 с декабря 2010 г .; 1,52 отсутствует на CPAN, но 1,53 - это дата, датированная ноябрем 2006 года.

Я рекомендую обновить одну и ту же более свежую версию на обеих машинах или привести более старую версию в соответствие с новой версией на более старой машине. Вероятнее всего, источником проблемы является версия DBI, но все равно было бы неплохо обновить ее до самой последней версии.

...