Thread: Small problem in contrib/dbase/dbf2pg.c

Small problem in contrib/dbase/dbf2pg.c

From
"Thomas Behr"
Date:
Your name               : Thomas Behr
Your email address      : ------.----@bnv-bamberg.de
System Configuration
---------------------
  Architecture (example: Intel Pentium)         :   ALL
  Operating System (example: Linux 2.0.26 ELF)  :   ALL
  PostgreSQL version (example: PostgreSQL-7.3.3):   PostgreSQL-7.3.3
  Compiler used (example:  gcc 2.95.2)          :   WorkShop Compilers 5.0 98/12/15 C 5.0
Please enter a FULL description of your problem:
------------------------------------------------
  dbf2pg  -  Insert  xBase-style  .dbf-files  into  a PostgreSQL-table
  There is an option "-s oldname=newname", which changes the old field name of
  the dbf-file to the newname in PostgeSQL. If the length of the new name is 0,
  the field is skiped. If you want to skip the first field of the dbf-file,
  you get the wildest error-messages from the backend.
  dbf2pg load the dbf-file via "COPY tablename FROM STDIN". If you skip the
  first field, it is an \t to much in STDIN.
Please describe a way to repeat the problem.   Please try to provide a
concise reproducible example, if at all possible:
----------------------------------------------------------------------
  dbf2pg -s first_field_name=,other_fieldname=,reserved_fieldname=new_fieldname
 -c -d testdb -t testtable -h dbhost -U testuser -F IBM437 -T ISO-8859-1 -vv
test.dbf

If you know how this problem might be fixed, list the solution below:
---------------------------------------------------------------------

    440     /* build line and submit */
    441     result = dbf_get_record(dbh, fields, i);
    442     if (result == DBF_VALID)
    443     {
    444       query[0] = '\0';
    445       for (h = 0; h < dbh->db_nfields; h++)
    446       {
    447         if (!strlen(fields[h].db_name))
    448           continue;
    449
    450         if (h != 0)   /* not for the first field! */
    451           strcat(query, "\t");    /* COPY statement field
    452                          * separator */



A fix could be an counter j=0, which increments only, if a field is imported
(IF (strlen(fields[h].db_name)> 0) j++. And only if j > 1 (if an other field is
imported) the \t is printed.

...
int j;
...

 if (result == DBF_VALID)
    {
      query[0] = '\0';
      j = 0;
      for (h = 0; h < dbh->db_nfields; h++)
      {
        if (!strlen(fields[h].db_name))
        {
          continue;
        }
        else
        {
          j++;
        }

        if (j > 1)   /* not for the first field! */
          strcat(query, "\t");    /* COPY statement field
                         * separator */


An other small bug in the README:
-s start
              Specify  the  first record-number in the xBase-file
              we will insert.
should be
-e start
              Specify  the  first record-number in the xBase-file
              we will insert.

Re: Small problem in contrib/dbase/dbf2pg.c

From
Bruce Momjian
Date:
Thomas, would you send me a context diff (diff -c) of the change and I
will get into 7.4.  Thanks.

---------------------------------------------------------------------------

Thomas Behr wrote:
> Your name               : Thomas Behr
> Your email address      : ------.----@bnv-bamberg.de
> System Configuration
> ---------------------
>   Architecture (example: Intel Pentium)         :   ALL
>   Operating System (example: Linux 2.0.26 ELF)  :   ALL
>   PostgreSQL version (example: PostgreSQL-7.3.3):   PostgreSQL-7.3.3
>   Compiler used (example:  gcc 2.95.2)          :   WorkShop Compilers 5.0 98/12/15 C 5.0
> Please enter a FULL description of your problem:
> ------------------------------------------------
>   dbf2pg  -  Insert  xBase-style  .dbf-files  into  a PostgreSQL-table
>   There is an option "-s oldname=newname", which changes the old field name of
>   the dbf-file to the newname in PostgeSQL. If the length of the new name is 0,
>   the field is skiped. If you want to skip the first field of the dbf-file,
>   you get the wildest error-messages from the backend.
>   dbf2pg load the dbf-file via "COPY tablename FROM STDIN". If you skip the
>   first field, it is an \t to much in STDIN.
> Please describe a way to repeat the problem.   Please try to provide a
> concise reproducible example, if at all possible:
> ----------------------------------------------------------------------
>   dbf2pg -s first_field_name=,other_fieldname=,reserved_fieldname=new_fieldname
>  -c -d testdb -t testtable -h dbhost -U testuser -F IBM437 -T ISO-8859-1 -vv
> test.dbf
>
> If you know how this problem might be fixed, list the solution below:
> ---------------------------------------------------------------------
>
>     440     /* build line and submit */
>     441     result = dbf_get_record(dbh, fields, i);
>     442     if (result == DBF_VALID)
>     443     {
>     444       query[0] = '\0';
>     445       for (h = 0; h < dbh->db_nfields; h++)
>     446       {
>     447         if (!strlen(fields[h].db_name))
>     448           continue;
>     449
>     450         if (h != 0)   /* not for the first field! */
>     451           strcat(query, "\t");    /* COPY statement field
>     452                          * separator */
>
>
>
> A fix could be an counter j=0, which increments only, if a field is imported
> (IF (strlen(fields[h].db_name)> 0) j++. And only if j > 1 (if an other field is
> imported) the \t is printed.
>
> ...
> int j;
> ...
>
>  if (result == DBF_VALID)
>     {
>       query[0] = '\0';
>       j = 0;
>       for (h = 0; h < dbh->db_nfields; h++)
>       {
>         if (!strlen(fields[h].db_name))
>         {
>           continue;
>         }
>         else
>         {
>           j++;
>         }
>
>         if (j > 1)   /* not for the first field! */
>           strcat(query, "\t");    /* COPY statement field
>                          * separator */
>
>
> An other small bug in the README:
> -s start
>               Specify  the  first record-number in the xBase-file
>               we will insert.
> should be
> -e start
>               Specify  the  first record-number in the xBase-file
>               we will insert.
>
>
> ---------------------------(end of broadcast)---------------------------
> TIP 8: explain analyze is your friend
>

--
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 359-1001
  +  If your life is a hard drive,     |  13 Roberts Road
  +  Christ can be your backup.        |  Newtown Square, Pennsylvania 19073

Re: Small problem in contrib/dbase/dbf2pg.c

From
"Thomas Behr"
Date:
Hej!

 select version();
                           version
--------------------------------------------------------------
 PostgreSQL 7.3.3 on sparc-sun-solaris2.7, compiled by cc -Xa

On 23 Jul 2003, Bruce Momjian wrote:
> Thomas, would you send me a context diff (diff -c) of the change and I
> will get into 7.4.  Thanks.

I hope, it is OK.

Thomas


----8<-------------8<--------------8<----------

*** dbf2pg.c    Thu Oct 31 20:11:48 2002
--- dbf2pg.c.TB    Thu Jul 24 13:09:48 2003
***************
*** 194,200 ****
      printf("dbf2pg\n"
             "usage: dbf2pg [-u | -l] [-h hostname] [-W] [-U username]\n"
             "              [-B transaction_size] [-F charset_from [-T charset_to]]\n"
!            "              [-s oldname=newname[,oldname=newname[...]]] [-d dbase]\n"
             "              [-t table] [-c | -D] [-f] [-v[v]] dbf-file\n");
  }

--- 194,200 ----
      printf("dbf2pg\n"
             "usage: dbf2pg [-u | -l] [-h hostname] [-W] [-U username]\n"
             "              [-B transaction_size] [-F charset_from [-T charset_to]]\n"
!            "              [-s oldname=[newname][,oldname=[newname][...]]] [-d dbase]\n"
             "              [-t table] [-c | -D] [-f] [-v[v]] dbf-file\n");
  }

***************
*** 359,364 ****
--- 359,365 ----
      field       *fields;
      int            i,
                  h,
+                 j,
                  result;
      char       *query,
                 *foo;
***************
*** 442,453 ****
          if (result == DBF_VALID)
          {
              query[0] = '\0';
              for (h = 0; h < dbh->db_nfields; h++)
              {
!                 if (!strlen(fields[h].db_name))
                      continue;

!                 if (h != 0)        /* not for the first field! */
                      strcat(query, "\t");        /* COPY statement field
                                                   * separator */

--- 443,461 ----
          if (result == DBF_VALID)
          {
              query[0] = '\0';
+             j = 0; /* counter for fields in the output */
              for (h = 0; h < dbh->db_nfields; h++)
              {
!                 if (!strlen(fields[h].db_name)) /* When the new fieldname is empty, the field is skipped */
!                 {
                      continue;
+                 }
+                 else
+                 {
+                     j++;
+                 }

!                 if (j > 1)        /* not for the first field! */
                      strcat(query, "\t");        /* COPY statement field
                                                   * separator */


----8<-------------8<--------------8<----------

*** README.dbf2pg    Fri Dec 21 06:29:46 2001
--- README.dbf2pg.TB    Thu Jul 24 13:28:35 2003
***************
*** 12,18 ****
         "dbf2pg [options] dbf-file"
         Options:
         [-v[v]] [-f] [-u | -l] [-c | -D] [-d database] [-t  table]
!        [-h   host]   [-s  oldname=newname[,oldname=newname]]  [-s
         start] [-e end] [-W] [-U username]  [-B    transaction_size]
         [-F charset_from [-T charset_to]]

--- 12,18 ----
         "dbf2pg [options] dbf-file"
         Options:
         [-v[v]] [-f] [-u | -l] [-c | -D] [-d database] [-t  table]
!        [-h   host]   [-s  oldname=[newname][,oldname=[newname]]]  [-b
         start] [-e end] [-W] [-U username]  [-B    transaction_size]
         [-F charset_from [-T charset_to]]

***************
*** 70,84 ****
  dbf2sql(1L)                          dbf2sql(1L)


!        -s oldname=newname[,oldname=newname]
            Change the name of a field from oldname to newname.
            This  is    mainly    used to avoid using reserved SQL-
!           keywords. Example:
!           -s SELECT=SEL,COMMIT=doit
            This is done  before  the  -f  operator  has  taken
            effect!

!        -s start
            Specify  the  first record-number in the xBase-file
            we will insert.

--- 70,88 ----
  dbf2sql(1L)                          dbf2sql(1L)


!        -s oldname=[newname][,oldname=[newname]]
            Change the name of a field from oldname to newname.
            This  is    mainly    used to avoid using reserved SQL-
!           keywords.  When the new fieldname is empty, the field
!           is skipped in both the CREATE-clause and the
!           INSERT-clauses, in common words: it will not be present
!           in the SQL-table.
!           Example:
!           -s SELECT=SEL,remark=,COMMIT=doit
            This is done  before  the  -f  operator  has  taken
            effect!

!        -b start
            Specify  the  first record-number in the xBase-file
            we will insert.


----8<-------------8<--------------8<----------

*** dbf2pg.1    Thu May 10 16:41:23 2001
--- dbf2pg.1.TB    Thu Jul 24 13:33:08 2003
***************
*** 8,15 ****
  Options:
  .br
  [-v[v]] [-f] [-u | -l] [-c | -D] [-d database] [-t table]
! [-h host] [-s oldname=newname[,oldname=newname]]
! [-s start] [-e end] [-W] [-U username] [-B transaction_size]
  [-F charset_from [-T charset_to]]

  .SH DESCRIPTION
--- 8,15 ----
  Options:
  .br
  [-v[v]] [-f] [-u | -l] [-c | -D] [-d database] [-t table]
! [-h host] [-s oldname=[newname][,oldname=[newname]]]
! [-b start] [-e end] [-W] [-U username] [-B transaction_size]
  [-F charset_from [-T charset_to]]

  .SH DESCRIPTION
***************
*** 78,84 ****
  .IR -f
  operator has taken effect!
  .TP
! .I "-s start"
  Specify the first record-number in the xBase-file we will insert.
  .TP
  .I "-e end"
--- 78,84 ----
  .IR -f
  operator has taken effect!
  .TP
! .I "-b start"
  Specify the first record-number in the xBase-file we will insert.
  .TP
  .I "-e end"



----8<-------------8<--------------8<----------

Re: Small problem in contrib/dbase/dbf2pg.c

From
Bruce Momjian
Date:
Patch applied.  Thanks.

---------------------------------------------------------------------------


Thomas Behr wrote:
> Hej!
>
>  select version();
>                            version
> --------------------------------------------------------------
>  PostgreSQL 7.3.3 on sparc-sun-solaris2.7, compiled by cc -Xa
>
> On 23 Jul 2003, Bruce Momjian wrote:
> > Thomas, would you send me a context diff (diff -c) of the change and I
> > will get into 7.4.  Thanks.
>
> I hope, it is OK.
>
> Thomas
>
>
> ----8<-------------8<--------------8<----------
>
> *** dbf2pg.c    Thu Oct 31 20:11:48 2002
> --- dbf2pg.c.TB    Thu Jul 24 13:09:48 2003
> ***************
> *** 194,200 ****
>       printf("dbf2pg\n"
>              "usage: dbf2pg [-u | -l] [-h hostname] [-W] [-U username]\n"
>              "              [-B transaction_size] [-F charset_from [-T charset_to]]\n"
> !            "              [-s oldname=newname[,oldname=newname[...]]] [-d dbase]\n"
>              "              [-t table] [-c | -D] [-f] [-v[v]] dbf-file\n");
>   }
>
> --- 194,200 ----
>       printf("dbf2pg\n"
>              "usage: dbf2pg [-u | -l] [-h hostname] [-W] [-U username]\n"
>              "              [-B transaction_size] [-F charset_from [-T charset_to]]\n"
> !            "              [-s oldname=[newname][,oldname=[newname][...]]] [-d dbase]\n"
>              "              [-t table] [-c | -D] [-f] [-v[v]] dbf-file\n");
>   }
>
> ***************
> *** 359,364 ****
> --- 359,365 ----
>       field       *fields;
>       int            i,
>                   h,
> +                 j,
>                   result;
>       char       *query,
>                  *foo;
> ***************
> *** 442,453 ****
>           if (result == DBF_VALID)
>           {
>               query[0] = '\0';
>               for (h = 0; h < dbh->db_nfields; h++)
>               {
> !                 if (!strlen(fields[h].db_name))
>                       continue;
>
> !                 if (h != 0)        /* not for the first field! */
>                       strcat(query, "\t");        /* COPY statement field
>                                                    * separator */
>
> --- 443,461 ----
>           if (result == DBF_VALID)
>           {
>               query[0] = '\0';
> +             j = 0; /* counter for fields in the output */
>               for (h = 0; h < dbh->db_nfields; h++)
>               {
> !                 if (!strlen(fields[h].db_name)) /* When the new fieldname is empty, the field is skipped */
> !                 {
>                       continue;
> +                 }
> +                 else
> +                 {
> +                     j++;
> +                 }
>
> !                 if (j > 1)        /* not for the first field! */
>                       strcat(query, "\t");        /* COPY statement field
>                                                    * separator */
>
>
> ----8<-------------8<--------------8<----------
>
> *** README.dbf2pg    Fri Dec 21 06:29:46 2001
> --- README.dbf2pg.TB    Thu Jul 24 13:28:35 2003
> ***************
> *** 12,18 ****
>          "dbf2pg [options] dbf-file"
>          Options:
>          [-v[v]] [-f] [-u | -l] [-c | -D] [-d database] [-t  table]
> !        [-h   host]   [-s  oldname=newname[,oldname=newname]]  [-s
>          start] [-e end] [-W] [-U username]  [-B    transaction_size]
>          [-F charset_from [-T charset_to]]
>
> --- 12,18 ----
>          "dbf2pg [options] dbf-file"
>          Options:
>          [-v[v]] [-f] [-u | -l] [-c | -D] [-d database] [-t  table]
> !        [-h   host]   [-s  oldname=[newname][,oldname=[newname]]]  [-b
>          start] [-e end] [-W] [-U username]  [-B    transaction_size]
>          [-F charset_from [-T charset_to]]
>
> ***************
> *** 70,84 ****
>   dbf2sql(1L)                          dbf2sql(1L)
>
>
> !        -s oldname=newname[,oldname=newname]
>             Change the name of a field from oldname to newname.
>             This  is    mainly    used to avoid using reserved SQL-
> !           keywords. Example:
> !           -s SELECT=SEL,COMMIT=doit
>             This is done  before  the  -f  operator  has  taken
>             effect!
>
> !        -s start
>             Specify  the  first record-number in the xBase-file
>             we will insert.
>
> --- 70,88 ----
>   dbf2sql(1L)                          dbf2sql(1L)
>
>
> !        -s oldname=[newname][,oldname=[newname]]
>             Change the name of a field from oldname to newname.
>             This  is    mainly    used to avoid using reserved SQL-
> !           keywords.  When the new fieldname is empty, the field
> !           is skipped in both the CREATE-clause and the
> !           INSERT-clauses, in common words: it will not be present
> !           in the SQL-table.
> !           Example:
> !           -s SELECT=SEL,remark=,COMMIT=doit
>             This is done  before  the  -f  operator  has  taken
>             effect!
>
> !        -b start
>             Specify  the  first record-number in the xBase-file
>             we will insert.
>
>
> ----8<-------------8<--------------8<----------
>
> *** dbf2pg.1    Thu May 10 16:41:23 2001
> --- dbf2pg.1.TB    Thu Jul 24 13:33:08 2003
> ***************
> *** 8,15 ****
>   Options:
>   .br
>   [-v[v]] [-f] [-u | -l] [-c | -D] [-d database] [-t table]
> ! [-h host] [-s oldname=newname[,oldname=newname]]
> ! [-s start] [-e end] [-W] [-U username] [-B transaction_size]
>   [-F charset_from [-T charset_to]]
>
>   .SH DESCRIPTION
> --- 8,15 ----
>   Options:
>   .br
>   [-v[v]] [-f] [-u | -l] [-c | -D] [-d database] [-t table]
> ! [-h host] [-s oldname=[newname][,oldname=[newname]]]
> ! [-b start] [-e end] [-W] [-U username] [-B transaction_size]
>   [-F charset_from [-T charset_to]]
>
>   .SH DESCRIPTION
> ***************
> *** 78,84 ****
>   .IR -f
>   operator has taken effect!
>   .TP
> ! .I "-s start"
>   Specify the first record-number in the xBase-file we will insert.
>   .TP
>   .I "-e end"
> --- 78,84 ----
>   .IR -f
>   operator has taken effect!
>   .TP
> ! .I "-b start"
>   Specify the first record-number in the xBase-file we will insert.
>   .TP
>   .I "-e end"
>
>
>
> ----8<-------------8<--------------8<----------
>
> ---------------------------(end of broadcast)---------------------------
> TIP 6: Have you searched our list archives?
>
>                http://archives.postgresql.org
>

--
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 359-1001
  +  If your life is a hard drive,     |  13 Roberts Road
  +  Christ can be your backup.        |  Newtown Square, Pennsylvania 19073