nginx解析一个命令的多个值

    由于开发需要,我需要在nginx的server块中一个命令,对应对各值,而且数量并不确定,于是乎,开始了漫长的寻找资料之旅,可是,一而再,再而三的失败,只能借助于手中的源代码了,悲哀阿,捷径是没有了,整理如下

/***********************************************************
****作者:周建业
****功能:获取server模块的配置命令
****时间:2014-10-28
***********************************************************/
#include<ngx_config.h>
#include<ngx_core.h>
#include<ngx_http.h>

/*  moudle config data  config*/
typedef struct
{
	/****存放链接数据库的用户名********************************/
	ngx_array_t*  DBUNameList;	
	/****存放链接数据库的密码*********************************/
	ngx_array_t* DBPwdList;
	/****存放链接数据库的数据库名称*****************************/
	ngx_array_t *DBSourceList;
	/****存放链接数据库的数据库地址*****************************/
	ngx_array_t *DBServerAddList;
	/****存放提供web服务的地址*********************************/
	ngx_array_t *IISServerList;
}ngx_dbcommandList;

#define  NGX_MAX_SERVER_COUNT 10
#define  NGX_MAX_CHAR_LEN     50
/***********函数声明部分*****************************************/
static char *
ngx_zjy_dbname(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);

static char *
ngx_zjy_dbpwd(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);

static char *
ngx_zjy_dbsource(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);

static char *
ngx_zjy_dbaddress(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);

static char *
ngz_zjy_iisserver(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);

static void *
ngx_zjy_create_srv_conf(ngx_conf_t *cf);

/**********ngx处理命令列表**************************************/

static ngx_command_t ngx_zjy_commands[]={
	{
		ngx_string("dbname"),
		NGX_HTTP_SRV_CONF|NGX_CONF_1MORE,
		ngx_zjy_dbname,
		NGX_HTTP_SRV_CONF_OFFSET,
		offsetof(ngx_dbcommandList,DBUNameList),
		NULL
	},
	{
		ngx_string("dbpwd"),
		NGX_HTTP_SRV_CONF|NGX_CONF_1MORE,
		ngx_zjy_dbpwd,
		NGX_HTTP_SRV_CONF_OFFSET,
		offsetof(ngx_dbcommandList,DBPwdList),
		NULL
	},
	{
		ngx_string("dbsource"),
		NGX_HTTP_SRV_CONF|NGX_CONF_1MORE,
		ngx_zjy_dbsource,
		NGX_HTTP_SRV_CONF_OFFSET,
		offsetof(ngx_dbcommandList,DBSourceList),
		NULL
	},
	{
		ngx_string("dbaddress"),
		NGX_HTTP_SRV_CONF|NGX_CONF_1MORE,
		ngx_zjy_dbaddress,
		NGX_HTTP_SRV_CONF_OFFSET,
		offsetof(ngx_dbcommandList,DBServerAddList),
		NULL
	},
	{
		ngx_string("iisserver"),
		NGX_HTTP_SRV_CONF|NGX_CONF_1MORE,
		ngz_zjy_iisserver,
		NGX_HTTP_SRV_CONF_OFFSET,
		offsetof(ngx_dbcommandList,IISServerList),
		NULL
	},
	ngx_null_command
};

static ngx_http_module_t ngx_zjy_moudle_ctx={
	NULL,
	NULL,
	NULL,
	NULL,
	ngx_zjy_create_srv_conf,//创建srv的时候调用,为我们需要的开辟空间
	NULL,
	NULL,
	NULL
};

/************************moudle info*********************************/
ngx_module_t ngx_zjy_moudle={
	NGX_MODULE_V1,
	&ngx_zjy_moudle_ctx,
	ngx_zjy_commands,
	NGX_HTTP_MODULE,
	NULL,
	NULL,
	NULL,
	NULL,
	NULL,
	NULL,
	NULL,
	NGX_MODULE_V1_PADDING
};
///
///函数名称:ngx_zjy_create_srv_conf
///函数描述:为我们存放命令项开辟内存空间
///
static void *
ngx_zjy_create_srv_conf(ngx_conf_t *cf)
{
        ngx_dbcommandList* cmdList=NULL;
	cmdList=ngx_pcalloc(cf->pool,sizeof(ngx_dbcommandList));
	//检测是否分配成功
	if(cmdList==NULL)
	{
		return NULL;
	}
	//初始化每个数组
	cmdList->DBUNameList=ngx_array_create(cf->pool,NGX_MAX_SERVER_COUNT,NGX_MAX_CHAR_LEN);
	if(cmdList->DBUNameList==NULL)
	{
		return NGX_CONF_ERROR;
	}
	
	cmdList->DBPwdList=ngx_array_create(cf->pool,NGX_MAX_SERVER_COUNT,NGX_MAX_CHAR_LEN);
	if(cmdList->DBPwdList==NULL)
	{
		return NGX_CONF_ERROR;
	}

	cmdList->DBSourceList=ngx_array_create(cf->pool,NGX_MAX_SERVER_COUNT,NGX_MAX_CHAR_LEN);
	if(cmdList->DBSourceList==NULL)
	{
		return NGX_CONF_ERROR;
	}
	
	cmdList->DBServerAddList=ngx_array_create(cf->pool,NGX_MAX_SERVER_COUNT,NGX_MAX_CHAR_LEN);
	if(cmdList->DBServerAddList==NULL)
	{
		return NGX_CONF_ERROR;
	}
	
	cmdList->IISServerList=ngx_array_create(cf->pool,NGX_MAX_SERVER_COUNT,NGX_MAX_CHAR_LEN);
	if(cmdList->IISServerList==NULL)
	{
		return NGX_CONF_ERROR;
	}
	ngx_log_stderr(0,"Initialize Sucessfully!");
	return cmdList;
}
///
///函数结束
///


///
///函数名称:ngx_zjy_dbname
///函数描述:开始解析我们填入的数据库用户名
///
static char *
ngx_zjy_dbname(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
{
	ngx_log_stderr(0,"we  begin to get dbname");
	ngx_dbcommandList* cmdList=conf;
	ngx_str_t *value;
	value=cf->args->elts;
	ngx_uint_t i=1;
	//我们i必须从1开始,因为0是命令项的名字
 	for( i=1;i<cf->args->nelts;i++)
	 {		
		ngx_str_t* sn=NULL;
		sn=ngx_array_push(cmdList->DBUNameList);
		if(sn==NULL)
		{
		    ngx_log_stderr(0,"ngx_array_push error");
		    return NGX_CONF_ERROR;
		}
		sn->data=value[i].data;
		sn->len=value[i].len;
		ngx_log_stderr(0,"the %d dbname is:%s",i,sn->data);
	 }
	 return NGX_CONF_OK;
}
///
///函数结束
///


///
///函数名称:ngx_zjy_dbpwd
///函数描述:开始解析我们填入的数据库密码
///
static char *
ngx_zjy_dbpwd(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
{
	ngx_log_stderr(0,"we  begin to get dbpwd");
	 ngx_dbcommandList* cmdList=conf;
         ngx_uint_t i=0;
	ngx_str_t* value=cf->args->elts;
	 for(i=1;i<cf->args->nelts;i++)
	 {
		ngx_str_t* sn=NULL;
		sn=ngx_array_push(cmdList->DBPwdList);
		sn->data=value[i].data;
		sn->len=value[i].len;
		ngx_log_stderr(0,"the %d dbpwd is:%s",i,sn->data);
	 }
	 return NGX_CONF_OK;
}
///
///函数结束
///



///
///函数名称:ngx_zjy_dbsource
///函数描述:开始解析我们填入的数据库名称
///
static char *
ngx_zjy_dbsource(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
{
	ngx_log_stderr(0,"we  begin to get dbsource");
	 ngx_dbcommandList* cmdList=conf;
	 ngx_uint_t i=0;
	ngx_str_t* value=cf->args->elts;
	 for( i=1;i<cf->args->nelts;i++)
	 {
		ngx_str_t* sn=NULL;
		sn=ngx_array_push(cmdList->DBSourceList);
		sn->data=value[i].data;
		sn->len=value[i].len;
		ngx_log_stderr(0,"the %d dbsource is:%s",i,sn->data);
	 }
	 return NGX_CONF_OK;
}
///
///函数结束
///


///
///函数名称:ngx_zjy_dbaddress
///函数描述:开始解析我们填入的数据库ip地址
///

static char *
ngx_zjy_dbaddress(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
{
	ngx_log_stderr(0,"we  begin to get dbaddress");
	 ngx_dbcommandList* cmdList=conf;
	 ngx_uint_t i=0;
	ngx_str_t* value=cf->args->elts;
	 for(i=1;i<cf->args->nelts;i++)
	 {
		ngx_str_t* sn=NULL;
		sn=ngx_array_push(cmdList->DBServerAddList);
		sn->data=value[i].data;
		sn->len=value[i].len;
		ngx_log_stderr(0,"the %d dbaddress is:%s",i,sn->data);
	 }
	 return NGX_CONF_OK;
}
///
///函数结束
///



///
///函数名称:ngz_zjy_iisserver
///函数描述:开始解析我们填入的web服务器地址
///
static char *
ngz_zjy_iisserver(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
{
	ngx_log_stderr(0,"we  begin to get iisserver");
	 ngx_dbcommandList* cmdList=conf;
	 ngx_uint_t i=0;
	ngx_str_t* value=cf->args->elts;
	 for( i=1;i<cf->args->nelts;i++)
	 {
		ngx_str_t* sn=NULL;
		sn=ngx_array_push(cmdList->IISServerList);
		sn->data=value[i].data;
		sn->len=value[i].len;
		ngx_log_stderr(0,"the %d IISServerList is:%s",i,sn->data);
	 }
	 return NGX_CONF_OK;
}
///
///函数结束
///


 

整个过程,其实就两个,一个是在create srv过程中分配内存,一个是在解析的时候的使用,好了,一天就这样过去了,不过还有收获阿,哈哈,测试通过

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

世纪殇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值