diff --git a/resources/install/scripts/app/xml_handler/index.lua b/resources/install/scripts/app/xml_handler/index.lua index 23212b2161..7a9958a3ca 100644 --- a/resources/install/scripts/app/xml_handler/index.lua +++ b/resources/install/scripts/app/xml_handler/index.lua @@ -27,6 +27,7 @@ expire = {} expire["directory"] = "3600"; expire["dialplan"] = "3600"; + expire["languages"] = "3600"; expire["sofia.conf"] = "3600"; load_balancing = false; diff --git a/resources/install/scripts/app/xml_handler/resources/scripts/languages/languages.lua b/resources/install/scripts/app/xml_handler/resources/scripts/languages/languages.lua new file mode 100644 index 0000000000..c4b177d017 --- /dev/null +++ b/resources/install/scripts/app/xml_handler/resources/scripts/languages/languages.lua @@ -0,0 +1,205 @@ +-- xml_handler.lua +-- Part of FusionPBX +-- Copyright (C) 2013 Mark J Crane +-- All rights reserved. +-- +-- Redistribution and use in source and binary forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- 1. Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- 2. Redistributions in binary form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, +-- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY +-- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +-- AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, +-- OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Contributor(s): +-- Mark J Crane + +--set the default + continue = true; + +--get the action + --action = params:getHeader("action"); + language = params:getHeader("lang"); + +--additional information + --event_calling_function = params:getHeader("Event-Calling-Function"); + +--determine the correction action to perform + --get the cache + if (trim(api:execute("module_exists", "mod_memcache")) == "true") then + XML_STRING = trim(api:execute("memcache", "get languages:" .. language)); + --freeswitch.consoleLog("notice", "[xml_handler] SQL: " .. XML_STRING .. "\n"); + if (XML_STRING == "-ERR NOT FOUND") or (XML_STRING == "-ERR CONNECTION FAILURE") then + source = "database"; + continue = true; + else + source = "cache"; + continue = true; + end + else + XML_STRING = ""; + source = "database"; + continue = true; + end + + --show the params in the console + --if (params:serialize() ~= nil) then + -- freeswitch.consoleLog("notice", "[xml_handler-languages.lua] Params:\n" .. params:serialize() .. "\n"); + --end + + --build the XML string from the database + if (source == "database") then + --database connection + if (continue) then + --connect to the database + dofile(scripts_dir.."/resources/functions/database_handle.lua"); + dbh = database_handle('system'); + + --exits the script if we didn't connect properly + assert(dbh:connected()); + + --get the domain_uuid + if (domain_uuid == nil) then + --get the domain_uuid + if (domain_name ~= nil) then + sql = "SELECT domain_uuid FROM v_domains "; + sql = sql .. "WHERE domain_name = '" .. domain_name .."' "; + if (debug["sql"]) then + freeswitch.consoleLog("notice", "[xml_handler] SQL: " .. sql .. "\n"); + end + status = dbh:query(sql, function(rows) + domain_uuid = rows["domain_uuid"]; + end); + end + end + end + + --prevent processing for invalid domains + if (domain_uuid == nil) then + continue = false; + end + + --set the xml array and then concatenate the array to a string + if (continue) then + --build the xml + local xml = {} + table.insert(xml, [[]]); + table.insert(xml, [[]]); + table.insert(xml, [[
]]); + table.insert(xml, [[ ]]); + table.insert(xml, [[ ]]); + table.insert(xml, [[ ]]); + + sql = "SELECT * FROM v_phrases as p, v_phrase_details as d "; + sql = sql .. "WHERE d.domain_uuid = '" .. domain_uuid .. "' "; + sql = sql .. "AND p.phrase_language like '".. language .."%' "; + sql = sql .. "AND p.phrase_uuid = d.phrase_uuid "; + sql = sql .. "AND p.phrase_enabled = 'true' "; + sql = sql .. "ORDER BY d.domain_uuid, p.phrase_uuid, d.phrase_detail_order ASC "; + if (debug["sql"]) then + freeswitch.consoleLog("notice", "[xml_handler] SQL: " .. sql .. "\n"); + end + previous_phrase_uuid = ""; + match_tag = "open"; + x = 0; + dbh:query(sql, function(row) + --phrase_uuid,domain_uuid,phrase_name,phrase_language + --phrase_description,phrase_enabled,phrase_detail_uuid + --phrase_detail_group,phrase_detail_tag,phrase_detail_pattern + --phrase_detail_function,phrase_detail_data,phrase_detail_method + --phrase_detail_type,phrase_detail_order + + if (previous_phrase_uuid ~= row.phrase_uuid) then + if (x > 0) then + table.insert(xml, [[ ]]); + table.insert(xml, [[ ]]); + table.insert(xml, [[ ]]);; + end + table.insert(xml, [[ ]]); + table.insert(xml, [[ ]]); + table.insert(xml, [[ ]]); + match_open_tag = true + end + table.insert(xml, [[ ]]); + previous_phrase_uuid = row.phrase_uuid; + x = x + 1; + end); + + table.insert(xml, [[ ]]); + table.insert(xml, [[ ]]); + table.insert(xml, [[ ]]);; + + --output xml & close previous file + table.insert(xml, [[ ]]); + table.insert(xml, [[ ]]); + table.insert(xml, [[ ]]); + table.insert(xml, [[
]]); + table.insert(xml, [[
]]); + XML_STRING = table.concat(xml, "\n"); + freeswitch.consoleLog("notice", "[xml_handler] language " .. XML_STRING .. " \n") + + --close the database connection + dbh:release(); + + --set the cache + if (domain_name) then + result = trim(api:execute("memcache", "set languages:" .. language .. " '"..XML_STRING:gsub("'", "'").."' "..expire["languages"])); + end + + --send the xml to the console + if (debug["xml_string"]) then + local file = assert(io.open("/tmp/xml_handler-" .. language .. ".xml", "w")); + file:write(XML_STRING); + file:close(); + end + + --send to the console + if (debug["cache"]) then + freeswitch.consoleLog("notice", "[xml_handler] languages:" .. language .. " source: database\n"); + end + end + end + + --get the XML string from the cache + if (source == "cache") then + --replace the ' back to a single quote + if (XML_STRING) then + XML_STRING = XML_STRING:gsub("'", "'"); + end + + --send to the console + if (debug["cache"]) then + if (XML_STRING) then + freeswitch.consoleLog("notice", "[xml_handler] language:" .. language .. " source: memcache \n"); + end + end + end + +--if the extension does not exist send "not found" + if (trim(XML_STRING) == "-ERR NOT FOUND" or XML_STRING == nil) then + --send not found but do not cache it + XML_STRING = [[ + +
+ +
+
]]; + end + +--send the xml to the console + if (debug["xml_string"]) then + freeswitch.consoleLog("notice", "[xml_handler] XML_STRING: \n" .. XML_STRING .. "\n"); + end \ No newline at end of file