[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    branches/KDE/4.6/kdelibs/nepomuk/query
From:       Aaron J. Seigo <aseigo () kde ! org>
Date:       2011-01-14 1:06:02
Message-ID: 20110114010602.66D6DAC8B3 () svn ! kde ! org
[Download RAW message or body]

SVN commit 1214296 by aseigo:

use local copies of the regexps for thread safety; cures a few more crashes in \
krunner thanks to Thiago for suggesting the elegant solution and to Matthias Fuchs \
for tracking down the culprit.


 M  +50 -42    queryparser.cpp  


--- branches/KDE/4.6/kdelibs/nepomuk/query/queryparser.cpp #1214295:1214296
@@ -461,6 +461,14 @@
     bool inAndBlock = false;
 
     int pos = 0;
+
+    // create local copies of the regexps for thread safety purposes
+    const QRegExp resourceRx = s_resourceRx;
+    const QRegExp propertyRx = s_propertyRx;
+    const QRegExp fieldFieldRx = s_fieldFieldRx;
+    const QRegExp fieldRx = s_fieldRx;
+    const QRegExp plainTermRx = s_plainTermRx;
+
     while ( pos < query.length() ) {
         // skip whitespace
         while ( pos < query.length() && query[pos].isSpace() ) {
@@ -471,27 +479,27 @@
         Term term;
 
         if ( pos < query.length() ) {
-            if ( s_resourceRx.indexIn( query, pos ) == pos ) {
-                kDebug() << "matched resource term at" << pos << s_resourceRx.cap( 0 \
                );
-                term = ComparisonTerm( tryToBeIntelligentAboutParsingUrl( \
                s_resourceRx.cap( 2 ) ),
-                                       ResourceTerm( \
tryToBeIntelligentAboutParsingUrl( s_resourceRx.cap( 3 ) ) ), +            if ( \
resourceRx.indexIn( query, pos ) == pos ) { +                kDebug() << "matched \
resource term at" << pos << resourceRx.cap( 0 ); +                term = \
ComparisonTerm( tryToBeIntelligentAboutParsingUrl( resourceRx.cap( 2 ) ), +           \
ResourceTerm( tryToBeIntelligentAboutParsingUrl( resourceRx.cap( 3 ) ) ),  \
                ComparisonTerm::Equal );
-                if ( !positiveTerm(s_resourceRx.cap( 1 ) ) ) {
+                if ( !positiveTerm( resourceRx.cap( 1 ) ) ) {
                     term = NegationTerm::negateTerm( term );
                 }
-                pos += s_resourceRx.matchedLength();
+                pos += resourceRx.matchedLength();
             }
 
-            else if ( s_propertyRx.indexIn( query, pos ) == pos ) {
-                kDebug() << "matched property term at" << pos << s_propertyRx.cap( 0 \
); +            else if ( propertyRx.indexIn( query, pos ) == pos ) {
+                kDebug() << "matched property term at" << pos << propertyRx.cap( 0 \
);  ComparisonTerm ct;
-                ct.setProperty( tryToBeIntelligentAboutParsingUrl( s_propertyRx.cap( \
                2 ) ) );
-                ct.setSubTerm( LiteralTerm( createLiteral( s_propertyRx.cap( 4 ), \
                flags&QueryTermGlobbing ) ) );
-                QString comparator = s_propertyRx.cap( 3 );
+                ct.setProperty( tryToBeIntelligentAboutParsingUrl( propertyRx.cap( 2 \
) ) ); +                ct.setSubTerm( LiteralTerm( createLiteral( propertyRx.cap( 4 \
), flags&QueryTermGlobbing ) ) ); +                QString comparator = \
                propertyRx.cap( 3 );
                 ct.setComparator( fieldTypeRelationFromString( comparator ) );
-                pos += s_propertyRx.matchedLength();
+                pos += propertyRx.matchedLength();
 
-                if ( !positiveTerm(s_propertyRx.cap( 1 ) ) ) {
+                if ( !positiveTerm(propertyRx.cap( 1 ) ) ) {
                     term = NegationTerm::negateTerm( ct );
                 }
                 else {
@@ -499,24 +507,24 @@
                 }
             }
 
-            else if ( s_fieldFieldRx.indexIn( query, pos ) == pos ) {
+            else if ( fieldFieldRx.indexIn( query, pos ) == pos ) {
                 kDebug() << "matched field field term at" << pos
-                         << s_fieldFieldRx.cap( 0 )
-                         << s_fieldFieldRx.cap( 2 )
-                         << s_fieldFieldRx.cap( 4 )
-                         << s_fieldFieldRx.cap( 5 )
-                         << s_fieldFieldRx.cap( 7 )
-                         << s_fieldFieldRx.cap( 8 );
+                         << fieldFieldRx.cap( 0 )
+                         << fieldFieldRx.cap( 2 )
+                         << fieldFieldRx.cap( 4 )
+                         << fieldFieldRx.cap( 5 )
+                         << fieldFieldRx.cap( 7 )
+                         << fieldFieldRx.cap( 8 );
                 ComparisonTerm ct;
-                ct.setProperty( QUrl(stripQuotes( s_fieldFieldRx.cap( 2 ) )) );
-                QString comparator = s_fieldFieldRx.cap( 4 );
+                ct.setProperty( QUrl(stripQuotes( fieldFieldRx.cap( 2 ) )) );
+                QString comparator = fieldFieldRx.cap( 4 );
                 ct.setComparator( fieldTypeRelationFromString( comparator ) );
-                ct.setSubTerm( ComparisonTerm( QUrl(stripQuotes( s_fieldFieldRx.cap( \
                5 ) )),
-                                               LiteralTerm( createLiteral( \
                s_fieldFieldRx.cap( 8 ), flags&QueryTermGlobbing ) ),
-                                               fieldTypeRelationFromString( \
                s_fieldFieldRx.cap( 7 ) ) ) );
-                pos += s_fieldFieldRx.matchedLength();
+                ct.setSubTerm( ComparisonTerm( QUrl(stripQuotes( fieldFieldRx.cap( 5 \
) )), +                                               LiteralTerm( createLiteral( \
fieldFieldRx.cap( 8 ), flags&QueryTermGlobbing ) ), +                                 \
fieldTypeRelationFromString( fieldFieldRx.cap( 7 ) ) ) ); +                pos += \
fieldFieldRx.matchedLength();  
-                if ( !positiveTerm(s_fieldFieldRx.cap( 1 ) ) ) {
+                if ( !positiveTerm( fieldFieldRx.cap( 1 ) ) ) {
                     term = NegationTerm::negateTerm( ct );
                 }
                 else {
@@ -524,27 +532,27 @@
                 }
             }
 
-            else if ( s_fieldRx.indexIn( query, pos ) == pos ) {
-                kDebug() << "matched field term at" << pos << s_fieldRx.cap( 0 ) << \
                s_fieldRx.cap( 2 ) << s_fieldRx.cap( 4 ) << s_fieldRx.cap( 5 );
-                if( stripQuotes ( s_fieldRx.cap( 2 ) ).compare( QString( "inFolder" \
                ), Qt::CaseInsensitive ) == 0 ) {
-                    KUrl url( s_fieldRx.cap( 5 ) );
+            else if ( fieldRx.indexIn( query, pos ) == pos ) {
+                kDebug() << "matched field term at" << pos << fieldRx.cap( 0 ) << \
fieldRx.cap( 2 ) << fieldRx.cap( 4 ) << fieldRx.cap( 5 ); +                if( \
stripQuotes ( fieldRx.cap( 2 ) ).compare( QString( "inFolder" ), Qt::CaseInsensitive \
) == 0 ) { +                    KUrl url( fieldRx.cap( 5 ) );
                     kDebug() << "found include path" << url;
                     FileQuery fileQuery(final);
-                    if ( positiveTerm( s_fieldRx.cap( 1 ) ) )
+                    if ( positiveTerm( fieldRx.cap( 1 ) ) )
                         fileQuery.addIncludeFolder(url);
                     else
                         fileQuery.addExcludeFolder(url);
                     final = fileQuery;
-                    pos += s_fieldRx.matchedLength();
+                    pos += fieldRx.matchedLength();
                 }
                 else {
                     ComparisonTerm ct;
-                    ct.setProperty( QUrl( stripQuotes( s_fieldRx.cap( 2 ) ) ) );
-                    ct.setSubTerm( LiteralTerm( createLiteral( s_fieldRx.cap( 5 ), \
                flags&QueryTermGlobbing ) ) );
-                    QString comparator = s_fieldRx.cap( 4 );
+                    ct.setProperty( QUrl( stripQuotes( fieldRx.cap( 2 ) ) ) );
+                    ct.setSubTerm( LiteralTerm( createLiteral( fieldRx.cap( 5 ), \
flags&QueryTermGlobbing ) ) ); +                    QString comparator = fieldRx.cap( \
                4 );
                     ct.setComparator( fieldTypeRelationFromString( comparator ) );
-                    pos += s_fieldRx.matchedLength();
-                    if ( !positiveTerm(s_fieldRx.cap( 1 ) ) ) {
+                    pos += fieldRx.matchedLength();
+                    if ( !positiveTerm(fieldRx.cap( 1 ) ) ) {
                         NegationTerm nt;
                         nt.setSubTerm( ct );
                         term = nt;
@@ -555,8 +563,8 @@
                 }
             }
 
-            else if ( s_plainTermRx.indexIn( query, pos ) == pos ) {
-                QString value = s_plainTermRx.cap( 2 );
+            else if ( plainTermRx.indexIn( query, pos ) == pos ) {
+                QString value = plainTermRx.cap( 2 );
                 if ( d->orKeywords.contains( value.toLower() ) ) {
                     inOrBlock = true;
                 }
@@ -571,11 +579,11 @@
                     else {
                         term = LiteralTerm( createLiteral( value, \
flags&QueryTermGlobbing ) );  }
-                    if ( !positiveTerm(s_plainTermRx.cap( 1 ) ) ) {
+                    if ( !positiveTerm(plainTermRx.cap( 1 ) ) ) {
                         term = NegationTerm::negateTerm( term );
                     }
                 }
-                pos += s_plainTermRx.matchedLength();
+                pos += plainTermRx.matchedLength();
             }
 
             else {


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic