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/dbi-users@perl.org/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 c...@cam.ac.uk 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;