| 569 | } |
| 570 | |
| 571 | QString DBManager::restoreBackup(const QJsonObject& backupData) |
| 572 | { |
| 573 | SqlDatabase* idb = getDB(); |
| 574 | const QJsonObject& message = backupData.value("config").toObject(); |
| 575 | bool rm = _readonlyMode; |
| 576 | |
| 577 | Info(_log, "Creating DB backup first."); |
| 578 | QString resultFile = createLocalBackup(); |
| 579 | if (!resultFile.isEmpty()) |
| 580 | Info(_log, "The backup is saved as: %s", QSTRING_CSTR(resultFile)); |
| 581 | else |
| 582 | Warning(_log, "Could not create a backup"); |
| 583 | |
| 584 | _readonlyMode = true; |
| 585 | |
| 586 | if (idb->transaction()) |
| 587 | { |
| 588 | SqlQuery queryDelInstances(idb); |
| 589 | queryDelInstances.prepare(QString("DELETE FROM instances")); |
| 590 | |
| 591 | SqlQuery queryDelSettings(idb); |
| 592 | queryDelSettings.prepare(QString("DELETE FROM settings")); |
| 593 | |
| 594 | if (!queryDelSettings.exec() || !queryDelInstances.exec()) |
| 595 | { |
| 596 | Error(_log, "Failed to clear tables before import"); |
| 597 | idb->rollback(); |
| 598 | _readonlyMode = rm; |
| 599 | return "Failed to clear tables before import"; |
| 600 | } |
| 601 | |
| 602 | const QJsonArray instances = message.value("instances").toArray(); |
| 603 | if (instances.count() > 0) |
| 604 | { |
| 605 | for (auto value : instances) |
| 606 | { |
| 607 | QStringList headers, placeholder; |
| 608 | QVariantList values; |
| 609 | QJsonObject obj = value.toObject(); |
| 610 | |
| 611 | foreach(const QString & key, obj.keys()) |
| 612 | { |
| 613 | headers.append(key); |
| 614 | placeholder.append("?"); |
| 615 | if (obj.value(key).isString()) |
| 616 | values.append(obj.value(key).toString()); |
| 617 | else |
| 618 | values.append(obj.value(key).toInt()); |
| 619 | } |
| 620 | |
| 621 | SqlQuery queryInstInsert(idb); |
| 622 | queryInstInsert.prepare(QString("INSERT INTO %1 ( %2 ) VALUES ( %3 )").arg("instances").arg(headers.join(", ")).arg(placeholder.join(", "))); |
| 623 | doAddBindValue(queryInstInsert, values); |
| 624 | |
| 625 | if (!queryInstInsert.exec()) |
| 626 | { |
| 627 | Error(_log, "Failed to create record in table 'instances'. Error: %s", QSTRING_CSTR(idb->error())); |
| 628 | idb->rollback(); |