src/ImportXML.cpp

changeset 275
f472f9773782
child 276
7316a419334d
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/ImportXML.cpp	Sat Jun 11 12:59:49 2022 +0200
@@ -0,0 +1,582 @@
+/**
+ * ImportXML.cpp is part of bmsapp.
+ *
+ * bmsapp is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * bmsapp is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+#include "ImportXML.h"
+#include "../ui/ui_ImportXML.h"
+#include "MainWindow.h"
+
+
+ImportXML::ImportXML(QWidget *parent) : QDialog(parent), ui(new Ui::ImportXML)
+{
+    qDebug() << "ImportXML start";
+    ui->setupUi(this);
+    WindowTitle();
+    ui->progressBar->setValue(0);
+    connect(ui->quitButton, SIGNAL(clicked()), parent, SLOT(fromImportXML()));
+}
+
+
+ImportXML::~ImportXML()
+{
+    qDebug() << "ImportXML done";
+    delete ui;
+}
+
+
+void ImportXML::WindowTitle()
+{
+    QString txt = QString(tr("BMSapp - Import XML"));
+    setWindowTitle(txt);
+}
+
+
+void ImportXML::on_openButton_clicked()
+{
+    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;
+
+    QString fileName = QFileDialog::getOpenFileName(this, tr("Open File"), QDir::homePath() + "/*.xml", tr("Files (*.xml)"));
+    if (fileName == 0) {
+        QMessageBox::warning(this, tr("Open File"), tr("No XML file selected."));
+        return;
+    }
+    ui->fileEdit->setText(fileName);
+
+    QFile file(fileName);
+    qint64 fsize = file.size();
+
+    log = "Import XML file `" + fileName + "`\n\n"; 
+    qInfo() << "Import XML" << fileName << "length" << fsize << "bytes";
+
+    file.open(QIODevice::ReadOnly);
+    QXmlStreamReader *xml = new QXmlStreamReader(&file);
+
+    while (xml->readNext()) {
+
+	if (xml->atEnd())
+	    break;
+
+	if (xml->tokenType() == QXmlStreamReader::StartDocument) {
+//	    qDebug() << xml->readElementText();
+	    // Just skip
+	} else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "EQUIPMENTS")) {
+	    /*
+	     * Equipments
+	     */
+	    while (xml->readNext()) {
+		if (xml->atEnd())
+            	    break;
+		if ((xml->tokenType() == QXmlStreamReader::EndElement) && (xml->name() == "EQUIPMENTS")) {
+		    qDebug() << "0 /EQUIPMENTS";
+		    break;
+		}
+		if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "EQUIPMENT")) {
+		    /*
+		     * Equipment
+		     */
+		    eq_total++;
+		    total++;
+		    sql = "INSERT INTO inventory_equipments SET uuid='";
+		    sql.append(QUuid::createUuid().toString().mid(1, 36));
+		    sql.append("', top_up_water=0");
+
+		    while (xml->readNext()) {
+		    	if (xml->atEnd())
+                            break;
+		    	if ((xml->tokenType() == QXmlStreamReader::EndElement) && (xml->name() == "EQUIPMENT")) {
+			    query.exec(sql);
+			    if (query.lastError().isValid()) {
+//				qWarning() << sql << query.lastError();
+				eq_errors++;
+				errors++;
+			    }
+			    ui->progressBar->setValue(round(100 * xml->characterOffset() / fsize));
+			    break;
+		    	}
+			if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "VERSION")) {
+			    // 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()));
+			} 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")) {
+			    sql.append(QString(", batch_size=%1").arg(xml->readElementText().toDouble(), 3, 'f', 2, '0'));
+			} else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "TUN_VOLUME")) {
+			    sql.append(QString(", tun_volume=%1").arg(xml->readElementText().toDouble(), 2, 'f', 1, '0'));
+			} else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "TUN_WEIGHT")) {
+			    sql.append(QString(", tun_weight=%1").arg(xml->readElementText().toDouble(), 2, 'f', 1, '0'));
+			} else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "TUN_SPECIFIC_HEAT")) {
+			    sql.append(QString(", tun_specific_heat=%1").arg(xml->readElementText().toDouble(), 4, 'f', 3, '0'));
+			} else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "TUN_HEIGHT")) {
+			    sql.append(QString(", tun_height=%1").arg(xml->readElementText().toDouble(), 4, 'f', 3, '0'));
+			} else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "TRUB_CHILLER_LOSS")) {
+			    sql.append(QString(", trub_chiller_loss=%1").arg(xml->readElementText().toDouble(), 2, 'f', 1, '0'));
+			} else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "EVAP_RATE")) {
+			    sql.append(QString(", evap_rate=%1").arg(xml->readElementText().toDouble(), 3, 'f', 2, '0'));
+			} else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "BOIL_TIME")) {
+			    sql.append(QString(", boil_time=%1").arg(xml->readElementText().toDouble(), 1, 'f', 0, '0'));
+			} else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "CALC_BOIL_VOLUME")) {
+			    sql.append(QString(", calc_boil_volume=%1").arg((xml->readElementText() == "TRUE") ? "true":"false"));
+			} else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "TOP_UP_KETTLE")) {
+			    sql.append(QString(", top_up_kettle=%1").arg(xml->readElementText().toDouble(), 2, 'f', 1, '0'));
+			} else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "HOP_UTILIZATION")) {
+			    sql.append(QString(", hop_utilization=%1").arg(xml->readElementText().toDouble(), 1, 'f', 0, '0'));
+			} else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "LAUTER_VOLUME")) {
+			    sql.append(QString(", lauter_volume=%1").arg(xml->readElementText().toDouble(), 2, 'f', 1, '0'));
+			} else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "LAUTER_HEIGHT")) {
+			    sql.append(QString(", lauter_height=%1").arg(xml->readElementText().toDouble(), 4, 'f', 3, '0'));
+			} else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "LAUTER_DEADSPACE")) {
+			    sql.append(QString(", lauter_deadspace=%1").arg(xml->readElementText().toDouble(), 2, 'f', 1, '0'));
+			} else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "KETTLE_VOLUME")) {
+			    sql.append(QString(", kettle_volume=%1").arg(xml->readElementText().toDouble(), 2, 'f', 1, '0'));
+			} else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "KETTLE_HEIGHT")) {
+			    sql.append(QString(", kettle_height=%1").arg(xml->readElementText().toDouble(), 4, 'f', 3, '0'));
+			} else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "MASH_VOLUME")) {
+			    sql.append(QString(", mash_volume=%1").arg(xml->readElementText().toDouble(), 2, 'f', 1, '0'));
+			} else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "EFFICIENCY")) {
+			    sql.append(QString(", efficiency=%1").arg(xml->readElementText().toDouble(), 2, 'f', 1, '0'));
+			} else {
+			    if (xml->tokenType() == QXmlStreamReader::StartElement)
+			    	qDebug() << "2  " << xml->tokenType() << xml->name();
+			}
+		    }
+		}
+	    }
+	} else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "STYLES")) {
+	    /*
+             * Styles
+             */
+            while (xml->readNext()) {
+	        if (xml->atEnd())
+                    break;
+                if ((xml->tokenType() == QXmlStreamReader::EndElement) && (xml->name() == "STYLES")) {
+                    qDebug() << "0 /STYLES";
+                    break;
+                }
+                if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "STYLE")) {
+                    /*
+                     * Style
+                     */
+                    st_total++;
+                    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);
+                            if (query.lastError().isValid()) {
+                                qWarning() << sql << query.lastError();
+                                st_errors++;
+                                errors++;
+                            }
+                            ui->progressBar->setValue(round(100 * xml->characterOffset() / fsize));
+                            break;
+                        }
+                        if ((xml->tokenType() == QXmlStreamReader::StartElement) && ((xml->name() == "VERSION")) ||
+			    (xml->name() == "DISPLAY_OG_MIN") || (xml->name() == "DISPLAY_OG_MAX") || (xml->name() == "DISPLAY_FG_MIN") ||
+			    (xml->name() == "DISPLAY_FG_MAX") || (xml->name() == "DISPLAY_IBU_MIN") || (xml->name() == "DISPLAY_IBU_MAX") ||
+			    (xml->name() == "DISPLAY_COLOR_MIN") || (xml->name() == "DISPLAY_COLOR_MAX") || (xml->name() == "DISPLAY_CARB_MIN") ||
+			    (xml->name() == "DISPLAY_CARB_MAX") || (xml->name() == "DISPLAY_ABV_MIN") || (xml->name() == "DISPLAY_ABV_MAX") ||
+			    (xml->name() == "OG_RANGE") || (xml->name() == "FG_RANGE") || (xml->name() == "IBU_RANGE") ||
+			    (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()));
+			} else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "CATEGORY")) {
+                            sql.append(QString(", category='%1'").arg(xml->readElementText()));
+			} else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "CATEGORY_NUMBER")) {
+                            sql.append(QString(", category_number=%1").arg(xml->readElementText().toInt()));
+			} else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "STYLE_LETTER")) {
+                            sql.append(QString(", style_letter='%1'").arg(xml->readElementText()));
+			} else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "STYLE_GUIDE")) {
+                            sql.append(QString(", style_guide='%1'").arg(xml->readElementText()));
+			} else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "TYPE")) {
+                            sql.append(QString(", type=%1").arg(xml->readElementText().toInt()));
+			} else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "NOTES")) {
+                            sql.append(QString(", notes='%1'").arg(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'));
+			} else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "OG_MAX")) {
+                            sql.append(QString(", og_max=%1").arg(xml->readElementText().toDouble(), 4, 'f', 3, '0'));
+			} else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "FG_MIN")) {
+                            sql.append(QString(", fg_min=%1").arg(xml->readElementText().toDouble(), 4, 'f', 3, '0'));
+			} else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "FG_MAX")) {
+                            sql.append(QString(", fg_max=%1").arg(xml->readElementText().toDouble(), 4, 'f', 3, '0'));
+			} else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "IBU_MIN")) {
+                            sql.append(QString(", ibu_min=%1").arg(xml->readElementText().toDouble(), 2, 'f', 1, '0'));
+                        } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "IBU_MAX")) {
+                            sql.append(QString(", ibu_max=%1").arg(xml->readElementText().toDouble(), 2, 'f', 1, '0'));
+			} else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "COLOR_MIN")) {
+                            sql.append(QString(", color_min=%1").arg(xml->readElementText().toDouble(), 2, 'f', 1, '0'));
+                        } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "COLOR_MAX")) {
+                            sql.append(QString(", color_max=%1").arg(xml->readElementText().toDouble(), 2, 'f', 1, '0'));
+			} else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "CARB_MIN")) {
+                            sql.append(QString(", carb_min=%1").arg(xml->readElementText().toDouble(), 2, 'f', 1, '0'));
+                        } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "CARB_MAX")) {
+                            sql.append(QString(", carb_max=%1").arg(xml->readElementText().toDouble(), 2, 'f', 1, '0'));
+			} else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "ABV_MIN")) {
+                            sql.append(QString(", abv_min=%1").arg(xml->readElementText().toDouble(), 2, 'f', 1, '0'));
+                        } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "ABV_MAX")) {
+                            sql.append(QString(", abv_max=%1").arg(xml->readElementText().toDouble(), 2, 'f', 1, '0'));
+			} else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "PROFILE")) {
+                            sql.append(QString(", profile='%1'").arg(xml->readElementText()));
+			} else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "INGREDIENTS")) {
+                            sql.append(QString(", ingredients='%1'").arg(xml->readElementText()));
+			} else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "EXAMPLES")) {
+                            sql.append(QString(", examples='%1'").arg(xml->readElementText()));
+			} else {
+                            if (xml->tokenType() == QXmlStreamReader::StartElement)
+                                qDebug() << "2  " << xml->tokenType() << xml->name();
+                        }
+                    }
+                }
+            }
+        } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "FERMENTABLES")) {
+            /*
+             * Fermentables
+             */
+            while (xml->readNext()) {
+                if (xml->atEnd())
+                    break;
+                if ((xml->tokenType() == QXmlStreamReader::EndElement) && (xml->name() == "FERMENTABLES")) {
+                    qDebug() << "0 /FERMENTABLES";
+                    break;
+                }
+                if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "FERMENTABLE")) {
+                    /*
+                     * Fermentable
+                     */
+                    f_total++;
+                    total++;
+                    sql = "INSERT INTO inventory_fermentables SET uuid='";
+                    sql.append(QUuid::createUuid().toString().mid(1, 36));
+
+                    while (xml->readNext()) {
+                        if (xml->atEnd())
+                            break;
+                        if ((xml->tokenType() == QXmlStreamReader::EndElement) && (xml->name() == "FERMENTABLE")) {
+//                            query.exec(sql);
+                            if (query.lastError().isValid()) {
+//                              qWarning() << sql << query.lastError();
+                                f_errors++;
+                                errors++;
+                            }
+                            ui->progressBar->setValue(round(100 * xml->characterOffset() / fsize));
+                            break;
+                        }
+                        if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "VERSION")) {
+                            // Ignore.
+                        } else {
+                            if (xml->tokenType() == QXmlStreamReader::StartElement)
+                                qDebug() << "2  " << xml->tokenType() << xml->name();
+                        }
+                    }
+                }
+            }
+        } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "HOPS")) {
+            /*
+             * Hops
+             */
+            while (xml->readNext()) {
+                if (xml->atEnd())
+                    break;
+                if ((xml->tokenType() == QXmlStreamReader::EndElement) && (xml->name() == "HOPS")) {
+                    qDebug() << "0 /HOPS";
+                    break;
+                }
+                if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "HOP")) {
+                    /*
+                     * Hop
+                     */
+                    h_total++;
+                    total++;
+                    sql = "INSERT INTO inventory_hops SET uuid='";
+                    sql.append(QUuid::createUuid().toString().mid(1, 36));
+
+                    while (xml->readNext()) {
+                        if (xml->atEnd())
+                            break;
+                        if ((xml->tokenType() == QXmlStreamReader::EndElement) && (xml->name() == "HOP")) {
+//                            query.exec(sql);
+                            if (query.lastError().isValid()) {
+//                              qWarning() << sql << query.lastError();
+                                h_errors++;
+                                errors++;
+                            }
+                            ui->progressBar->setValue(round(100 * xml->characterOffset() / fsize));
+                            break;
+                        }
+                        if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "VERSION")) {
+                            // Ignore.
+                        } else {
+                            if (xml->tokenType() == QXmlStreamReader::StartElement)
+                                qDebug() << "2  " << xml->tokenType() << xml->name();
+                        }
+                    }
+                }
+            }
+        } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "MISCS")) {
+            /*
+             * Miscs
+             */
+            while (xml->readNext()) {
+                if (xml->atEnd())
+                    break;
+                if ((xml->tokenType() == QXmlStreamReader::EndElement) && (xml->name() == "MISCS")) {
+                    qDebug() << "0 /MISCS";
+                    break;
+                }
+                if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "MISC")) {
+                    /*
+                     * Misc
+                     */
+                    m_total++;
+                    total++;
+                    sql = "INSERT INTO inventory_miscs SET uuid='";
+                    sql.append(QUuid::createUuid().toString().mid(1, 36));
+
+                    while (xml->readNext()) {
+                        if (xml->atEnd())
+                            break;
+                        if ((xml->tokenType() == QXmlStreamReader::EndElement) && (xml->name() == "MISC")) {
+//                            query.exec(sql);
+                            if (query.lastError().isValid()) {
+//                              qWarning() << sql << query.lastError();
+                                m_errors++;
+                                errors++;
+                            }
+                            ui->progressBar->setValue(round(100 * xml->characterOffset() / fsize));
+                            break;
+                        }
+                        if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "VERSION")) {
+                            // Ignore.
+                        } else {
+                            if (xml->tokenType() == QXmlStreamReader::StartElement)
+                                qDebug() << "2  " << xml->tokenType() << xml->name();
+                        }
+                    }
+                }
+            }
+        } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "YEASTS")) {
+            /*
+             * Yeasts
+             */
+            while (xml->readNext()) {
+                if (xml->atEnd())
+                    break;
+                if ((xml->tokenType() == QXmlStreamReader::EndElement) && (xml->name() == "YEASTS")) {
+                    qDebug() << "0 /YEASTS";
+                    break;
+                }
+                if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "YEAST")) {
+                    /*
+                     * Yeast
+                     */
+                    y_total++;
+                    total++;
+                    sql = "INSERT INTO inventory_yeasts SET uuid='";
+                    sql.append(QUuid::createUuid().toString().mid(1, 36));
+
+                    while (xml->readNext()) {
+                        if (xml->atEnd())
+                            break;
+                        if ((xml->tokenType() == QXmlStreamReader::EndElement) && (xml->name() == "YEAST")) {
+//                            query.exec(sql);
+                            if (query.lastError().isValid()) {
+//                              qWarning() << sql << query.lastError();
+                                y_errors++;
+                                errors++;
+                            }
+                            ui->progressBar->setValue(round(100 * xml->characterOffset() / fsize));
+                            break;
+                        }
+                        if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "VERSION")) {
+                            // Ignore.
+                        } else {
+                            if (xml->tokenType() == QXmlStreamReader::StartElement)
+                                qDebug() << "2  " << xml->tokenType() << xml->name();
+                        }
+                    }
+                }
+            }
+        } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "WATERS")) {
+            /*
+             * Waters
+             */
+            while (xml->readNext()) {
+                if (xml->atEnd())
+                    break;
+                if ((xml->tokenType() == QXmlStreamReader::EndElement) && (xml->name() == "WATERS")) {
+                    qDebug() << "0 /WATERS";
+                    break;
+                }
+                if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "WATER")) {
+                    /*
+                     * Water
+                     */
+                    w_total++;
+                    total++;
+                    sql = "INSERT INTO inventory_waters SET uuid='";
+                    sql.append(QUuid::createUuid().toString().mid(1, 36));
+
+                    while (xml->readNext()) {
+                        if (xml->atEnd())
+                            break;
+                        if ((xml->tokenType() == QXmlStreamReader::EndElement) && (xml->name() == "WATER")) {
+//                            query.exec(sql);
+                            if (query.lastError().isValid()) {
+//                              qWarning() << sql << query.lastError();
+                                w_errors++;
+                                errors++;
+                            }
+                            ui->progressBar->setValue(round(100 * xml->characterOffset() / fsize));
+                            break;
+                        }
+                        if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "VERSION")) {
+                            // Ignore.
+                        } else {
+                            if (xml->tokenType() == QXmlStreamReader::StartElement)
+                                qDebug() << "2  " << xml->tokenType() << xml->name();
+                        }
+                    }
+                }
+            }
+        } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "RECIPES")) {
+            /*
+             * Recipes
+             */
+            while (xml->readNext()) {
+                if (xml->atEnd())
+                    break;
+                if ((xml->tokenType() == QXmlStreamReader::EndElement) && (xml->name() == "RECIPES")) {
+                    qDebug() << "0 /RECIPES";
+                    break;
+                }
+                if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "RECIPE")) {
+                    /*
+                     * Recipe
+                     */
+                    rec_total++;
+                    total++;
+                    sql = "INSERT INTO recipes SET uuid='";
+                    sql.append(QUuid::createUuid().toString().mid(1, 36));
+
+                    while (xml->readNext()) {
+                        if (xml->atEnd())
+                            break;
+                        if ((xml->tokenType() == QXmlStreamReader::EndElement) && (xml->name() == "RECIPE")) {
+//                            query.exec(sql);
+                            if (query.lastError().isValid()) {
+//                              qWarning() << sql << query.lastError();
+                                rec_errors++;
+                                errors++;
+                            }
+                            ui->progressBar->setValue(round(100 * xml->characterOffset() / fsize));
+                            break;
+                        }
+                        if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "VERSION")) {
+                            // Ignore.
+                        } else {
+                            if (xml->tokenType() == QXmlStreamReader::StartElement)
+                                qDebug() << "2  " << xml->tokenType() << xml->name();
+                        }
+                    }
+                }
+            }
+        } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "MASHS")) {
+            /*
+             * Mashes
+             */
+            while (xml->readNext()) {
+                if (xml->atEnd())
+                    break;
+                if ((xml->tokenType() == QXmlStreamReader::EndElement) && (xml->name() == "MASHS")) {
+                    qDebug() << "0 /MASHS";
+                    break;
+                }
+                if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "MASH")) {
+                    /*
+                     * Mash
+                     */
+                    mash_total++;
+                    total++;
+                    sql = "INSERT INTO inventory_mashs SET uuid='";
+                    sql.append(QUuid::createUuid().toString().mid(1, 36));
+
+                    while (xml->readNext()) {
+                        if (xml->atEnd())
+                            break;
+                        if ((xml->tokenType() == QXmlStreamReader::EndElement) && (xml->name() == "MASH")) {
+//                            query.exec(sql);
+                            if (query.lastError().isValid()) {
+//                              qWarning() << sql << query.lastError();
+                                mash_errors++;
+                                errors++;
+                            }
+                            ui->progressBar->setValue(round(100 * xml->characterOffset() / fsize));
+                            break;
+                        }
+                        if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "VERSION")) {
+                            // Ignore.
+                        } else {
+                            if (xml->tokenType() == QXmlStreamReader::StartElement)
+                                qDebug() << "2  " << xml->tokenType() << xml->name();
+                        }
+                    }
+                }
+            }
+	} else {
+	    qDebug() << "Unknown level 0" << xml->name();
+	}
+	if (xml->atEnd())
+	    break;
+    }
+
+    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;
+    }
+    file.close();
+}
+
+

mercurial