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

📄 search.c

📁 开放源码的ldap系统
💻 C
📖 第 1 页 / 共 2 页
字号:
/* *	 Copyright 1999, Dmitry Kovalev <mit@openldap.org>, All rights reserved. * *	 Redistribution and use in source and binary forms are permitted only *	 as authorized by the OpenLDAP Public License.	A copy of this *	 license is available at http://www.OpenLDAP.org/license.html or *	 in file LICENSE in the top-level directory of the distribution. */#include "portable.h"#ifdef SLAPD_SQL#include <stdio.h>#include <sys/types.h>#include <string.h>#include "slap.h"#include "back-sql.h"#include "sql-wrap.h"#include "schema-map.h"#include "entry-id.h"#include "util.h"int backsql_attrlist_add(backsql_srch_info *bsi,char *at_name){ char **p=bsi->attrs; int n_attrs=0; if (bsi->attrs==NULL)  return 1; while(*p) {  Debug(LDAP_DEBUG_TRACE,"==>backsql_attrlist_add(): attribute '%s' is in list\n",*p,0,0);  if (!strcasecmp(*p,at_name))   return 1;  n_attrs++;  p++; } Debug(LDAP_DEBUG_TRACE,"==>backsql_attrlist_add(): adding '%s' to list\n",at_name,0,0); bsi->attrs=(char**)ch_realloc(bsi->attrs,(n_attrs+2)*sizeof(char*)); bsi->attrs[n_attrs]=ch_strdup(at_name); bsi->attrs[n_attrs+1]=NULL; return 1;}void backsql_init_search(backsql_srch_info *bsi,backsql_info *bi,char *nbase,int scope,						 int slimit,int tlimit,time_t stoptime,Filter *filter,						 SQLHDBC dbh,BackendDB *be,Connection *conn,Operation *op,char **attrs){ char **p; bsi->base_dn=nbase; bsi->scope=scope; bsi->slimit=slimit; bsi->tlimit=tlimit; bsi->filter=filter; bsi->dbh=dbh; bsi->be=be; bsi->conn=conn; bsi->op=op; if (attrs!=NULL) {  bsi->attrs=(char**)ch_calloc(1,sizeof(char*));  bsi->attrs[0]=NULL;  for(p=attrs;*p!=NULL;p++)   backsql_attrlist_add(bsi,*p); } else  bsi->attrs=attrs; bsi->abandon=0; bsi->id_list=NULL; bsi->stoptime=stoptime; bsi->bi=bi; bsi->sel=NULL; bsi->from=NULL; bsi->join_where=NULL; bsi->flt_where=NULL; bsi->sel_len=0; bsi->from_len=0; bsi->jwhere_len=0; bsi->fwhere_len=0;}int backsql_process_filter_list(backsql_srch_info *bsi,Filter *f,int op){ char *sub_clause=NULL; int len=0,res; if (!f)  return 0; bsi->flt_where=backsql_strcat(bsi->flt_where,&bsi->fwhere_len,"(",NULL); while(1) {  res=backsql_process_filter(bsi,f);    f=f->f_next;  if (f==NULL)   break;  switch (op)  {   case LDAP_FILTER_AND:			bsi->flt_where=backsql_strcat(bsi->flt_where,&bsi->fwhere_len," AND ",NULL);			break;   case LDAP_FILTER_OR:			bsi->flt_where=backsql_strcat(bsi->flt_where,&bsi->fwhere_len," OR ",NULL);			break;  } }  bsi->flt_where=backsql_strcat(bsi->flt_where,&bsi->fwhere_len,")",NULL); return 1;}int backsql_process_sub_filter(backsql_srch_info *bsi,Filter *f){ int i; backsql_at_map_rec *at=backsql_at_with_name(bsi->oc,f->f_sub_desc->ad_cname->bv_val);  if (!f)  return 0; bsi->flt_where=backsql_strcat(bsi->flt_where,&bsi->fwhere_len,"(",NULL); if (bsi->bi->upper_func) {  bsi->flt_where=backsql_strcat(bsi->flt_where,&bsi->fwhere_len,	  bsi->bi->upper_func,"(",at->sel_expr,")",				" LIKE '",NULL); } else {  bsi->flt_where=backsql_strcat(bsi->flt_where,&bsi->fwhere_len,at->sel_expr,				" LIKE '",NULL); } if (f->f_sub_initial!=NULL) {  if (bsi->bi->upper_func)   {    bsi->flt_where=backsql_strcat(bsi->flt_where,&bsi->fwhere_len,ldap_pvt_str2upper(f->f_sub_initial->bv_val),NULL);   }   else    bsi->flt_where=backsql_strcat(bsi->flt_where,&bsi->fwhere_len,f->f_sub_initial->bv_val,NULL); } bsi->flt_where=backsql_strcat(bsi->flt_where,&bsi->fwhere_len,"%",NULL); if (f->f_sub_any!=NULL)  for(i=0;f->f_sub_any[i]!=NULL;i++)  {   //Debug(LDAP_DEBUG_TRACE,"==>backsql_process_sub_filter(): sub_any='%s'\n",f->f_sub_any[i]->bv_val,0,0);   if (bsi->bi->upper_func)   {    bsi->flt_where=backsql_strcat(bsi->flt_where,&bsi->fwhere_len,ldap_pvt_str2upper(f->f_sub_any[i]->bv_val),"%",NULL);   }   else    bsi->flt_where=backsql_strcat(bsi->flt_where,&bsi->fwhere_len,f->f_sub_any[i]->bv_val,"%",NULL);      } if (f->f_sub_final!=NULL)  if (bsi->bi->upper_func)   {    bsi->flt_where=backsql_strcat(bsi->flt_where,&bsi->fwhere_len,ldap_pvt_str2upper(f->f_sub_final->bv_val),NULL);   }   else    bsi->flt_where=backsql_strcat(bsi->flt_where,&bsi->fwhere_len,f->f_sub_final->bv_val,NULL); bsi->flt_where=backsql_strcat(bsi->flt_where,&bsi->fwhere_len,"')",NULL);  return 1;}int backsql_process_filter(backsql_srch_info *bsi,Filter *f){ backsql_at_map_rec *at; backsql_at_map_rec oc_attr={"objectClass","","",NULL,NULL,NULL,NULL}; char *at_name=NULL; int done=0,len=0; Debug(LDAP_DEBUG_TRACE,"==>backsql_process_filter()\n",0,0,0); if (f==NULL || f->f_choice==SLAPD_FILTER_COMPUTED)  {   return 0;  }   switch(f->f_choice) {  case LDAP_FILTER_OR:			backsql_process_filter_list(bsi,f->f_or,LDAP_FILTER_OR);			done=1;			break;  case LDAP_FILTER_AND:			backsql_process_filter_list(bsi,f->f_and,LDAP_FILTER_AND);			done=1;			break;  case LDAP_FILTER_NOT:			bsi->flt_where=backsql_strcat(bsi->flt_where,&bsi->fwhere_len,"NOT (",NULL);			backsql_process_filter(bsi,f->f_not);			bsi->flt_where=backsql_strcat(bsi->flt_where,&bsi->fwhere_len,")",NULL);			done=1;			break;  case LDAP_FILTER_PRESENT:			at_name=f->f_desc->ad_cname->bv_val;			break;  default:			 at_name=f->f_av_desc->ad_cname->bv_val;			break; }  if (done)  goto done; if (strcasecmp(at_name,"objectclass"))  at=backsql_at_with_name(bsi->oc,at_name); else {  at=&oc_attr;  at->sel_expr=backsql_strcat(at->sel_expr,&len,"'",bsi->oc->name,"'",NULL); } if (at==NULL) {  Debug(LDAP_DEBUG_TRACE,"backsql_process_filter(): attribute '%s' is not defined for objectclass '%s'\n",                      at_name,bsi->oc->name,0);  bsi->flt_where=backsql_strcat(bsi->flt_where,&bsi->fwhere_len," 1=0 ",NULL);  return -1; }			 backsql_merge_from_clause(&bsi->from,&bsi->from_len,at->from_tbls); //need to add this attribute to list of attrs to load, so that we could do test_filter() later backsql_attrlist_add(bsi,at_name); if (at->join_where != NULL && strstr(bsi->join_where,at->join_where)==NULL)  bsi->join_where=backsql_strcat(bsi->join_where,&bsi->jwhere_len," AND ",at->join_where,NULL); //if (at!=&oc_attr) // bsi->sel=backsql_strcat(bsi->sel,&bsi->sel_len,",",at->sel_expr," AS ",at->name,NULL); switch(f->f_choice) {  case LDAP_FILTER_EQUALITY:			//maybe we should check type of at->sel_expr here somehow,			//to know whether upper_func is applicable, but for now			//upper_func stuff is made for Oracle, where UPPER is			//safely applicable to NUMBER etc.			if (bsi->bi->upper_func)			bsi->flt_where=backsql_strcat(bsi->flt_where,&bsi->fwhere_len,"(",					bsi->bi->upper_func,"(",at->sel_expr,")='",						ldap_pvt_str2upper(f->f_av_value->bv_val),"')",NULL);			else			 bsi->flt_where=backsql_strcat(bsi->flt_where,&bsi->fwhere_len,"(",at->sel_expr,"='",							f->f_av_value->bv_val,"')",NULL);			break;  case LDAP_FILTER_GE:			bsi->flt_where=backsql_strcat(bsi->flt_where,&bsi->fwhere_len,"(",at->sel_expr,">=",							f->f_av_value->bv_val,")",NULL);			break;  case LDAP_FILTER_LE:			bsi->flt_where=backsql_strcat(bsi->flt_where,&bsi->fwhere_len,"(",at->sel_expr,"<=",							f->f_av_value->bv_val,")",NULL);			break;  case LDAP_FILTER_PRESENT:			bsi->flt_where=backsql_strcat(bsi->flt_where,&bsi->fwhere_len,"NOT (",at->sel_expr,						" IS NULL)",NULL);			break;  case LDAP_FILTER_SUBSTRINGS:			backsql_process_sub_filter(bsi,f);			break; }done: if (oc_attr.sel_expr!=NULL)  free(oc_attr.sel_expr); Debug(LDAP_DEBUG_TRACE,"<==backsql_process_filter()\n",0,0,0); return 1;}char* backsql_srch_query(backsql_srch_info *bsi){ char *query=NULL; int q_len=0; Debug(LDAP_DEBUG_TRACE,"==>backsql_srch_query()\n",0,0,0); bsi->sel=NULL; bsi->from=NULL; bsi->join_where=NULL; bsi->flt_where=NULL;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -