📄 write_data_file.c
字号:
//********************************************************************
// author: wangqiang
// time : 2006-08-14
// title: write file data from database with console command 'dbfile reload'
//**********************************************************************
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <signal.h>
#include <libpq-fe.h>
#include "asterisk.h"
ASTERISK_FILE_VERSION(__FILE__, "$Revision: 14235 $")
#include "asterisk/lock.h"
#include "asterisk/channel.h"
#include "asterisk/write_data_file.h"
#include "asterisk/logger.h"
#include "asterisk/callerid.h"
#include "asterisk/causes.h"
#include "asterisk/options.h"
#include "asterisk/linkedlists.h"
#include "asterisk/utils.h"
#include "asterisk/sched.h"
#include "asterisk/config.h"
#include "asterisk/cli.h"
#include "asterisk/module.h"
//----------------------------------------------------------------------------------------
static struct sched_context *sched;
ast_mutex_t postgreslock;
PGconn *fileconn=NULL;
AST_MUTEX_DEFINE_STATIC(dbfile_batch_lock);
PGresult* execsql(char * sql,PGresult *result)
{
ast_mutex_lock(&postgreslock);
result=PQexec(fileconn, sql);
ast_mutex_unlock(&postgreslock);
if (PQresultStatus(result) == PGRES_FATAL_ERROR)
{
ast_log(LOG_WARNING,"%s\n",PQerrorMessage(fileconn));
PQclear(result);
return NULL;
}
else
return result;
}
static void freefilefuction(struct file_data *ptr)
{
if(ptr!=NULL)
{
free(ptr);
ptr=NULL;
}
}
static struct read_data_db* freesipfunction(struct read_data_db *ptr)
{
ast_log(LOG_WARNING,"sip is relaxing\n");
if(ptr->sipdbptr!=NULL)
{
free(ptr->sipdbptr);
ptr->sipdbptr=NULL;
}
return ptr;
}
static struct read_data_db* freeextionfunction(struct read_data_db *ptr)
{
ast_log(LOG_WARNING,"extension is relaxing\n");
if(ptr->extensionsdbptr!=NULL)
{
free(ptr->extensionsdbptr);
ptr->extensionsdbptr=NULL;
}
return ptr;
}
static struct read_data_db* freevoicefunction(struct read_data_db *ptr )
{
ast_log(LOG_WARNING,"voice is relaxing\n");
if(ptr->voicedbptr!=NULL)
{
free(ptr->voicedbptr);
ptr->voicedbptr=NULL;
}
return ptr;
}
static struct read_data_db* write_head_file(struct read_data_db *ptr,FILE *f)
{
int i;
for(i=0;i<ptr->file_row_num;i++)
{
fputs(ptr->fileptr[i].sbuf,f);
fputs("\n",f);
}
ptr->file_data_ptr=f;
return ptr;
}
static char* get_voicemail_head(char *buf)
{
char sbuf[34],sname[34];
memset(sbuf,0,sizeof(sbuf));
memset(sname,0,sizeof(sname));
strcpy(sbuf,buf);
strcat(sname,"[");
strcat(sname,sbuf);
strcat(sname,"]");
memset(gloabbuf,0,sizeof(gloabbuf));
strcpy(gloabbuf,sname);
return gloabbuf;
}
static char* get_voicemail_body_data(char* s1,char* s2,char * s3,char * s4,char* s5)
{
char sbuf[128];
strcpy(sbuf,s1);
strcat(sbuf," ");
strcat(sbuf,"=>");
strcat(sbuf," ");
strcat(sbuf,s2);
strcat(sbuf,","); //s1 => s2,s3,s4,s5
/*if(s2=="$$")
strcat(sbuf,"");
else*/
strcat(sbuf,s2);
strcat(sbuf,",");
/*if(s3=="$$")
strcat(sbuf,"");
else*/
strcat(sbuf,s3);
strcat(sbuf,",");
/*if(s4=="$$")
strcat(sbuf,"");
else*/
strcat(sbuf,s4);
strcat(sbuf,",");
strcat(sbuf,s5);
strcpy(gloabbuf,sbuf);
return gloabbuf;
}
static struct read_data_db* write_voicemail_file(struct read_data_db *ptr,char *filepath)
{
int i;char buf[34];
char sbuf[128];
struct read_data_db *vptr;
FILE *fp=NULL,*fp2;
fp=fopen(filepath,"w+");
if(fp==NULL)
{
ast_log(LOG_WARNING,"File don't open!\n");
ptr->errorflag=0;//文件打不开标志
return ptr;
}
vptr=write_head_file(ptr,fp);
fp2=vptr->file_data_ptr;
if(vptr->voicemail_number==0)
{
ast_log(LOG_WARNING,"voicemail_file NO recorder!\n");
vptr->errorflag=0;//内存中没有取出记录
fclose(fp2);
return vptr;
}
memset(buf,0,sizeof(buf));
strcpy(buf,get_voicemail_head(vptr->voicedbptr[0].context));
fputs(buf,fp2);
fputs("\n",fp2);
for(i=0;i<vptr->voicemail_number;i++) //暂时先传这几个
{
strcpy( sbuf,get_voicemail_body_data(vptr->voicedbptr[i].mailbox,vptr->voicedbptr[i].password,vptr->voicedbptr[i].fullname,vptr->voicedbptr[i].email,vptr->voicedbptr[i].pager) ) ;
fputs(sbuf,fp2);
fputs("\n",fp2);
memset(sbuf,0,sizeof(sbuf));
}
ptr->errorflag=1;
fclose(fp2);
return vptr;
}
static char* get_extension_head(char *buf)
{
char sbuf[34],sname[34];
memset(sbuf,0,sizeof(sbuf));
//strcpy(sbuf,"[LOCAL_ASSESS]");
strcpy(sbuf,buf);
strcpy(sname,"[");
strcat(sname,sbuf);
strcat(sname,"]");
strcpy(gloabbuf,sname);
return gloabbuf;
}
static char* get_extension_body_data(char *exten,char *priority,char *app)
{
char sbuf[128];
strcpy(sbuf,"exten");
strcat(sbuf," ");
strcat(sbuf,"=>");
strcat(sbuf," ");
strcat(sbuf,exten);
strcat(sbuf,",");
strcat(sbuf,priority);
strcat(sbuf,",");
strcat(sbuf,app);
strcpy(gloabbuf,sbuf);
return gloabbuf;
}
static struct read_data_db* write_extension_file(struct read_data_db *ptr,char *filepath)
{
int i;char buf[34];
struct read_data_db *eptr;
FILE *fp=NULL,*fp2;
fp=fopen(filepath,"w");
if(fp==NULL)
{
ast_log(LOG_WARNING,"File don't open!\n");
ptr->errorflag=0;//文件打不开标志
return ptr;
}
eptr=write_head_file(ptr,fp);
fp2=eptr->file_data_ptr;
if(eptr->extensions_number==0)
{
ast_log(LOG_WARNING,"File don't open!\n");
eptr->errorflag=0;//内存中没有取出记录
fclose(fp2);
return eptr;
}
memset(buf,0,sizeof(buf));
strcpy(buf,get_extension_head(eptr->extensionsdbptr[0].context));
fputs(buf,fp2);
fputs("\n",fp2);
memset(buf,0,sizeof(buf));
for(i=0;i<eptr->extensions_number;i++)
{
strcpy(buf,get_extension_body_data(eptr->extensionsdbptr[i].exten,eptr->extensionsdbptr[i].priority,eptr->extensionsdbptr[i].app));
if(strcmp(eptr->extensionsdbptr[i].appdata,"$$")!=0)
{
strcat(buf,"(");
strcat(buf,eptr->extensionsdbptr[i].appdata);
strcat(buf,")");
}
fputs(buf,fp2);
fputs("\n",fp2);
}
fputs("\0",fp2);
ptr->errorflag=1;
fclose(fp2);
return eptr;
}
static char * getsipcharacter(char * f)
{
char buf[34];
strcpy(buf," = ");
strcat(buf,f);
strcpy(gloabbuf,buf);
return gloabbuf;
}
static char * write_sip_body_file(char * sbuf,int i)
{
char buf[34];char sname[64];
strcpy(buf,sbuf);
switch(i)
{
case 0:
memset(sname,0,sizeof(sname));
strcpy(sname,"type");
strcat(sname,getsipcharacter(buf));
break;
case 1:
memset(sname,0,sizeof(sname));
strcpy(sname,"username");
strcat(sname,getsipcharacter(buf));
break;
case 2:
memset(sname,0,sizeof(sname));
strcpy(sname,"secret");
strcat(sname,getsipcharacter(buf));
break;
case 3:
memset(sname,0,sizeof(sname));
strcpy(sname,"host");
strcat(sname,getsipcharacter(buf));
break;
case 4:
memset(sname,0,sizeof(sname));
strcpy(sname,"context");
strcat(sname,getsipcharacter(buf));
break;
case 5:
memset(sname,0,sizeof(sname));
strcpy(sname,"dtmfmode");
strcat(sname,getsipcharacter(buf));
break;
case 6:
memset(sname,0,sizeof(sname));
strcpy(sname,"nat");
strcat(sname,getsipcharacter(buf));
break;
}
strcpy(gloabbuf,sname);
return gloabbuf;
}
static struct read_data_db* write_sip_file(struct read_data_db *ptr,char *filepath)
{
int i;char sbuf[34];
struct read_data_db *sptr;
FILE *fp=NULL,*fp2;
fp=fopen(filepath,"w");
if(fp==NULL)
{
ast_log(LOG_WARNING,"File don't open!\n");
ptr->errorflag=0;//文件打不开标志
return ptr;
}
sptr=write_head_file(ptr,fp);
fp2=sptr->file_data_ptr;
for(i=0;i<sptr->sip_number;i++)
{
fputs("[",fp2);
fputs(sptr->sipdbptr[i].name,fp2);
fputs("]",fp2);
fputs("\n",fp2);
strcpy(sbuf,write_sip_body_file(sptr->sipdbptr[i].type,0));
fputs(sbuf,fp2);
fputs("\n",fp2);
memset(sbuf,0,sizeof(sbuf));
strcpy(sbuf,write_sip_body_file(sptr->sipdbptr[i].username,1));
fputs(sbuf,fp2);
fputs("\n",fp2);
memset(sbuf,0,sizeof(sbuf));
strcpy(sbuf,write_sip_body_file(sptr->sipdbptr[i].secret,2));
fputs(sbuf,fp2);
fputs("\n",fp2);
memset(sbuf,0,sizeof(sbuf));
strcpy(sbuf,write_sip_body_file(sptr->sipdbptr[i].host,3));
fputs(sbuf,fp2);
fputs("\n",fp2);
memset(sbuf,0,sizeof(sbuf));
strcpy(sbuf,write_sip_body_file(sptr->sipdbptr[i].context,4));
fputs(sbuf,fp2);
fputs("\n",fp2);
memset(sbuf,0,sizeof(sbuf));
strcpy(sbuf,write_sip_body_file(sptr->sipdbptr[i].dtmfmode,5));
fputs(sbuf,fp2);
fputs("\n",fp2);
memset(sbuf,0,sizeof(sbuf));
strcpy(sbuf,write_sip_body_file(sptr->sipdbptr[i].nat,6));
fputs(sbuf,fp2);
fputs("\n\n",fp2);
}
ptr->errorflag=1;
fclose(fp2);
return sptr;
}
//共用的读文件函数
static struct read_data_db * _read_file(struct read_data_db *ptr,char *filepath)
{
ast_log(LOG_WARNING,"so is coming!!!!!!\n");
//char* buf=NULL;
char buf[1024];
FILE* fp=NULL ;
int j;
int i=2;
fp=fopen(filepath, "r");
if(fp==NULL)
{
ast_log(LOG_WARNING,"File don't open!\n");
ptr->errorflag=0;
return ptr;
}
FINDONEMEMORY(ptr->fileptr,file_data);
memset(ptr->fileptr,0,sizeof(struct file_data));
ast_log(LOG_WARNING,"File have open \n");
while(fgets(buf, BUFSIZE, fp))
{
if(!strncmp(buf,"\n",2))
continue;
strcpy(ptr->fileptr[i-2].sbuf,buf);
FINDNEXTMEMORY(ptr->fileptr,file_data,i);
i++;
if(strncmp(buf,";[end_general]",14)==0)
break;
memset(buf,0,sizeof(buf));
}
ptr->file_row_num=i-2;
for(j=0;j<ptr->file_row_num;j++)
{
ast_log(LOG_WARNING,"%s\n",ptr->fileptr[j].sbuf);
}
ast_log(LOG_WARNING,"文件将要被关闭!!\n");
fclose(fp);
ptr->errorflag=1;
return ptr;
}
static struct read_data_db* getvoicemaildata(struct read_data_db *ptr,PGresult *db_res)
{
PGresult *res;int i,j;
char sbuf[512];int nrows;
memset(sbuf,0,sizeof(sbuf));
sprintf(sbuf,"select customer_id,context,mailbox,\"password\",fullname,email,pager from voicemail;");
res=execsql(sbuf,db_res);
if(res==NULL)
{
ptr->unvoicemailflag=1;
return ptr;
}
nrows=PQntuples(res);
ptr->voicemail_number=nrows;
if(nrows==0)
{
ast_log(LOG_WARNING,"voicemail table no record!!\n");
ptr->unvoicemailflag=1;
return ptr;
}
memset(sbuf,0,sizeof(sbuf));
FINDMAXMEMORY(ptr->voicedbptr,voicemail_db,ptr->voicemail_number);
memset(ptr->voicedbptr,0,sizeof(struct voicemail_db));
for(i=0;i<nrows;i++)
{
for(j=0;j<PQnfields(res);j++)
{
strcpy(sbuf,PQfname(res,j));
if(!strcmp(sbuf,"customer_id"))
{
strcpy(ptr->voicedbptr[i].custom_id,PQgetvalue(res, i, j));
}
if(!strcmp(sbuf,"context"))
{
strcpy(ptr->voicedbptr[i].context,PQgetvalue(res, i, j));
}
if(!strcmp(sbuf,"mailbox"))
{
strcpy(ptr->voicedbptr[i].mailbox,PQgetvalue(res, i, j));
}
if(!strcmp(sbuf,"password"))
{
if(!PQgetisnull(res,i,j))
strcpy(ptr->voicedbptr[i].password,PQgetvalue(res, i, j));
else
strcpy(ptr->voicedbptr[i].password," ");
}
if(!strcmp(sbuf,"fullname"))
{
if(!PQgetisnull(res,i,j))
strcpy(ptr->voicedbptr[i].fullname,PQgetvalue(res, i, j));
else
strcpy(ptr->voicedbptr[i].fullname," ");
}
if(!strcmp(sbuf,"email"))
{
if(!PQgetisnull(res,i,j))
strcpy(ptr->voicedbptr[i].email,PQgetvalue(res, i, j));
else
strcpy(ptr->voicedbptr[i].email," ");
}
if(!strcmp(sbuf,"pager"))
{
if(!PQgetisnull(res,i,j))
strcpy(ptr->voicedbptr[i].pager,PQgetvalue(res, i, j));
else
strcpy(ptr->voicedbptr[i].pager," ");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -