diff options
author | Chris Wilson <chris+github@qwirx.com> | 2009-01-04 13:43:54 +0000 |
---|---|---|
committer | Chris Wilson <chris+github@qwirx.com> | 2009-01-04 13:43:54 +0000 |
commit | 6a5fa78ebb1178d97d18ea533f3be0a700667511 (patch) | |
tree | 08b2eeba4a37b6fd4e008755052a97a0045ce81c | |
parent | 4c118b664a47228a06b8cdec94e4d92049c7f78e (diff) |
Move stream comparison code out of BackupQueries::Compare to
FileStream class.
-rw-r--r-- | bin/bbackupquery/BackupQueries.cpp | 29 | ||||
-rw-r--r-- | lib/common/FileStream.cpp | 41 | ||||
-rw-r--r-- | lib/common/FileStream.h | 2 |
3 files changed, 44 insertions, 28 deletions
diff --git a/bin/bbackupquery/BackupQueries.cpp b/bin/bbackupquery/BackupQueries.cpp index 85f659d4..c63b964a 100644 --- a/bin/bbackupquery/BackupQueries.cpp +++ b/bin/bbackupquery/BackupQueries.cpp @@ -1728,34 +1728,7 @@ void BackupQueries::Compare(int64_t DirID, const std::string &rStoreDir, SelfFlushingStream flushFile(*fileOnServerStream); // Open the local file FileStream l(localPath.c_str()); - - // Size - IOStream::pos_type fileSizeLocal = l.BytesLeftToRead(); - IOStream::pos_type fileSizeServer = 0; - - // Test the contents - char buf1[2048]; - char buf2[2048]; - while(fileOnServerStream->StreamDataLeft() && l.StreamDataLeft()) - { - int size = fileOnServerStream->Read(buf1, sizeof(buf1), mrConnection.GetTimeout()); - fileSizeServer += size; - - if(l.Read(buf2, size) != size - || ::memcmp(buf1, buf2, size) != 0) - { - equal = false; - break; - } - } - - // Check read all the data from the server and file -- can't be equal if local and remote aren't the same length - // Can't use StreamDataLeft() test on file, because if it's the same size, it won't know - // it's EOF yet. - if(fileOnServerStream->StreamDataLeft() || fileSizeServer != fileSizeLocal) - { - equal = false; - } + equal = l.CompareWith(fileOnServerStream, mrConnection.GetTimeout()); } } diff --git a/lib/common/FileStream.cpp b/lib/common/FileStream.cpp index 3e3ace3f..09296d79 100644 --- a/lib/common/FileStream.cpp +++ b/lib/common/FileStream.cpp @@ -403,3 +403,44 @@ bool FileStream::StreamClosed() return mIsEOF; } +// -------------------------------------------------------------------------- +// +// Function +// Name: FileStream::CompareWith(IOStream&, int) +// Purpose: Compare bytes in this file with other stream's data +// Created: 2009/01/03 +// +// -------------------------------------------------------------------------- +bool FileStream::CompareWith(IOStream& rOther, int Timeout) +{ + // Size + IOStream::pos_type mySize = BytesLeftToRead(); + IOStream::pos_type otherSize = 0; + + // Test the contents + char buf1[2048]; + char buf2[2048]; + while(StreamDataLeft() && rOther.StreamDataLeft()) + { + int readSize = rOther.Read(buf1, sizeof(buf1), Timeout); + otherSize += readSize; + + if(Read(buf2, readSize) != readSize || + ::memcmp(buf1, buf2, readSize) != 0) + { + return false; + } + } + + // Check read all the data from the server and file -- can't be + // equal if local and remote aren't the same length. Can't use + // StreamDataLeft() test on local file, because if it's the same + // size, it won't know it's EOF yet. + + if(rOther.StreamDataLeft() || otherSize != mySize) + { + return false; + } + + return true; +} diff --git a/lib/common/FileStream.h b/lib/common/FileStream.h index 5f9b31bb..7c4118cd 100644 --- a/lib/common/FileStream.h +++ b/lib/common/FileStream.h @@ -56,6 +56,8 @@ public: virtual bool StreamDataLeft(); virtual bool StreamClosed(); + bool CompareWith(IOStream& rOther, int Timeout = IOStream::TimeOutInfinite); + private: tOSFileHandle mOSFileHandle; bool mIsEOF; |