[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