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>