Если вы используете сервер LDAP, поддерживающий сортировку на стороне сервера (см. RFC 2891), например OpenLDAP с помощью slapo-sssvlv вы можете искать наибольшее число, поиск только одного результата поиска с обратным порядком сортировки.
Фрагмент кода Python на основе python-ldap (отрывок из одного из Æ-DIR 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
Обратите внимание, что это не всегда то, что вам нужно при назначении новых идентификаторов, поскольку пробелы в пространстве идентификационных номеров не (повторно) используются.
Также обязательно используйте уникальный плагин ограничения на стороне сервера, например. Наложение OpenLDAP slapo-unique. Это позволяет избежать дублирования в случае, если параллельные клиенты добавляют новые записи.
person
Michael Ströder
schedule
31.07.2018