Страница 1 из 1

Чем * пишет CDR? Длина CallerID

Добавлено: 17 фев 2014, 14:15
murr
freepbx 2.11

Где и что можно подрихтовать, чтобы в таблицу CDR писался полный кириллический CallerID?

Из full-лога (оставлены только строки с CallerID):

Код: Выделить всё

[2014-02-17 11:29:20] VERBOSE[31512] res_agi.c:  /var/www/html/admin/modules/superfecta/agi/superfecta.agi: CID Superfecta: CID Determined to be: 'Лунина пр, 89 (с колоннами), Торговый флот Донбасс'
[2014-02-17 11:29:20] VERBOSE[31512] pbx.c:     -- Executing [380629406599201@from-trunk:5] Set("SIP/380629406599201-000000bb", "CALLERID(name)=Лунина пр, 89 (с колоннами), Торговый флот Донбасс") in new stack
[2014-02-17 11:29:20] VERBOSE[31512] pbx.c:     -- Executing [s@macro-user-callerid:30] Set("SIP/380629406599201-000000bb", "CALLERID(name)=Лунина пр, 89 (с колоннами), Торговый флот Донбасс") in new stack
[2014-02-17 11:29:20] VERBOSE[31512] pbx.c:     -- Executing [s@macro-user-callerid:33] Set("SIP/380629406599201-000000bb", "CDR(cnam)=Лунина пр, 89 (с колоннами), Торговый флот Донбасс") in new stack
[2014-02-17 11:29:21] VERBOSE[31512] res_agi.c:  dialparties.agi: Caller ID name is 'Лунина пр, 89 (с колоннами), Торговый флот Донбасс' number is '00629540824'
Т.е. определено верно и в процессе выполнения не меняется.

А это из логов MySQL

Код: Выделить всё

                  291 Query     INSERT INTO cdr (`calldate`,`clid`,`src`,`dst`,`dcontext`,`channel`,`dstchannel`,`lastapp`,`lastdata`,`duration`,`billsec`,`disposition`,`amaflags`,`uniqueid`,`did`,`recordingfile`,`cnum`,`cnam`) VALUES ('2014-02-17 11:29:19','\"Лунина пр, 89 (с колоннами), Торговый флот До.','00629540824','600','ext-group','SIP/380629406599201-000000bb','SIP/101-000000bc','Dial','SIP/101,15,tTrM(auto-blkvm)','3','0','NO ANSWER','3','1392629359.203','380629406599201','rg-600-00629540824-20140217-112920-1392629359.203.WAV','00629540824','Лунина пр, 89 (с колоннами), Торговый флот Донбасс')

                  288 Query     INSERT INTO cel (eventtype,eventtime,userdeftype,cid_name,cid_num,cid_ani,cid_rdnis,cid_dnid,exten,context,channame,ap
pname,appdata,amaflags,accountcode,peeraccount,uniqueid,linkedid,userfield,peer) VALUES ('CHAN_END',{ ts '2014-02-17 11:29:22'  },'','Dispetcher-101',' 101','101','','','600','from-internal','SIP/101-000000bc','AppDial','(Outgoing  Line)',3,'','','1392629361.204','1392629359.203','','')
Т.е. в запросе вставки записи в cel идет полное наименование, а в cdr обрезанное (еще и точечку ставит зараза).
Поле clid VARCHAR(500), UTF-8, utf_general_ci

Где-то оно регулируется? Ну кроме как в исходниках?
Базу с клиентами и телефонами трогать нельзя.

Re: Чем * пишет CDR? Длина CallerID

Добавлено: 17 фев 2014, 14:58
awsswa
а нет, надо смотреть исходники

Re: Чем * пишет CDR? Длина CallerID

Добавлено: 18 фев 2014, 10:49
virus_net
murr писал(а):Поле clid VARCHAR(500)
The CHAR and VARCHAR Types
Типы данных CHAR и VARCHAR
VARCHAR любой длины между 1 и 255.

Re: Чем * пишет CDR? Длина CallerID

Добавлено: 20 фев 2014, 18:06
murr
Решил так (может кому пригодится):
CDR пишутся у меня депрекативным cdr_mysql. Adaptive_odbc не пишет дату звонка в поле типа datetime с дефолтом "0000-00-00 ....", изменять поле на тип timestamp с дефолтом now() не стал - как к этому отнесется freepbx - хез.

Пришлось лезть в сорцы - как и предупреждали более знающие коллеги. Си не знаю в принципе, но решил попробовать.
В файле include/asterisk/cdr.c видим, что в структуре полей значение длины определяется константой AST_MAX_EXTENSION, размер которой задается в include/asterisk/channel.c как

Код: Выделить всё

#define AST_MAX_EXTENSION 80 /*!< Max length of an extension */
Поскольку эта константа используется в куче других мест, то завел новую:

Код: Выделить всё

#define AST_MAX_CLID 160 /*!< Max length of a callerID for mysql cdr */
и указал ее в cdr.c как значение длины поля

Код: Выделить всё

struct ast_cdr {
            /*! Caller*ID with text */
            char clid[AST_MAX_CLID];
После пересборки и инсталляции все заработало как надо, единственно, что потребовалось увеличить в таблице БД кроме поля clid еще и поле cnam.

Re: Чем * пишет CDR? Длина CallerID

Добавлено: 20 фев 2014, 18:16
murr
virus_net писал(а):
murr писал(а):Поле clid VARCHAR(500)
The CHAR and VARCHAR Types
Типы данных CHAR и VARCHAR
VARCHAR любой длины между 1 и 255.
Спасибо, поправлю. Это мои следы на дороге постижения способов борьбы с двухбайтовыми кодировками. :oops: