src/ImportXML.cpp

Sat, 11 Jun 2022 12:59:49 +0200

author
Michiel Broek <mbroek@mbse.eu>
date
Sat, 11 Jun 2022 12:59:49 +0200
changeset 275
f472f9773782
child 276
7316a419334d
permissions
-rw-r--r--

Added import from xml, equipments and beerstyles.

/**
 * 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