У меня конкретная задача. Используя базу данных CDR MYSQL которая установлен на сервере asterisk через интерфейс AMI передать в 1С историю звонков за один день. Есть много способов хранения CDR записей и обращения к ним, но в данный момент прошу раскритиковать то что написано ниже.
При обращении в переменную v1 мы передаем информацию о канале для которого запрашиваются CDR записи, например "SIP/26". В переменную date1 передаем дату, например "2012-04-12", в переменную numbers список телефонов для которых нам нужно получить историю, например "26-7926524444-90-91-92", номера разделяем знаками "-".
За один раз в 1С можно передать определенную порцию данных, в данном примере 20 строк, причем каждая переменная должна быть разделена символом запятая в кавычках, а каждая строка последовательностью из 5 точек. На всякий случай ограничиваем количество записей 200 за день.
Есть ли в коде приведенном ниже грубые ошибки?
exten => 0000555,n,Set(num=0)
exten => 0000555,n,Set(i=0)
exten => 0000555,n,Set(chan=${v1})
exten => 0000555,n,Set(date1=${v2})
exten => 0000555,n,Set(numbers=${v3})
exten => 0000555,n,Set(dbname=${AST_CONFIG(cdr_mysql.conf,global,dbname)})
exten => 0000555,n,Set(user=${AST_CONFIG(cdr_mysql.conf,global,user)})
exten => 0000555,n,Set(password=${AST_CONFIG(cdr_mysql.conf,global,password)})
exten => 0000555,n,Set(tmp_dir=${ASTLOGDIR})
exten => 0000555,n,NoOp()
exten => 0000555,n,Set(packet=20)
exten => 0000555,n,Answer()
exten => 0000555,n(NextNum),Set(i=$[${i} + 1])
exten => 0000555,n,Set(NumFilter=${CUT(numbers,,${i})})
exten => 0000555,n,Gotoif($[ ${LEN(${NumFilter})}=0 ]?SendRequest)
exten => 0000555,n,ExecIf($[${i}>1]?Set(SQLrequest=${SQLrequest} UNION ))
exten => 0000555,n,Set(SQLrequest=${SQLrequest}SELECT calldate,src,dst,channel,dstchannel,billsec,disposition,uniqueid from cdr where (DATE(calldate) BETWEEN DATE(${QUOTE(${date1})}) AND DATE(${QUOTE(${date1})})) AND ((lastapp="Transferred Call" AND lastdata like ${QUOTE(%/${NumFilter}@%)}) OR (lastapp="Dial" AND (channel like ${QUOTE(%/${NumFilter}-%)} OR dstchannel like ${QUOTE(%/${NumFilter}-%)} OR dstchannel like ${QUOTE(%/${NumFilter}@%)} ))))
exten => 0000555,n,ExecIf($[${i}>15]?Hangup())
exten => 0000555,n,Goto(NextNum)
exten => 0000555,n(SendRequest),System( mysql -sse '${SQLrequest} LIMIT 200' -u${user} -p${password} ${dbname}> ${tmp_dir}/${UNIQUEID})
exten => 0000555,n,Set(kls=${SHELL(cat ${tmp_dir}/${UNIQUEID} |wc -l)})
exten => 0000555,n,Gotoif($[ ${kls} = 0 ]?DelTmpFile:SendCDRHistory)
exten => 0000555,n(SendCDRHistory),Set(ostatok=${kls})
exten => 0000555,n(SendNextPacket),Set(packet=${IF($[ ${ostatok} < ${packet}]?${ostatok}:${packet})})
exten => 0000555,n,Set(num=$[${num} + ${packet}])
exten => 0000555,n,UserEvent(FromCDR,Channel: ${chan},Date: ${date1},Lines: ${QUOTE(${SHELL(cat ${tmp_dir}/${UNIQUEID} |head -n '${num}'| tail -n '${packet}'| sed 's/|/'\',\''/g'| sed 's/[\t]/'\',\''/g'|sed 's/$/...../g'|tr "\n" " ")})})
exten => 0000555,n,Set(ostatok=$[${ostatok}-${packet}])
exten => 0000555,n,Gotoif($[ ${ostatok} > 0 ]?SendNextPacket:DelTmpFile)
exten => 0000555,n(DelTmpFile),System(rm ${tmp_dir}/${UNIQUEID})
exten => 0000555,n,ExecIf($[${kls}>0]?UserEvent(Refresh1CHistory,Channel: ${chan},Date: ${date1}))
exten => 0000555,n,Hangup()