From b4176e9f4cee1032bc8eb6266c45a8f8009f4147 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Fri, 27 May 2005 15:44:04 +0000 Subject: [PATCH] Clean up bogus checking of date and numeric fields in DBF files, per report from Boris van Schooten. --- contrib/dbase/dbf2pg.c | 53 ++++++++++++------------------------------ 1 file changed, 15 insertions(+), 38 deletions(-) diff --git a/contrib/dbase/dbf2pg.c b/contrib/dbase/dbf2pg.c index 52561cf247..ab0ae9a30a 100644 --- a/contrib/dbase/dbf2pg.c +++ b/contrib/dbase/dbf2pg.c @@ -63,31 +63,8 @@ char *Escape_db(char *); 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) { @@ -471,8 +448,15 @@ do_inserts(PGconn *conn, char *table, dbhead * dbh) /* handle the date first - liuk */ if (fields[h].db_type == 'D') { - if ((strlen(foo) == 8) && isinteger(foo)) + 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,26 +464,19 @@ do_inserts(PGconn *conn, char *table, dbhead * dbh) } else { - /* - * empty field must be inserted as NULL value in - * this way - */ - strcat(query, "\\N"); + /* try to insert it as-is */ + strcat(query, foo); } } - else if ((fields[h].db_type == 'N') && - (fields[h].db_dec == 0)) + else if (fields[h].db_type == 'N') { - if (isinteger(foo)) - strcat(query, foo); - else + if (strlen(foo) == 0) { + /* assume empty string means a NULL */ strcat(query, "\\N"); - if (verbose) - fprintf(stderr, "Illegal numeric value found " - "in record %d, field \"%s\"\n", - i, fields[h].db_name); } + else + strcat(query, foo); } else { -- 2.40.0