Attached is a patch against DBD::Oracle version 1.27 which corrects
some type mismatches which prevent the support for objects working
on big-endian platforms such as Sun-sparc.
There was a thread on this topic in this mail list last April.
See http://www.mail-archive.com/[email protected]/msg32902.html
The original poster reported that tests in t/58object.t in
version 1.24a did not work on his sparc platform. I posted a patch.
the OP tested it, and found that my patch allowed him to get further,
but later tests still failed. I posted a second patch and asked the OP
to test it. I never got a reply.
The first patch got into DBD::Oracle-1.27, but the second patch,
being untested, did not.
I have now managed to borrow some sparc hardware. I have re-worked
the second patch for 1.27, and tested it. With the patch applied,
DBD::Oracle passes all its tests on a 64-bit sparc running
Solaris 10. I can now run some of my production scripts, which
use objects, on the sparc.
I recommend that this patch be incorporated into version 1.28.
--
Charles Jardine - Computing Service, University of Cambridge
[email protected] Tel: +44 1223 334506, Fax: +44 1223 334679
diff -r -u DBD-Oracle-1.27/oci8.c DBD-Oracle-1.27.patched/oci8.c
--- DBD-Oracle-1.27/oci8.c 2010-12-15 00:41:56.000000000 +0000
+++ DBD-Oracle-1.27.patched/oci8.c 2011-01-28 12:40:45.000000000 +0000
@@ -2045,6 +2045,7 @@
text str_buf[200];
double dnum;
size_t str_len;
+ ub4 ub4_str_len;
OCIRaw *raw = (OCIRaw *) 0;
OCIString *vs = (OCIString *) 0;
ub1 *temp = (ub1 *)0;
@@ -2068,7 +2069,7 @@
fbh->imp_sth->errhp,
attr_value,
str_buf,
- 200,
+ (size_t)200,
&str_len,
status);
str_buf[str_len+1] = '\0';
@@ -2080,9 +2081,9 @@
case OCI_TYPECODE_TIMESTAMP :
- str_len = 200;
+ ub4_str_len = 200;
OCIDateTimeToText_log_stat(fbh->imp_sth->envhp,
-
fbh->imp_sth->errhp,attr_value,&str_len,str_buf,status);
+
fbh->imp_sth->errhp,attr_value,&ub4_str_len,str_buf,status);
if (typecode == OCI_TYPECODE_TIMESTAMP_TZ || typecode ==
OCI_TYPECODE_TIMESTAMP_LTZ){
char s_tz_hour[3]="000";
@@ -2104,19 +2105,19 @@
sprintf(s_tz_min,":%02d", tz_minute);
strcat((signed char*)str_buf, s_tz_hour);
strcat((signed char*)str_buf, s_tz_min);
- str_buf[str_len+7] = '\0';
+ str_buf[ub4_str_len+7] = '\0';
} else {
- str_buf[str_len+1] = '\0';
+ str_buf[ub4_str_len+1] = '\0';
}
av_push(list, newSVpv( (char *) str_buf,0));
break;
case OCI_TYPECODE_DATE :
/* fixed length string*/
- str_len = 200;
- OCIDateToText_log_stat(fbh->imp_sth->errhp, (CONST OCIDate *)
attr_value,&str_len,str_buf,status);
- str_buf[str_len+1] = '\0';
+ ub4_str_len = 200;
+ OCIDateToText_log_stat(fbh->imp_sth->errhp, (CONST OCIDate *)
attr_value,&ub4_str_len,str_buf,status);
+ str_buf[ub4_str_len+1] = '\0';
av_push(list, newSVpv( (char *) str_buf,0));
break;