📄 search.c
字号:
/* * 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 + -