Boris van Schooten <[EMAIL PROTECTED]> writes:
> Don't know anything about nulls in dbf though.  I am not a dbase expert, I
> just run into dbfs often when trying to enter gis data into postgis.

I'm considering the following patch, which turns around the test: check
for an empty string and if so believe it's a null, otherwise just insert
the value as-is.  I dunno if the check for null is actually meaningful,
but I doubt this will break any cases that worked before.  Comments anyone?

                        regards, tom lane


Index: contrib/dbase/dbf2pg.c
===================================================================
RCS file: /cvsroot/pgsql/contrib/dbase/dbf2pg.c,v
retrieving revision 1.21
diff -c -r1.21 dbf2pg.c
*** contrib/dbase/dbf2pg.c      14 Sep 2004 03:28:28 -0000      1.21
--- contrib/dbase/dbf2pg.c      4 May 2005 17:55:29 -0000
***************
*** 63,93 ****
  char     *convert_charset(char *string);
  #endif
  void          usage(void);
- unsigned int isinteger(char *);
  
  
- 
- unsigned int
- isinteger(char *buff)
- {
-       char       *i = buff;
- 
-       while (*i != '\0')
-       {
-               if (i == buff)
-                       if ((*i == '-') ||
-                               (*i == '+'))
-                       {
-                               i++;
-                               continue;
-                       }
-               if (!isdigit((unsigned char) *i))
-                       return 0;
-               i++;
-       }
-       return 1;
- }
- 
  static inline void
  strtoupper(char *string)
  {
--- 63,70 ----
***************
*** 471,478 ****
                                /* handle the date first - liuk */
                                if (fields[h].db_type == 'D')
                                {
!                                       if ((strlen(foo) == 8) && 
isinteger(foo))
                                        {
                                                snprintf(pgdate, 11, 
"%c%c%c%c-%c%c-%c%c",
                                                                 foo[0], 
foo[1], foo[2], foo[3],
                                                                 foo[4], 
foo[5], foo[6], foo[7]);
--- 448,462 ----
                                /* handle the date first - liuk */
                                if (fields[h].db_type == 'D')
                                {
!                                       if (strlen(foo) == 0)
                                        {
+                                               /* assume empty string means a 
NULL */
+                                               strcat(query, "\\N");
+                                       }
+                                       else if (strlen(foo) == 8 &&
+                                                        strspn(foo, 
"0123456789") == 8)
+                                       {
+                                               /* transform YYYYMMDD to 
Postgres style */
                                                snprintf(pgdate, 11, 
"%c%c%c%c-%c%c-%c%c",
                                                                 foo[0], 
foo[1], foo[2], foo[3],
                                                                 foo[4], 
foo[5], foo[6], foo[7]);
***************
*** 480,505 ****
                                        }
                                        else
                                        {
!                                               /*
!                                                * empty field must be inserted 
as NULL value in
!                                                * this way
!                                                */
!                                               strcat(query, "\\N");
                                        }
                                }
!                               else if ((fields[h].db_type == 'N') &&
!                                                (fields[h].db_dec == 0))
                                {
!                                       if (isinteger(foo))
!                                               strcat(query, foo);
!                                       else
                                        {
                                                strcat(query, "\\N");
-                                               if (verbose)
-                                                       fprintf(stderr, 
"Illegal numeric value found "
-                                                                       "in 
record %d, field \"%s\"\n",
-                                                                       i, 
fields[h].db_name);
                                        }
                                }
                                else
                                {
--- 464,482 ----
                                        }
                                        else
                                        {
!                                               /* try to insert it as-is */
!                                               strcat(query, foo);
                                        }
                                }
!                               else if (fields[h].db_type == 'N')
                                {
!                                       if (strlen(foo) == 0)
                                        {
+                                               /* assume empty string means a 
NULL */
                                                strcat(query, "\\N");
                                        }
+                                       else
+                                               strcat(query, foo);
                                }
                                else
                                {

---------------------------(end of broadcast)---------------------------
TIP 2: you can get off all lists at once with the unregister command
    (send "unregister YourEmailAddressHere" to [EMAIL PROTECTED])

Reply via email to