Added 2nd try to rsync when the 1st attempt fails to cache the burn image properly.
[backups/.git] / filedata.cpp
index 2a9840a7756717aec032566d93f1fc92f16b73b4..81ebb588058c503664d9d8b1618d17b684cdd0bb 100644 (file)
@@ -6,24 +6,6 @@
 
 using namespace std;
 
-FileData::FileData( char               _type,
-                    string             _permissions,
-                    string             _user,
-                    string             _group,
-                    unsigned long long _size,
-                    unsigned long long _modified_date,
-                    unsigned long long _last_backup,
-                    string             _name )
-: filetype( _type ),
-  permissions( _permissions ),
-  username( _user ),
-  groupname( _group ),
-  filesize( _size ),
-  modified_date( _modified_date ),
-  last_backup_date( _last_backup ),
-  filename( _name )
-{}
-
 vector<string> split( const string &line, char c, int limit = -1 ) {
   string::size_type start = 0, end = 0;
 
@@ -43,7 +25,15 @@ vector<string> split( const string &line, char c, int limit = -1 ) {
   return out;
 }
 
-ostream &operator<<( const FileData &d, ostream &o ) {
+const FileData::LastBackupCmp FileData::lastbackupcmp = FileData::LastBackupCmp();
+const FileData::SizeCmp       FileData::sizecmp       = FileData::SizeCmp();
+const FileData::NameCmp       FileData::namecmp       = FileData::NameCmp();
+
+ostream &operator<<( ostream &o, const FileData *d) {
+  return operator<<( o, *d );
+}
+
+ostream &operator<<( ostream &o, const FileData &d ) {
   o << d.getFileType()       << ' ';
   o << d.getPermissions()    << ' ';
   o << d.getUserName()       << ' ';
@@ -56,12 +46,21 @@ ostream &operator<<( const FileData &d, ostream &o ) {
   return o;
 }
 
+istream &operator>>( istream &i, FileData *d ) {
+  return operator>>( i, *d );
+}
+
 istream &operator>>( istream &i, FileData &d ) {
   string file_string;
 
-  for( int c = i.get(); 0 != c && ! i.eof(); c = i.get() ) {
+  int c;
+  // Todo, don't use char_traits<char> directly here
+  for( c = i.get(); 0 != c && char_traits<char>::eof() != c; c = i.get() ) {
     file_string.push_back( c );
   }
+  if( char_traits<char>::eof() == c ) {
+    i.setstate( ios_base::eofbit );
+  }
 
   if( 0 != file_string.size() ) {
     // Example entry
@@ -72,11 +71,25 @@ istream &operator>>( istream &i, FileData &d ) {
     d.setPermissions(    vals[1] );
     d.setUserName(       vals[2] );
     d.setGroupName(      vals[3] );
-    d.setFileSize(       atoi( vals[4].c_str() ) );
-    d.setModifiedDate(   atoi( vals[5].c_str() ) );
-    d.setLastBackupDate( atoi( vals[6].c_str() ) );
+    d.setFileSize(       atoll( vals[4].c_str() ) );
+    d.setModifiedDate(   atoll( vals[5].c_str() ) );
+    d.setLastBackupDate( atoll( vals[6].c_str() ) );
     d.setFileName(       vals[7] );
   }
 
   return i;
 }
+
+bool needs_backup( const FileData *before, const FileData *after ) {
+  assert( before->getFileName() == after->getFileName() );
+
+  if( after->getLastBackupDate()  <  after->getModifiedDate() ) return true;
+
+  if( before->getFileType()       != after->getFileType()     ) return true;
+  if( before->getPermissions()    != after->getPermissions()  ) return true;
+  if( before->getUserName()       != after->getUserName()     ) return true;
+  if( before->getGroupName()      != after->getGroupName()    ) return true;
+  if( before->getFileSize()       != after->getFileSize()     ) return true;
+
+  return false;
+}