2013-12-22 32 views
1

我工作在Lua一個數據庫驅動的撥號方案項目與Asterisk更換GotoIfTime。我已經很糟糕地用.conf dialplan格式替換GotoIfTime()應用程序。如Asterisk Lua Reference中列出的Goto Asterisk主食真的不應該在Lua中使用,這對我很有意義。Asterisk的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 

這裏是我的麻煩了點:

  1. 星期幾由範圍指定。如何驗證日期範圍以字符串格式存儲時的星期幾?

  2. 該系統將使用與操作系統上可以設置不同的時區的多個服務器。使用GotoIfTime驗證帳戶的時區非常簡單,因爲我唯一需要做的就是將帳戶的時區數據庫條目結果指向GotoIfTime應用程序的時區參數。

+0

1)你爲什麼要把一切'varchar',而不是使用更多的敏感數據類型? 2)你根本就沒有說清楚你正在試圖用時區做什麼。通常,在查詢期間需要考慮時區,而不是事後。 3)請退後一步,從陌生人的角度閱讀。我不知道你將哪些數據放入這些列中,也不知道你是如何將這些數據加載到變量中的,或者說是否將這些數據加載到變量中。你需要更簡潔。謝謝。 –

+0

與論壇網站不同,我們不使用「謝謝」或「任何幫助表示讚賞」,或在[so]上簽名。請參閱[應該'嗨','謝謝',標語和致敬辭職](http://meta.stackexchange.com/questions/2950/should-hi-thanks-taglines-and-salutations-be-刪除 - 從 - 個)。 – rene

+0

@MattJohnson 1)已更正。 2)我已經添加了幾行,試圖用更清晰簡潔的格式來解釋時區的完成情況。 3)當我寫這個問題時,我假設讀者會熟悉星號,並且會理解GotoIfTime應用程序的功能,因爲它是Asterisk的主要部分。 GotoIftime應用程序被替換爲Asterisk的Lua diaplan格式。坦率地說,我沒有將這些數據加載到Lua變量中的方法,因爲我還沒有得到這些。 – When1ConsumeMem

回答

0

擺弄周圍,細算通過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 

星號調試是這樣的:

執行[嗒嗒@從外部的:1] execiftime( 「SIP/102-00000211」, 「9:0-19:0,週一至週五,,在/ usr/share/zoneinfo中/美國/芝加哥?集(開放= 1)」

1

如果你選擇了lua,你有lua本身的解析日期,然後比較一週中的哪一天。

或者你可以使用默認GotoIftime,但它會跳出這個盧阿的功能,所以你需要寫等。

一般不應使用LUA,除非您熟悉該語言。如果你不是LUA專家,使用撥號或fastAGI用語言您熟悉(的Perl,PHP等)

有關日期解析Lua中更多信息,你可以檢查此鏈接http://lua-users.org/wiki/DateAndTime

+1

我很欣賞指針,但是根據你的邏輯,如果你不熟悉某種語言,你就不應該嘗試去學習它。我不覺得這是一個好的答案。 – When1ConsumeMem

+0

當然你在這裏有正確的一點,但如果你的目標是lua學習,你需要去lua doc /論壇網站。這樣會更快,更高質量。對不起,我不能說在LUA中如何做這個任務,我只能說你不能使用星號領域的東西來幫助在LUA中完成它。我很抱歉,我曾經與perl/php/C++一起工作。如果你更熟悉任何單一的語言,那麼LUA-使用該語言。如果你覺得你不知道 - 學習星號dialplan或AEL。真的,使用類似lua裏面的解釋器並不是最好的選擇。 – arheops