X-Git-Url: http://git.pippins.net/embedvideo/.git/static/gitweb.js?a=blobdiff_plain;f=main.cc;fp=main.cc;h=0000000000000000000000000000000000000000;hb=3a93fc06d34d4a2a577ff53fa9e6321598d8f9fd;hp=07868bcd65199d14e2a43da88dbf3740018bb672;hpb=7f06c56f69c8bfda925dd6b28d73201f0a7ea311;p=backups%2F.git diff --git a/main.cc b/main.cc deleted file mode 100644 index 07868bc..0000000 --- a/main.cc +++ /dev/null @@ -1,168 +0,0 @@ -#include -#include -#include -#include -#include -#include - -#include "filedata.hpp" - -using namespace std; - -unsigned long long current_time() { - unsigned long long rc = 0; - time_t now_tt = time( 0 ); - tm *now = localtime( &now_tt ); - rc += ( now->tm_year + 1900ULL ) * 10000000000ULL; - rc += ( now->tm_mon + 1ULL ) * 100000000ULL; - rc += now->tm_mday * 1000000ULL; - rc += now->tm_hour * 10000ULL; - rc += now->tm_min * 100ULL; - rc += now->tm_sec; - - return rc; -} - -template -bool copy_until_full( I begin, I end, O out, unsigned long long &space ) { - const unsigned long long block_size = 0x200ULL; - bool complete = true; - - I i = begin; - while( 0 != space && i != end ) { - unsigned long long size = (*i)->getFileSize(); - unsigned long long blocks = size & ( ~(block_size-1) ); - if( blocks < size ) blocks += block_size; - - if( blocks <= space ) { - space -= blocks; - out = *i; - ++out; - } else { - // We missed a file that should be included so the backup is not complete - complete = false; - } - ++i; - } - return complete; -} - -template -void populate_set( istream &in, SET &files ) { - do { - FileData *data = new FileData(); - in >> data; - if( data->getFileName().size() ) { - files.insert( data ); - } else { - delete data; - } - } while( ! in.eof() ); -} - -template -void partition_sets( const SET ¤t, const SET &old, - SET &added, SET &common, SET &old_common, SET &deleted ) { - FileDataNameCmp cmp; - - set_difference( current.begin(), current.end(), - old.begin(), old.end(), - inserter( added, added.begin() ), - cmp ); - - set_difference( old.begin(), old.end(), - current.begin(), current.end(), - inserter( deleted, deleted.begin() ), - cmp ); - - set_union( current.begin(), current.end(), - old.begin(), old.end(), - inserter( common, common.begin() ), - cmp ); - - set_union( old.begin(), old.end(), - common.begin(), common.end(), - inserter( old_common, old_common.begin() ), - cmp ); -} - -int main() { - // Parse the list of current files on stdin - file_set current; - populate_set( cin, current ); - - file_set backed_up; - ifstream db( "test.db" ); - if( db && db.good() ) { - populate_set( db, backed_up ); - } - - // Now divide the two sets into three sets (added, deleted and common ) - file_set added, deleted, common, old_common; - partition_sets( current, backed_up, added, common, old_common, deleted ); - - // Now find the list of files to backup. - file_set backups; - - // backup all added files - copy( added.begin(), added.end(), inserter( backups, backups.begin() ) ); - - // Backup files that have been modified - file_set::iterator i = common.begin(), j = old_common.begin(); - for( ; i != common.end(); ++i, ++j ) { - (*i)->setLastBackupDate( (*j)->getLastBackupDate() ); - - if( needs_backup( *j, *i ) ) backups.insert( *i ); - } - - // Now, sort the backups by filesize and build a list that'll fit on a DVD - file_vector backups_s; - copy( backups.begin(), backups.end(), back_inserter( backups_s ) ); - - FileDataSizeCmp sizecmp; - sort( backups_s.begin(), backups_s.end(), sizecmp ); - - file_set final; - unsigned long long space = 0x107c00000ULL; // 4220 MBytes - - insert_iterator final_i( final, final.begin() ); - - // Copy files over until full or out of files - bool complete = copy_until_full( backups_s.rbegin(), - backups_s.rend(), - final_i, - space ); - - // Now, sort the non-backed-up list by last_backup_date and back-fill - if( 0 != space ) { - file_vector leftovers; - FileDataNameCmp cmp; - set_difference( current.begin(), current.end(), - final.begin(), final.end(), - back_inserter( leftovers ), - cmp ); - - FileDataLastBackupCmp lastbackupcmp; - sort( leftovers.begin(), leftovers.end(), lastbackupcmp ); - - copy_until_full( leftovers.begin(), leftovers.end(), final_i, space ); - } - - unsigned long long now = current_time(); - for( file_set::iterator k = final.begin(); k != final.end(); ++k ) { - (*k)->setLastBackupDate( now ); - } - - // Write the 'current' list to the dbfile - ofstream dbout( "test.db" ); - copy( current.begin(), current.end(), ostream_iterator( dbout, "" ) ); - - // Write the 'final' list to stdout - copy( final.begin(), final.end(), ostream_iterator( cout, "" ) ); - - if( ! complete ) { cerr << "incomplete" << endl; } - - // Clean-up - for( file_set::iterator i = backed_up.begin(); i != backed_up.end(); ++i ) { delete *i; } - for( file_set::iterator i = current.begin(); i != current.end(); ++i ) { delete *i; } -}