Package: dbf2mysql
Version: 1.14a-3.1
The attached two patches fixes some bugs found in dbf2mysql and mysql2dbf.
dbf2mysql:
- add missing quotes around column names in CREATE TABLE query, allowing
reserver words in column names
- add column list to INSERT query, allowing inserts into existing tables with
more columns
mysql2dbf:
- fix number length (was always 10 before)
- fix DECIMAL support (add NEWDECIMAL field type)
- add ENUM (two-state only) support (ENUM field type does not work, uses
ENUM_FLAG)
--
Ondrej Zary
diff -ur dbf2mysql-1.14a/dbf2mysql.c dbf2mysql-1.14a-new/dbf2mysql.c
--- dbf2mysql-1.14a/dbf2mysql.c 2007-07-25 14:38:19.000000000 +0200
+++ dbf2mysql-1.14a-new/dbf2mysql.c 2007-07-25 14:35:01.000000000 +0200
@@ -221,7 +221,9 @@
if (fieldlow)
strtolower(dbh->db_fields[i].db_name);
+ strcat(query, '`');
strcat(query, dbh->db_fields[i].db_name);
+ strcat(query, '`');
switch(dbh->db_fields[i].db_type) {
case 'C':
if (var_chars)
@@ -324,7 +326,7 @@
/* Patched by GLC to fix quick mode Numeric fields */
void do_inserts(MYSQL *SQLsock, char *table, dbhead *dbh)
{
- int result, i, j, nc = 0, h;
+ int result, i, j, nc = 0, h, first_done;
field *fields;
char *query, *vpos, *pos;
char str[257], *cvt = NULL, *s;
@@ -370,6 +372,7 @@
for ( i = 0 ; i < dbh->db_nfields ; i++ )
{
+ val_len += 32;
switch(dbh->db_fields[i].db_type)
{
case 'M':
@@ -393,7 +396,24 @@
}
if (!quick)
{
- sprintf(query, "INSERT INTO %s VALUES (",table);
+ sprintf(query, "INSERT INTO %s (",table);
+ first_done = 0;
+ for ( i = 0; i < dbh->db_nfields; i++) {
+ if (!strlen(dbh->db_fields[i].db_name)) {
+ continue;
+ /* skip field if length of name == 0 */
+ }
+ if (first_done) {
+ strcat(query, ",\n\t");
+ }
+ first_done = 1;
+ if (fieldlow)
+ strtolower(dbh->db_fields[i].db_name);
+ strcat(query, '`');
+ strcat(query, dbh->db_fields[i].db_name);
+ strcat(query, '`');
+ }
+ strcat(query, ") VALUES (");
}
else
if (express)
--- dbf2mysql-1.14a/mysql2dbf.c 2007-08-03 12:19:22.000000000 +0200
+++ dbf/mysql2dbf.c 2007-08-03 12:22:28.000000000 +0200
@@ -201,12 +201,12 @@
strtoupper(qfield->name);
switch (qfield->type) {
- /* assume INT's have a max. of 10 digits (4^32 has 10 digits) */
+
case FIELD_TYPE_CHAR:
case FIELD_TYPE_SHORT:
case FIELD_TYPE_LONG:
- dbf_add_field(dbh, qfield->name, 'N', 10, 0);
+ dbf_add_field(dbh, qfield->name, 'N', qfield->length, 0);
if (verbose > 1) {
printf("Adding field: %s, INT_TYPE, %d\n", qfield->name,
qfield->length);
@@ -217,6 +217,7 @@
case FIELD_TYPE_DOUBLE:
case FIELD_TYPE_FLOAT:
case FIELD_TYPE_DECIMAL:
+ case FIELD_TYPE_NEWDECIMAL:
dbf_add_field(dbh, qfield->name, 'N', qfield->length,
qfield->decimals);
if (verbose > 1) {
@@ -230,10 +231,18 @@
case FIELD_TYPE_TINY_BLOB:
case FIELD_TYPE_MEDIUM_BLOB:
case FIELD_TYPE_LONG_BLOB:
- dbf_add_field(dbh, qfield->name, 'C', qfield->length, 0);
- if (verbose > 1) {
- printf("Adding field: %s, INT_CHAR, %d\n", qfield->name,
- qfield->length);
+ if (qfield->flags & ENUM_FLAG) {
+ dbf_add_field(dbh, qfield->name, 'L', 1, 2);
+ if (verbose > 1) {
+ printf("Adding field: %s, INT_ENUM, %d\n", qfield->name,
+ qfield->length);
+ }
+ } else {
+ dbf_add_field(dbh, qfield->name, 'C', qfield->length, 0);
+ if (verbose > 1) {
+ printf("Adding field: %s, INT_CHAR, %d\n", qfield->name,
+ qfield->length);
+ }
}
break;
case FIELD_TYPE_DATETIME:
@@ -254,6 +263,8 @@
}
break;
default:
+ if (verbose > 1)
+ printf("Unknown field type: %d\n", qfield->type);
break;
}
}