Changed import XML method for beer styles using a temporary struct and native database functions. This is the correct method which gives the correct results.

Sat, 11 Jun 2022 19:29:20 +0200

author
Michiel Broek <mbroek@mbse.eu>
date
Sat, 11 Jun 2022 19:29:20 +0200
changeset 276
7316a419334d
parent 275
f472f9773782
child 277
2228d833c52a

Changed import XML method for beer styles using a temporary struct and native database functions. This is the correct method which gives the correct results.

src/ImportXML.cpp file | annotate | diff | comparison | revisions
src/global.h file | annotate | diff | comparison | revisions
--- a/src/ImportXML.cpp	Sat Jun 11 12:59:49 2022 +0200
+++ b/src/ImportXML.cpp	Sat Jun 11 19:29:20 2022 +0200
@@ -16,6 +16,7 @@
  */
 #include "ImportXML.h"
 #include "../ui/ui_ImportXML.h"
+#include "global.h"
 #include "MainWindow.h"
 
 
@@ -47,10 +48,8 @@
 {
     QSqlQuery query;
     QString   sql, log;
-    int	eq_total = 0, eq_errors = 0, f_total = 0, f_errors = 0, h_total = 0, h_errors = 0;
-    int m_total = 0, m_errors = 0, y_total = 0, y_errors = 0, rec_total = 0, rec_errors = 0;
-    int st_total = 0, st_errors = 0, mash_total = 0, mash_errors = 0, w_total = 0, w_errors = 0;
     int total = 0, errors = 0;
+    bool hasnotes;
 
     QString fileName = QFileDialog::getOpenFileName(this, tr("Open File"), QDir::homePath() + "/*.xml", tr("Files (*.xml)"));
     if (fileName == 0) {
@@ -74,7 +73,7 @@
 	    break;
 
 	if (xml->tokenType() == QXmlStreamReader::StartDocument) {
-//	    qDebug() << xml->readElementText();
+	    qDebug() << xml->documentVersion() << xml->documentEncoding();
 	    // Just skip
 	} else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "EQUIPMENTS")) {
 	    /*
@@ -91,8 +90,8 @@
 		    /*
 		     * Equipment
 		     */
-		    eq_total++;
 		    total++;
+		    hasnotes = false;
 		    sql = "INSERT INTO inventory_equipments SET uuid='";
 		    sql.append(QUuid::createUuid().toString().mid(1, 36));
 		    sql.append("', top_up_water=0");
@@ -101,21 +100,30 @@
 		    	if (xml->atEnd())
                             break;
 		    	if ((xml->tokenType() == QXmlStreamReader::EndElement) && (xml->name() == "EQUIPMENT")) {
+			    if (! hasnotes)
+                                sql.append(", notes=''");
 			    query.exec(sql);
 			    if (query.lastError().isValid()) {
-//				qWarning() << sql << query.lastError();
-				eq_errors++;
+				qWarning() << sql << query.lastError();
 				errors++;
 			    }
 			    ui->progressBar->setValue(round(100 * xml->characterOffset() / fsize));
 			    break;
 		    	}
-			if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "VERSION")) {
+			if ((xml->tokenType() == QXmlStreamReader::StartElement) &&
+			   ((xml->name() == "VERSION") || (xml->name() == "DISPLAY_BOIL_SIZE") ||
+			    (xml->name() == "DISPLAY_BATCH_SIZE") || (xml->name() == "DISPLAY_TUN_VOLUME") ||
+			    (xml->name() == "DISPLAY_TUN_WEIGHT") || (xml->name() == "DISPLAY_TRUB_CHILLER_LOSS") ||
+			    (xml->name() == "DISPLAY_LAUTERDEADSPACE") || (xml->name() == "TUN_MATERIAL") ||
+			    (xml->name() == "ATTENUATION_FACTOR_YEAST") || (xml->name() == "ATTENUATION_FACTOR_WATER_TO_GRAIN_RATIO") ||
+			    (xml->name() == "ATTENUATION_FACTOR_TOTAL_MASH_TIME") || (xml->name() == "ATTENUATION_FACTOR_PERC_SIMPLE_SUGAR") ||
+			    (xml->name() == "ATTENUATION_FACTOR_CONSTANT"))) {
 			    // Ignore.
 			} else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "NAME")) {
 			    sql.append(QString(", name='%1'").arg(xml->readElementText()));
 			} else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "NOTES")) {
 			    sql.append(QString(", notes='%1'").arg(xml->readElementText()));
+			    hasnotes = true;
 			} else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "BOIL_SIZE")) {
 			    sql.append(QString(", boil_size=%1").arg(xml->readElementText().toDouble(), 2, 'f', 1, '0'));
 			} else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "BATCH_SIZE")) {
@@ -176,23 +184,52 @@
                     /*
                      * Style
                      */
-                    st_total++;
+		    Style *st = new Style;
+		    st->notes = st->category = st->style_letter = st->profile = st->ingredients = st->examples = "";
+		    st->style_guide = "BKG 2019";
+		    st->category_number = 0;
                     total++;
-                    sql = "INSERT INTO profile_styles SET uuid='";
-                    sql.append(QUuid::createUuid().toString().mid(1, 36));
-		    sql.append("'");
 
 		    while (xml->readNext()) {
                         if (xml->atEnd())
                             break;
                         if ((xml->tokenType() == QXmlStreamReader::EndElement) && (xml->name() == "STYLE")) {
-                            query.exec(sql);
+			    query.prepare("INSERT INTO profile_styles SET name=:name, category=:category, "
+				"category_number=:catnr, style_letter=:group, style_guide=:guide, type=:type, "
+				"og_min=:og_min, og_max=:og_max, fg_min=:fg_min, fg_max=:fg_max, ibu_min=:ibu_min, "
+				"ibu_max=:ibu_max, color_min=:ebc_min, color_max=:ebc_max, carb_min=:co2_min, "
+				"carb_max=:co2_max, abv_min=:abv_min, abv_max=:abv_max, notes=:notes, "
+				"profile=:profile, ingredients=:ingredients, examples=:examples, uuid=:uuid");
+			    query.bindValue(":name", st->name);
+        		    query.bindValue(":category", st->category);
+        		    query.bindValue(":catnr", st->category_number);
+			    query.bindValue(":group", st->style_letter);
+			    query.bindValue(":guide", st->style_guide);
+			    query.bindValue(":type", st->type);
+			    query.bindValue(":og_min", QString("%1").arg(st->og_min, 4, 'f', 3, '0'));
+			    query.bindValue(":og_max", QString("%1").arg(st->og_max, 4, 'f', 3, '0'));
+			    query.bindValue(":fg_min", QString("%1").arg(st->fg_min, 4, 'f', 3, '0'));
+			    query.bindValue(":fg_max", QString("%1").arg(st->fg_max, 4, 'f', 3, '0'));
+			    query.bindValue(":ibu_min", QString("%1").arg(st->ibu_min, 1, 'f', 0, '0'));
+			    query.bindValue(":ibu_max", QString("%1").arg(st->ibu_max, 1, 'f', 0, '0'));
+			    query.bindValue(":ebc_min", QString("%1").arg(st->color_min, 1, 'f', 0, '0'));
+			    query.bindValue(":ebc_max", QString("%1").arg(st->color_max, 1, 'f', 0, '0'));
+			    query.bindValue(":co2_min", QString("%1").arg(st->carb_min, 2, 'f', 1, '0'));
+			    query.bindValue(":co2_max", QString("%1").arg(st->carb_max, 2, 'f', 1, '0'));
+			    query.bindValue(":abv_min", QString("%1").arg(st->abv_min, 2, 'f', 1, '0'));
+			    query.bindValue(":abv_max", QString("%1").arg(st->abv_max, 2, 'f', 1, '0'));
+			    query.bindValue(":notes", st->notes);
+			    query.bindValue(":profile", st->profile);
+			    query.bindValue(":ingredients", st->ingredients);
+			    query.bindValue(":examples", st->examples);
+			    query.bindValue(":uuid", QUuid::createUuid().toString().mid(1, 36));
+                            query.exec();
                             if (query.lastError().isValid()) {
-                                qWarning() << sql << query.lastError();
-                                st_errors++;
+                                qWarning() << query.lastError();
                                 errors++;
                             }
                             ui->progressBar->setValue(round(100 * xml->characterOffset() / fsize));
+			    delete st;
                             break;
                         }
                         if ((xml->tokenType() == QXmlStreamReader::StartElement) && ((xml->name() == "VERSION")) ||
@@ -204,49 +241,61 @@
 			    (xml->name() == "CARB_RANGE") || (xml->name() == "COLOR_RANGE") || (xml->name() == "ABV_RANGE")) {
                             // Ignore.
 			} else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "NAME")) {
-                            sql.append(QString(", name='%1'").arg(xml->readElementText()));
+			    st->name = xml->readElementText();
 			} else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "CATEGORY")) {
-                            sql.append(QString(", category='%1'").arg(xml->readElementText()));
+			    st->category = xml->readElementText();
 			} else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "CATEGORY_NUMBER")) {
-                            sql.append(QString(", category_number=%1").arg(xml->readElementText().toInt()));
+			    st->category_number = xml->readElementText().toInt();
 			} else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "STYLE_LETTER")) {
-                            sql.append(QString(", style_letter='%1'").arg(xml->readElementText()));
+			    st->style_letter = xml->readElementText();
 			} else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "STYLE_GUIDE")) {
-                            sql.append(QString(", style_guide='%1'").arg(xml->readElementText()));
+			    st->style_guide = xml->readElementText();
 			} else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "TYPE")) {
-                            sql.append(QString(", type=%1").arg(xml->readElementText().toInt()));
+			    QString temp = xml->readElementText();
+			    if (temp == "Lager")
+				st->type = 0;
+			    else if (temp == "Ale")
+				st->type = 1;
+			    else if (temp == "Mead")
+				st->type = 2;
+                            else if (temp == "Wheat")
+				st->type = 3;
+                            else if (temp == "Mixed")
+				st->type = 4;
+                            else if (temp == "Cider")
+				st->type = 5;
 			} else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "NOTES")) {
-                            sql.append(QString(", notes='%1'").arg(xml->readElementText()));
+			    st->notes = xml->readElementText();
 			} else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "OG_MIN")) {
-                            sql.append(QString(", og_min=%1").arg(xml->readElementText().toDouble(), 4, 'f', 3, '0'));
+			    st->og_min = xml->readElementText().toDouble();
 			} else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "OG_MAX")) {
-                            sql.append(QString(", og_max=%1").arg(xml->readElementText().toDouble(), 4, 'f', 3, '0'));
+			    st->og_max = xml->readElementText().toDouble();
 			} else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "FG_MIN")) {
-                            sql.append(QString(", fg_min=%1").arg(xml->readElementText().toDouble(), 4, 'f', 3, '0'));
+			    st->fg_min = xml->readElementText().toDouble();
 			} else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "FG_MAX")) {
-                            sql.append(QString(", fg_max=%1").arg(xml->readElementText().toDouble(), 4, 'f', 3, '0'));
+			    st->fg_max = xml->readElementText().toDouble();
 			} else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "IBU_MIN")) {
-                            sql.append(QString(", ibu_min=%1").arg(xml->readElementText().toDouble(), 2, 'f', 1, '0'));
+			    st->ibu_min = xml->readElementText().toDouble();
                         } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "IBU_MAX")) {
-                            sql.append(QString(", ibu_max=%1").arg(xml->readElementText().toDouble(), 2, 'f', 1, '0'));
+			    st->ibu_max = xml->readElementText().toDouble();
 			} else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "COLOR_MIN")) {
-                            sql.append(QString(", color_min=%1").arg(xml->readElementText().toDouble(), 2, 'f', 1, '0'));
+			    st->color_min = xml->readElementText().toDouble();
                         } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "COLOR_MAX")) {
-                            sql.append(QString(", color_max=%1").arg(xml->readElementText().toDouble(), 2, 'f', 1, '0'));
+			    st->color_max = xml->readElementText().toDouble();
 			} else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "CARB_MIN")) {
-                            sql.append(QString(", carb_min=%1").arg(xml->readElementText().toDouble(), 2, 'f', 1, '0'));
+			    st->carb_min = xml->readElementText().toDouble();
                         } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "CARB_MAX")) {
-                            sql.append(QString(", carb_max=%1").arg(xml->readElementText().toDouble(), 2, 'f', 1, '0'));
+			    st->carb_max = xml->readElementText().toDouble();
 			} else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "ABV_MIN")) {
-                            sql.append(QString(", abv_min=%1").arg(xml->readElementText().toDouble(), 2, 'f', 1, '0'));
+			    st->abv_min = xml->readElementText().toDouble();
                         } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "ABV_MAX")) {
-                            sql.append(QString(", abv_max=%1").arg(xml->readElementText().toDouble(), 2, 'f', 1, '0'));
+			    st->abv_max = xml->readElementText().toDouble();
 			} else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "PROFILE")) {
-                            sql.append(QString(", profile='%1'").arg(xml->readElementText()));
+			    st->profile = xml->readElementText();
 			} else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "INGREDIENTS")) {
-                            sql.append(QString(", ingredients='%1'").arg(xml->readElementText()));
+			    st->ingredients = xml->readElementText();
 			} else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "EXAMPLES")) {
-                            sql.append(QString(", examples='%1'").arg(xml->readElementText()));
+			    st->examples = xml->readElementText();
 			} else {
                             if (xml->tokenType() == QXmlStreamReader::StartElement)
                                 qDebug() << "2  " << xml->tokenType() << xml->name();
@@ -255,6 +304,7 @@
                 }
             }
         } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "FERMENTABLES")) {
+qDebug() << "start FERMENTABLES";
             /*
              * Fermentables
              */
@@ -269,26 +319,109 @@
                     /*
                      * Fermentable
                      */
-                    f_total++;
                     total++;
+		    hasnotes = false;
                     sql = "INSERT INTO inventory_fermentables SET uuid='";
                     sql.append(QUuid::createUuid().toString().mid(1, 36));
+		    sql.append("'");
 
                     while (xml->readNext()) {
                         if (xml->atEnd())
                             break;
                         if ((xml->tokenType() == QXmlStreamReader::EndElement) && (xml->name() == "FERMENTABLE")) {
-//                            query.exec(sql);
+				qDebug() << "hasnotes" << hasnotes;
+			    if (! hasnotes)
+				sql.append(", notes=''");
+                            query.exec(sql);
                             if (query.lastError().isValid()) {
-//                              qWarning() << sql << query.lastError();
-                                f_errors++;
+				qWarning() << sql << query.lastError();
                                 errors++;
                             }
                             ui->progressBar->setValue(round(100 * xml->characterOffset() / fsize));
                             break;
                         }
-                        if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "VERSION")) {
+                        if ((xml->tokenType() == QXmlStreamReader::StartElement) &&
+			   ((xml->name() == "VERSION") || (xml->name() == "DISPLAY_COST") ||
+			    (xml->name() == "DISPLAY_COLOR") || (xml->name() == "INVENTORY") ||
+			    (xml->name() == "PERCENTAGE") || (xml->name() == "ADJUST_TO_TOTAL_100") )) {
                             // Ignore.
+			} else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "NAME")) {
+                            sql.append(QString(", name='%1'").arg(xml->readElementText()));
+			} else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "COST")) {
+                            sql.append(QString(", cost=%1").arg(xml->readElementText().toDouble(), 3, 'f', 2, '0'));
+			} else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "TYPE")) {
+			    QString temp = xml->readElementText();
+			    if (temp == "Grain")
+				sql.append(", type=0");
+			    else if (temp == "Sugar")
+				sql.append(", type=1");
+			    else if (temp == "Extract")
+				sql.append(", type=2");
+			    else if (temp == "Dry extract")
+				sql.append(", type=3");
+			    else if (temp == "Adjunct")
+				sql.append(", type=4");
+			} else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "ORIGIN")) {
+                            sql.append(QString(", origin='%1'").arg(xml->readElementText()));
+			} else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "SUPPLIER")) {
+                            sql.append(QString(", supplier='%1'").arg(xml->readElementText()));
+			} else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "NOTES")) {
+                            sql.append(QString(", notes='%1'").arg(xml->readElementText()));
+			    hasnotes = true;
+			} else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "ALWAYS_ON_STOCK")) {
+                            sql.append(QString(", always_on_stock=%1").arg(xml->readElementText().toLower()));
+			} else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "YIELD")) {
+                            sql.append(QString(", yield=%1").arg(xml->readElementText().toDouble(), 5, 'f', 4, '0'));
+			} else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "COARSE_FINE_DIFF")) {
+                            sql.append(QString(", coarse_fine_diff=%1").arg(xml->readElementText().toDouble(), 5, 'f', 4, '0'));
+			} else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "MOISTURE")) {
+                            sql.append(QString(", moisture=%1").arg(xml->readElementText().toDouble(), 5, 'f', 4, '0'));
+			} else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "DIASTATIC_POWER")) {
+                            sql.append(QString(", diastatic_power=%1").arg(xml->readElementText().toDouble(), 5, 'f', 4, '0'));
+			} else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "MAX_IN_BATCH")) {
+                            sql.append(QString(", max_in_batch=%1").arg(xml->readElementText().toDouble(), 5, 'f', 4, '0'));
+			} else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "RECOMMEND_MASH")) {
+                            sql.append(QString(", recommend_mash=%1").arg(xml->readElementText().toLower()));
+			} else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "GRAINTYPE")) {
+			    QString temp = xml->readElementText();
+			    if (temp == "Base")
+				sql.append(QString(", graintype=0"));
+			    else if (temp == "Roast")
+				sql.append(QString(", graintype=1"));
+			    else if (temp == "Crystal")
+				sql.append(QString(", graintype=2"));
+                            else if (temp == "Kilned")
+				sql.append(QString(", graintype=3"));
+                            else if (temp == "Sour Malt")
+				sql.append(QString(", graintype=4"));
+                            else if (temp == "Special")
+				sql.append(QString(", graintype=5"));
+                            else if (temp == "No malt")
+				sql.append(QString(", graintype=6"));
+			} else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "ADDED")) {
+                            QString temp = xml->readElementText();
+			    if (temp == "Mash")
+				sql.append(QString(", added=0"));
+			    else if (temp == "Boil")
+				sql.append(QString(", added=1"));
+                            else if (temp == "Fermentation")
+				sql.append(QString(", added=2"));
+                            else if (temp == "Lagering")
+				sql.append(QString(", added=3"));
+                            else if (temp == "Bottle")
+				sql.append(QString(", added=4"));
+			} else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "ADD_AFTER_BOIL")) {
+                            sql.append(QString(", add_after_boil=%1").arg(xml->readElementText().toLower()));
+			} else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "COLOR")) {
+                            sql.append(QString(", color=%1").arg(xml->readElementText().toDouble(), 5, 'f', 4, '0'));
+			} else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "PROTEIN")) {
+                            sql.append(QString(", protein=%1").arg(xml->readElementText().toDouble(), 5, 'f', 4, '0'));
+			} else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "DISSOLVED_PROTEIN")) {
+                            sql.append(QString(", dissolved_protein=%1").arg(xml->readElementText().toDouble(), 5, 'f', 4, '0'));
+			} else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "DI_pH")) {
+                            sql.append(QString(", di_ph=%1").arg(xml->readElementText().toDouble(), 6, 'f', 5, '0'));
+			} else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "ACID_TO_pH_5.7")) {
+                            sql.append(QString(", acid_to_ph_57=%1").arg(xml->readElementText().toDouble(), 6, 'f', 5, '0'));
                         } else {
                             if (xml->tokenType() == QXmlStreamReader::StartElement)
                                 qDebug() << "2  " << xml->tokenType() << xml->name();
@@ -311,7 +444,6 @@
                     /*
                      * Hop
                      */
-                    h_total++;
                     total++;
                     sql = "INSERT INTO inventory_hops SET uuid='";
                     sql.append(QUuid::createUuid().toString().mid(1, 36));
@@ -323,7 +455,6 @@
 //                            query.exec(sql);
                             if (query.lastError().isValid()) {
 //                              qWarning() << sql << query.lastError();
-                                h_errors++;
                                 errors++;
                             }
                             ui->progressBar->setValue(round(100 * xml->characterOffset() / fsize));
@@ -353,7 +484,6 @@
                     /*
                      * Misc
                      */
-                    m_total++;
                     total++;
                     sql = "INSERT INTO inventory_miscs SET uuid='";
                     sql.append(QUuid::createUuid().toString().mid(1, 36));
@@ -365,7 +495,6 @@
 //                            query.exec(sql);
                             if (query.lastError().isValid()) {
 //                              qWarning() << sql << query.lastError();
-                                m_errors++;
                                 errors++;
                             }
                             ui->progressBar->setValue(round(100 * xml->characterOffset() / fsize));
@@ -395,7 +524,6 @@
                     /*
                      * Yeast
                      */
-                    y_total++;
                     total++;
                     sql = "INSERT INTO inventory_yeasts SET uuid='";
                     sql.append(QUuid::createUuid().toString().mid(1, 36));
@@ -407,7 +535,6 @@
 //                            query.exec(sql);
                             if (query.lastError().isValid()) {
 //                              qWarning() << sql << query.lastError();
-                                y_errors++;
                                 errors++;
                             }
                             ui->progressBar->setValue(round(100 * xml->characterOffset() / fsize));
@@ -437,7 +564,6 @@
                     /*
                      * Water
                      */
-                    w_total++;
                     total++;
                     sql = "INSERT INTO inventory_waters SET uuid='";
                     sql.append(QUuid::createUuid().toString().mid(1, 36));
@@ -449,7 +575,6 @@
 //                            query.exec(sql);
                             if (query.lastError().isValid()) {
 //                              qWarning() << sql << query.lastError();
-                                w_errors++;
                                 errors++;
                             }
                             ui->progressBar->setValue(round(100 * xml->characterOffset() / fsize));
@@ -479,7 +604,6 @@
                     /*
                      * Recipe
                      */
-                    rec_total++;
                     total++;
                     sql = "INSERT INTO recipes SET uuid='";
                     sql.append(QUuid::createUuid().toString().mid(1, 36));
@@ -491,7 +615,6 @@
 //                            query.exec(sql);
                             if (query.lastError().isValid()) {
 //                              qWarning() << sql << query.lastError();
-                                rec_errors++;
                                 errors++;
                             }
                             ui->progressBar->setValue(round(100 * xml->characterOffset() / fsize));
@@ -521,7 +644,6 @@
                     /*
                      * Mash
                      */
-                    mash_total++;
                     total++;
                     sql = "INSERT INTO inventory_mashs SET uuid='";
                     sql.append(QUuid::createUuid().toString().mid(1, 36));
@@ -533,7 +655,6 @@
 //                            query.exec(sql);
                             if (query.lastError().isValid()) {
 //                              qWarning() << sql << query.lastError();
-                                mash_errors++;
                                 errors++;
                             }
                             ui->progressBar->setValue(round(100 * xml->characterOffset() / fsize));
@@ -557,24 +678,12 @@
 
     log.append(QString("             total  errors\n"));
     log.append(QString("             -----  ------\n"));
-    log.append(QString("styles         %1     %2\n").arg(st_total, 3).arg(st_errors, 3));
-    log.append(QString("equipments     %1     %2\n").arg(eq_total, 3).arg(eq_errors, 3));
-    log.append(QString("fermentables   %1     %2\n").arg(f_total, 3).arg(f_errors, 3));
-    log.append(QString("hops           %1     %2\n").arg(h_total, 3).arg(h_errors, 3));
-    log.append(QString("miscs          %1     %2\n").arg(m_total, 3).arg(m_errors, 3));
-    log.append(QString("yeasts         %1     %2\n").arg(y_total, 3).arg(y_errors, 3));
-    log.append(QString("waters         %1     %2\n").arg(w_total, 3).arg(w_errors, 3));
-    log.append(QString("mashes         %1     %2\n").arg(mash_total, 3).arg(mash_errors, 3));
-    log.append(QString("recipes        %1     %2\n").arg(rec_total, 3).arg(rec_errors, 3));
-    log.append(QString("             -----  ------\n"));
     log.append(QString("total          %1     %2\n").arg(total, 3).arg(errors, 3));
     ui->logEdit->setPlainText(log);
 
     ui->progressBar->setValue(100);
     if (xml->hasError()) {
-	qWarning() << "error" << xml->error();
-    } else {
-	qDebug() << "all good" << eq_total << eq_errors;
+	qWarning() << "XML error" << xml->error() << xml->errorString();
     }
     file.close();
 }
--- a/src/global.h	Sat Jun 11 12:59:49 2022 +0200
+++ b/src/global.h	Sat Jun 11 19:29:20 2022 +0200
@@ -175,6 +175,34 @@
 };
 
 
+struct Style
+{
+    QString	name;
+    QString	category;
+    int		category_number;
+    QString	style_letter;
+    QString	style_guide;
+    int		type;
+    double	og_min;
+    double	og_max;
+    double	fg_min;
+    double	fg_max;
+    double	ibu_min;
+    double	ibu_max;
+    double	color_min;
+    double	color_max;
+    double	carb_min;
+    double	carb_max;
+    double	abv_min;
+    double	abv_max;
+    QString	notes;
+    QString	profile;
+    QString	ingredients;
+    QString	examples;
+    QString	uuid;
+};
+
+
 /*
  * The main recipe record stored in the database.
  */

mercurial