Mon, 13 Jun 2022 15:47:16 +0200
Member names for hops normalized.
/** * 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 "Utils.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 log; 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->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 = ""; 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"; 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")) { /* * 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++; Fermentables *f = new Fermentables(); f->f_supplier = f->f_origin = f->f_notes = ""; f->f_yield = 80; f->f_max_in_batch = 100; f->f_recommend_mash = true; f->f_di_ph = 5.7; while (xml->readNext()) { if (xml->atEnd()) break; if ((xml->tokenType() == QXmlStreamReader::EndElement) && (xml->name() == "FERMENTABLE")) { query.prepare("INSERT INTO inventory_fermentables SET name=:name, type=:type, yield=:yield, color=:color, " "add_after_boil=:addafter, origin=:origin, supplier=:supplier, notes=:notes, coarse_fine_diff=:coarse, " "moisture=:moisture, diastatic_power=:diastatic, protein=:protein, dissolved_protein=:dissolved, " "max_in_batch=:maxinbatch, recommend_mash=:mash, added=:added, di_ph=:diph, " "acid_to_ph_57=:acidph, graintype=:graintype, uuid = :uuid"); query.bindValue(":name", f->f_name); query.bindValue(":type", f->f_type); query.bindValue(":yield", QString("%1").arg(f->f_yield, 2, 'f', 1, '0')); query.bindValue(":color", QString("%1").arg(Utils::srm_to_ebc(f->f_color), 1, 'f', 0, '0')); query.bindValue(":addafter", f->f_add_after_boil ? 1:0); query.bindValue(":origin", f->f_origin); query.bindValue(":supplier", f->f_supplier); query.bindValue(":notes", f->f_notes); query.bindValue(":coarse", QString("%1").arg(f->f_coarse_fine_diff, 4, 'f', 3, '0')); query.bindValue(":moisture", QString("%1").arg(f->f_moisture, 4, 'f', 3, '0')); query.bindValue(":diastatic", Utils::kolbach_to_lintner(f->f_diastatic_power)); query.bindValue(":protein", QString("%1").arg(f->f_protein, 4, 'f', 3, '0')); query.bindValue(":dissolved", QString("%1").arg(f->f_dissolved_protein, 4, 'f', 3, '0')); query.bindValue(":maxinbatch", QString("%1").arg(f->f_max_in_batch, 2, 'f', 1, '0')); query.bindValue(":mash", f->f_recommend_mash ? 1:0); query.bindValue(":added", f->f_added); query.bindValue(":diph", QString("%1").arg(f->f_di_ph, 6, 'f', 5, '0')); query.bindValue(":acidph", QString("%1").arg(f->f_acid_to_ph_57, 6, 'f', 5, '0')); query.bindValue(":graintype", f->f_graintype); 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)); break; } if ((xml->tokenType() == QXmlStreamReader::StartElement) && ((xml->name() == "VERSION") || (xml->name() == "DISPLAY_COST") || (xml->name() == "DISPLAY_COLOR") || (xml->name() == "INVENTORY") || (xml->name() == "COST") || (xml->name() == "ALWAYS_ON_STOCK") || (xml->name() == "PERCENTAGE") || (xml->name() == "ADJUST_TO_TOTAL_100") )) { // Ignore. } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "NAME")) { f->f_name = xml->readElementText(); } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "TYPE")) { QString temp = xml->readElementText(); if (temp == "Sugar") f->f_type = 1; else if (temp == "Extract") f->f_type = 2; else if (temp == "Dry extract") f->f_type = 3; else if (temp == "Adjunct") f->f_type = 4; else f->f_type = 0; } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "ORIGIN")) { f->f_origin = xml->readElementText(); } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "SUPPLIER")) { f->f_supplier = xml->readElementText(); } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "NOTES")) { f->f_notes = xml->readElementText(); } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "YIELD")) { f->f_yield = xml->readElementText().toDouble(); } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "COARSE_FINE_DIFF")) { f->f_coarse_fine_diff = xml->readElementText().toDouble(); } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "MOISTURE")) { f->f_moisture = xml->readElementText().toDouble(); } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "DIASTATIC_POWER")) { f->f_diastatic_power = xml->readElementText().toDouble(); } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "MAX_IN_BATCH")) { f->f_max_in_batch = xml->readElementText().toDouble(); } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "RECOMMEND_MASH")) { f->f_recommend_mash = (xml->readElementText() == "TRUE") ? true:false; } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "GRAINTYPE")) { QString temp = xml->readElementText(); if (temp == "Roast") f->f_graintype = 1; else if (temp == "Crystal") f->f_graintype = 2; else if (temp == "Kilned") f->f_graintype = 3; else if (temp == "Sour Malt") f->f_graintype = 4; else if (temp == "Special") f->f_graintype = 5; else if (temp == "No malt") f->f_graintype = 6; else f->f_graintype = 0; } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "ADDED")) { QString temp = xml->readElementText(); if (temp == "Boil") f->f_added = 1; else if (temp == "Fermentation") f->f_added = 2; else if (temp == "Lagering") f->f_added = 3; else if (temp == "Bottle") f->f_added = 4; else f->f_added = 0; } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "ADD_AFTER_BOIL")) { f->f_add_after_boil = (xml->readElementText() == "TRUE") ? true:false; } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "COLOR")) { f->f_color = xml->readElementText().toDouble(); } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "PROTEIN")) { f->f_protein = xml->readElementText().toDouble(); } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "DISSOLVED_PROTEIN")) { f->f_dissolved_protein = xml->readElementText().toDouble(); } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "DI_pH")) { f->f_di_ph = xml->readElementText().toDouble(); } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "ACID_TO_pH_5.7")) { f->f_acid_to_ph_57 = xml->readElementText().toDouble(); } 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++; Hops *h = new Hops(); h->notes = h->origin = h->substitutes = ""; while (xml->readNext()) { if (xml->atEnd()) break; if ((xml->tokenType() == QXmlStreamReader::EndElement) && (xml->name() == "HOP")) { query.prepare("INSERT INTO inventory_hops SET name=:name, alpha=:alpha, beta=:beta, " "humulene=:humulene, caryophyllene=:cary, cohumulone=:cohumulone, myrcene=:myrcene, " "hsi=:hsi, type=:type, form=:form, notes=:notes, origin=:origin, substitutes=:substitutes, " "total_oil=:oil, uuid = :uuid"); query.bindValue(":name", h->name); query.bindValue(":alpha", QString("%1").arg(h->alpha, 2, 'f', 1, '0')); query.bindValue(":beta", QString("%1").arg(h->beta, 2, 'f', 1, '0')); query.bindValue(":humulene", QString("%1").arg(h->humulene, 2, 'f', 1, '0')); query.bindValue(":cary", QString("%1").arg(h->caryophyllene, 2, 'f', 1, '0')); query.bindValue(":cohumulone", QString("%1").arg(h->cohumulone, 2, 'f', 1, '0')); query.bindValue(":myrcene", QString("%1").arg(h->myrcene, 2, 'f', 1, '0')); query.bindValue(":hsi", QString("%1").arg(h->hsi, 2, 'f', 1, '0')); query.bindValue(":type", h->type); query.bindValue(":form", h->form); query.bindValue(":notes", h->notes); query.bindValue(":origin", h->origin); query.bindValue(":substitutes", h->substitutes); query.bindValue(":oil", QString("%1").arg(h->total_oil, 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)); break; } if ((xml->tokenType() == QXmlStreamReader::StartElement) && ( (xml->name() == "VERSION") || (xml->name() == "ALWAYS_ON_STOCK") || (xml->name() == "HARVEST_DATE") || (xml->name() == "DISPLAY_COST") || (xml->name() == "COST") || (xml->name() == "INVENTORY"))) { // Ignore. } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "NAME")) { h->name = xml->readElementText(); } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "ORIGIN")) { h->origin = xml->readElementText(); } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "NOTES")) { h->notes = xml->readElementText(); } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "FORM")) { QString temp = xml->readElementText(); if (temp == "Plug") h->form = 1; else if (temp == "Leaf") h->form = 2; else if (temp == "Leaf wet") h->form = 3; else if (temp == "Cryo") h->form = 4; else h->form = 0; } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "ALPHA")) { h->alpha = xml->readElementText().toDouble(); } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "TYPE")) { QString temp = xml->readElementText(); if (temp == "Aroma") h->type = 1; else if (temp == "Both") h->type = 2; else h->type = 0; } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "USE")) { QString temp = xml->readElementText(); if (temp == "First wort") h->useat = 1; else if (temp == "Boil") h->useat = 2; else if (temp == "Aroma") h->useat = 3; else if (temp == "Whirlpool") h->useat = 4; else if (temp == "Dry hop") h->useat = 5; else h->useat = 0; } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "BETA")) { h->beta = xml->readElementText().toDouble(); } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "HSI")) { h->hsi = xml->readElementText().toDouble(); } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "SUBSTITUTES")) { h->substitutes = xml->readElementText(); } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "HUMULENE")) { h->humulene = xml->readElementText().toDouble(); } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && ((xml->name() == "CARYOPHYLLENE") || (xml->name() == "CAROPHYLLENE"))) { h->caryophyllene = xml->readElementText().toDouble(); } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "COHUMULONE")) { h->cohumulone = xml->readElementText().toDouble(); } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "MYRCENE")) { h->myrcene = xml->readElementText().toDouble(); } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "TOTAL_OIL")) { h->total_oil = xml->readElementText().toDouble(); } 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++; Miscs *m = new Miscs(); m->name = m->use_for = m->notes = ""; while (xml->readNext()) { if (xml->atEnd()) break; if ((xml->tokenType() == QXmlStreamReader::EndElement) && (xml->name() == "MISC")) { query.prepare("INSERT INTO inventory_miscs SET name=:name, type=:type, use_use=:use, " "time=:time, amount_is_weight=:isweight, use_for=:usefor, notes=:notes, " "uuid = :uuid"); query.bindValue(":name", m->name); query.bindValue(":type", m->type); query.bindValue(":use", m->use_use); query.bindValue(":time", QString("%1").arg(m->time, 1, 'f', 0, '0')); query.bindValue(":isweight", m->amount_is_weight ? 1:0); query.bindValue(":usefor", m->use_for); query.bindValue(":notes", m->notes); 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)); break; } if ((xml->tokenType() == QXmlStreamReader::StartElement) && ( (xml->name() == "VERSION") || (xml->name() == "DISPLAY_AMOUNT") || (xml->name() == "AMOUNT") || (xml->name() == "ALWAYS_ON_STOCK") || (xml->name() == "COST") || (xml->name() == "DISPLAY_COST") || (xml->name() == "INVENTORY") || (xml->name() == "DISPLAY_TIME") || (xml->name() == "FREE_FIELD") || (xml->name() == "FREE_FIELD_NAME") )) { // Ignore. } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "NAME")) { m->name = xml->readElementText(); } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "NOTES")) { m->notes = xml->readElementText(); } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "USE_FOR")) { m->use_for = xml->readElementText(); } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "TYPE")) { QString temp = xml->readElementText(); if (temp == "Herb") m->type = 1; else if (temp == "Flavor") m->type = 2; else if (temp == "Fining") m->type = 3; else if (temp == "Water agent") m->type = 4; else if (temp == "Yeast nutrient") m->type = 5; else if (temp == "Other") m->type = 6; else m->type = 0; } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "USE")) { QString temp = xml->readElementText(); if (temp == "Mash") m->use_use = 1; else if (temp == "Boil") m->use_use = 2; else if (temp == "Primary") m->use_use = 3; else if (temp == "Secondary") m->use_use = 4; else if (temp == "Bottling") m->use_use = 5; else m->use_use = 0; } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "AMOUNT_IS_WEIGHT")) { m->amount_is_weight = (xml->readElementText() == "TRUE") ? true:false; } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "TIME")) { m->time = xml->readElementText().toDouble(); } 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++; 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++; 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++; 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++; 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(); }