[Erp5-report] r38358 vincent - /erp5/trunk/products/ZSQLCatalog/SearchText/SearchTextParser.py

nobody at svn.erp5.org nobody at svn.erp5.org
Tue Sep 14 15:01:58 CEST 2010


Author: vincent
Date: Tue Sep 14 15:01:54 2010
New Revision: 38358

URL: http://svn.erp5.org?rev=38358&view=rev
Log:
Move parser instance pooling mechanism in a class for easier reuse.

Modified:
    erp5/trunk/products/ZSQLCatalog/SearchText/SearchTextParser.py

Modified: erp5/trunk/products/ZSQLCatalog/SearchText/SearchTextParser.py
URL: http://svn.erp5.org/erp5/trunk/products/ZSQLCatalog/SearchText/SearchTextParser.py?rev=38358&r1=38357&r2=38358&view=diff
==============================================================================
--- erp5/trunk/products/ZSQLCatalog/SearchText/SearchTextParser.py [utf8] (original)
+++ erp5/trunk/products/ZSQLCatalog/SearchText/SearchTextParser.py [utf8] Tue Sep 14 15:01:54 2010
@@ -43,28 +43,36 @@ if __name__ == '__main__':
 else:
   DEBUG = 0
 
-parser_pool = threading.local()
+class ParserPool(object):
+  """
+  Per-thread parser pool, because ply is not thread-safe.
+  """
 
- at profiler_decorator
-def getAdvancedSearchTextDetector():
-  try:
-    return parser_pool.advanced_search_text_detector
-  except AttributeError:
-    advanced_search_text_detector = AdvancedSearchTextDetector()
-    advanced_search_text_detector.init(debug=DEBUG)
-    parser_pool.advanced_search_text_detector = advanced_search_text_detector
-    return advanced_search_text_detector
+  def __init__(self):
+    self.parser_pool = threading.local()
+    self.parser_registry = {}
+
+  def register(self, parser):
+    parser_registry = self.parser_registry
+    name = (parser.__module__, parser.__name__)
+    if name in parser_registry:
+      raise ValueError, 'Duplicate parser for name %r' % (name, )
+    parser_registry[name] = parser
+    return name
 
- at profiler_decorator
-def getAdvancedSearchTextParser():
-  try:
-    return parser_pool.parser
-  except AttributeError:
-    parser = AdvancedSearchTextParser()
-    parser.init(debug=DEBUG)
-    parser_pool.parser = parser
+  def get(self, name):
+    try:
+      parser = getattr(self.parser_pool, name)
+    except AttributeError:
+      parser = self.parser_registry[name]()
+      parser.init(debug=DEBUG)
+      setattr(self.parser_pool, name, parser)
     return parser
 
+parser_pool = ParserPool()
+DETECTOR_ID = parser_pool.register(AdvancedSearchTextDetector)
+PARSER_ID = parser_pool.register(AdvancedSearchTextParser)
+
 def safeParsingDecorator(func):
   """
   Wrapper hiding parsing errors and returning None when they occur.
@@ -84,13 +92,13 @@ def safeParsingDecorator(func):
 
 @profiler_decorator
 def isAdvancedSearchText(input, is_column):
-  return getAdvancedSearchTextDetector()(input, is_column)
+  return parser_pool.get(DETECTOR_ID)(input, is_column)
 
 @profiler_decorator
 @safeParsingDecorator
 def parse(input, is_column, *args, **kw):
   if isAdvancedSearchText(input, is_column):
-    result = getAdvancedSearchTextParser()(input, is_column, *args, **kw)
+    result = parser_pool.get(PARSER_ID)(input, is_column, *args, **kw)
   else:
     result = None
   return result
@@ -328,7 +336,8 @@ if __name__ == '__main__':
     print repr(input)
     try:
       try:
-        detector_result = getAdvancedSearchTextDetector()(input, isColumn)
+        detector_result = parser_pool.get(DETECTOR_ID)(input,
+          isColumn)
       except ParserOrLexerError, message:
         print '  Detector raise: %r' % (message, )
         detector_result = False
@@ -336,7 +345,7 @@ if __name__ == '__main__':
         print '  Detector: %r' % (detector_result, )
       if detector_result:
         print '  LEX:'
-        advanced_parser = getAdvancedSearchTextParser()
+        advanced_parser = parser_pool.get(PARSER_ID)
         lexer = advanced_parser.lexer
         advanced_parser.isColumn = isColumn
         lexer.input(input)




More information about the Erp5-report mailing list