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

📄 write_data_file.c

📁 在asterisk平台写注册命令的程序
💻 C
📖 第 1 页 / 共 2 页
字号:

			}
		}
	}
	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 + -