Patch applied and will be in the next DBDpg release.

---------------------------------------------------------------------------

Peter Haworth wrote:
> Here's a patch against CVS to add a pg_bool_tf database handle attribute to
> DBD::Pg, and a new test for it. This flag defaults to false, but when set to
> true, booleans are returned as 't' and 'f', rather than '1' and '0'.
> 
> -- 
>       Peter Haworth   [EMAIL PROTECTED]
> "OK, see, the sad thing is that I really have no idea whether
>  you're joking or not.  That's how wiggy this thread has gotten."
>               -- Michael Lazzaro

> diff -u -N -r DBD-Pg-1.20/dbdimp.c DBD-Pg-1.20-bool_tf/dbdimp.c
> --- DBD-Pg-1.20/dbdimp.c      2002-11-27 02:02:39.000000000 +0000
> +++ DBD-Pg-1.20-bool_tf/dbdimp.c      2002-12-31 18:03:35.000000000 +0000
> @@ -191,6 +191,7 @@
>  
>      imp_dbh->init_commit = 1;                        /* initialize AutoCommit */
>      imp_dbh->pg_auto_escape = 1;             /* initialize pg_auto_escape */
> +    imp_dbh->pg_bool_tf = 0;                    /* initialize pg_bool_tf */
>  
>      DBIc_IMPSET_on(imp_dbh);                 /* imp_dbh set up now */
>      DBIc_ACTIVE_on(imp_dbh);                 /* call disconnect before freeing */
> @@ -461,6 +462,8 @@
>          return 1;
>      } else if (kl==14 && strEQ(key, "pg_auto_escape")) {
>          imp_dbh->pg_auto_escape = newval;
> +    } else if (kl==10 && strEQ(key, "pg_bool_tf")) {
> +     imp_dbh->pg_bool_tf = newval;
>      } else {
>          return 0;
>      }
> @@ -483,6 +486,8 @@
>          retsv = boolSV(DBIc_has(imp_dbh, DBIcf_AutoCommit));
>      } else if (kl==14 && strEQ(key, "pg_auto_escape")) {
>          retsv = newSViv((IV)imp_dbh->pg_auto_escape);
> +    } else if (kl==10 && strEQ(key, "pg_bool_tf")) {
> +     retsv = newSViv((IV)imp_dbh->pg_bool_tf);
>      } else if (kl==11 && strEQ(key, "pg_INV_READ")) {
>          retsv = newSViv((IV)INV_READ);
>      } else if (kl==12 && strEQ(key, "pg_INV_WRITE")) {
> @@ -1326,6 +1331,7 @@
>      SV *sth;
>      imp_sth_t *imp_sth;
>  {
> +    D_imp_dbh_from_sth;
>      int num_fields;
>      int i;
>      AV *av;
> @@ -1357,7 +1363,7 @@
>              char *val   = (char*)PQgetvalue(imp_sth->result, imp_sth->cur_tuple, i);
>              int val_len = strlen(val);
>              int  type   = PQftype(imp_sth->result, i); /* hopefully these hard 
>coded values will not change */
> -            if (16 == type) {
> +            if (16 == type && ! imp_dbh->pg_bool_tf) {
>                 *val = (*val == 'f') ? '0' : '1'; /* bool: translate postgres into 
>perl */
>              }
>              if (17 == type) {  /* decode \001 -> chr(1), etc, in-place */
> diff -u -N -r DBD-Pg-1.20/dbdimp.h DBD-Pg-1.20-bool_tf/dbdimp.h
> --- DBD-Pg-1.20/dbdimp.h      2002-11-27 10:21:46.000000000 +0000
> +++ DBD-Pg-1.20-bool_tf/dbdimp.h      2002-12-31 17:57:00.000000000 +0000
> @@ -22,6 +22,7 @@
>      PGconn    * conn;                /* connection structure */
>      int         init_commit; /* initialize AutoCommit */
>      int         pg_auto_escape;      /* initialize AutoEscape */
> +    int         pg_bool_tf;     /* do bools return 't'/'f' */
>  };
>  
>  /* Define sth implementor data structure */
> diff -u -N -r DBD-Pg-1.20/t/16pgbooltf.t DBD-Pg-1.20-bool_tf/t/16pgbooltf.t
> --- DBD-Pg-1.20/t/16pgbooltf.t        1970-01-01 01:00:00.000000000 +0100
> +++ DBD-Pg-1.20-bool_tf/t/16pgbooltf.t        2002-12-31 18:30:32.000000000 +0000
> @@ -0,0 +1,46 @@
> +use strict;
> +use DBI;
> +use Test::More;
> +
> +if (defined $ENV{DBI_DSN}) {
> +  plan tests => 10;
> +} else {
> +  plan skip_all => 'cannot test without DB info';
> +}
> +
> +my $dbh = DBI->connect($ENV{DBI_DSN}, $ENV{DBI_USER}, $ENV{DBI_PASS},
> +                       {RaiseError => 1, AutoCommit => 0}
> +                      );
> +ok(defined $dbh,
> +   'connect with transaction'
> +  );
> +
> +ok(get('select 1=1') eq 1,'default true is 1');
> +ok(get('select 1=0') eq 0,'default false is 0');
> +ok(!defined get('select 1=null'),'null');
> +
> +$dbh->{pg_bool_tf}=0;
> +
> +ok(get('select 1=1') eq 1,'default true is 1');
> +ok(get('select 1=0') eq 0,'default false is 0');
> +ok(!defined get('select 1=null'),'null');
> +
> +$dbh->{pg_bool_tf}=1;
> +
> +ok(get('select 1=1') eq 't','tf true is t');
> +ok(get('select 1=0') eq 'f','tf false is f');
> +ok(!defined get('select 1=null'),'null');
> +
> +
> +
> +sub get{
> +  my($sql)=@_;
> +
> +  my $sth=$dbh->prepare($sql);
> +  $sth->execute;
> +  my($ret)=$sth->fetchrow_array;
> +  $sth->finish;
> +
> +  $ret;
> +}
> +

> use strict;
> use DBI;
> use Test::More;
> 
> if (defined $ENV{DBI_DSN}) {
>   plan tests => 10;
> } else {
>   plan skip_all => 'cannot test without DB info';
> }
> 
> my $dbh = DBI->connect($ENV{DBI_DSN}, $ENV{DBI_USER}, $ENV{DBI_PASS},
>                        {RaiseError => 1, AutoCommit => 0}
>                       );
> ok(defined $dbh,
>    'connect with transaction'
>   );
> 
> ok(get('select 1=1') eq 1,'default true is 1');
> ok(get('select 1=0') eq 0,'default false is 0');
> ok(!defined get('select 1=null'),'null');
> 
> $dbh->{pg_bool_tf}=0;
> 
> ok(get('select 1=1') eq 1,'default true is 1');
> ok(get('select 1=0') eq 0,'default false is 0');
> ok(!defined get('select 1=null'),'null');
> 
> $dbh->{pg_bool_tf}=1;
> 
> ok(get('select 1=1') eq 't','tf true is t');
> ok(get('select 1=0') eq 'f','tf false is f');
> ok(!defined get('select 1=null'),'null');
> 
> 
> 
> sub get{
>   my($sql)=@_;
> 
>   my $sth=$dbh->prepare($sql);
>   $sth->execute;
>   my($ret)=$sth->fetchrow_array;
>   $sth->finish;
> 
>   $ret;
> }
> 

-- 
  Bruce Momjian                        |  http://candle.pha.pa.us
  [EMAIL PROTECTED]               |  (610) 359-1001
  +  If your life is a hard drive,     |  13 Roberts Road
  +  Christ can be your backup.        |  Newtown Square, Pennsylvania 19073

Reply via email to