diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/global.cc | 20 | ||||
-rw-r--r-- | src/global.h | 1 | ||||
-rw-r--r-- | src/main.cc | 4 | ||||
-rw-r--r-- | src/report.cc | 2 | ||||
-rw-r--r-- | src/report.h | 5 | ||||
-rw-r--r-- | src/session.cc | 96 | ||||
-rw-r--r-- | src/session.h | 3 |
7 files changed, 76 insertions, 55 deletions
diff --git a/src/global.cc b/src/global.cc index c012b17d..b2dc24fc 100644 --- a/src/global.cc +++ b/src/global.cc @@ -109,24 +109,6 @@ void global_scope_t::read_init() } } -void global_scope_t::read_journal_files() -{ - INFO_START(journal, "Read journal file"); - - string master_account; - if (session().HANDLED(account_)) - master_account = session().HANDLER(account_).str(); - - std::size_t count = session().read_data(master_account); - if (count == 0) - throw_(parse_error, "Failed to locate any journal entries; " - "did you specify a valid file with -f?"); - - INFO_FINISH(journal); - - INFO("Found " << count << " entries"); -} - char * global_scope_t::prompt_string() { static char prompt[32]; @@ -195,7 +177,7 @@ void global_scope_t::execute_command(strings_list args, bool at_repl) if (! is_precommand) { if (! at_repl) - read_journal_files(); + session().read_journal_files(); normalize_report_options(verb); } diff --git a/src/global.h b/src/global.h index 0851cdaa..883972fc 100644 --- a/src/global.h +++ b/src/global.h @@ -52,7 +52,6 @@ public: ~global_scope_t(); void read_init(); - void read_journal_files(); void read_environment_settings(char * envp[]); strings_list read_command_arguments(scope_t& scope, strings_list args); void normalize_session_options(); diff --git a/src/main.cc b/src/main.cc index 30a54b3b..74ef9c64 100644 --- a/src/main.cc +++ b/src/main.cc @@ -92,7 +92,7 @@ int main(int argc, char * argv[], char * envp[]) if (global_scope->HANDLED(script_)) { // Ledger is being invoked as a script command interpreter - global_scope->read_journal_files(); + global_scope->session().read_journal_files(); status = 0; @@ -115,7 +115,7 @@ int main(int argc, char * argv[], char * envp[]) // Commence the REPL by displaying the current Ledger version global_scope->show_version_info(std::cout); - global_scope->read_journal_files(); + global_scope->session().read_journal_files(); bool exit_loop = false; diff --git a/src/report.cc b/src/report.cc index a4076d9f..335974d2 100644 --- a/src/report.cc +++ b/src/report.cc @@ -556,6 +556,8 @@ expr_t::ptr_op_t report_t::lookup(const string& name) return WRAP_FUNCTOR (reporter<>(new format_xacts(*this, HANDLER(register_format_).str()), *this)); + else if (is_eq(p, "reload")) + return MAKE_FUNCTOR(report_t::reload_command); break; case 's': diff --git a/src/report.h b/src/report.h index fd268c91..9ea99bbd 100644 --- a/src/report.h +++ b/src/report.h @@ -143,6 +143,11 @@ public: return value_t(static_cast<scope_t *>(this)); } + value_t reload_command(call_scope_t& scope) { + session.reread_journal_files(); + return true; + } + void append_predicate(const string& str) { if (HANDLED(limit_)) HANDLER(limit_).on(string("(") + HANDLER(limit_).str() + ")&" + str); diff --git a/src/session.cc b/src/session.cc index 99b0d013..52c84acb 100644 --- a/src/session.cc +++ b/src/session.cc @@ -60,7 +60,7 @@ session_t::session_t() current_year(CURRENT_DATE().year()), commodity_pool(new commodity_pool_t), - master(new account_t(NULL, "")), + master(new account_t), journal(new journal_t(master.get())) { TRACE_CTOR(session_t, ""); @@ -106,42 +106,39 @@ std::size_t session_t::read_data(const string& master_account) std::size_t entry_count = 0; - if (entry_count == 0) { - account_t * acct = journal->master; - if (! master_account.empty()) - acct = journal->find_account(master_account); + account_t * acct = journal->master; + if (! master_account.empty()) + acct = journal->find_account(master_account); - if (HANDLED(price_db_) && exists(path(HANDLER(price_db_).str()))) { - if (read_journal(HANDLER(price_db_).str())) - throw_(parse_error, "Entries not allowed in price history file"); - } - - - foreach (const path& pathname, HANDLER(file_).data_files) { - if (pathname == "-") { - // To avoid problems with stdin and pipes, etc., we read the entire - // file in beforehand into a memory buffer, and then parcel it out - // from there. - std::ostringstream buffer; + if (HANDLED(price_db_) && exists(path(HANDLER(price_db_).str()))) { + if (read_journal(HANDLER(price_db_).str())) + throw_(parse_error, "Entries not allowed in price history file"); + } - while (std::cin.good() && ! std::cin.eof()) { - char line[8192]; - std::cin.read(line, 8192); - std::streamsize count = std::cin.gcount(); - buffer.write(line, count); - } - buffer.flush(); + foreach (const path& pathname, HANDLER(file_).data_files) { + if (pathname == "-") { + // To avoid problems with stdin and pipes, etc., we read the entire + // file in beforehand into a memory buffer, and then parcel it out + // from there. + std::ostringstream buffer; + + while (std::cin.good() && ! std::cin.eof()) { + char line[8192]; + std::cin.read(line, 8192); + std::streamsize count = std::cin.gcount(); + buffer.write(line, count); + } + buffer.flush(); - std::istringstream buf_in(buffer.str()); + std::istringstream buf_in(buffer.str()); - entry_count += read_journal(buf_in, "/dev/stdin", acct); - } - else if (exists(pathname)) { - entry_count += read_journal(pathname, acct); - } - else { - throw_(parse_error, "Could not open journal file '" << pathname << "'"); - } + entry_count += read_journal(buf_in, "/dev/stdin", acct); + } + else if (exists(pathname)) { + entry_count += read_journal(pathname, acct); + } + else { + throw_(parse_error, "Could not open journal file '" << pathname << "'"); } } @@ -150,6 +147,39 @@ std::size_t session_t::read_data(const string& master_account) return entry_count; } +void session_t::read_journal_files() +{ + INFO_START(journal, "Read journal file"); + + string master_account; + if (HANDLED(account_)) + master_account = HANDLER(account_).str(); + + std::size_t count = read_data(master_account); + if (count == 0) + throw_(parse_error, "Failed to locate any journal entries; " + "did you specify a valid file with -f?"); + + INFO_FINISH(journal); + + INFO("Found " << count << " entries"); +} + +void session_t::reread_journal_files() +{ + journal.reset(); + master.reset(); + commodity_pool.reset(); + amount_t::shutdown(); + + commodity_pool.reset(new commodity_pool_t); + amount_t::initialize(commodity_pool); + master.reset(new account_t); + journal.reset(new journal_t(master.get())); + + read_journal_files(); +} + void session_t::clean_xacts() { journal_xacts_iterator walker(*journal.get()); diff --git a/src/session.h b/src/session.h index 6ee7af9d..f4937f10 100644 --- a/src/session.h +++ b/src/session.h @@ -87,6 +87,9 @@ public: std::size_t read_data(const string& master_account = ""); + void read_journal_files(); + void reread_journal_files(); + void clean_xacts(); void clean_xacts(entry_t& entry); void clean_accounts(); |