2 * Copyright 2000, OpenLDAP Foundation, All Rights Reserved.
3 * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
9 #include "LDAPSearchRequest.h"
10 #include "LDAPException.h"
11 #include "LDAPSearchReference.h"
12 #include "LDAPResult.h"
13 #include "LDAPRequest.h"
18 LDAPSearchRequest::LDAPSearchRequest(const LDAPSearchRequest& req ) :
20 DEBUG(LDAP_DEBUG_CONSTRUCT,
21 "LDAPSearchRequest::LDAPSearchRequest(&)" << endl);
24 m_filter=req.m_filter;
26 m_attrsOnly=req.m_attrsOnly;
30 LDAPSearchRequest::LDAPSearchRequest(const string& base, int scope,
31 const string& filter, const StringList& attrs, bool attrsOnly,
32 LDAPAsynConnection *connect,
33 const LDAPConstraints* cons, bool isReferral,
34 const LDAPRequest* parent)
35 : LDAPRequest (connect,cons,isReferral,parent) {
37 DEBUG(LDAP_DEBUG_CONSTRUCT,
38 "LDAPSearchRequest:LDAPSearchRequest()" << endl);
39 DEBUG(LDAP_DEBUG_CONSTRUCT & LDAP_DEBUG_PARAMETER,
40 " base:" << base << endl << " scope:" << scope << endl
41 << " filter:" << filter << endl);
42 m_requestType=LDAPRequest::SEARCH;
43 //insert some validating and copying here
47 m_filter="objectClass=*";
52 m_attrsOnly=attrsOnly;
55 LDAPSearchRequest::~LDAPSearchRequest(){
56 DEBUG(LDAP_DEBUG_DESTROY, "LDAPSearchRequest::~LDAPSearchRequest" << endl);
59 LDAPMessageQueue* LDAPSearchRequest::sendRequest(){
61 DEBUG(LDAP_DEBUG_TRACE, "LDAPSearchRequest::sendRequest()" << endl);
62 timeval* tmptime=m_cons->getTimeoutStruct();
63 char** tmpattrs=m_attrs.toCharArray();
64 LDAPControl** tmpSrvCtrl=m_cons->getSrvCtrlsArray();
65 LDAPControl** tmpClCtrl=m_cons->getClCtrlsArray();
66 int aliasDeref = m_cons->getAliasDeref();
67 ldap_set_option(m_connection->getSessionHandle(), LDAP_OPT_DEREF,
69 int err=ldap_search_ext(m_connection->getSessionHandle(), m_base.c_str(),
70 m_scope, m_filter.c_str(), tmpattrs, m_attrsOnly, tmpSrvCtrl,
71 tmpClCtrl, tmptime, m_cons->getSizeLimit(), &msgID );
73 ldap_value_free(tmpattrs);
74 LDAPControlSet::freeLDAPControlArray(tmpSrvCtrl);
75 LDAPControlSet::freeLDAPControlArray(tmpClCtrl);
77 if (err != LDAP_SUCCESS){
78 throw LDAPException(err);
79 } else if (isReferral()){
84 return new LDAPMessageQueue(this);
88 LDAPRequest* LDAPSearchRequest::followReferral(LDAPMsg* ref){
89 DEBUG(LDAP_DEBUG_TRACE, "LDAPSearchRequest::followReferral()" << endl);
91 LDAPUrlList::const_iterator usedUrl;
92 LDAPAsynConnection* con;
95 if(ref->getMessageType() == LDAPMsg::SEARCH_REFERENCE){
96 urls = ((LDAPSearchReference *)ref)->getUrls();
98 urls = ((LDAPResult *)ref)->getReferralUrls();
100 con = getConnection()->referralConnect(urls,usedUrl,m_cons);
102 if((usedUrl->getFilter() != "") &&
103 (usedUrl->getFilter() != m_filter)){
104 filter=usedUrl->getFilter();
108 if( (ref->getMessageType() == LDAPMsg::SEARCH_REFERENCE) &&
109 (m_scope == LDAPAsynConnection::SEARCH_ONE)
111 scope = LDAPAsynConnection::SEARCH_BASE;
112 DEBUG(LDAP_DEBUG_TRACE," adjusted scope to BASE" << endl);
119 return new LDAPSearchRequest(usedUrl->getDN(), scope, filter,
120 m_attrs, m_attrsOnly, con, m_cons,true,this);
123 bool LDAPSearchRequest::equals(const LDAPRequest* req)const{
124 DEBUG(LDAP_DEBUG_TRACE,"LDAPSearchRequest::equals()" << endl);
125 if( LDAPRequest::equals(req)){
126 LDAPSearchRequest* sreq = (LDAPSearchRequest*)req;
127 if ( (m_base == sreq->m_base) &&
128 (m_scope == sreq->m_scope)