File indexing completed on 2025-05-04 04:45:10

0001 /***************************************************************************
0002  * SPDX-FileCopyrightText: 2022 S. MANKOWSKI stephane@mankowski.fr
0003  * SPDX-FileCopyrightText: 2022 G. DE BURE support@mankowski.fr
0004  * SPDX-License-Identifier: GPL-3.0-or-later
0005  ***************************************************************************/
0006 /** @file
0007  * This file is Skrooge plugin for SKG import / export.
0008  *
0009  * @author Stephane MANKOWSKI / Guillaume DE BURE
0010  */
0011 #include "skgimportpluginskg.h"
0012 
0013 #include <qdir.h>
0014 #include <qfile.h>
0015 #include <qfileinfo.h>
0016 #include <qsqldatabase.h>
0017 #include <qsqlerror.h>
0018 #include <quuid.h>
0019 
0020 #include <klocalizedstring.h>
0021 #include <kpluginfactory.h>
0022 
0023 #include "skgbankincludes.h"
0024 #include "skgimportexportmanager.h"
0025 #include "skgobjectbase.h"
0026 #include "skgpropertyobject.h"
0027 #include "skgservices.h"
0028 #include "skgtraces.h"
0029 
0030 #define SQLDRIVERNAME QStringLiteral("SKGSQLCIPHER")
0031 /**
0032  * This plugin factory.
0033  */
0034 K_PLUGIN_CLASS_WITH_JSON(SKGImportPluginSkg, "metadata.json")
0035 
0036 SKGImportPluginSkg::SKGImportPluginSkg(QObject* iImporter, const QVariantList& iArg)
0037     : SKGImportPlugin(iImporter)
0038 {
0039     SKGTRACEINFUNC(10)
0040     Q_UNUSED(iArg)
0041 
0042     m_importParameters[QStringLiteral("password")] = QString();
0043 }
0044 
0045 SKGImportPluginSkg::~SKGImportPluginSkg()
0046     = default;
0047 
0048 bool SKGImportPluginSkg::isImportPossible()
0049 {
0050     SKGTRACEINFUNC(10)
0051     return (m_importer->getDocument() == nullptr ? true : m_importer->getFileNameExtension() == QStringLiteral("SKG") || m_importer->getFileNameExtension() == QStringLiteral("SQLITE") || m_importer->getFileNameExtension() == QStringLiteral("SQLCIPHER"));
0052 }
0053 
0054 SKGError SKGImportPluginSkg::importFile()
0055 {
0056     if (m_importer->getDocument() == nullptr) {
0057         return SKGError(ERR_ABORT, i18nc("Error message", "Invalid parameters"));
0058     }
0059     SKGError err;
0060     SKGTRACEINFUNCRC(2, err)
0061     QString lfile = m_importer->getLocalFileName();
0062     if (lfile.isEmpty()) {
0063         err.setReturnCode(ERR_INVALIDARG).setMessage(i18nc("Error message",  "Open file '%1' failed", m_importer->getFileName().toDisplayString()));
0064     } else {
0065         SKGDocumentBank docOrigin;
0066         err = docOrigin.load(lfile, m_importParameters.value(QStringLiteral("password")));
0067         IFOK(err) {
0068             QMap<QString, SKGObjectBase> mapOriginNew;
0069             err = m_importer->getDocument()->beginTransaction("#INTERNAL#" % i18nc("Import step", "Import %1 file", "SKG"), 10);
0070 
0071             // Step 1 - units
0072             IFOK(err) {
0073                 SKGObjectBase::SKGListSKGObjectBase listUnits;
0074                 err = docOrigin.getObjects(QStringLiteral("v_unit"), QStringLiteral("1=1 order by rd_unit_id, t_type"), listUnits);
0075                 IFOK(err) {
0076                     int nb = listUnits.count();
0077                     err = m_importer->getDocument()->beginTransaction("#INTERNAL#" % i18nc("Import step", "Import units"), nb);
0078                     for (int i = 0; !err && i < nb; ++i) {
0079                         SKGUnitObject unitOrigin(listUnits.at(i));
0080                         SKGUnitObject unit(unitOrigin.cloneInto(m_importer->getDocument()));
0081                         if (unit.load().isFailed()) {
0082                             // This unit does not exist yet
0083                             IFOK(err) {
0084                                 SKGUnitObject::UnitType unitType = unitOrigin.getType();
0085                                 if (unitType == SKGUnitObject::PRIMARY || unitType == SKGUnitObject::SECONDARY) {
0086                                     unitType = SKGUnitObject::CURRENCY;
0087                                 }
0088                                 err = unit.setType(unitType);
0089                             }
0090                             IFOK(err) {
0091                                 SKGUnitObject parentUnitOrigin;
0092                                 unitOrigin.getUnit(parentUnitOrigin);
0093 
0094                                 SKGUnitObject parentUnit(mapOriginNew[parentUnitOrigin.getUniqueID()]);
0095                                 if (parentUnit != unit) {
0096                                     err = unit.setUnit(parentUnit);
0097                                 }
0098                             }
0099                             IFOKDO(err, unit.save(false))
0100                         }
0101                         mapOriginNew[unitOrigin.getUniqueID()] = unit;
0102 
0103                         // Duplicate properties
0104                         IFOKDO(err, copyParameters(unitOrigin, unit))
0105 
0106                         // Unit values
0107                         SKGObjectBase::SKGListSKGObjectBase listUnitsValues;
0108                         IFOKDO(err, unitOrigin.getUnitValues(listUnitsValues))
0109                         int nb2 = listUnitsValues.count();
0110                         for (int j = 0; !err && j < nb2; ++j) {
0111                             SKGUnitValueObject unitValueOrigin(listUnitsValues.at(j));
0112 
0113                             SKGUnitValueObject  unitval;
0114                             err = unit.addUnitValue(unitval);
0115                             IFOKDO(err, unitval.setDate(unitValueOrigin.getDate()))
0116                             IFOKDO(err, unitval.setQuantity(unitValueOrigin.getQuantity()))
0117                             IFOKDO(err, unitval.save(true))
0118 
0119                             // Duplicate properties
0120                             IFOKDO(err, copyParameters(unitValueOrigin, unitval))
0121                         }
0122                         IFOKDO(err, m_importer->getDocument()->stepForward(i + 1))
0123                     }
0124 
0125                     SKGENDTRANSACTION(m_importer->getDocument(),  err)
0126                 }
0127             }
0128             IFOKDO(err, m_importer->getDocument()->stepForward(1))
0129 
0130             // Step 2 - bank and accounts
0131             IFOK(err) {
0132                 SKGObjectBase::SKGListSKGObjectBase listBanks;
0133                 err = docOrigin.getObjects(QStringLiteral("v_bank"), QString(), listBanks);
0134                 IFOK(err) {
0135                     int nb = listBanks.count();
0136                     err = m_importer->getDocument()->beginTransaction("#INTERNAL#" % i18nc("Import step", "Import banks and accounts"), nb);
0137                     for (int i = 0; !err && i < nb; ++i) {
0138                         SKGBankObject bankOrigin(listBanks.at(i));
0139                         SKGBankObject bank(bankOrigin.cloneInto(m_importer->getDocument()));
0140                         if (bank.load().isFailed()) {
0141                             // This bank does not exist yet
0142                             IFOKDO(err, bank.save(false))
0143                         }
0144 
0145                         // Duplicate properties
0146                         IFOKDO(err, copyParameters(bankOrigin, bank))
0147 
0148                         // Accounts
0149                         SKGObjectBase::SKGListSKGObjectBase listAccounts;
0150                         IFOKDO(err, bankOrigin.getAccounts(listAccounts))
0151                         int nb2 = listAccounts.count();
0152                         for (int j = 0; !err && j < nb2; ++j) {
0153                             SKGAccountObject accountOrigin(listAccounts.at(j));
0154                             SKGAccountObject account(accountOrigin.cloneInto(m_importer->getDocument()));
0155                             if (account.load().isFailed()) {
0156                                 // This account does not exist yet
0157                                 IFOKDO(err, account.setBank(bank))
0158                                 // Initial balance will be set on transaction creation
0159                                 IFOKDO(err, account.save(false))
0160                             }
0161 
0162                             // Duplicate properties
0163                             IFOKDO(err, copyParameters(accountOrigin, account))
0164 
0165                             mapOriginNew[accountOrigin.getUniqueID()] = account;
0166                         }
0167                         IFOKDO(err, m_importer->getDocument()->stepForward(i + 1))
0168                     }
0169 
0170                     SKGENDTRANSACTION(m_importer->getDocument(),  err)
0171                 }
0172             }
0173             IFOKDO(err, m_importer->getDocument()->stepForward(2))
0174 
0175             // Step 3 - categories
0176             IFOK(err) {
0177                 SKGObjectBase::SKGListSKGObjectBase listCategories;
0178                 err = docOrigin.getObjects(QStringLiteral("v_category"), QString(), listCategories);
0179                 IFOK(err) {
0180                     int nb = listCategories.count();
0181                     err = m_importer->getDocument()->beginTransaction("#INTERNAL#" % i18nc("Import step", "Import categories"), nb);
0182                     for (int i = 0; !err && i < nb; ++i) {
0183                         SKGCategoryObject catOrigin(listCategories.at(i));
0184 
0185                         SKGCategoryObject cat;
0186                         err = SKGCategoryObject::createPathCategory(m_importer->getDocument(), catOrigin.getFullName(), cat);
0187                         // Duplicate properties
0188                         IFOKDO(err, copyParameters(catOrigin, cat))
0189                         mapOriginNew[catOrigin.getUniqueID()] = cat;
0190                         IFOKDO(err, m_importer->getDocument()->stepForward(i + 1))
0191                     }
0192 
0193                     SKGENDTRANSACTION(m_importer->getDocument(),  err)
0194                 }
0195             }
0196             IFOKDO(err, m_importer->getDocument()->stepForward(3))
0197 
0198             // Step 4 - trackers
0199             IFOK(err) {
0200                 SKGObjectBase::SKGListSKGObjectBase listRefund;
0201                 err = docOrigin.getObjects(QStringLiteral("v_refund"), QString(), listRefund);
0202                 IFOK(err) {
0203                     int nb = listRefund.count();
0204                     err = m_importer->getDocument()->beginTransaction("#INTERNAL#" % i18nc("Import step", "Import trackers"), nb);
0205                     for (int i = 0; !err && i < nb; ++i) {
0206                         SKGTrackerObject tracOrigin(listRefund.at(i));
0207                         SKGTrackerObject trac(tracOrigin.cloneInto(m_importer->getDocument()));
0208                         err = trac.save();
0209                         // Duplicate properties
0210                         IFOKDO(err, copyParameters(tracOrigin, trac))
0211                         mapOriginNew[tracOrigin.getUniqueID()] = trac;
0212                         IFOKDO(err, m_importer->getDocument()->stepForward(i + 1))
0213                     }
0214 
0215                     SKGENDTRANSACTION(m_importer->getDocument(),  err)
0216                 }
0217             }
0218             IFOKDO(err, m_importer->getDocument()->stepForward(4))
0219 
0220             // Step 5 - rules
0221             IFOK(err) {
0222                 SKGObjectBase::SKGListSKGObjectBase listRules;
0223                 err = docOrigin.getObjects(QStringLiteral("v_rule"), QString(), listRules);
0224                 IFOK(err) {
0225                     int nb = listRules.count();
0226                     err = m_importer->getDocument()->beginTransaction("#INTERNAL#" % i18nc("Import step", "Import rules"), nb);
0227                     for (int i = 0; !err && i < nb; ++i) {
0228                         SKGRuleObject rulOrigin(listRules.at(i));
0229                         SKGRuleObject rul(rulOrigin.cloneInto(m_importer->getDocument()));
0230                         err = rul.save(false);  // Save only
0231                         // Duplicate properties
0232                         IFOKDO(err, copyParameters(rulOrigin, rul))
0233                         IFOKDO(err, m_importer->getDocument()->stepForward(i + 1))
0234                     }
0235 
0236                     SKGENDTRANSACTION(m_importer->getDocument(),  err)
0237                 }
0238             }
0239             IFOKDO(err, m_importer->getDocument()->stepForward(5))
0240 
0241             // Step 6 - payee
0242             IFOK(err) {
0243                 SKGObjectBase::SKGListSKGObjectBase listPayee;
0244                 err = docOrigin.getObjects(QStringLiteral("v_payee"), QString(), listPayee);
0245                 IFOK(err) {
0246                     int nb = listPayee.count();
0247                     err = m_importer->getDocument()->beginTransaction("#INTERNAL#" % i18nc("Import step", "Import payees"), nb);
0248                     for (int i = 0; !err && i < nb; ++i) {
0249                         SKGPayeeObject paylOrigin(listPayee.at(i));
0250 
0251                         SKGPayeeObject pay;
0252                         err = SKGPayeeObject::createPayee(m_importer->getDocument(), paylOrigin.getName(), pay);
0253                         IFOKDO(err, pay.setAddress(paylOrigin.getAddress()))
0254                         IFOKDO(err, pay.save())
0255                         // Duplicate properties
0256                         IFOKDO(err, copyParameters(paylOrigin, pay))
0257                         mapOriginNew[paylOrigin.getUniqueID()] = pay;
0258                         IFOKDO(err, m_importer->getDocument()->stepForward(i + 1))
0259                     }
0260 
0261                     SKGENDTRANSACTION(m_importer->getDocument(),  err)
0262                 }
0263             }
0264             IFOKDO(err, m_importer->getDocument()->stepForward(6))
0265 
0266             // Step 7 - transactions and suboperation
0267             IFOK(err) {
0268                 SKGObjectBase::SKGListSKGObjectBase listOperations;
0269                 err = docOrigin.getObjects(QStringLiteral("v_operation"), QString(), listOperations);
0270                 IFOK(err) {
0271                     int nb = listOperations.count();
0272                     err = m_importer->getDocument()->beginTransaction("#INTERNAL#" % i18nc("Import step", "Import transactions"), nb);
0273                     for (int i = 0; !err && i < nb; ++i) {
0274                         SKGOperationObject operationOrigin(listOperations.at(i));
0275                         SKGOperationObject operation(operationOrigin.cloneInto(m_importer->getDocument()));
0276                         IFOKDO(err, operation.setAttribute(QStringLiteral("r_recurrentoperation_id"), QString()))
0277                         IFOKDO(err, operation.setImported(true))
0278                         IFOK(err) {
0279                             QString importID = operationOrigin.getImportID();
0280                             if (importID.isEmpty()) {
0281                                 importID = "SKG-" % SKGServices::intToString(operationOrigin.getID());
0282                             }
0283                             err = operation.setImportID(importID);
0284                         }
0285                         IFOK(err) {
0286                             SKGAccountObject actOrig;
0287                             err = operationOrigin.getParentAccount(actOrig);
0288                             IFOK(err) {
0289                                 SKGAccountObject act(mapOriginNew[actOrig.getUniqueID()]);
0290                                 act.setClosed(false);  // To be sure that the modification is possible. NOT SAVED
0291                                 IFOKDO(err, operation.setParentAccount(act))
0292                             }
0293                         }
0294                         IFOK(err) {
0295                             SKGPayeeObject payeeOrig;
0296                             operationOrigin.getPayee(payeeOrig);     // Error not managed
0297                             IFOKDO(err, operation.setPayee(SKGPayeeObject(mapOriginNew[payeeOrig.getUniqueID()])))
0298                         }
0299                         IFOK(err) {
0300                             SKGUnitObject unitOrig;
0301                             err = operationOrigin.getUnit(unitOrig);
0302                             IFOKDO(err, operation.setUnit(SKGUnitObject(mapOriginNew[unitOrig.getUniqueID()])))
0303                         }
0304                         IFOK(err) {
0305                             SKGOperationObject groupOrig;
0306                             operationOrigin.getGroupOperation(groupOrig);
0307                             err = operation.setGroupOperation(SKGOperationObject(mapOriginNew[groupOrig.getUniqueID()]));
0308                         }
0309                         IFOKDO(err, operation.save(false))
0310 
0311                         mapOriginNew[operationOrigin.getUniqueID()] = operation;
0312 
0313                         // Duplicate properties
0314                         IFOKDO(err, copyParameters(operationOrigin, operation))
0315 
0316                         // Sub operation
0317                         SKGObjectBase::SKGListSKGObjectBase listSuboperations;
0318                         IFOKDO(err, operationOrigin.getSubOperations(listSuboperations))
0319                         int nb2 = listSuboperations.count();
0320                         for (int j = 0; !err && j < nb2; ++j) {
0321                             SKGSubOperationObject subopOrigin(listSuboperations.at(j));
0322 
0323                             SKGSubOperationObject subop(subopOrigin.cloneInto(m_importer->getDocument()));
0324                             err = subop.setParentOperation(operation);
0325                             IFOK(err) {
0326                                 SKGCategoryObject catOrig;
0327                                 subopOrigin.getCategory(catOrig);    // Error not managed
0328                                 err = subop.setCategory(SKGCategoryObject(mapOriginNew[catOrig.getUniqueID()]));
0329                             }
0330                             IFOK(err) {
0331                                 SKGTrackerObject tracOrig;
0332                                 subopOrigin.getTracker(tracOrig);    // Error not managed
0333                                 IFOKDO(err, subop.setTracker(SKGTrackerObject(mapOriginNew[tracOrig.getUniqueID()]), true))
0334                             }
0335                             IFOKDO(err, subop.save(false))
0336 
0337                             // Duplicate properties
0338                             IFOKDO(err, copyParameters(subopOrigin, subop))
0339                         }
0340                         IFOKDO(err, m_importer->getDocument()->stepForward(i + 1))
0341 
0342                         if (!err && i % 500 == 0) {
0343                             err = m_importer->getDocument()->executeSqliteOrder(QStringLiteral("ANALYZE"));
0344                         }
0345                     }
0346 
0347                     SKGENDTRANSACTION(m_importer->getDocument(),  err)
0348                 }
0349             }
0350             IFOKDO(err, m_importer->getDocument()->stepForward(7))
0351             /*                                      SKGObjectBase opWithThisHash;
0352                                                 if ( SKGObjectBase::getObject ( m_importer->getDocument(), "operation", "t_imported IN ('Y','P') AND t_import_id='"+QString ( hash.toHex() ) +'\'', opWithThisHash ).isSucceeded() )*/
0353 
0354             // Step 8 - recurrent
0355             IFOK(err) {
0356                 SKGObjectBase::SKGListSKGObjectBase ListRecurrentOperations;
0357                 err = docOrigin.getObjects(QStringLiteral("v_recurrentoperation"), QString(), ListRecurrentOperations);
0358                 IFOK(err) {
0359                     int nb = ListRecurrentOperations.count();
0360                     err = m_importer->getDocument()->beginTransaction("#INTERNAL#" % i18nc("Import step", "Import scheduled transactions"), nb);
0361                     for (int i = 0; !err && i < nb; ++i) {
0362                         SKGRecurrentOperationObject recuOrigin(ListRecurrentOperations.at(i));
0363                         SKGRecurrentOperationObject recu(recuOrigin.cloneInto(m_importer->getDocument()));
0364 
0365                         SKGOperationObject opOrig;
0366                         err = recuOrigin.getParentOperation(opOrig);
0367                         IFOKDO(err, recu.setParentOperation(SKGOperationObject(mapOriginNew[opOrig.getUniqueID()])))
0368                         IFOKDO(err, recu.save(false))
0369 
0370                         // Duplicate properties
0371                         IFOKDO(err, copyParameters(recuOrigin, recu))
0372 
0373                         IFOKDO(err, m_importer->getDocument()->stepForward(i + 1))
0374                     }
0375 
0376                     SKGENDTRANSACTION(m_importer->getDocument(),  err)
0377                 }
0378             }
0379             IFOKDO(err, m_importer->getDocument()->stepForward(8))
0380 
0381             // Step 9 - nodes
0382             IFOK(err) {
0383                 SKGObjectBase::SKGListSKGObjectBase listNodes;
0384                 err = docOrigin.getObjects(QStringLiteral("v_node"), QString(), listNodes);
0385                 IFOK(err) {
0386                     int nb = listNodes.count();
0387                     err = m_importer->getDocument()->beginTransaction("#INTERNAL#" % i18nc("Import step", "Import bookmarks"), nb);
0388                     for (int i = 0; !err && i < nb; ++i) {
0389                         SKGNodeObject nodeOrigin(listNodes.at(i));
0390 
0391                         SKGNodeObject node;
0392                         err = SKGNodeObject::createPathNode(m_importer->getDocument(), i18n("Imported bookmarks") % OBJECTSEPARATOR % nodeOrigin.getFullName(), node);
0393                         IFOKDO(err, node.setData(nodeOrigin.getData()))
0394                         IFOKDO(err, node.setOrder(nodeOrigin.getOrder()))
0395                         IFOKDO(err, node.setAutoStart(nodeOrigin.isAutoStart()))
0396                         IFOKDO(err, node.save(true, false))
0397                         IFOKDO(err, m_importer->getDocument()->stepForward(i + 1))
0398                     }
0399 
0400                     SKGENDTRANSACTION(m_importer->getDocument(),  err)
0401                 }
0402             }
0403             IFOKDO(err, m_importer->getDocument()->stepForward(9))
0404 
0405             // Step 10 - interest
0406             IFOK(err) {
0407                 SKGObjectBase::SKGListSKGObjectBase listInterests;
0408                 err = docOrigin.getObjects(QStringLiteral("v_interest"), QString(), listInterests);
0409                 IFOK(err) {
0410                     int nb = listInterests.count();
0411                     err = m_importer->getDocument()->beginTransaction("#INTERNAL#" % i18nc("Import step", "Import interests"), nb);
0412                     for (int i = 0; !err && i < nb; ++i) {
0413                         SKGInterestObject interestOrigin(listInterests.at(i));
0414                         SKGInterestObject interest(interestOrigin.cloneInto(m_importer->getDocument()));
0415                         IFOK(err) {
0416                             SKGAccountObject actOrig;
0417                             err = interestOrigin.getAccount(actOrig);
0418                             IFOKDO(err, interest.setAccount(SKGAccountObject(mapOriginNew[actOrig.getUniqueID()])))
0419                         }
0420                         IFOKDO(err, interest.save())
0421 
0422                         // Duplicate properties
0423                         IFOKDO(err, copyParameters(interestOrigin, interest))
0424 
0425                         IFOKDO(err, m_importer->getDocument()->stepForward(i + 1))
0426                     }
0427 
0428                     SKGENDTRANSACTION(m_importer->getDocument(),  err)
0429                 }
0430             }
0431             IFOKDO(err, m_importer->getDocument()->stepForward(10))
0432 
0433             SKGENDTRANSACTION(m_importer->getDocument(),  err)
0434 
0435             IFOKDO(err, m_importer->getDocument()->executeSqliteOrder(QStringLiteral("ANALYZE")))
0436         }
0437     }
0438     return err;
0439 }
0440 
0441 
0442 
0443 bool SKGImportPluginSkg::isExportPossible()
0444 {
0445     SKGTRACEINFUNC(10)
0446     return isImportPossible();
0447 }
0448 
0449 SKGError SKGImportPluginSkg::exportFile()
0450 {
0451     if (m_importer->getDocument() == nullptr) {
0452         return SKGError(ERR_ABORT, i18nc("Error message", "Invalid parameters"));
0453     }
0454     SKGError err;
0455     SKGTRACEINFUNCRC(2, err)
0456     // Different modes:
0457     // In memory sqlite DB => skg : copySqliteDatabase + cryptFile
0458     // In memory sqlcipher DB => skg : sqlcipher_export + cryptFile
0459     // File sqlite DB => skg : cryptFile
0460     // File sqcipher DB => skg : cryptFile
0461 
0462     // In memory sqlite DB => sqlite : copySqliteDatabase + upload
0463     // In memory sqlcipher DB => sqlite : sqlcipher_export + upload
0464     // File sqlite DB => sqlite : upload
0465     // File sqcipher DB => sqlite : sqlcipher_export + upload
0466 
0467     // In memory sqlite DB => sqlcipher : sqlcipher_export + upload
0468     // In memory sqlcipher DB => sqlcipher : sqlcipher_export + upload
0469     // File sqlite DB => sqlcipher : sqlcipher_export + upload
0470     // File sqcipher DB => sqlcipher : sqlcipher_export + upload
0471 
0472     QString file = m_importer->getLocalFileName(false);
0473     QFile::remove(file);
0474     QString ext = QFileInfo(file).suffix().toUpper();
0475     QString pwd = m_importer->getDocument()->getPassword();
0476 
0477     QString tempFile = m_importer->getDocument()->getCurrentTemporaryFile();
0478     bool removeTempFile = false;
0479     QString DBMode = m_importer->getDocument()->getParameter(QStringLiteral("SKG_DATABASE_TYPE"));
0480 
0481     if (m_importer->getDocument()->getCurrentFileName().isEmpty() || DBMode != QStringLiteral("QSQLITE") || (ext == QStringLiteral("SQLCIPHER") && !pwd.isEmpty())) {
0482         // The database is only in memory
0483         tempFile = QDir::tempPath() % "/skg_" % QUuid::createUuid().toString() % ".skg";
0484         removeTempFile = true;
0485 
0486         auto fileDb = QSqlDatabase::addDatabase(ext == QStringLiteral("SQLITE") ? QStringLiteral("QSQLITE") : SQLDRIVERNAME, tempFile);
0487         fileDb.setDatabaseName(tempFile);
0488         if (!fileDb.open()) {
0489             // Set error message
0490             QSqlError sqlErr = fileDb.lastError();
0491             err = SKGError(SQLLITEERROR + sqlErr.nativeErrorCode().toInt(), sqlErr.text());
0492         } else {
0493             if (ext == QStringLiteral("SQLCIPHER") && !pwd.isEmpty()) {
0494                 IFOKDO(err, SKGServices::executeSqliteOrder(fileDb, "PRAGMA KEY = '" % SKGServices::stringToSqlString(pwd) % "'"))
0495                 IFOKDO(err, m_importer->getDocument()->sendMessage(i18nc("An information message", "The sqlcipher database has been protected with the same password than your document"), SKGDocument::Information))
0496             }
0497 
0498             m_importer->getDocument()->getMainDatabase()->commit();
0499             if (DBMode == QStringLiteral("QSQLITE") && ext == QStringLiteral("QSQLITE")) {
0500                 // The source database is a sqlite DB
0501                 IFOKDO(err, SKGServices::copySqliteDatabase(fileDb, *(m_importer->getDocument()->getMainDatabase()), false))
0502 
0503             } else {
0504                 // The source database is a sqcipher DB
0505                 if (ext == QStringLiteral("SQLITE")) {
0506                     pwd = QString();
0507                 }
0508                 IFOKDO(err, m_importer->getDocument()->executeSqliteOrders(QStringList() << "ATTACH DATABASE '" % tempFile % "' AS sqlcipher KEY '" % SKGServices::stringToSqlString(pwd) % "'"
0509                         << QStringLiteral("SELECT SQLCIPHER_EXPORT('sqlcipher')")
0510                         << QStringLiteral("DETACH DATABASE sqlcipher")));
0511             }
0512             m_importer->getDocument()->getMainDatabase()->transaction();
0513 
0514             fileDb.close();
0515             QSqlDatabase::removeDatabase(tempFile);
0516         }
0517     }
0518 
0519     // Copy file to file
0520     IFOK(err) {
0521         if (ext != QStringLiteral("SKG")) {
0522             if (SKGServices::upload(QUrl::fromLocalFile(tempFile), QUrl::fromLocalFile(file))) {
0523                 err.setReturnCode(ERR_FAIL).setMessage(i18nc("An error message", "Creation file '%1' failed", file));
0524             }
0525         } else {
0526             bool mode;
0527             err = SKGServices::cryptFile(tempFile, file, QString(), true, m_importer->getDocument()->getDocumentHeader(), mode);
0528             IFOK(err) {
0529                 SKGDocumentBank doc;
0530                 err = doc.load(file);
0531                 IFOKDO(err, doc.removeAllTransactions())
0532                 IFOKDO(err, doc.saveAs(file, true))
0533             }
0534         }
0535     }
0536 
0537     if (removeTempFile) {
0538         QFile(tempFile).remove();
0539     }
0540 
0541     return err;
0542 }
0543 
0544 SKGError SKGImportPluginSkg::copyParameters(const SKGObjectBase& iFrom, const SKGObjectBase& iTo)
0545 {
0546     SKGError err;
0547 
0548     SKGObjectBase::SKGListSKGObjectBase params;
0549     err = iFrom.getDocument()->getObjects(QStringLiteral("parameters"), "t_uuid_parent='" % SKGServices::stringToSqlString(iFrom.getUniqueID()) % '\'', params);
0550     IFOK(err) {
0551         int nb = params.count();
0552         SKGDocument* documentTarget = iTo.getDocument();
0553         for (int i = 0; !err && i < nb; ++i) {
0554             SKGPropertyObject orig(params.at(i));
0555             SKGPropertyObject param(orig.cloneInto(documentTarget));
0556             err = param.setAttribute(QStringLiteral("t_uuid_parent"), iTo.getUniqueID());
0557             IFOKDO(err, param.save(true, false))
0558         }
0559     }
0560     return err;
0561 }
0562 
0563 QString SKGImportPluginSkg::getMimeTypeFilter() const
0564 {
0565     return "*.skg|" % i18nc("A file format", "Skrooge document") % '\n' %
0566            "*.sqlcipher|" % i18nc("A file format", "SQLCipher document") % '\n' %
0567            "*.sqlite|" % i18nc("A file format", "SQLite document");
0568 }
0569 
0570 #include <skgimportpluginskg.moc>