diff -r 554d9980157f -r 223f270fa7ff engine/src/PodcastModel.cpp --- a/engine/src/PodcastModel.cpp Sun Apr 04 00:21:57 2010 +0100 +++ b/engine/src/PodcastModel.cpp Sun Apr 04 15:54:17 2010 +0100 @@ -22,6 +22,7 @@ #include "SettingsEngine.h" #include "ShowEngine.h" #include "connectionengine.h" +#include "podcastutils.h" #include #include @@ -84,6 +85,21 @@ iSettingsEngine = CSettingsEngine::NewL(*this); iConnectionEngine = CConnectionEngine::NewL(*this); + TRAPD(err, OpenDBL()); + + if (err != KErrNone) + { + ResetDB(); + + TRAP(err, OpenDBL()); + + if (err != KErrNone) + { + User::Panic(_L("Podcatcher"), 1); + } + + } + iFeedEngine = CFeedEngine::NewL(*this); iShowEngine = CShowEngine::NewL(*this); @@ -237,38 +253,90 @@ } } +void CPodcastModel::ResetDB() + { + DP("CPodcastModel::ResetDB BEGIN"); + + if (iDB != NULL) + { + sqlite3_close(iDB); + iDB = NULL; + } + + TFileName dbFileName; + dbFileName.Copy(iSettingsEngine->PrivatePath()); + dbFileName.Append(KDBFileName); + + // remove the old DB file + if (BaflUtils::FileExists(iFsSession, dbFileName)) + { + BaflUtils::DeleteFile(iFsSession, dbFileName); + } + + // copy template to new DB + TFileName dbTemplate; + dbTemplate.Copy(iSettingsEngine->PrivatePath()); + dbTemplate.Append(KDBTemplateFileName); + + BaflUtils::CopyFile(iFsSession, dbTemplate,dbFileName); + iIsFirstStartup = ETrue; + DP("CPodcastModel::ResetDB END"); + } + + +void CPodcastModel::OpenDBL() + { + DP("CPodcastModel::OpenDBL BEGIN"); + + if (iDB != NULL) + { + sqlite3_close(iDB); + iDB = NULL; + } + + TFileName dbFileName; + dbFileName.Copy(iSettingsEngine->PrivatePath()); + dbFileName.Append(KDBFileName); + + if (!BaflUtils::FileExists(iFsSession, dbFileName)) + { + User::Leave(KErrNotFound); + } + + if (iDB == NULL) { + // open DB + TBuf8 filename8; + filename8.Copy(dbFileName); + int rc = sqlite3_open((const char*) filename8.PtrZ(), &iDB); + if(rc != SQLITE_OK){ + User::Leave(KErrCorrupt); + } + + // do a test query + sqlite3_stmt *st; + rc = sqlite3_prepare_v2(iDB,"select count(*) from feeds" , -1, &st, (const char**) NULL); + if( rc==SQLITE_OK ) + { + Cleanup_sqlite3_finalize_PushL(st); + rc = sqlite3_step(st); + + if (rc != SQLITE_ROW) + { + User::Leave(KErrCorrupt); + } + CleanupStack::PopAndDestroy(); // st + } + else + { + User::Leave(KErrCorrupt); + } + } + + DP("CPodcastModel::OpenDBL END"); + } + sqlite3* CPodcastModel::DB() { - DP("CPodcastModel::DB BEGIN"); - if (iDB == NULL) { - TFileName dbFileName; - dbFileName.Copy(iSettingsEngine->PrivatePath()); - //iFsSession.PrivatePath(dbFileName); - dbFileName.Append(KDBFileName); - DP1("DB is at %S", &dbFileName); - - if (!BaflUtils::FileExists(iFsSession, dbFileName)) { - TFileName dbTemplate; - dbTemplate.Copy(iSettingsEngine->PrivatePath()); - //iFsSession.PrivatePath(dbTemplate); - dbTemplate.Append(KDBTemplateFileName); - DP1("No DB found, copying template from %S", &dbTemplate); - BaflUtils::CopyFile(iFsSession, dbTemplate,dbFileName); - iIsFirstStartup = ETrue; - } - - TBuf8 filename8; - filename8.Copy(dbFileName); - DP("Before sqlite3_open"); - int rc = sqlite3_open((const char*) filename8.PtrZ(), &iDB); - if( rc != SQLITE_OK){ - DP("Error loading DB"); - User::Panic(_L("Podcatcher"), 10); - } - - - } - DP("CPodcastModel::DB END"); return iDB; }