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; } }