Wipe the csync statedb after a sync definition is removed.

This commit is contained in:
Klaas Freitag 2012-06-11 10:10:07 +02:00
parent 8b38131b4b
commit 06b3a50e84
7 changed files with 67 additions and 4 deletions

View file

@ -137,11 +137,12 @@ void CSyncThread::run()
wStats->seenFiles = 0; wStats->seenFiles = 0;
wStats->conflicts = 0; wStats->conflicts = 0;
wStats->error = 0; wStats->error = 0;
const char *statedb = 0;
_mutex.lock(); _mutex.lock();
if( csync_create(&csync, if( csync_create(&csync,
_source.toLocal8Bit().data(), _source.toLocal8Bit().data(),
_target.toLocal8Bit().data()) < 0 ) { _target.toLocal8Bit().data()) < 0 ) {
emit csyncError( tr("CSync create failed.") ); emit csyncError( tr("CSync create failed.") );
} }
// FIXME: Check if we really need this stringcopy! // FIXME: Check if we really need this stringcopy!
@ -214,6 +215,17 @@ void CSyncThread::run()
goto cleanup; goto cleanup;
} }
// After csync_init the statedb file name can be emitted
statedb = csync_get_statedb_file( csync );
if( statedb ) {
QString stateDbFile = QString::fromUtf8(statedb);
free((void*)statedb);
emit csyncStateDbFile( stateDbFile );
} else {
qDebug() << "WRN: Unable to get csync statedb file name";
}
qDebug() << "############################################################### >>"; qDebug() << "############################################################### >>";
if( csync_update(csync) < 0 ) { if( csync_update(csync) < 0 ) {
emit csyncError(tr("CSync Update failed.")); emit csyncError(tr("CSync Update failed."));
@ -240,7 +252,6 @@ void CSyncThread::run()
emit csyncError(tr("Local filesystem problems. Better disable Syncing and check.")); emit csyncError(tr("Local filesystem problems. Better disable Syncing and check."));
goto cleanup; goto cleanup;
} }
qDebug() << " ..... Local walk finished: " << walkTime.elapsed();
// emit the treewalk results. Do not touch the wStats after this. // emit the treewalk results. Do not touch the wStats after this.
emit treeWalkResult(wStats); emit treeWalkResult(wStats);
@ -248,6 +259,7 @@ void CSyncThread::run()
_mutex.lock(); _mutex.lock();
if( _localCheckOnly ) { if( _localCheckOnly ) {
_mutex.unlock(); _mutex.unlock();
qDebug() << " ..... Local only walk finished: " << walkTime.elapsed();
// we have to go out here as its local check only. // we have to go out here as its local check only.
goto cleanup; goto cleanup;
} else { } else {

View file

@ -68,7 +68,9 @@ public:
signals: signals:
void treeWalkResult(WalkStats*); void treeWalkResult(WalkStats*);
void csyncError(const QString&); void csyncError( const QString& );
void csyncStateDbFile( const QString& );
private: private:
static int getauth(const char *prompt, static int getauth(const char *prompt,

View file

@ -262,5 +262,10 @@ QString Folder::backend() const
return _backend; return _backend;
} }
void Folder::wipe()
{
}
} // namespace Mirall } // namespace Mirall

View file

@ -129,6 +129,11 @@ public:
*/ */
QString backend() const; QString backend() const;
/**
* This is called if the sync folder definition is removed. Do cleanups here.
*/
virtual void wipe();
QIcon icon( int size ) const; QIcon icon( int size ) const;
QTimer *_pollTimer; QTimer *_pollTimer;

View file

@ -337,6 +337,7 @@ void FolderMan::removeFolder( const QString& alias )
if( _folderMap.contains( alias )) { if( _folderMap.contains( alias )) {
qDebug() << "Removing " << alias; qDebug() << "Removing " << alias;
Folder *f = _folderMap.take( alias ); Folder *f = _folderMap.take( alias );
f->wipe();
f->deleteLater(); f->deleteLater();
} else { } else {
qDebug() << "!! Can not remove " << alias << ", not in folderMap."; qDebug() << "!! Can not remove " << alias << ", not in folderMap.";

View file

@ -68,6 +68,7 @@ ownCloudFolder::ownCloudFolder(const QString &alias,
ownCloudFolder::~ownCloudFolder() ownCloudFolder::~ownCloudFolder()
{ {
} }
#ifndef USE_INOTIFY #ifndef USE_INOTIFY
@ -144,6 +145,7 @@ void ownCloudFolder::startSync(const QStringList &pathList)
QObject::connect(_csync, SIGNAL(finished()), SLOT(slotCSyncFinished())); QObject::connect(_csync, SIGNAL(finished()), SLOT(slotCSyncFinished()));
QObject::connect(_csync, SIGNAL(terminated()), SLOT(slotCSyncTerminated())); QObject::connect(_csync, SIGNAL(terminated()), SLOT(slotCSyncTerminated()));
connect(_csync, SIGNAL(csyncError(const QString)), SLOT(slotCSyncError(const QString))); connect(_csync, SIGNAL(csyncError(const QString)), SLOT(slotCSyncError(const QString)));
connect(_csync, SIGNAL(csyncStateDbFile(QString)), SLOT(slotCsyncStateDbFile(QString)));
connect( _csync, SIGNAL(treeWalkResult(WalkStats*)), connect( _csync, SIGNAL(treeWalkResult(WalkStats*)),
this, SLOT(slotThreadTreeWalkResult(WalkStats*))); this, SLOT(slotThreadTreeWalkResult(WalkStats*)));
@ -200,6 +202,12 @@ void ownCloudFolder::slotCSyncError(const QString& err)
_csyncError = true; _csyncError = true;
} }
void ownCloudFolder::slotCsyncStateDbFile( const QString& file )
{
qDebug() << "Got csync statedb file: " << file;
_csyncStateDbFile = file;
}
void ownCloudFolder::slotCSyncTerminated() void ownCloudFolder::slotCSyncTerminated()
{ {
// do not ask csync here for reasons. // do not ask csync here for reasons.
@ -253,5 +261,31 @@ void ownCloudFolder::slotTerminateSync()
} }
} }
// This removes the csync File database if the sync folder definition is removed
// permanentely. This is needed to provide a clean startup again in case another
// local folder is synced to the same ownCloud.
// See http://bugs.owncloud.org/thebuggenie/owncloud/issues/oc-788
void ownCloudFolder::wipe()
{
if( !_csyncStateDbFile.isEmpty() ) {
QFile file(_csyncStateDbFile);
if( file.exists() ) {
if( !file.remove()) {
qDebug() << "WRN: Failed to remove existing csync StateDB " << _csyncStateDbFile;
} else {
qDebug() << "wipe: Removed csync StateDB " << _csyncStateDbFile;
}
} else {
qDebug() << "WRN: statedb is empty, can not remove.";
}
// Check if the tmp database file also exists
QString ctmpName = _csyncStateDbFile + ".ctmp";
QFile ctmpFile( ctmpName );
if( ctmpFile.exists() ) {
ctmpFile.remove();
}
}
}
} // ns } // ns

View file

@ -38,6 +38,8 @@ public:
virtual bool isBusy() const; virtual bool isBusy() const;
virtual void startSync(const QStringList &pathList); virtual void startSync(const QStringList &pathList);
virtual void wipe();
public slots: public slots:
void startSync(); void startSync();
void slotTerminateSync(); void slotTerminateSync();
@ -48,6 +50,7 @@ private slots:
void slotCSyncFinished(); void slotCSyncFinished();
void slotThreadTreeWalkResult( WalkStats* ); void slotThreadTreeWalkResult( WalkStats* );
void slotCSyncTerminated(); void slotCSyncTerminated();
void slotCsyncStateDbFile(const QString&);
#ifndef USE_INOTIFY #ifndef USE_INOTIFY
void slotPollTimerRemoteCheck(); void slotPollTimerRemoteCheck();
@ -62,6 +65,7 @@ private:
QStringList _errors; QStringList _errors;
bool _csyncError; bool _csyncError;
ulong _lastSeenFiles; ulong _lastSeenFiles;
QString _csyncStateDbFile;
}; };
} }