📄 write_data_file.c
字号:
}
}
}
ptr->unvoicemailflag=2;
PQclear(res);
return ptr;
}
static struct read_data_db* getextensiondata(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 context,exten,priority,app,appdata from extensions;");
res=execsql(sbuf,db_res);
if(res==NULL)
{
ptr->unextensionflag=1;
return ptr;
}
nrows=PQntuples(res);
ptr->extensions_number=nrows;
if(nrows==0)
{
ast_log(LOG_WARNING,"extensions table no record!!\n");
ptr->unextensionflag=1;
return ptr;
}
memset(sbuf,0,sizeof(sbuf));
FINDMAXMEMORY(ptr->extensionsdbptr,extensions_db,ptr->extensions_number);
memset(ptr->extensionsdbptr,0,sizeof(struct extensions_db));
for(i=0;i<nrows;i++)
{
for(j=0;j<PQnfields(res);j++)
{
strcpy(sbuf,PQfname(res,j));
if(!strcmp(sbuf,"context"))
{
strcpy(ptr->extensionsdbptr[i].context,PQgetvalue(res, i, j));
}
if(!strcmp(sbuf,"exten"))
{
strcpy(ptr->extensionsdbptr[i].exten,PQgetvalue(res, i, j));
}
if(!strcmp(sbuf,"priority"))
{
strcpy(ptr->extensionsdbptr[i].priority,PQgetvalue(res, i, j));
}
if(!strcmp(sbuf,"app"))
{
strcpy(ptr->extensionsdbptr[i].app,PQgetvalue(res, i, j));
}
if(!strcmp(sbuf,"appdata"))
{
if(!PQgetisnull(res,i,j))
strcpy(ptr->extensionsdbptr[i].appdata,PQgetvalue(res, i, j));
else
strcpy(ptr->extensionsdbptr[i].appdata,"$$"); //如果appdata为空,就用$$符号
}
}
}
ptr->unextensionflag=2;
PQclear(res);
return ptr;
}
static struct read_data_db* getsipdata(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 name,\"type\",username,secret,host,context,dtmfmode,nat from sip;");
res=execsql(sbuf,db_res);
if(res==NULL)
{
ptr->unsipflag=1;
return ptr;
}
nrows=PQntuples(res);
ptr->sip_number=nrows;
if(nrows==0)
{
ast_log(LOG_WARNING,"Sip table no record!!\n");
ptr->unsipflag=1;
return ptr;
}
memset(sbuf,0,sizeof(sbuf));
FINDMAXMEMORY(ptr->sipdbptr,sip_db,nrows);
memset(ptr->sipdbptr,0,sizeof(struct sip_db)*nrows);
for(i=0;i<nrows;i++)
{
for(j=0;j<PQnfields(res);j++)
{
strcpy(sbuf,PQfname(res,j));
if(!strcmp(sbuf,"name"))
{
strcpy(ptr->sipdbptr[i].name,PQgetvalue(res, i, j));
}
if(!strcmp(sbuf,"type"))
{
strcpy(ptr->sipdbptr[i].type,PQgetvalue(res, i, j));
}
if(!strcmp(sbuf,"username"))
{
strcpy(ptr->sipdbptr[i].username,PQgetvalue(res, i, j));
}
if(!strcmp(sbuf,"secret"))
{
strcpy(ptr->sipdbptr[i].secret,PQgetvalue(res, i, j));
}
if(!strcmp(sbuf,"host"))
{
strcpy(ptr->sipdbptr[i].host,PQgetvalue(res, i, j));
}
if(!strcmp(sbuf,"context"))
{
strcpy(ptr->sipdbptr[i].context,PQgetvalue(res, i, j));
}
if(!strcmp(sbuf,"dtmfmode"))
{
strcpy(ptr->sipdbptr[i].dtmfmode,PQgetvalue(res, i, j));
}
if(!strcmp(sbuf,"nat"))
{
strcpy(ptr->sipdbptr[i].nat,PQgetvalue(res, i, j));
}
}
}
ptr->unsipflag=2;
PQclear(res);
return ptr;
}
static int unlinkfile(char * path)
{
int res;
res=unlink(path);
return res;
}
static int cpfile(const char * source,const char* dest)
{
FILE *fs=NULL,*fd=NULL;
char buff[1024];
int n=0;
fs=fopen(source,"r");
if(fs==NULL)
return -1;
fd=fopen(dest,"w+");
if(fd==NULL)
{
fclose(fs);
return -1;
}
while(fgets(buff, BUFSIZE, fs))
{
fputs(buff,fd);
//fputs("\n",fd);
}
/* while(1)
{
if(!feof(fs)&&(n=fread(buff,sizeof(char),sizeof(buff),fs))>=0)
{
fwrite(buff,sizeof(char),sizeof(buff),fd);
}
else
if(feof(fs))
{
fclose(fd);
fclose(fs);
return 0;
}
else
{
fclose(fd);
fclose(fs);
return -1;
}
}*/
fclose(fs);
fclose(fd);
return n;
}
static int write_exec_data(void)
{
char sip_file[64],extention_file[64],voicemail_file[64];
char sip_temp[64],extention_temp[64],voicemail_temp[64];
PGresult *result=NULL;
struct read_data_db *dbptr;
FINDONEMEMORY(dbptr,read_data_db);
strcpy(sip_file,sipdirectory);
strcpy(sip_temp,sipdirectory);
strcat(sip_file,"sip.conf");
strcat(sip_temp,"~sip.conf");
strcpy(extention_file,extensiondirectory);
strcpy(extention_temp,extensiondirectory);
strcat(extention_file,"extensions.conf");
strcat(extention_temp,"~extensions.conf");
strcpy(voicemail_file,voicemaildirectory);
strcpy(voicemail_temp,voicemaildirectory);
strcat(voicemail_file,"voicemail.conf");
strcat(voicemail_temp,"~voicemail1.conf");
memset(dbptr,0,sizeof(struct read_data_db));
//写sip文件
dbptr=_read_file(dbptr,sip_file);
if(dbptr->errorflag!=0)
{
dbptr=getsipdata(dbptr,result);
dbptr=write_sip_file(dbptr,sip_temp);
freefilefuction(dbptr->fileptr);
}
//写extention文件
dbptr=_read_file(dbptr,extention_file);
if(dbptr->errorflag!=0)
{
ast_log(LOG_WARNING, "extension file is copying data into struct!!!!\n");
dbptr=getextensiondata(dbptr,result);
ast_log(LOG_WARNING, "extension file is copying data into struct!!!!\n");
dbptr=write_extension_file(dbptr,extention_temp);
ast_log(LOG_WARNING, "extension file is releaseing data !!!!\n");
freefilefuction(dbptr->fileptr);
}
//写voicemail文件
ast_log(LOG_WARNING, "voicemail file is starting!!!!\n");
dbptr=_read_file(dbptr,voicemail_file);
if(dbptr->errorflag!=0)
{
ast_log(LOG_WARNING, "voicemail file is copying data into struct!!!!\n");
dbptr=getvoicemaildata(dbptr,result);
dbptr=write_voicemail_file(dbptr,voicemail_temp);
freefilefuction(dbptr->fileptr);
}
if(cpfile(sip_temp,sip_file)!=-1)
unlinkfile(sip_temp);
if(cpfile(extention_temp,extention_file)!=-1)
unlinkfile(extention_temp);
if(cpfile(voicemail_temp,voicemail_file)!=-1)
unlinkfile(voicemail_temp);
ast_log(LOG_WARNING, "program is freeing memory!!!!\n");
if(dbptr->unsipflag!=1)
dbptr=freesipfunction(dbptr);
if(dbptr->unextensionflag!=1)
dbptr=freeextionfunction(dbptr);
if(dbptr->unvoicemailflag!=1)
dbptr=freevoicefunction(dbptr);
free(dbptr);
dbptr=NULL;
}
static int do_reload(int fd, int argc, char *argv[])
{
int x;
int res;
if (argc < 1)
return RESULT_SHOWUSAGE;
if (argc > 2)
{
for (x=2;x<argc;x++)
{
res = ast_module_reload(argv[x]);
switch(res)
{
case 0:
ast_cli(fd, "No such module '%s'\n", argv[x]);
break;
case 1:
ast_cli(fd, "Module '%s' does not support reload\n", argv[x]);
break;
}
}
} else
ast_module_reload(NULL);
return RESULT_SUCCESS;
}
static int freedbconn()
{
if(!idbflag&&fileconn!=NULL)
{
PQfinish(fileconn);
fileconn=NULL;
}
}
static int handle_dbfile_status(int fd, int argc, char *argv[])
{
if (argc > 2)
return RESULT_SHOWUSAGE;
write_exec_data();
do_reload(fd,argc,argv);
return 0;
}
static struct ast_cli_entry dbfile_status = {
.cmda = { "dbfile", "reload", NULL },
.handler = handle_dbfile_status,
.summary = "copy data from db to config file",
.usage =
"Usage: dbfile reload\n"
" Displays :copy data from db to config file.\n"
};
int dbfile_init(void)
{
int res=0;
sched = sched_context_create();
if (!sched) {
ast_log(LOG_ERROR, "Unable to create schedule context.\n");
return -1;
}
getfiledirectory();
idbflag=db_check_connected(); //xxxx
if(idbflag==-1)
return res;
ast_cli_register(&dbfile_status);
return res;
}
void dbfile_reload(void)
{
//do_reload();
ast_log(LOG_WARNING, "database program is coming into second \n");
}
int db_check_connected(void)
{
int connected=0;
char *stconn;
char infostr[1024];
memset(infostr,0,sizeof(infostr));
stconn=get_db_character();
strcpy(infostr,stconn);
ast_log(LOG_WARNING,"database is %s\n",infostr);
//conn=PQconnectdb("hostaddr=\'127.0.0.1\' dbname=\'billon_db\' user=\'postgres\' password=\'server\'");
fileconn=PQconnectdb(infostr);
if(PQstatus(fileconn) == CONNECTION_BAD)
{
connected=-1;
ast_log(LOG_WARNING,"database unconnected!!!!\n");
}
else
{
connected=0;
ast_log(LOG_WARNING,"database connected!!!\n");
}
if(connected==-1)
{
sleep(2);
fileconn=PQconnectdb(infostr);
if(PQstatus(fileconn) == CONNECTION_BAD)
{
connected=-1;
}
else
connected=0;
}
return connected;
}
void getfiledirectory(void)
{
struct ast_config *cfg;int res=0;
ast_mutex_lock(&dbfile_batch_lock);
if ((cfg = ast_config_load("cdr_pgsql.conf")))
{
if ((strcpy(sipdirectory ,ast_variable_retrieve(cfg, "FILEPATH", "sipdir"))))
{
ast_log(LOG_WARNING,"PostgreSQL server hostname not specified. %s\n",sipdirectory);
//ast_true(sipdirectory);
}
else
res=-1;
if ((strcpy(extensiondirectory ,ast_variable_retrieve(cfg, "FILEPATH", "extensionsdir"))))
{
ast_log(LOG_WARNING,"PostgreSQL server hostname not specified. %s\n",extensiondirectory);
//ast_true(extensiondirectory);
}
else
res=-1;
if ((strcpy(voicemaildirectory ,ast_variable_retrieve(cfg, "FILEPATH", "voicemaildir"))))
{
ast_log(LOG_WARNING,"PostgreSQL server hostname not specified. %s\n",voicemaildirectory);
//ast_true(voicemaildirectory);
}
else
res=-1;
}
if(res==-1)
{
strcpy(sipdirectory,"/etc/asterisk/");
strcpy(extensiondirectory,"/etc/asterisk/");
strcpy(voicemaildirectory,"/etc/asterisk/");
}
ast_mutex_unlock(&dbfile_batch_lock);
ast_config_destroy(cfg);
}
char* get_db_character(void)
{
struct ast_config *cfg;
memset(infostr,0,sizeof(infostr));
int res=0;
char phostname[64],pdbport[64],pdbuser[64],ppassword[64],pdbname[64];
ast_mutex_lock(&dbfile_batch_lock);
if ((cfg = ast_config_load("cdr_pgsql.conf")))
{
if ((strcpy(phostname ,ast_variable_retrieve(cfg, "FILE", "hostname"))))
{
ast_log(LOG_WARNING,"PostgreSQL server hostname not specified. %s\n",phostname);
ast_true(phostname);
}
else
res=-1;
if ((strcpy(pdbname , ast_variable_retrieve(cfg, "FILE", "dbname"))))
{
ast_log(LOG_WARNING,"PostgreSQL server hostname not specified. %s\n",pdbname);
ast_true(pdbname);
}
else
res=-1;
if ((strcpy(pdbuser,ast_variable_retrieve(cfg, "FILE", "user"))))
{
ast_log(LOG_WARNING,"PostgreSQL server hostname not specified. %s\n",pdbuser);
ast_true(pdbuser);
}
else
res=-1;
if ((strcpy(ppassword,ast_variable_retrieve(cfg, "FILE", "password"))))
{
ast_log(LOG_WARNING,"PostgreSQL server hostname not specified. %s\n",ppassword);
ast_true(ppassword);
}
else
res=-1;
if ((strcpy(pdbport,ast_variable_retrieve(cfg, "FILE", "port"))))
{
ast_log(LOG_WARNING,"PostgreSQL server hostname not specified. %s\n",pdbport);
ast_true(pdbport);
}
else
res=-1;
}
if(res==-1)
{
strcpy(phostname,"10.2.1.97");
strcpy(pdbport,"5432");
strcpy(pdbname,"postgres");
strcpy(pdbuser,"postgres");
strcpy(ppassword,"server");
}
ast_mutex_unlock(&dbfile_batch_lock);
ast_config_destroy(cfg);
snprintf(infostr,sizeof(infostr),"hostaddr=\'%s\' port=\'%s\' dbname=\'%s\' user=\'%s\' password=\'%s\'",phostname,pdbport,pdbname,pdbuser,ppassword);
ast_log(LOG_WARNING,"database is %s\n",infostr);
return infostr;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -