Author: turnstep
Date: Sun Jul 12 11:02:14 2009
New Revision: 13039

Modified:
   DBD-Pg/trunk/Changes
   DBD-Pg/trunk/dbdimp.c

Log:
Fix for RT #47619 - return ints as Perlish ints.


Modified: DBD-Pg/trunk/Changes
==============================================================================
--- DBD-Pg/trunk/Changes        (original)
+++ DBD-Pg/trunk/Changes        Sun Jul 12 11:02:14 2009
@@ -6,6 +6,8 @@
   - Fix problem with foreign_key_info() and NAME_uc (CPAN bug #46109) [GSM]
   - Improve Win32 README notes [Curtis Jewell]
   - Fix spelling error in type_info (CPAN bug #47786) 
[[email protected]]
+  - Return ints and bools-cast-to-number from the db as true Perlish numbers.
+    (CPAN bug #47619) [GSM]
 
 2.13.1 Released April 23, 2009 (subversion r12713)
 

Modified: DBD-Pg/trunk/dbdimp.c
==============================================================================
--- DBD-Pg/trunk/dbdimp.c       (original)
+++ DBD-Pg/trunk/dbdimp.c       Sun Jul 12 11:02:14 2009
@@ -3350,13 +3350,32 @@
                        else {
                                if (type_info) {
                                        type_info->dequote(value, &value_len); 
/* dequote in place */
-                                       if (PG_BOOL == type_info->type_id && 
imp_dbh->pg_bool_tf)
-                                               *value = ('1' == *value) ? 't' 
: 'f';
+                                       /* For certain types, we can cast to 
non-string Perlish values */
+                                       switch (type_info->type_id) {
+                                       case PG_BOOL:
+                                               if (imp_dbh->pg_bool_tf) {
+                                                       *value = ('1' == 
*value) ? 't' : 'f';
+                                                       sv_setpvn(sv, (char 
*)value, value_len);
+                                               }
+                                               else
+                                                       sv_setiv(sv, '1' == 
*value ? 1 : 0);
+                                               break;
+                                       case PG_OID:
+                                       case PG_INT4:
+                                       case PG_INT2:
+                                               sv_setiv(sv, atol(value));
+                                               break;
+                                       case PG_INT8:
+                                               sv_setnv(sv, atoll(value));
+                                               break;
+                                       default:
+                                               sv_setpvn(sv, (char *)value, 
value_len);
+                                       }
                                }
-                               else
+                               else {
                                        value_len = strlen((char *)value);
-                       
-                               sv_setpvn(sv, (char *)value, value_len);
+                                       sv_setpvn(sv, (char *)value, value_len);
+                               }
                        
                                if (type_info && (PG_BPCHAR == 
type_info->type_id) && chopblanks) {
                                        p = SvEND(sv);

Reply via email to