diff options
author | John Wiegley <johnw@newartisans.com> | 2010-06-09 07:38:45 -0400 |
---|---|---|
committer | John Wiegley <johnw@newartisans.com> | 2010-06-09 07:47:45 -0400 |
commit | c28fad384c28fb929fc8ea69854496141bdf306a (patch) | |
tree | 9b4d0197448cd8587e11f5e3e65214e9dc80e3a7 /src | |
parent | 8637dd6ccf7afc71d911cd66c4a55a1308596dbb (diff) | |
download | fork-ledger-c28fad384c28fb929fc8ea69854496141bdf306a.tar.gz fork-ledger-c28fad384c28fb929fc8ea69854496141bdf306a.tar.bz2 fork-ledger-c28fad384c28fb929fc8ea69854496141bdf306a.zip |
The --anon option now anonymizes commodities
Fixes #227 / 1C90D8AF-830E-43C2-A5B7-D382F68EBDE3
Diffstat (limited to 'src')
-rw-r--r-- | src/filters.cc | 52 | ||||
-rw-r--r-- | src/filters.h | 12 | ||||
-rw-r--r-- | src/pool.cc | 16 |
3 files changed, 69 insertions, 11 deletions
diff --git a/src/filters.cc b/src/filters.cc index 1385a3f0..b818c7d0 100644 --- a/src/filters.cc +++ b/src/filters.cc @@ -36,6 +36,7 @@ #include "journal.h" #include "report.h" #include "compare.h" +#include "pool.h" namespace ledger { @@ -216,6 +217,43 @@ namespace { } } +void anonymize_posts::render_commodity(amount_t& amt) +{ + commodity_t& comm(amt.commodity()); + + std::size_t id; + bool newly_added = false; + + commodity_index_map::iterator i = comms.find(&comm); + if (i == comms.end()) { + id = next_comm_id++; + newly_added = true; + comms.insert(commodity_index_map::value_type(&comm, id)); + } else { + id = (*i).second; + } + + std::ostringstream buf; + do { + buf << static_cast<char>('A' + (id % 26)); + id /= 26; + } + while (id > 0); + + if (amt.has_annotation()) + amt.set_commodity + (*commodity_pool_t::current_pool->find_or_create(buf.str(), + amt.annotation())); + else + amt.set_commodity + (*commodity_pool_t::current_pool->find_or_create(buf.str())); + + if (newly_added) { + amt.commodity().set_flags(comm.flags()); + amt.commodity().set_precision(comm.precision()); + } +} + void anonymize_posts::operator()(post_t& post) { SHA1 sha; @@ -258,6 +296,20 @@ void anonymize_posts::operator()(post_t& post) temp.note = none; temp.add_flags(POST_ANONYMIZED); + DEBUG("foo", "1.rendering amount: " << temp.amount); + render_commodity(temp.amount); + DEBUG("foo", "2.rendering amount: " << temp.amount); + if (temp.amount.has_annotation()) { + temp.amount.annotation().tag = none; + if (temp.amount.annotation().price) + render_commodity(*temp.amount.annotation().price); + } + + if (temp.cost) + render_commodity(*temp.cost); + if (temp.assigned_amount) + render_commodity(*temp.assigned_amount); + (*handler)(temp); } diff --git a/src/filters.h b/src/filters.h index 3f2f2145..ffca9d1e 100644 --- a/src/filters.h +++ b/src/filters.h @@ -334,20 +334,26 @@ public: class anonymize_posts : public item_handler<post_t> { - temporaries_t temps; - xact_t * last_xact; + typedef std::map<commodity_t *, std::size_t> commodity_index_map; + + temporaries_t temps; + commodity_index_map comms; + std::size_t next_comm_id; + xact_t * last_xact; anonymize_posts(); public: anonymize_posts(post_handler_ptr handler) - : item_handler<post_t>(handler), last_xact(NULL) { + : item_handler<post_t>(handler), next_comm_id(0), last_xact(NULL) { TRACE_CTOR(anonymize_posts, "post_handler_ptr"); } virtual ~anonymize_posts() { TRACE_DTOR(anonymize_posts); } + void render_commodity(amount_t& amt); + virtual void operator()(post_t& post); virtual void clear() { diff --git a/src/pool.cc b/src/pool.cc index ad97a9c6..5285be92 100644 --- a/src/pool.cc +++ b/src/pool.cc @@ -57,7 +57,7 @@ commodity_t * commodity_pool_t::create(const string& symbol) base_commodity(new commodity_t::base_t(symbol)); std::auto_ptr<commodity_t> commodity(new commodity_t(this, base_commodity)); - DEBUG("amounts.commodities", "Creating base commodity " << symbol); + DEBUG("pool.commodities", "Creating base commodity " << symbol); // Create the "qualified symbol" version of this commodity's symbol if (commodity_t::symbol_needs_quotes(symbol)) { @@ -66,7 +66,7 @@ commodity_t * commodity_pool_t::create(const string& symbol) *commodity->qualified_symbol += "\""; } - DEBUG("amounts.commodities", + DEBUG("pool.commodities", "Creating commodity '" << commodity->symbol() << "'"); std::pair<commodities_map::iterator, bool> result @@ -79,7 +79,7 @@ commodity_t * commodity_pool_t::create(const string& symbol) commodity_t * commodity_pool_t::find_or_create(const string& symbol) { - DEBUG("amounts.commodities", "Find-or-create commodity " << symbol); + DEBUG("pool.commodities", "Find-or-create commodity " << symbol); commodity_t * commodity = find(symbol); if (commodity) @@ -89,7 +89,7 @@ commodity_t * commodity_pool_t::find_or_create(const string& symbol) commodity_t * commodity_pool_t::find(const string& symbol) { - DEBUG("amounts.commodities", "Find commodity " << symbol); + DEBUG("pool.commodities", "Find commodity " << symbol); commodities_map::const_iterator i = commodities.find(symbol); if (i != commodities.end()) @@ -124,10 +124,10 @@ string commodity_pool_t::make_qualified_name(const commodity_t& comm, #if defined(DEBUG_ON) if (comm.qualified_symbol) - DEBUG("amounts.commodities", "make_qualified_name for " + DEBUG("pool.commodities", "make_qualified_name for " << *comm.qualified_symbol << std::endl << details); #endif - DEBUG("amounts.commodities", "qualified_name is " << name.str()); + DEBUG("pool.commodities", "qualified_name is " << name.str()); return name.str(); } @@ -156,7 +156,7 @@ commodity_t * commodity_pool_t::find_or_create(const string& symbol, const annotation_t& details) { - commodity_t * comm = find(symbol); + commodity_t * comm = find_or_create(symbol); if (! comm) return NULL; @@ -181,7 +181,7 @@ commodity_pool_t::create(commodity_t& comm, commodity->qualified_symbol = comm.symbol(); assert(! commodity->qualified_symbol->empty()); - DEBUG("amounts.commodities", "Creating annotated commodity " + DEBUG("pool.commodities", "Creating annotated commodity " << "symbol " << commodity->symbol() << " key " << mapping_key << std::endl << details); |