Sql 替换星号Lua中的GotoIfTime

Sql 替换星号Lua中的GotoIfTime,sql,lua,timezone,asterisk,Sql,Lua,Timezone,Asterisk,我正在用Lua和Asterisk开发一个数据库驱动的dialplan项目。我在以.conf dialplan格式替换GotoIfTime()应用程序时遇到了很大的困难。正如Goto星号中所列,我认为Lua中不应该使用主食,这对我来说很有意义 我检查时间条件的方法将与GotoIfTime应用程序完全相同,因为它将限定一周中的一天,按小时和分钟,然后按帐户时区。该系统将有多个位于不同时区的帐户。帐户的工作时间将由它在帐户定义时区的时间决定 我的数据库结构如下: CREATE TABLE IF NOT

我正在用Lua和Asterisk开发一个数据库驱动的dialplan项目。我在以.conf dialplan格式替换GotoIfTime()应用程序时遇到了很大的困难。正如Goto星号中所列,我认为Lua中不应该使用主食,这对我来说很有意义

我检查时间条件的方法将与GotoIfTime应用程序完全相同,因为它将限定一周中的一天,按小时和分钟,然后按帐户时区。该系统将有多个位于不同时区的帐户。帐户的工作时间将由它在帐户定义时区的时间决定

我的数据库结构如下:

CREATE TABLE IF NOT EXISTS `hours` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`account_id` int(11) NOT NULL,
`day_start` varchar(3) NOT NULL,
`day_end` varchar(3) NOT NULL,
`hour_start` int(3) NOT NULL,
`minute_start` int(3) NOT NULL,
`hour_end` int(3) NOT NULL,
`minute_end` int(3) NOT NULL,
`closed_dest_type` varchar(20) NOT NULL,
`closed_dest_id` int(11) NOT NULL,
PRIMARY KEY (`id`)
);

CREATE TABLE IF NOT EXISTS `accounts` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`timezone` varchar(40) NOT NULL,
);
下面是这个操作在Lua中的一些非常简单的用法:

if (open == true) then
    dial(dest_type, dest_id)
else
    dial(closed_dest_type, closed_dest_id)
end
以下是我的问题:

  • 一周中的天数由范围指定。当天数范围以字符串格式存储时,如何验证它是一周中的哪一天

  • 此系统将使用多台服务器,操作系统上可能设置了不同的时区。使用GotoIfTime验证帐户的时区很容易,因为我只需要将帐户的时区数据库条目的结果指向GotoIfTime应用程序的时区参数


  • 如果您选择了lua,您就可以按lua本身解析日期,然后比较一周中的哪一天

    或者您可以使用默认的GotoIftime,但它将跳出这个lua函数,所以您需要编写其他函数

    一般来说,您不应该使用LUA,除非您熟悉该语言。如果您不是lua专家,请将dialplan或fastAGI与您熟悉的语言(Perl、php等)结合使用


    有关lua中日期解析的更多信息,您可以查看此链接

    在修补并查看Asterisk源代码后,我发现Asterisk内置了ExecIfTime应用程序。我没有用lua编写自己的时间条件库,而是使用内置在Asterisk中的函数来完成我需要做的事情。这是一个简单得多的方法

    local zone_dir = "/usr/share/zoneinfo/"
    
    if (resHour.id[1] ~= nil) then
        for i=1,#resHour.id do
    
            local a = resHour.hour_start[i] .. ":"
            a = a .. resHour.minute_start[i] .. "-"
            a = a .. resHour.hour_end[i] .. ":"
            a = a .. resHour.minute_end[i] .. ","
            a = a .. resHour.day_start[i] .. "-"
            a = a .. resHour.day_end[i] .. ",*,*,"
            a = a .. zone_dir .. resAccount.timezone
    
            app.execiftime(a .. "?Set(open=1)")
         end
    
         if (channel.open:get() ~= "1") then
             closed()
         end
    end
    
    星号调试如下所示:

    执行[blah@from-外部:1]执行时间(“SIP/102-00000211”, “9:0-19:0,周一至周五,,,/usr/share/zoneinfo/America/Chicago?集合(开放=1)”


    1) 为什么要将所有内容都设置为
    varchar
    ,而不是使用更合理的数据类型?2) 你根本没有明确说明你想对时区做什么。通常,在查询期间需要考虑时区,而不是在查询之后。3) 请退后一步,从陌生人的角度来读这篇文章。我不知道您在这些列中输入了什么数据,也不知道您是如何将这些数据加载到变量中的,或者其他许多相关内容。你需要更加简洁。谢谢。与论坛网站不同,我们不使用“谢谢”或“感谢任何帮助”或签名。请参阅。@MattJohnson 1)已更正。2) 我添加了几行文字,试图以更清晰、简洁的格式解释时区的作用。3) 当我写这个问题时,我假设读者会熟悉asterisk,并且会理解GotoIfTime应用程序的功能,因为它是asterisk中的主要部分。GotoIftime应用程序正在被替换为以Lua-diaplan格式为Asterisk编写。坦白地说,我还没有一种方法将这些数据加载到Lua变量中,因为我还没有做到这一点。我很欣赏这些指针,但是按照你的逻辑,如果你不熟悉一种语言,你就不应该尝试学习它。我觉得这不是一个好答案。当然,你的观点是正确的,但如果你的目标是lua学习,你需要去lua文档/论坛网站。这样会更快、更高质量。很抱歉,不幸的是,我不能说如何在LUA中完成这项任务,我只能说你不能使用asterisk领域的东西来帮助在LUA中完成这项任务。很抱歉,我以前使用perl/php/c++。如果你更了解任何一种语言,那么LUA-使用那种语言。如果你觉得自己什么都不懂-学习星号拨号计划或AEL。实际上,在星号中使用像lua这样的解释器并不是最好的选择。