src/ImportXML.cpp

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
permissions
-rw-r--r--

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.

/**
 * 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 "global.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 total = 0, errors = 0;
    bool hasnotes;

    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->documentVersion() << xml->documentEncoding();
	    // 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
		     */
		    total++;
		    hasnotes = false;
		    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")) {
			    if (! hasnotes)
                                sql.append(", notes=''");
			    query.exec(sql);
			    if (query.lastError().isValid()) {
				qWarning() << sql << query.lastError();
				errors++;
			    }
			    ui->progressBar->setValue(round(100 * xml->characterOffset() / fsize));
			    break;
		    	}
			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")) {
			    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
                     */
		    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++;

		    while (xml->readNext()) {
                        if (xml->atEnd())
                            break;
                        if ((xml->tokenType() == QXmlStreamReader::EndElement) && (xml->name() == "STYLE")) {
			    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() << query.lastError();
                                errors++;
                            }
                            ui->progressBar->setValue(round(100 * xml->characterOffset() / fsize));
			    delete st;
                            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")) {
			    st->name = xml->readElementText();
			} else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "CATEGORY")) {
			    st->category = xml->readElementText();
			} else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "CATEGORY_NUMBER")) {
			    st->category_number = xml->readElementText().toInt();
			} else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "STYLE_LETTER")) {
			    st->style_letter = xml->readElementText();
			} else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "STYLE_GUIDE")) {
			    st->style_guide = xml->readElementText();
			} else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "TYPE")) {
			    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")) {
			    st->notes = xml->readElementText();
			} else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "OG_MIN")) {
			    st->og_min = xml->readElementText().toDouble();
			} else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "OG_MAX")) {
			    st->og_max = xml->readElementText().toDouble();
			} else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "FG_MIN")) {
			    st->fg_min = xml->readElementText().toDouble();
			} else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "FG_MAX")) {
			    st->fg_max = xml->readElementText().toDouble();
			} else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "IBU_MIN")) {
			    st->ibu_min = xml->readElementText().toDouble();
                        } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "IBU_MAX")) {
			    st->ibu_max = xml->readElementText().toDouble();
			} else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "COLOR_MIN")) {
			    st->color_min = xml->readElementText().toDouble();
                        } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "COLOR_MAX")) {
			    st->color_max = xml->readElementText().toDouble();
			} else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "CARB_MIN")) {
			    st->carb_min = xml->readElementText().toDouble();
                        } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "CARB_MAX")) {
			    st->carb_max = xml->readElementText().toDouble();
			} else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "ABV_MIN")) {
			    st->abv_min = xml->readElementText().toDouble();
                        } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "ABV_MAX")) {
			    st->abv_max = xml->readElementText().toDouble();
			} else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "PROFILE")) {
			    st->profile = xml->readElementText();
			} else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "INGREDIENTS")) {
			    st->ingredients = xml->readElementText();
			} else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "EXAMPLES")) {
			    st->examples = xml->readElementText();
			} else {
                            if (xml->tokenType() == QXmlStreamReader::StartElement)
                                qDebug() << "2  " << xml->tokenType() << xml->name();
                        }
                    }
                }
            }
        } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "FERMENTABLES")) {
qDebug() << "start 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
                     */
                    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")) {
				qDebug() << "hasnotes" << hasnotes;
			    if (! hasnotes)
				sql.append(", notes=''");
                            query.exec(sql);
                            if (query.lastError().isValid()) {
				qWarning() << sql << query.lastError();
                                errors++;
                            }
                            ui->progressBar->setValue(round(100 * xml->characterOffset() / fsize));
                            break;
                        }
                        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();
                        }
                    }
                }
            }
        } 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
                     */
                    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();
                                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
                     */
                    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();
                                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
                     */
                    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();
                                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
                     */
                    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();
                                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
                     */
                    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();
                                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
                     */
                    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();
                                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("total          %1     %2\n").arg(total, 3).arg(errors, 3));
    ui->logEdit->setPlainText(log);

    ui->progressBar->setValue(100);
    if (xml->hasError()) {
	qWarning() << "XML error" << xml->error() << xml->errorString();
    }
    file.close();
}

mercurial