[Date Prev][Date Next]
[Chronological]
[Thread]
[Top]
search practice
Hello,
Using openldap 2.3.35.
I have some simpleString like "aaaBBBcccDDDeeeFFF", and I want
to find entries, in which a specified attribute "mySearchAttr"
has values like
entry 1:
mySearchAttr=aaaBBBcccDD
entry 2:
mySearchAttr=aa
entry 3:
mySearchAttr=aaaBBBc
entry 4:
mySearchAttr=aaaBBBcccDDDeeeFFF
and example entries which should NOT be covered by search:
entry 5:
mySearchAttr=aaaBBBcccDDDeeeFFFgggHHH
entry 6:
mySearchAttr=XXXyyyZZZaaaBBBcccDDDeeeFFFxxxYYYzzz
entry 7:
mySearchAttr=XXXyyyZZZaaaBBBcccXXXyyyZZZ
and so on.
In other words, I want to find all entries having
a value of mySearchAttr attribute starting with
the same characters as simpleString, and shorter than or
equal to simpleString.
What would be best practice to do such search? I imagined
three versions:
a. iterate over simpleString from 0 to strlen(simpleString) - 1,
and do a search for
"mySearchAttr=a", then for "mySearchAttr=aa", ...,
then for "mySearchAttr=aaaBBBcccDDD" and so on until
end of simpleString is reached. But this would be
probably inefficient, regarding number of searches.
b. iterate over simpleString from 0 to strlen(simpleString) -1,
and build a really long filter from all partial strings, like
(|(mySearchAttr=a)(mySearchAttr=aa)(mySearchAttr=aaa)...)
but the string may be even 100+ characters long, so filter
would have 100+ conditions in it, which also seems not so well).
c. find all entries which have (myAttrSearch=*), sort by myAttrSearch,
and then iterate over search result, to extract final set of entries,
which have myAttrSearch matching all partial strings of simpleString.
But actually I don't even need to know all strings, I need
only the first one found.
On one hand - simpleString may be long. on the other hand - number
of entries (c) may hundreds, or even thousands of entries,
and all partial strings of simpleString should be compared to each
value of mySearchAttr attribute.
Finally I search for mySearchAtt=*, then I sort, next I iterate
over search result, and for each entry, and each attribute value,
next if the value is shorter than or equal to simpleString, I iterate over
all partial strings (starting from left), and matching by some strcasecmp
- all of this until the first is found. Even some regex value
matching wouldn't be solution for "aa", ..., "aaaBBB",...
Any hints ? Actually mySearchAttr keeps for me some filesystem object name
string. Knowing some fsobject name like /some/dir/subfileordir, I want
to find all entries, which are related to objects _above_ my fsobject
in filesystem directory tree. I have no special characters in directory
and file names, only letters, digits and slashes. This actually
is used to check some fs directory access permissions - to determine
whether access to /some/sub/dir/or/file should be granted, I need
to make sure, that there's no above object which restricts access,
it should work like http access control.
Isn't there really some filter to cover this? Did I miss something
trivial? :)
Regards,
Piotr