如果您使用支持服务器端排序的 LDAP 服务器(请参阅 RFC 2891),例如带有 slapo-sssvlv 的 OpenLDAP,您可以通过反向排序仅搜索一个搜索结果来搜索最大数字。
基于python-ldap 的Python sn-p(摘自Æ-DIR's CLI 工具之一):
import ldap
from ldap.controls.sss import SSSRequestControl
def highest_id(ldap_conn, searchbase, id_attr):
"""
search the highest value of `id_attr' by using server-side (reverse) sorting
"""
# reverse sorting request control
sss_control = SSSRequestControl(criticality=True, ordering_rules=['-'+id_attr])
# send search request
msg_id = ldap_conn.search(
searchbase,
ldap.SCOPE_SUBTREE,
'({0}=*)'.format(id_attr),
attrlist=[id_attr],
sizelimit=1,
serverctrls=[sss_control],
)
# collect result
ldap_result = []
try:
for _, res_data, _, res_controls in ldap_conn.results(
msg_id,
add_ctrls=0
):
ldap_result.extend(res_data)
except ldap.SIZELIMIT_EXCEEDED:
pass
if not ldap_result:
logging.error('No entry with attribute %r found!', id_attr)
raise ValueError('No LDAP result!')
highest_id_number = int(ldap_result[0][1][id_attr][0])
logging.debug('Highest %r value found: %d', id_attr, highest_id_number)
return highest_id_number
请注意,在分配新 ID 时,这并不总是您想要的,因为 ID 号空间中的间隙不会(重新)使用。
还要确保使用服务器端唯一约束插件,例如OpenLDAP 的覆盖slapo-unique。这样可以避免在并发客户端添加新条目时出现重复。