On Sun, 28 Dec 2003, Terrence Brannon wrote:

> It looks like we are in some sort of (painful?) symbiotic relationship 
> here. As I update my drivers to make sure that Recordset works before 
> release, I keep having problems.

Looks like it. But hey, anything that finds bugs is a good thing, IMO.

> This time, I tried to do the following code which is part of Recordset:
> 


> which shows two things about dbdimp.c in DBD::Pg's latest distro:
> 
> (a) it should say DBD::Pg where it currently says DBD::ChurlPg:

That is my fault.

>  /* // XXX this is broken: bind_param(1,1,{TYPE=>SQL_INTEGER}); */

My fault again.

> Any suggestions for fixing this are welcome!
> 

How about a patch (subjoined).  It is not as clean as I woould like, but
should take care of the problem while I work on cleaning up this section
of code.


Rudy


Index: dbdimp.c
===================================================================
RCS file: /usr/local/cvsroot/dbdpg/dbdpg/dbdimp.c,v
retrieving revision 1.33
diff -u -r1.33 dbdimp.c
--- dbdimp.c    21 Nov 2003 18:57:11 -0000      1.33
+++ dbdimp.c    29 Dec 2003 20:41:50 -0000
@@ -739,7 +739,8 @@
        char namebuf[30];
        phs_t *phs;
        sql_type_info_t *sql_type_info;
-       int pg_type, bind_type;
+       int pg_type = 0;
+       int bind_type;
        char *value_string;
        STRLEN value_len;
 
@@ -789,38 +790,39 @@
        }
        
        
-  /* // XXX this is broken: bind_param(1,1,{TYPE=>SQL_INTEGER}); */
-       if (attribs) {
-               if (sql_type)
-                       croak ("Cannot specify both sql_type and pg_type");
-               
-               if ((svp = hv_fetch((HV*)SvRV(attribs),"pg_type", 7, 0))==NULL)
-                       croak("DBD::ChurlPg only knows about the pg_type attribute");
-               
-               pg_type = SvIV(*svp);
-               
-               
+       if (attribs)
+               if((svp = hv_fetch((HV*)SvRV(attribs),"pg_type", 7, 0)) != NULL)
+                       pg_type = SvIV(*svp);
+
+       if (sql_type && pg_type)
+               croak ("Cannot specify both sql_type and pg_type");
+
+
+       if (pg_type) {
                if ((sql_type_info = pg_type_data(pg_type))) {
                        if (!sql_type_info->bind_ok) {
                                croak("Can't bind %s, pg_type %s not supported"
-                                                       "by DBD::ChurlPg",
-                                                       name, 
sql_type_info->type_name);
+                                               "by DBD::Pg",
+                                               name, sql_type_info->type_name);
                        }
                } else {
-                       croak("Cannot bind %s unknown sql_type %i",     name, 
sql_type);
+                       croak("Cannot bind %s unknown pg_type %i",
+                               name, pg_type);
                }
                bind_type = sql_type_info->type_id;
                
        } else if (sql_type) {
                
                if ((sql_type_info = sql_type_data(sql_type))) {
-                       /* always bind as pg_type, because we know we are inserting
-                                into a pg database... It would make no sense to quote
-                                something to sql semantics and break the insert.
-                       */
+                       /* always bind as pg_type, because we know we are 
+                          inserting into a pg database... It would make no 
+                          sense to quote something to sql semantics and break
+                          the insert.
+                        */
                        bind_type = sql_type_info->type.pg;
                } else {
-                       croak("Cannot bind %s unknown sql_type %i",     name, 
sql_type);
+                       croak("Cannot bind %s unknown sql_type %i",
+                               name, sql_type);
                }
                
        } else {
Index: t/03bind.t
===================================================================
RCS file: /usr/local/cvsroot/dbdpg/dbdpg/t/03bind.t,v
retrieving revision 1.8
diff -u -r1.8 03bind.t
--- t/03bind.t  31 Oct 2003 16:45:34 -0000      1.8
+++ t/03bind.t  29 Dec 2003 20:41:50 -0000
@@ -1,9 +1,9 @@
 use strict;
-use DBI;
+use DBI qw(:sql_types);
 use Test::More;
 
 if (defined $ENV{DBI_DSN}) {
-    plan tests => 11;
+    plan tests => 14;
 } else {
     plan skip_all => "DBI_DSN must be set: see the README file";
 }
@@ -40,6 +40,10 @@
    FROM dbd_pg_test
    WHERE id = ?
    AND name = ?
+   AND name = ?
+   AND name = ?
+   AND name = ?
+   AND name = ?
 SQL
 $sth = $dbh->prepare($sql);
 ok(defined $sth,
@@ -55,6 +59,24 @@
 ok($sth->bind_param(2, 'baz'),
    'rebind string column with text'
   );
+ok($sth->bind_param(3, 'baz', {TYPE=>SQL_VARCHAR}),
+   'bind {TYPE=>SQL_VARCHAR}'
+  );
+
+eval {$sth->bind_param(4, 'baz', {TYPE=>SQL_VARCHAR, pg_type=>3}) };
+   ok($@, 'bind {TYPE=>SQL_VARCHAR, pg_type=>3}');
+
+ok($sth->bind_param(5, 'baz', {pg_type=>1043}),
+   'bind {pg_type=>1043}'
+  );
+
+#ok($sth->bind_param(6, 'baz', {unknow_hash_key=>1043}),
+#   'use unknown hash key'
+#  );
+
+#ok($sth->bind_param(6, 'baz', {unknow_hash_key=>1043}),
+#   'Rebind with a different type'
+#  );
 
 ok($sth->finish(),
    'finish'


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to