dbTalk Databases Forums  

Re: [BUGS] Small problem in contrib/dbase/dbf2pg.c

mailing.database.pgsql-bugs mailing.database.pgsql-bugs


Discuss Re: [BUGS] Small problem in contrib/dbase/dbf2pg.c in the mailing.database.pgsql-bugs forum.



Reply
 
Thread Tools Display Modes
  #1  
Old   
Bruce Momjian
 
Posts: n/a

Default Re: [BUGS] Small problem in contrib/dbase/dbf2pg.c - 07-23-2003 , 09:32 PM







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

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

Thomas Behr wrote:
Quote:
Your name : Thomas Behr
Your email address : ------.---- (AT) bnv-bamberg (DOT) 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_fieldn ame=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 (AT) candle (DOT) 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

---------------------------(end of broadcast)---------------------------
TIP 5: Have you checked our extensive FAQ?

http://www.postgresql.org/docs/faqs/FAQ.html


Reply With Quote
  #2  
Old   
Bruce Momjian
 
Posts: n/a

Default Re: [BUGS] Small problem in contrib/dbase/dbf2pg.c - 07-30-2003 , 09:19 PM







Patch applied. Thanks.

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


Thomas Behr wrote:
Quote:
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 (AT) candle (DOT) 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

---------------------------(end of broadcast)---------------------------
TIP 7: don't forget to increase your free space map settings


Reply With Quote
Reply




Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

vB code is On
Smilies are On
[IMG] code is On
HTML code is Off



Powered by vBulletin Version 3.5.3
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.