summaryrefslogtreecommitdiff
path: root/quotes.cc
diff options
context:
space:
mode:
Diffstat (limited to 'quotes.cc')
-rw-r--r--quotes.cc76
1 files changed, 76 insertions, 0 deletions
diff --git a/quotes.cc b/quotes.cc
new file mode 100644
index 00000000..65dc7316
--- /dev/null
+++ b/quotes.cc
@@ -0,0 +1,76 @@
+#include "quotes.h"
+#include "datetime.h"
+#include "error.h"
+#include "debug.h"
+
+#include <fstream>
+#include <stdlib.h>
+
+namespace ledger {
+
+void quotes_by_script::operator()(commodity_t& commodity,
+ const std::time_t moment,
+ const std::time_t date,
+ const std::time_t last,
+ amount_t& price)
+{
+ DEBUG_CLASS("ledger.quotes.download");
+
+ DEBUG_PRINT_("commodity: " << commodity.symbol);
+ DEBUG_PRINT_TIME_(now);
+ DEBUG_PRINT_TIME_(moment);
+ DEBUG_PRINT_TIME_(date);
+ DEBUG_PRINT_TIME_(last);
+ if (commodity.history)
+ DEBUG_PRINT_TIME_(commodity.history->last_lookup);
+ DEBUG_PRINT_("pricing_leeway is " << pricing_leeway);
+
+ if ((commodity.history &&
+ std::difftime(now, commodity.history->last_lookup) < pricing_leeway) ||
+ std::difftime(now, last) < pricing_leeway ||
+ (price && std::difftime(moment, date) <= pricing_leeway))
+ return;
+
+ using namespace std;
+
+ DEBUG_PRINT_("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;
+ }
+
+ if (success && buf[0]) {
+ char * p = strchr(buf, '\n');
+ if (p) *p = '\0';
+
+ DEBUG_PRINT_("downloaded quote: " << buf);
+
+ price.parse(buf);
+ commodity.add_price(now, price);
+
+ commodity.history->last_lookup = now;
+ cache_dirty = true;
+
+ if (price && ! price_db.empty()) {
+ strftime(buf, 127, "%Y/%m/%d %H:%M:%S", localtime(&now));
+ ofstream database(price_db.c_str(), ios_base::out | ios_base::app);
+ database << "P " << buf << " " << commodity.symbol
+ << " " << price << endl;
+ }
+ } else {
+ throw error(std::string("Failed to download price for '") +
+ commodity.symbol + "' (command: \"getquote " +
+ commodity.symbol + "\")");
+ }
+}
+
+} // namespace ledger