// In Cloud mode, this function wraps around http GET. // It fetches existing content from the cache, and caches new content. string resource_logic_web_cache_get (string url, string & error) { // On the Cloud, check if the URL is in the cache. if (!config_logic_client_prepared ()) { if (database_filebased_cache_exists (url)) { return database_filebased_cache_get (url); } } // Fetch the URL from the network. // Do not cache the response in an error situation. error.clear (); string html = filter_url_http_get (url, error); if (!error.empty ()) { return html; } // In the Cloud, cache the response. if (!config_logic_client_prepared ()) { database_filebased_cache_put (url, html); } // Done. return html; }
string sword_logic_get_text (string source, string module, int book, int chapter, int verse) { #ifdef HAVE_CLIENT // Client checks for and optionally creates the cache for this SWORD module. if (!Database_Cache::exists (module, book)) { Database_Cache::create (module, book); } // If this module/passage exists in the cache, return it (it updates the access days in the cache). if (Database_Cache::exists (module, book, chapter, verse)) { return Database_Cache::retrieve (module, book, chapter, verse); } // Fetch this SWORD resource from the server. string address = Database_Config_General::getServerAddress (); int port = Database_Config_General::getServerPort (); if (!client_logic_client_enabled ()) { // If the client has not been connected to a cloud instance, // fetch the SWORD content from the Bibledit Cloud demo. address = demo_address (); port = demo_port (); } string url = client_logic_url (address, port, sync_resources_url ()); string resource = "[" + source + "][" + module + "]"; url = filter_url_build_http_query (url, "r", resource); url = filter_url_build_http_query (url, "b", convert_to_string (book)); url = filter_url_build_http_query (url, "c", convert_to_string (chapter)); url = filter_url_build_http_query (url, "v", convert_to_string (verse)); string error; string html = filter_url_http_get (url, error, true); // In case of an error, don't cache that error, but let the user see it. if (!error.empty ()) return error; // Client caches this info for later. // Except in case of predefined responses from the Cloud. if (html != sword_logic_installing_module_text ()) { if (html != sword_logic_fetch_failure_text ()) { Database_Cache::cache (module, book, chapter, verse, html); } } return html; #else string module_text; bool module_available = false; string osis = Database_Books::getOsisFromId (book); string chapter_verse = convert_to_string (chapter) + ":" + convert_to_string (verse); // See notes on function sword_logic_diatheke // for why it is not currently fetching content via a SWORD library call. // module_text = sword_logic_diatheke (module, osis, chapter, verse, module_available); // Running diatheke only works when it runs in the SWORD installation directory. string sword_path = sword_logic_get_path (); // Running several instances of diatheke simultaneously fails. sword_logic_diatheke_run_mutex.lock (); // The server fetches the module text as follows: // diatheke -b KJV -k Jn 3:16 int result = filter_shell_vfork (module_text, sword_path, "diatheke", "-b", module.c_str(), "-k", osis.c_str(), chapter_verse.c_str()); sword_logic_diatheke_run_mutex.unlock (); if (result != 0) return sword_logic_fetch_failure_text (); // Touch the cache so the server knows that the module has been accessed just now. string url = sword_logic_virtual_url (module, 0, 0, 0); database_filebased_cache_get (url); // If the module has not been installed, the output of "diatheke" will be empty. // If the module was installed, but the requested passage is out of range, // the output of "diatheke" contains the module name, so it won't be empty. module_available = !module_text.empty (); if (!module_available) { // Check whether the SWORD module exists. vector <string> modules = sword_logic_get_available (); string smodules = filter_string_implode (modules, ""); if (smodules.find ("[" + module + "]") != string::npos) { // Schedule SWORD module installation. // (It used to be the case that this function, to get the text, // would wait till the SWORD module was installed, and then after installation, // return the text from that module. // But due to long waiting on Bibledit demo, while it would install multiple modules, // the Bibledit demo would become unresponsive. // So, it's better to return immediately with an informative text.) sword_logic_install_module_schedule (source, module); // Return standard 'installing' information. Client knows not to cache this. return sword_logic_installing_module_text (); } else { return "Cannot find SWORD module " + module; } } // Remove any OSIS elements. filter_string_replace_between (module_text, "<", ">", ""); // Remove the passage name that diatheke adds. // A reliable signature for this is the chapter and verse plus subsequent colon. size_t pos = module_text.find (" " + chapter_verse + ":"); if (pos != string::npos) { pos += 2; pos += chapter_verse.size (); module_text.erase (0, pos); } // Remove the module name that diatheke adds. module_text = filter_string_str_replace ("(" + module + ")", "", module_text); // Clean whitespace away. module_text = filter_string_trim (module_text); return module_text; #endif return ""; }