Author: byterock
Date: Tue May  6 17:52:01 2008
New Revision: 11205

Modified:
   dbd-oracle/trunk/oci8.c

Log:
Possible fix for binary persistent lobs?
seem all I need it the size and it will get it all

Modified: dbd-oracle/trunk/oci8.c
==============================================================================
--- dbd-oracle/trunk/oci8.c     (original)
+++ dbd-oracle/trunk/oci8.c     Tue May  6 17:52:01 2008
@@ -2375,7 +2375,7 @@
                imp_fbh_t *fbh = &imp_sth->fbh[i-1];
                int ftype = fbh->ftype;
                /* add space for STRING null term, or VAR len prefix */
-               ub4 define_len = (ftype==94||ftype==95) ? fbh->disize+4 : 
fbh->disize;
+               sb4 define_len = (ftype==94||ftype==95) ? fbh->disize+4 : 
fbh->disize;
                fb_ary_t  *fb_ary;
                fbh->fb_ary = fb_ary_alloc(define_len, 1);
                fbh->fb_ary = fb_ary_alloc(define_len, imp_sth->rs_array_size);
@@ -2597,17 +2597,25 @@
                                }
 
                } else {
-
-                               int datalen = 
fb_ary->arlen[imp_sth->rs_array_idx];
-                               char *p = (char*)row_data;
-                               /* if ChopBlanks check for Oracle CHAR type 
(blank padded)      */
-                               if (ChopBlanks && fbh->dbtype == 96) {
-                                   while(datalen && p[datalen - 1]==' ')
-                                       --datalen;
-                               }
-                               sv_setpvn(sv, p, (STRLEN)datalen);
-                               if ((CSFORM_IMPLIES_UTF8(fbh->csform)) && 
(fbh->ftype != SQLT_BIN)){
-                                   SvUTF8_on(sv);
+                if (fbh->ftype == SQLT_BIN){
+                                       char *p = (char*)row_data;
+                                       sb4 datalen = strlen(p);
+                                       if (datalen >= fbh->disize){
+                                               datalen = fbh->disize;
+                                       }
+                                       sv_setpvn(sv, p, datalen);
+                               } else {
+                                       int datalen = 
fb_ary->arlen[imp_sth->rs_array_idx];
+                                   char *p = (char*)row_data;
+                                       /* if ChopBlanks check for Oracle CHAR 
type (blank padded)      */
+                                       if (ChopBlanks && fbh->dbtype == 96) {
+                                           while(datalen && p[datalen - 1]==' 
')
+                                               --datalen;
+                                       }
+                                       sv_setpvn(sv, p, (STRLEN)datalen);
+                                       if (CSFORM_IMPLIES_UTF8(fbh->csform) ){
+                                       SvUTF8_on(sv);
+                                       }
                                }
                    }
 

Reply via email to