Hi,

My application is working with a document file implemented in a sqlite database.
So, the function "Open" is copying a file base sqlite database in memory (This is very fast).
The function "Save" is copying a memory database into a file (This is very slow due to file access).

For you information, here is the code to do this copy:
Qt Code:
  1. SKGError SKGServices::copySqliteDatabase(QSqlDatabase* iFileDb, QSqlDatabase* iMemoryDb, bool iFromFileToMemory)
  2. {
  3. SKGError err;
  4. SKGTRACEINRC(10, "SKGServices::copySqliteDatabase", err);
  5. if (iFileDb && iMemoryDb) {
  6. SKGTRACEL(20) << "Input parameter [iFileDb]=[" << iFileDb->databaseName() << ']' << endl;
  7. SKGTRACEL(20) << "Input parameter [iMemoryDb]=[" << iMemoryDb->databaseName() << ']' << endl;
  8. SKGTRACEL(10) << "Input parameter [iFromFileToMemory]=[" << (iFromFileToMemory ? "FILE->MEMORY" : "MEMORY->FILE") << ']' << endl;
  9.  
  10. QString dbFileName=iFileDb->databaseName();
  11.  
  12. // Copy the schema
  13. SKGTRACEL(20) << "Coping the schema..." << endl;
  14. SKGStringListList listSqlOrder;
  15. err=SKGServices::executeSelectSqliteOrder((iFromFileToMemory ? iFileDb: iMemoryDb),
  16. "SELECT sql FROM sqlite_master WHERE sql NOT NULL and name NOT IN ('sqlite_stat1', 'sqlite_sequence')",
  17. listSqlOrder);
  18.  
  19. int nb=listSqlOrder.count();
  20. for (int i=1; err.isSucceeded() && i<nb; ++i) { //Forget header
  21. QString val=listSqlOrder.at(i).at(0);
  22. err=SKGServices::executeSqliteOrder((iFromFileToMemory ? iMemoryDb: iFileDb), val);
  23. }
  24.  
  25. // Attach the file dbFileName to the target
  26. if (err.isSucceeded()) {
  27. SKGTRACEL(20) << "Attaching the file..." << endl;
  28. err = SKGServices::executeSqliteOrder(iMemoryDb, "ATTACH DATABASE '" + dbFileName + "' as source");
  29. if (err.isSucceeded()) {
  30. // Copy the DATA from the source to the target
  31. SKGTRACEL(20) << "Coping data..." << endl;
  32. err = SKGServices::executeSqliteOrder(iMemoryDb, "BEGIN");
  33. if (err.isSucceeded()) {
  34. SKGStringListList listSqlOrder;
  35. err=SKGServices::executeSelectSqliteOrder(iMemoryDb,
  36. "SELECT name FROM source.sqlite_master WHERE type='table' and name NOT IN ('sqlite_stat1', 'sqlite_sequence')",
  37. listSqlOrder);
  38. int nb=listSqlOrder.count();
  39. for (int i=1; err.isSucceeded() && i<nb; ++i) { //Forget header
  40. QString val=listSqlOrder.at(i).at(0);
  41. if (iFromFileToMemory) err=SKGServices::executeSqliteOrder(iMemoryDb, "insert into main."+val+" select * from source."+val);
  42. else err=SKGServices::executeSqliteOrder(iMemoryDb, "insert into source."+val+" select * from main."+val);
  43. }
  44.  
  45. }
  46. if (err.isSucceeded()) err = SKGServices::executeSqliteOrder(iMemoryDb, "COMMIT");
  47.  
  48. //Detach
  49. SKGError err2=SKGServices::executeSqliteOrder(iMemoryDb, "DETACH DATABASE source");
  50. if (err.isSucceeded() && err2.isFailed()) err=err2;
  51.  
  52. //Check if created file exists
  53. if (err.isSucceeded() && !iFromFileToMemory && !QFile(dbFileName).exists()) {
  54. //Set error message
  55. err.setReturnCode(ERR_FAIL);
  56. err.setMessage(i18nc("An error message", "Creation file [%1] failed",dbFileName));
  57. }
  58. }
  59. }
  60. if (err.isFailed()) err.addError(SQLLITEERROR + ERR_FAIL, i18nc("Error message", "%1 failed", QString("copySqliteDatabase::copySqliteDatabase()")));
  61. }
  62. return err;
  63. }
To copy to clipboard, switch view to plain text mode 

I saw in this page http://www.sqlite.org/backup.html that new APIs are existing to do that.

Do you know how we can use it with QT ?