[Cascavel-pm] MVC e WxPerl

Daniel Ruoso daniel em ruoso.com
Quarta Maio 2 15:48:16 PDT 2007


Qua, 2007-05-02 às 22:46 +0300, Alceu Rodrigues de Freitas Junior
escreveu:
> Ahn... eu acho que eu já uso DBI. Veja o módulo QueryParser::DAO.
> Como eu não testei isso em Linux, por exemplo, eu não descartaria um
> bug apesar de que deveria ser a mesma coisa para os dois sistemas.
> Teoricamente ODBC deveria funcionar da mesma maneira.

Não, ODBC é um Driver que é específico de Windows, você está usando o
DBI sobre ODBC, o que é provavelmente desnecessário. Mesmo em Windows
você pode usar os diretamente DBI -> DBD -> SERVER, ao invés de usar DBI
-> ODBC -> DBD -> SERVER. O DBI já faz o papel que o ODBC faria.

De qualquer forma, o código tinha algumas coisas específicas de ODBC que
não precisariam ser específicas de ODBC. Segue um patch que corrige
isso, com a diferença que o teu arquivo INI tem que dizer o DSN do DBI e
não do ODBC, o que basicamente significa que tem que incluir o
'dbi:ODBC:' no arquivo de configuração, e não amarrado em código.

E repito, todas as funcionalidades que você estava obtendo utilizando
uma função específica do driver poderiam ser obtidas diretamente
utilizando o DBI. Então aí vai o patch

<PATCH>
--- QueryParser/DAO.pm~ 2007-04-03 20:19:38.000000000 +0100
+++ QueryParser/DAO.pm  2007-05-02 23:43:26.000000000 +0100
@@ -60,7 +60,7 @@
 
     my $self = shift;
 
-    my $conn_string = 'dbi:ODBC:' . $self->get_DSN();
+    my $conn_string = $self->get_DSN();
 
        $self->disconnect();
 
@@ -102,23 +102,25 @@
 
     my $sth = $self->get_dbh()->prepare($query)
       or croak "Cannot parse the query: $DBI::errstr";
+    $sth->execute();
 
     my $total_fields = $sth->{NUM_OF_FIELDS};
     my @properties;
 
-    for ( my $i = 1 ; $i <= $total_fields ; $i++ ) {
+    my $_names = $sth->{NAME};
+    my $_types = $sth->{TYPE};
+    my $_sizes = $sth->{PRECISION};
+
+    for ( my $i = 0 ; $i < $total_fields ; $i++ ) {
 
         # DescribeCol is an ODBC function to get a description
         # of a column that is part of a executed query
-        my @column_info = $sth->func( $i, 'DescribeCol' );
         push(
             @properties,
             [
-                (
-                    $column_info[0],
-                    $self->get_sql_types()->{ $column_info[1] },
-                    $column_info[2]
-                )
+             $_names->[$i],
+             $self->get_sql_types()->{$_types->[$i]},
+             $_sizes->[$i]
             ]
         );
</PATCH>



Mais detalhes sobre a lista de discussão Cascavel-pm