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]