X-Git-Url: http://git.pippins.net/embedvideo/.git/?a=blobdiff_plain;f=filedata.cpp;h=81ebb588058c503664d9d8b1618d17b684cdd0bb;hb=200a6dda1a8381f3c83753156d6248ba7ff8836b;hp=c66dadcd4f7e72dd51542e3b561dc12d3f856664;hpb=10f79645bbc320f9b1375e7143079c953f63ab23;p=backups%2F.git diff --git a/filedata.cpp b/filedata.cpp index c66dadc..81ebb58 100644 --- a/filedata.cpp +++ b/filedata.cpp @@ -1,23 +1,95 @@ #include +#include +#include #include "filedata.hpp" using namespace std; -FileData::FileData( char _type, - string _permissions, - string _user, - string _group, - unsigned 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 split( const string &line, char c, int limit = -1 ) { + string::size_type start = 0, end = 0; + + vector 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 directly here + for( c = i.get(); 0 != c && char_traits::eof() != c; c = i.get() ) { + file_string.push_back( c ); + } + if( char_traits::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 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; +}