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