From: Carl N Baldwin Date: Fri, 21 Oct 2005 15:00:23 +0000 (-0600) Subject: Rename main.cc -> main.cpp X-Git-Tag: release-0.4~82 X-Git-Url: http://git.pippins.net/embedvideo/%27%20.%20%24this-%3Ephpgw_js_url%20.%20%27/jscalendar/static/gitweb.js?a=commitdiff_plain;h=3a93fc06d34d4a2a577ff53fa9e6321598d8f9fd;p=backups%2F.git Rename main.cc -> main.cpp --- diff --git a/Makefile.am b/Makefile.am index 429b2b5..615ecfb 100644 --- a/Makefile.am +++ b/Makefile.am @@ -6,6 +6,6 @@ schema_files = schema.sql EXTRA_DIST = $(schema_files) -lsbackups_SOURCES = main.cc \ +lsbackups_SOURCES = main.cpp \ filedata.hpp \ filedata.cpp 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; } -} diff --git a/main.cpp b/main.cpp new file mode 100644 index 0000000..07868bc --- /dev/null +++ b/main.cpp @@ -0,0 +1,168 @@ +#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; } +}