aboutsummarylogtreecommitdiffstats
diff options
context:
space:
mode:
authorAntony Kellermann2018-09-27 11:56:30 -0400
committerAntony Kellermann2018-09-27 11:56:30 -0400
commit4ebcf5413bb105d22f38effcde6a45acd184ac82 (patch)
tree0422c62e380e0f573715aaa22f8fb43c29f89b3f
parentab918668eee50f8f0459ee6476f03d50d72d4fb3 (diff)
downloadaur-4ebcf5413bb105d22f38effcde6a45acd184ac82.tar.gz
Implemented ref cache
-rw-r--r--api.c29
-rw-r--r--api.h12
-rw-r--r--main.c4
3 files changed, 38 insertions, 7 deletions
diff --git a/api.c b/api.c
index 75adbce9b642..ffc31ced981a 100644
--- a/api.c
+++ b/api.c
@@ -1,6 +1,8 @@
#include "api.h"
-char* ref_cache_file_path;
+char* ref_cache_file_path = NULL;
+
+Ref_Data* ref_cache = NULL;
void ref_cache_file_path_init(void) {
char* home = getenv("HOME");
@@ -466,12 +468,35 @@ void info_array_store_totals(Info_Array* pInfo_Array) {
pInfo_Array->totals->total_spent;
}
-Ref_Data* api_iex_get_ref_data(void) {
+void api_ref_cache_init(void) {
+ Ref_Data* pRef_Data = ref_data_read_cache();
+ if (pRef_Data != NULL && difftime(time(NULL), pRef_Data->time_loaded) < 60 * 60 * 24 * 7) {
+ ref_cache = pRef_Data;
+ return;
+ }
+
+ api_ref_data_write_cache();
+ ref_cache = ref_data_read_cache();
+}
+
+void api_ref_data_write_cache(void) {
String* pString = api_curl_url("https://api.iextrading.com/1.0/ref-data/symbols");
if (pString == NULL)
+ return;
+
+ string_write_file(pString, ref_cache_file_path);
+ string_destroy(&pString);
+}
+
+Ref_Data* ref_data_read_cache(void) {
+ String* pString = file_get_string(ref_cache_file_path);
+ if (pString == NULL)
return NULL;
Json* jobj = json_tokener_parse(pString->data);
+ if (jobj == NULL) // Return NULL if cache file is not JSON formatted
+ return NULL;
+
Ref_Data* pRef_Data = ref_data_init_length(json_object_array_length(jobj));
ref_data_store_json(pRef_Data, jobj);
diff --git a/api.h b/api.h
index d2e27d666990..e37b24a4e26b 100644
--- a/api.h
+++ b/api.h
@@ -152,6 +152,8 @@ struct info_array {
extern char* ref_cache_file_path;
+extern Ref_Data* ref_cache;
+
void ref_cache_file_path_init(void);
/**
@@ -292,11 +294,11 @@ void info_store_portfolio_data(Info* pInfo);
*/
void info_array_store_totals(Info_Array* pInfo_Array);
-/**
- * Returns a pointer to an Info_Array containing a list of all iex listed securities.
- * @return Info_Array*
- */
-Ref_Data* api_iex_get_ref_data(void);
+void api_ref_cache_init(void);
+
+void api_ref_data_write_cache(void);
+
+Ref_Data* ref_data_read_cache(void);
void ref_data_store_json(Ref_Data* pRef_Data, const Json* jobj);
diff --git a/main.c b/main.c
index 681375d08870..2e188a9ecaa0 100644
--- a/main.c
+++ b/main.c
@@ -21,6 +21,9 @@ int main(int argc, char* argv[]) {
portfolio_file_path_init();
ref_cache_file_path_init();
+ // Init ref cache
+ api_ref_cache_init();
+
// Init cURL
curl_global_init(CURL_GLOBAL_ALL);
@@ -107,6 +110,7 @@ int main(int argc, char* argv[]) {
}
free(portfolio_file_path);
free(ref_cache_file_path);
+ ref_data_destroy(&ref_cache);
free(sym);
free(cmd);
curl_global_cleanup();