From de4d68eac3afc76d4169eb527fef0df6787e1298 Mon Sep 17 00:00:00 2001
From: Julian Rother <julian@jrother.eu>
Date: Sat, 11 Dec 2021 16:30:23 +0100
Subject: [PATCH] Caching for DN parsing and stringprep

---
 ldapserver/dn.py                 | 2 ++
 ldapserver/rfc4518_stringprep.py | 2 ++
 ldapserver/schema/types.py       | 3 +++
 3 files changed, 7 insertions(+)

diff --git a/ldapserver/dn.py b/ldapserver/dn.py
index f291fac..76a371f 100644
--- a/ldapserver/dn.py
+++ b/ldapserver/dn.py
@@ -16,6 +16,7 @@ Limitations:
 
 import typing
 import re
+import functools
 
 from . import exceptions
 
@@ -45,6 +46,7 @@ class DN(tuple):
 	# distinguishedName = [ relativeDistinguishedName *( COMMA relativeDistinguishedName ) ]
 
 	@classmethod
+	@functools.lru_cache(maxsize=128, typed=False)
 	def from_str(cls, schema, expr):
 		'''Parse string representation of a DN according to RFC 4514
 
diff --git a/ldapserver/rfc4518_stringprep.py b/ldapserver/rfc4518_stringprep.py
index 6e4c93c..889b94b 100644
--- a/ldapserver/rfc4518_stringprep.py
+++ b/ldapserver/rfc4518_stringprep.py
@@ -1,6 +1,7 @@
 import unicodedata
 import stringprep
 import enum
+import functools
 
 SPACE = 0x0020
 
@@ -159,6 +160,7 @@ class SubstringType(enum.Enum):
 	ANY = enum.auto()
 	FINAL = enum.auto()
 
+@functools.lru_cache(maxsize=128, typed=False)
 def prepare(value, matching_type=MatchingType.EXACT_STRING,
             substring_type=SubstringType.NONE):
 	# Algortihm according to RFC 4518
diff --git a/ldapserver/schema/types.py b/ldapserver/schema/types.py
index 4f3dcee..aba3bed 100644
--- a/ldapserver/schema/types.py
+++ b/ldapserver/schema/types.py
@@ -543,3 +543,6 @@ class Schema(OIDDict):
 		                   matching_rule_definitions=value.matching_rule_definitions,
 		                   attribute_type_definitions=value.attribute_type_definitions,
 		                   object_class_definitions=value.object_class_definitions)
+
+	def __hash__(self):
+		return id(self)
-- 
GitLab