SKGError SKGServices
::copySqliteDatabase(const QString
& iFileDbFile,
QSqlDatabase* iFileDb,
QSqlDatabase* iMemoryDb,
bool iFromFileToMemory
){
SKGError err;
SKGTRACEINRC(10, "SKGServices::copySqliteDatabase", err);
SKGTRACEL(10) << "Input parameter [iFileDbFile]=[" << iFileDbFile << "]" << endl;
SKGTRACEL(10) << "Input parameter [iFromFileToMemory]=[" << (iFromFileToMemory ? "FILE->MEMORY" : "MEMORY->FILE") << "]" << endl;
// Copy the schema
SKGTRACEL(20) << "Coping the schema..." << endl;
//TODO: How to copy the statistics too
SKGStringListList listSqlOrder;
err=SKGServices::executeSelectSqliteOrder((iFromFileToMemory ? iFileDb: iMemoryDb),
"SELECT sql FROM sqlite_master WHERE sql NOT NULL and name NOT IN ('sqlite_stat1', 'sqlite_sequence')",
listSqlOrder);
SKGStringListListIterator it = listSqlOrder.begin();
++it; //To Forget the header
for (; err.isSucceeded() &&it != listSqlOrder.end(); ++it) {
err=SKGServices::executeSqliteOrder((iFromFileToMemory ? iMemoryDb: iFileDb), *(it->begin()));
}
// Attach the file iFileDbFile to the target
SKGTRACEL(20) << "Attaching the file..." << endl;
if (err.isSucceeded()) {
err = SKGServices::executeSqliteOrder(iMemoryDb, "ATTACH DATABASE '" + iFileDbFile + "' as source");
if (err.isSucceeded()) {
// Copy the DATA from the source to the target
SKGTRACEL(20) << "Coping data..." << endl;
err = SKGServices::executeSqliteOrder(iMemoryDb, "BEGIN");
if (err.isSucceeded()) {
SKGStringListList listSqlOrder;
err=SKGServices::executeSelectSqliteOrder(iMemoryDb,
"SELECT name FROM source.sqlite_master WHERE type='table' and name NOT IN ('sqlite_stat1', 'sqlite_sequence')",
listSqlOrder);
SKGStringListListIterator it = listSqlOrder.begin();
++it; //To Forget the header
for (; err.isSucceeded() &&it != listSqlOrder.end(); ++it) {
if (iFromFileToMemory) {
err=SKGServices::executeSqliteOrder(iMemoryDb,
"insert into main."+val+" select * from source."+val);
} else {
err=SKGServices::executeSqliteOrder(iMemoryDb,
"insert into source."+val+" select * from main."+val);
}
}
}
if (err.isSucceeded()) {
err = SKGServices::executeSqliteOrder(iMemoryDb, "COMMIT");
}
//Detach
SKGServices::executeSqliteOrder(iMemoryDb, "DETACH DATABASE source");
}
}
if (err.isFailed()) err.addError(SQLLITEERROR + ERR_FAIL, tr("copySqliteDatabase::copySqliteDatabase() failed"));
return err;
}