Sat, 11 Jun 2022 20:58:46 +0200
The equipment import is now final.
/** * 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++; Equipment *eq = new Equipment; eq->notes = ""; eq->top_up_kettle = eq->top_up_water = 0; while (xml->readNext()) { if (xml->atEnd()) break; if ((xml->tokenType() == QXmlStreamReader::EndElement) && (xml->name() == "EQUIPMENT")) { query.prepare("INSERT INTO inventory_equipments SET name=:name, boil_size=:boil_size, " "batch_size=:batch_size, tun_volume=:tun_volume, tun_weight=:tun_weight, " "tun_specific_heat=:tun_specific_heat, tun_material=:tun_material, tun_height=:tun_height, " "top_up_water=:top_up_water, trub_chiller_loss=:chiller_loss, evap_rate=:evap_rate, " "boil_time=:boil_time, calc_boil_volume=:calcboil, top_up_kettle=:top_up_kettle, " "hop_utilization=:hopfactor, notes=:notes, lauter_volume=:lauter_volume, " "lauter_height=:lauter_height, lauter_deadspace=:lauter_deadspace, kettle_volume=:kettle_volume, " "kettle_height=:kettle_height, mash_volume=:mash_volume, mash_max=:mash_max, " "efficiency=:efficiency, uuid=:uuid"); query.bindValue(":name", eq->name); query.bindValue(":boil_size", QString("%1").arg(eq->boil_size, 2, 'f', 1, '0')); query.bindValue(":batch_size", QString("%1").arg(eq->batch_size, 3, 'f', 2, '0')); query.bindValue(":tun_volume", QString("%1").arg(eq->tun_volume, 2, 'f', 1, '0')); query.bindValue(":tun_weight", QString("%1").arg(eq->tun_weight, 2, 'f', 1, '0')); query.bindValue(":tun_specific_heat", QString("%1").arg(eq->tun_specific_heat, 4, 'f', 3, '0')); query.bindValue(":tun_material", eq->tun_material); query.bindValue(":tun_height", QString("%1").arg(eq->tun_height, 4, 'f', 3, '0')); query.bindValue(":top_up_water", QString("%1").arg(eq->top_up_water, 2, 'f', 1, '0')); query.bindValue(":chiller_loss", QString("%1").arg(eq->trub_chiller_loss, 2, 'f', 1, '0')); /* The evaporation in beerxml is percentage, but we use the real volume per hour */ query.bindValue(":evap_rate", QString("%1").arg((eq->evap_rate / 100) * eq->boil_size, 3, 'f', 2, '0')); query.bindValue(":boil_time", QString("%1").arg(eq->boil_time, 1, 'f', 0, '0')); query.bindValue(":calcboil", eq->calc_boil_volume ? 1:0); query.bindValue(":top_up_kettle", QString("%1").arg(eq->top_up_kettle, 2, 'f', 1, '0')); query.bindValue(":hopfactor", QString("%1").arg(eq->hop_utilization, 1, 'f', 0, '0')); query.bindValue(":notes", eq->notes); query.bindValue(":lauter_volume", QString("%1").arg(eq->lauter_volume, 2, 'f', 1, '0')); query.bindValue(":lauter_height", QString("%1").arg(eq->lauter_height, 4, 'f', 3, '0')); query.bindValue(":lauter_deadspace", QString("%1").arg(eq->lauter_deadspace, 2, 'f', 1, '0')); query.bindValue(":kettle_volume", QString("%1").arg(eq->kettle_volume, 2, 'f', 1, '0')); query.bindValue(":kettle_height", QString("%1").arg(eq->kettle_height, 4, 'f', 3, '0')); query.bindValue(":mash_volume", QString("%1").arg(eq->mash_volume, 2, 'f', 1, '0')); query.bindValue(":mash_max", QString("%1").arg(eq->mash_max, 2, 'f', 1, '0')); query.bindValue(":efficiency", QString("%1").arg(eq->efficiency, 2, 'f', 1, '0')); 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 eq; 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")) { eq->name = xml->readElementText(); } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "NOTES")) { eq->notes = xml->readElementText(); } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "BOIL_SIZE")) { eq->boil_size = xml->readElementText().toDouble(); } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "BATCH_SIZE")) { eq->batch_size = xml->readElementText().toDouble(); qDebug() << eq->batch_size; } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "TUN_VOLUME")) { eq->tun_volume = xml->readElementText().toDouble(); } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "TUN_WEIGHT")) { eq->tun_weight = xml->readElementText().toDouble(); } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "TUN_SPECIFIC_HEAT")) { eq->tun_specific_heat = xml->readElementText().toDouble(); if (eq->tun_specific_heat == 0.22) eq->tun_material = 1; else if (eq->tun_specific_heat == 0.46) eq->tun_material = 2; else if (eq->tun_specific_heat == 0.092) eq->tun_material = 3; else eq->tun_material = 0; } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "TUN_HEIGHT")) { eq->tun_height = xml->readElementText().toDouble(); } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "TRUB_CHILLER_LOSS")) { eq->trub_chiller_loss = xml->readElementText().toDouble(); } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "EVAP_RATE")) { eq->evap_rate = xml->readElementText().toDouble(); } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "BOIL_TIME")) { eq->boil_time = xml->readElementText().toDouble(); } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "CALC_BOIL_VOLUME")) { eq->calc_boil_volume = (xml->readElementText() == "TRUE") ? true:false; } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "TOP_UP_KETTLE")) { eq->top_up_kettle = xml->readElementText().toDouble(); } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "HOP_UTILIZATION")) { eq->hop_utilization = xml->readElementText().toDouble(); } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "LAUTER_VOLUME")) { eq->lauter_volume = xml->readElementText().toDouble(); } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "LAUTER_HEIGHT")) { eq->lauter_height = xml->readElementText().toDouble(); } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "LAUTER_DEADSPACE")) { eq->lauter_deadspace = xml->readElementText().toDouble(); } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "KETTLE_VOLUME")) { eq->kettle_volume = xml->readElementText().toDouble(); } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "KETTLE_HEIGHT")) { eq->kettle_height = xml->readElementText().toDouble(); } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "MASH_VOLUME")) { eq->mash_volume = xml->readElementText().toDouble(); eq->mash_max = eq->mash_volume / 3; } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "EFFICIENCY")) { eq->efficiency = xml->readElementText().toDouble(); } 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); qInfo() << "Import" << total << "records, " << total - errors << "ok, " << errors << "errors"; ui->progressBar->setValue(100); if (xml->hasError()) { qWarning() << "XML error" << xml->error() << xml->errorString(); } file.close(); }