455
470
// and output the resulting block. The ciphertext is the results of update()
456
471
// and the result of final()
457
472
fileOutput.write(f.toByteArray());
464
SKGError SKGServices::copySqliteDatabase(const QString& iFileDbFile, QSqlDatabase* iFileDb, QSqlDatabase* iMemoryDb, bool iFromFileToMemory)
482
SKGError SKGServices::copySqliteDatabase(QSqlDatabase* iFileDb, QSqlDatabase* iMemoryDb, bool iFromFileToMemory)
467
485
SKGTRACEINRC(10, "SKGServices::copySqliteDatabase", err);
468
SKGTRACEL(10) << "Input parameter [iFileDbFile]=[" << iFileDbFile << ']' << endl;
469
SKGTRACEL(10) << "Input parameter [iFromFileToMemory]=[" << (iFromFileToMemory ? "FILE->MEMORY" : "MEMORY->FILE") << ']' << endl;
472
SKGTRACEL(20) << "Coping the schema..." << endl;
473
SKGStringListList listSqlOrder;
474
err=SKGServices::executeSelectSqliteOrder((iFromFileToMemory ? iFileDb: iMemoryDb),
475
"SELECT sql FROM sqlite_master WHERE sql NOT NULL and name NOT IN ('sqlite_stat1', 'sqlite_sequence')",
477
SKGStringListListIterator it = listSqlOrder.begin();
478
++it; //To Forget the header
479
for (; err.isSucceeded() &&it != listSqlOrder.end(); ++it) {
480
err=SKGServices::executeSqliteOrder((iFromFileToMemory ? iMemoryDb: iFileDb), *(it->begin()));
483
// Attach the file iFileDbFile to the target
484
SKGTRACEL(20) << "Attaching the file..." << endl;
485
if (err.isSucceeded()) {
486
err = SKGServices::executeSqliteOrder(iMemoryDb, "ATTACH DATABASE '" + iFileDbFile + "' as source");
486
if (iFileDb && iMemoryDb) {
487
SKGTRACEL(20) << "Input parameter [iFileDb]=[" << iFileDb->databaseName() << ']' << endl;
488
SKGTRACEL(20) << "Input parameter [iMemoryDb]=[" << iMemoryDb->databaseName() << ']' << endl;
489
SKGTRACEL(10) << "Input parameter [iFromFileToMemory]=[" << (iFromFileToMemory ? "FILE->MEMORY" : "MEMORY->FILE") << ']' << endl;
491
QString dbFileName=iFileDb->databaseName();
494
SKGTRACEL(20) << "Coping the schema..." << endl;
495
SKGStringListList listSqlOrder;
496
err=SKGServices::executeSelectSqliteOrder((iFromFileToMemory ? iFileDb: iMemoryDb),
497
"SELECT sql FROM sqlite_master WHERE sql NOT NULL and name NOT IN ('sqlite_stat1', 'sqlite_sequence')",
500
int nb=listSqlOrder.count();
501
for (int i=1; err.isSucceeded() && i<nb; ++i) { //Forget header
502
QString val=listSqlOrder.at(i).at(0);
503
err=SKGServices::executeSqliteOrder((iFromFileToMemory ? iMemoryDb: iFileDb), val);
506
// Attach the file dbFileName to the target
487
507
if (err.isSucceeded()) {
488
// Copy the DATA from the source to the target
489
SKGTRACEL(20) << "Coping data..." << endl;
490
err = SKGServices::executeSqliteOrder(iMemoryDb, "BEGIN");
508
SKGTRACEL(20) << "Attaching the file..." << endl;
509
err = SKGServices::executeSqliteOrder(iMemoryDb, "ATTACH DATABASE '" + dbFileName + "' as source");
491
510
if (err.isSucceeded()) {
492
SKGStringListList listSqlOrder;
493
err=SKGServices::executeSelectSqliteOrder(iMemoryDb,
494
"SELECT name FROM source.sqlite_master WHERE type='table' and name NOT IN ('sqlite_stat1', 'sqlite_sequence')",
496
SKGStringListListIterator it = listSqlOrder.begin();
497
++it; //To Forget the header
498
for (; err.isSucceeded() &&it != listSqlOrder.end(); ++it) {
499
QString val=*(it->begin());
500
if (iFromFileToMemory) {
501
err=SKGServices::executeSqliteOrder(iMemoryDb, "insert into main."+val+" select * from source."+val);
503
QString val=*(it->begin());
504
err=SKGServices::executeSqliteOrder(iMemoryDb,
505
"insert into source."+val+" select * from main."+val);
511
// Copy the DATA from the source to the target
512
SKGTRACEL(20) << "Coping data..." << endl;
513
err = SKGServices::executeSqliteOrder(iMemoryDb, "BEGIN");
514
if (err.isSucceeded()) {
515
SKGStringListList listSqlOrder;
516
err=SKGServices::executeSelectSqliteOrder(iMemoryDb,
517
"SELECT name FROM source.sqlite_master WHERE type='table' and name NOT IN ('sqlite_stat1', 'sqlite_sequence')",
519
int nb=listSqlOrder.count();
520
for (int i=1; err.isSucceeded() && i<nb; ++i) { //Forget header
521
QString val=listSqlOrder.at(i).at(0);
522
if (iFromFileToMemory) err=SKGServices::executeSqliteOrder(iMemoryDb, "insert into main."+val+" select * from source."+val);
523
else err=SKGServices::executeSqliteOrder(iMemoryDb, "insert into source."+val+" select * from main."+val);
510
if (err.isSucceeded()) {
511
err = SKGServices::executeSqliteOrder(iMemoryDb, "COMMIT");
515
SKGServices::executeSqliteOrder(iMemoryDb, "DETACH DATABASE source");
527
if (err.isSucceeded()) err = SKGServices::executeSqliteOrder(iMemoryDb, "COMMIT");
530
SKGError err2=SKGServices::executeSqliteOrder(iMemoryDb, "DETACH DATABASE source");
531
if (err.isSucceeded() && err2.isFailed()) err=err2;
533
//Check if created file exists
534
if (err.isSucceeded() && !iFromFileToMemory && !QFile(dbFileName).exists()) {
536
err.setReturnCode(ERR_FAIL);
537
err.setMessage(tr("Creation file [%1] failed").arg(dbFileName));
541
if (err.isFailed()) err.addError(SQLLITEERROR + ERR_FAIL, tr("copySqliteDatabase::copySqliteDatabase() failed"));
518
if (err.isFailed()) err.addError(SQLLITEERROR + ERR_FAIL, tr("copySqliteDatabase::copySqliteDatabase() failed"));