diff options
-rw-r--r-- | api.c | 29 | ||||
-rw-r--r-- | api.h | 12 | ||||
-rw-r--r-- | main.c | 4 |
3 files changed, 38 insertions, 7 deletions
@@ -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); @@ -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); @@ -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(); |