diff options
Diffstat (limited to 'src/quotes.cc')
-rw-r--r-- | src/quotes.cc | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/src/quotes.cc b/src/quotes.cc new file mode 100644 index 00000000..1463c9bc --- /dev/null +++ b/src/quotes.cc @@ -0,0 +1,80 @@ +#include "quotes.h" + +namespace ledger { + +void quotes_by_script::operator()(commodity_base_t& commodity, + const ptime& moment, + const ptime& date, + const ptime& last, + amount_t& price) +{ + LOGGER("quotes.download"); + + DEBUG("commodity: " << commodity.symbol); + DEBUG(" now: " << now); + DEBUG(" moment: " << moment); + DEBUG(" date: " << date); + DEBUG(" last: " << last); + + if (SHOW_DEBUG() && commodity.history) + DEBUG("last_lookup: " << commodity.history->last_lookup); + DEBUG("pricing_leeway is " << pricing_leeway); + + if ((commodity.history && + (time_now - commodity.history->last_lookup) < pricing_leeway) || + (time_now - last) < pricing_leeway || + (price && moment > date && (moment - date) <= pricing_leeway)) + return; + + DEBUG("downloading quote for symbol " << commodity.symbol); + + char buf[256]; + buf[0] = '\0'; + + bool success = true; + + if (FILE * fp = popen((string("getquote \"") + + commodity.symbol + "\"").c_str(), "r")) { + if (feof(fp) || ! fgets(buf, 255, fp)) + success = false; + if (pclose(fp) != 0) + success = false; + } else { + success = false; + } + + if (success && buf[0]) { + char * p = strchr(buf, '\n'); + if (p) *p = '\0'; + + DEBUG("downloaded quote: " << buf); + + price.parse(buf); + commodity.add_price(now, price); + + commodity.history->last_lookup = time_now; + cache_dirty = true; + + if (price && ! price_db.empty()) { +#if defined(__GNUG__) && __GNUG__ < 3 + std::ofstream database(price_db.c_str(), ios::out | ios::app); +#else + std::ofstream database(price_db.c_str(), + std::ios_base::out | std::ios_base::app); +#endif +#if 0 + // jww (2007-04-18): Need to convert to local time and print + // here, print with UTC timezone specifier + database << "P " << now.to_string("%Y/%m/%d %H:%M:%S") + << " " << commodity.symbol << " " << price << endl; +#endif + } + } else { + throw exception(string("Failed to download price for '") + + commodity.symbol + "' (command: \"getquote " + + commodity.symbol + "\")", + context()); + } +} + +} // namespace ledger |