⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 write_data_file.c

📁 在asterisk平台写注册命令的程序
💻 C
📖 第 1 页 / 共 2 页
字号:
//********************************************************************
 // 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 + -