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

Reply via email to