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"
16 LDAPSearchRequest::LDAPSearchRequest(const LDAPSearchRequest& req ) :
18 DEBUG(LDAP_DEBUG_CONSTRUCT,
19 "LDAPSearchRequest::LDAPSearchRequest(&)" << endl);
22 m_filter=req.m_filter;
24 m_attrsOnly=req.m_attrsOnly;
28 LDAPSearchRequest::LDAPSearchRequest(const string& base, int scope,
29 const string& filter, const StringList& attrs, bool attrsOnly,
30 LDAPAsynConnection *connect,
31 const LDAPConstraints* cons, bool isReferral,
32 const LDAPRequest* parent)
33 : LDAPRequest (connect,cons,isReferral,parent) {
35 DEBUG(LDAP_DEBUG_CONSTRUCT,
36 "LDAPSearchRequest:LDAPSearchRequest()" << endl);
37 DEBUG(LDAP_DEBUG_CONSTRUCT & LDAP_DEBUG_PARAMETER,
38 " base:" << base << endl << " scope:" << scope << endl
39 << " filter:" << filter << endl);
40 m_requestType=LDAPRequest::SEARCH;
41 //insert some validating and copying here
45 m_filter="objectClass=*";
50 m_attrsOnly=attrsOnly;
53 LDAPSearchRequest::~LDAPSearchRequest(){
54 DEBUG(LDAP_DEBUG_DESTROY, "LDAPSearchRequest::~LDAPSearchRequest" << endl);
57 LDAPMessageQueue* LDAPSearchRequest::sendRequest(){
59 DEBUG(LDAP_DEBUG_TRACE, "LDAPSearchRequest::sendRequest()" << endl);
60 timeval* tmptime=m_cons->getTimeoutStruct();
61 char** tmpattrs=m_attrs.toCharArray();
62 LDAPControl** tmpSrvCtrl=m_cons->getSrvCtrlsArray();
63 LDAPControl** tmpClCtrl=m_cons->getClCtrlsArray();
64 int aliasDeref = m_cons->getAliasDeref();
65 ldap_set_option(m_connection->getSessionHandle(), LDAP_OPT_DEREF,
67 int err=ldap_search_ext(m_connection->getSessionHandle(), m_base.c_str(),
68 m_scope, m_filter.c_str(), tmpattrs, m_attrsOnly, tmpSrvCtrl,
69 tmpClCtrl, tmptime, m_cons->getSizeLimit(), &msgID );
71 ldap_value_free(tmpattrs);
72 ldap_controls_free(tmpSrvCtrl);
73 ldap_controls_free(tmpClCtrl);
75 if (err != LDAP_SUCCESS){
76 throw LDAPException(err);
77 } else if (isReferral()){
82 return new LDAPMessageQueue(this);
86 LDAPRequest* LDAPSearchRequest::followReferral(LDAPMsg* ref){
87 DEBUG(LDAP_DEBUG_TRACE, "LDAPSearchRequest::followReferral()" << endl);
89 LDAPUrlList::const_iterator usedUrl;
90 LDAPAsynConnection* con;
93 if(ref->getMessageType() == LDAPMsg::SEARCH_REFERENCE){
94 urls = ((LDAPSearchReference *)ref)->getUrls();
96 urls = ((LDAPResult *)ref)->getReferralUrls();
98 con = getConnection()->referralConnect(urls,usedUrl,m_cons);
100 if((usedUrl->getFilter() != "") &&
101 (usedUrl->getFilter() != m_filter)){
102 filter=usedUrl->getFilter();
106 if( (ref->getMessageType() == LDAPMsg::SEARCH_REFERENCE) &&
107 (m_scope == LDAPAsynConnection::SEARCH_ONE)
109 scope = LDAPAsynConnection::SEARCH_BASE;
110 DEBUG(LDAP_DEBUG_TRACE," adjusted scope to BASE" << endl);
117 return new LDAPSearchRequest(usedUrl->getDN(), scope, filter,
118 m_attrs, m_attrsOnly, con, m_cons,true,this);
121 bool LDAPSearchRequest::equals(const LDAPRequest* req)const{
122 DEBUG(LDAP_DEBUG_TRACE,"LDAPSearchRequest::equals()" << endl);
123 if( LDAPRequest::equals(req)){
124 LDAPSearchRequest* sreq = (LDAPSearchRequest*)req;
125 if ( (m_base == sreq->m_base) &&
126 (m_scope == sreq->m_scope)