Bump the revision number
[backups/.git] / filedata.cpp
index cd82b5408396861ee9c95e4fc8be02e27c04992b..81ebb588058c503664d9d8b1618d17b684cdd0bb 100644 (file)
@@ -1,23 +1,95 @@
 #include <string>
+#include <vector>
+#include <iostream>
 
 #include "filedata.hpp"
 
 using namespace std;
 
-FileData::FileData( char               _type,
-                    string             _permissions,
-                    string             _user,
-                    string             _group,
-                    unsigned long long _size,
-                    unsigned long long _modified_date,
-                    string             _name,
-                    unsigned long long _last_backup )
-: filetype( _type ),
-  permissions( _permissions ),
-  username( _user ),
-  groupname( _group ),
-  filesize( _size ),
-  modified_date( _modified_date ),
-  filename( _name ),
-  last_backup_date( _last_backup )
-{}
+vector<string> split( const string &line, char c, int limit = -1 ) {
+  string::size_type start = 0, end = 0;
+
+  vector<string> out;
+  while( 0 != limit-- && end != line.size() ) {
+    if( 0 == limit ) {
+      end = line.size();
+    } else {
+      end = line.find( c, start );
+      if( end == string::npos ) {
+        end = line.size();
+      }
+    }
+    out.push_back( line.substr( start, end-start ) );
+    start = end + 1;
+  }
+  return out;
+}
+
+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()       << ' ';
+  o << d.getGroupName()      << ' ';
+  o << d.getFileSize()       << ' ';
+  o << d.getModifiedDate()   << ' ';
+  o << d.getLastBackupDate() << ' ';
+  o << d.getFileName()       << '\0';
+
+  return o;
+}
+
+istream &operator>>( istream &i, FileData *d ) {
+  return operator>>( i, *d );
+}
+
+istream &operator>>( istream &i, FileData &d ) {
+  string file_string;
+
+  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
+    // type perms user group size datemodified name (8 total)
+    // f 0600 cnb cnb 424 20051015205340 0 ./.git/index
+    vector<string> vals = split( file_string, ' ', 8 );
+    d.setFileType(       vals[0][0] );
+    d.setPermissions(    vals[1] );
+    d.setUserName(       vals[2] );
+    d.setGroupName(      vals[3] );
+    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;
+}