List:Commits« Previous MessageNext Message »
From:jbalint Date:November 8 2006 11:57pm
Subject:Connector/ODBC 5 commit: r663 - trunk/SDK/MYSQLPlus/Library
View as plain text  
Modified:
   trunk/SDK/MYSQLPlus/Library/MResultPlus.cpp
   trunk/SDK/MYSQLPlus/Library/MResultPlus.h
   trunk/SDK/MYSQLPlus/Library/MResultRes.cpp
Log:
Gathered all the wildcard matching logic into one function.
Wildcards now support escaped chars and underscore matching (needed to link tables with
underscores in access)

Modified: trunk/SDK/MYSQLPlus/Library/MResultPlus.cpp
===================================================================
--- trunk/SDK/MYSQLPlus/Library/MResultPlus.cpp	2006-11-07 21:51:10 UTC (rev 662)
+++ trunk/SDK/MYSQLPlus/Library/MResultPlus.cpp	2006-11-08 23:57:29 UTC (rev 663)
@@ -1847,33 +1847,17 @@
         MYODBCDbgReturn( doAppendTablesSchemas( stringCatalog, stringSchemaFilter,
stringTableFilter, stringTableType ) );
     }
 
-    QStringList stringlistCatalogs = getCatalogs( "%" ); 
+    QStringList stringlistCatalogs = filterByWildcard( getCatalogs( "%"),
+            getStatement()->getMetadataID() == SQL_FALSE &&
+                    getEnvironment()->getODBCVersion() != SQL_OV_ODBC2 ?
+                stringSchemaFilter : "%" );
 
-    BOOL bWildCard = ( getEnvironment()->getODBCVersion() != SQL_OV_ODBC2 &&
getStatement()->getMetadataID() == SQL_FALSE );
-    QString stringWildCard = stringCatalogFilter;
-    QRegExp regexWildCard;
-    regexWildCard.setPatternSyntax( QRegExp::Wildcard );
-
-    if ( bWildCard )
-        regexWildCard.setPattern( stringWildCard.replace( '%', '*' ) );
-
     for ( int n = 0; n < stringlistCatalogs.count(); n++ )
     {
-        BOOL bMatch;
-
-        if ( stringCatalogFilter.isNull() )
-            bMatch = true;
-        else if ( bWildCard )
-            bMatch = regexWildCard.exactMatch( stringlistCatalogs[n] );
-        else
-            bMatch = stringlistCatalogs[n] == stringCatalogFilter;
-
-        if ( bMatch )
-        {
-            nReturn = doAppendTablesSchemas( stringlistCatalogs[n], stringSchemaFilter,
stringTableFilter, stringTableType );
-            if ( !SQL_SUCCEEDED( nReturn ) )
-                break;
-        }
+        nReturn = doAppendTablesSchemas( stringlistCatalogs[n], stringSchemaFilter,
+                stringTableFilter, stringTableType );
+        if ( !SQL_SUCCEEDED( nReturn ) )
+            break;
     }
 
     MYODBCDbgReturn( nReturn );
@@ -1885,39 +1869,17 @@
 
     SQLRETURN nReturn = SQL_SUCCESS;
 
-    /*!
-        \internal ODBC Rule
+    QStringList stringlistSchemas = filterByWildcard(
+            getSchemas( stringCatalog, "%"),
+            getStatement()->getMetadataID() == SQL_FALSE ?
+                stringSchemaFilter : "%" );
 
-        However, a zero-length search pattern-        zero -    */
-    QStringList stringlistSchemas = getSchemas( stringCatalog, "%" ); 
-
-    BOOL bWildCard = ( getStatement()->getMetadataID() == SQL_FALSE );
-    QString stringWildCard = stringSchemaFilter;
-    QRegExp regexWildCard;
-    regexWildCard.setPatternSyntax( QRegExp::Wildcard );
-
-    if ( bWildCard )
-        regexWildCard.setPattern( stringWildCard.replace( '%', '*' ) );
-
     for ( int n = 0; n < stringlistSchemas.count(); n++ )
     {
-        BOOL bMatch;
-
-        if ( stringSchemaFilter.isNull() )
-            bMatch = true;
-        else if ( bWildCard )
-            bMatch = regexWildCard.exactMatch( stringlistSchemas[n] );
-        else
-            bMatch = stringlistSchemas[n] == stringSchemaFilter;
-
-        if ( bMatch )
-        {
-            nReturn = doAppendTablesTables( stringCatalog, stringlistSchemas[n],
stringTableFilter, stringTableType );
-            if ( !SQL_SUCCEEDED( nReturn ) )
-                break;
-        }
+        nReturn = doAppendTablesTables( stringCatalog, stringlistSchemas[n],
+                stringTableFilter, stringTableType );
+        if ( !SQL_SUCCEEDED( nReturn ) )
+            break;
     }
 
     MYODBCDbgReturn( nReturn );
@@ -1957,35 +1919,17 @@
 
     SQLRETURN nReturn = SQL_SUCCESS;
 
-    /*!
-        \internal
-        \todo
+    QStringList stringlistTables = filterByWildcard(
+            getTables( stringCatalog, stringSchema, "%" ),
+            getStatement()->getMetadataID() == SQL_FALSE ?
+                stringTableFilter : "%" );
 
-        Support VIEW etc
-    */
-    QStringList stringlistTables = getTables( stringCatalog, stringSchema, "%" );
-
-    BOOL bWildCard = ( getStatement()->getMetadataID() == SQL_FALSE );
-    QString stringWildCard = stringTableFilter;
-    QRegExp regexWildCard;
-    regexWildCard.setPatternSyntax( QRegExp::Wildcard );
-
-    if ( bWildCard )
-        regexWildCard.setPattern( stringWildCard.replace( '%', '*' ) );
-
     for ( int n = 0; n < stringlistTables.count(); n++ )
     {
-        BOOL bMatch;
-
-        if ( stringTableFilter.isNull() )
-            bMatch = true;
-        else if ( bWildCard )
-            bMatch = regexWildCard.exactMatch( stringlistTables[n] );
-        else
-            bMatch = stringlistTables[n] == stringTableFilter;
-
-        if ( bMatch )
-            doAppendTables( stringCatalog, stringSchema, stringlistTables[n],
stringTableType );
+        nReturn = doAppendTables( stringCatalog, stringSchema,
+                stringlistTables[n], stringTableType );
+        if ( !SQL_SUCCEEDED( nReturn ) )
+            break;
     }
 
     MYODBCDbgReturn( nReturn );
@@ -2009,37 +1953,20 @@
         if ( stringCatalog.isNull() )
             stringCatalog = "";
 
-// printf( "[PAH][%s][%s][%d] CATALOG: %s\n", __FILE__, __FUNCTION__, __LINE__,
stringCatalog.toLatin1().data());
         MYODBCDbgReturn( doAppendColumnsSchemas( stringCatalog, stringSchemaFilter,
stringTableFilter, stringColumnFilter ) );
     }
 
-    QStringList stringlistCatalogs = getCatalogs( "%" ); 
+    QStringList stringlistCatalogs = filterByWildcard( getCatalogs( "%"),
+            getStatement()->getMetadataID() == SQL_FALSE &&
+                    getEnvironment()->getODBCVersion() != SQL_OV_ODBC2 ?
+                stringSchemaFilter : "%" );
 
-    BOOL bWildCard = ( getEnvironment()->getODBCVersion() != SQL_OV_ODBC2 &&
getStatement()->getMetadataID() == SQL_FALSE );
-    QString stringWildCard = stringCatalogFilter;
-    QRegExp regexWildCard;
-    regexWildCard.setPatternSyntax( QRegExp::Wildcard );
-
-    if ( bWildCard )
-        regexWildCard.setPattern( stringWildCard.replace( '%', '*' ) );
-
     for ( int n = 0; n < stringlistCatalogs.count(); n++ )
     {
-        BOOL bMatch;
-
-        if ( stringCatalogFilter.isNull() )
-            bMatch = true;
-        else if ( bWildCard )
-            bMatch = regexWildCard.exactMatch( stringlistCatalogs[n] );
-        else
-            bMatch = stringlistCatalogs[n] == stringCatalogFilter;
-
-        if ( bMatch )
-        {
-            nReturn = doAppendColumnsSchemas( stringlistCatalogs[n], stringSchemaFilter,
stringTableFilter, stringColumnFilter );
-            if ( !SQL_SUCCEEDED( nReturn ) )
-                break;
-        }
+        nReturn = doAppendColumnsSchemas( stringlistCatalogs[n], stringSchemaFilter,
+                stringTableFilter, stringColumnFilter );
+        if ( !SQL_SUCCEEDED( nReturn ) )
+            break;
     }
 
     MYODBCDbgReturn( nReturn );
@@ -2051,40 +1978,17 @@
 
     SQLRETURN nReturn = SQL_SUCCESS;
 
-    /*!
-        \internal ODBC Rule
+    QStringList stringlistSchemas = filterByWildcard(
+            getSchemas( stringCatalog, "%"),
+            getStatement()->getMetadataID() == SQL_FALSE ?
+                stringSchemaFilter : "%" );
 
-        However, a zero-length search pattern-        zero -    */
-    QStringList stringlistSchemas = getSchemas( stringCatalog, "%" ); 
-
-    BOOL bWildCard = ( getStatement()->getMetadataID() == SQL_FALSE );
-    QString stringWildCard = stringSchemaFilter;
-    QRegExp regexWildCard;
-    regexWildCard.setPatternSyntax( QRegExp::Wildcard );
-
-    if ( bWildCard )
-        regexWildCard.setPattern( stringWildCard.replace( '%', '*' ) );
-
     for ( int n = 0; n < stringlistSchemas.count(); n++ )
     {
-        BOOL bMatch;
-
-        if ( stringSchemaFilter.isNull() )
-            bMatch = true;
-        else if ( bWildCard )
-            bMatch = regexWildCard.exactMatch( stringlistSchemas[n] );
-        else
-            bMatch = stringlistSchemas[n] == stringSchemaFilter;
-
-        if ( bMatch )
-        {
-// printf( "[PAH][%s][%s][%d] SCHEMA: %s\n", __FILE__, __FUNCTION__, __LINE__,
stringlistSchemas[n].toLatin1().data());
-            nReturn = doAppendColumnsTables( stringCatalog, stringlistSchemas[n],
stringTableFilter, stringColumnFilter );
-            if ( !SQL_SUCCEEDED( nReturn ) )
-                break;
-        }
+        nReturn = doAppendColumnsTables( stringCatalog, stringlistSchemas[n],
+                stringTableFilter, stringColumnFilter );
+        if ( !SQL_SUCCEEDED( nReturn ) )
+            break;
     }
 
     MYODBCDbgReturn( nReturn );
@@ -2096,41 +2000,17 @@
 
     SQLRETURN nReturn = SQL_SUCCESS;
 
-    /*!
-        \internal ODBC Rule
+    QStringList stringlistTables = filterByWildcard(
+            getTables( stringCatalog, stringSchema, "%" ),
+            getStatement()->getMetadataID() == SQL_FALSE ?
+                stringTableFilter : "%" );
 
-        However, a zero-length search pattern-        zero -    */
-    QStringList stringlistTables = getTables( stringCatalog, stringSchema, "%" ); 
-
-    /* setup regex as needed */
-    BOOL bWildCard = ( getStatement()->getMetadataID() == SQL_FALSE );
-    QString stringWildCard = stringTableFilter;
-    QRegExp regexWildCard;
-    regexWildCard.setPatternSyntax( QRegExp::Wildcard );
-
-    if ( bWildCard )
-        regexWildCard.setPattern( stringWildCard.replace( '%', '*' ) );
-
     for ( int n = 0; n < stringlistTables.count(); n++ )
     {
-        BOOL bMatch;
-
-        if ( stringTableFilter.isNull() )
-            bMatch = true;
-        else if ( bWildCard )
-            bMatch = regexWildCard.exactMatch( stringlistTables[n] );
-        else
-            bMatch = stringlistTables[n] == stringTableFilter;
-
-        if ( bMatch )
-        {
-// printf( "[PAH][%s][%s][%d] TABLE: %s\n", __FILE__, __FUNCTION__, __LINE__,
stringlistTables[n].toLatin1().data() );
-            nReturn = doAppendColumnsColumns( stringCatalog, stringSchema,
stringlistTables[n], stringColumnFilter );
-            if ( !SQL_SUCCEEDED( nReturn ) )
-                break;
-        }
+        nReturn = doAppendColumnsColumns( stringCatalog, stringSchema,
+                stringlistTables[n], stringColumnFilter );
+        if ( !SQL_SUCCEEDED( nReturn ) )
+            break;
     }
 
     MYODBCDbgReturn( nReturn );
@@ -2756,4 +2636,66 @@
     MYODBCDbgReturn( SQL_SUCCESS );
 }
 
+QStringList MResultPlus::filterByWildcard( QStringList items, QString wildcard)
+{
+    QStringList result;
+    QStringList::const_iterator i;
+    QRegExp regex("", Qt::CaseInsensitive, QRegExp::Wildcard);
 
+    /* replacements for transforming the wildcard to a regex */
+    const char *replaceBefore[] = {"%", "_"};
+    const char *replaceAfter[] = {"*", "?"};
+    const int replacements = 2;
+
+    int j, k, pos;
+
+    if(wildcard.isNull())
+    {
+        /* null wildcard matches all */
+        regex.setPattern("*");
+    }
+    else
+    {
+        /* fix up the wildcard to a regex, leaving escaped chars alone */
+        for(j = 0; j < replacements; ++j)
+        {
+            QString replpattern;
+            replpattern.append("([^\\\\]|^)").append(replaceBefore[j]);
+            QRegExp replregex(replpattern);
+
+            QString escpattern;
+            escpattern.append("\\\\").append(replaceBefore[j]);
+            QRegExp escregex(escpattern);
+
+            pos = 0;
+            /* first fix the wildcard chars */
+            while((pos = replregex.indexIn(wildcard, pos)) != -1)
+            {
+                QString match = replregex.cap(1);
+                wildcard.replace(pos,
+                        match.length() + strlen(replaceAfter[j]),
+                        match + replaceAfter[j]);
+            }
+
+            pos = 0;
+            /* next fix the escaped chars */
+            while((pos = escregex.indexIn(wildcard, pos)) != -1)
+            {
+                QString match = replregex.cap(1);
+                wildcard.replace(pos, 2, replaceBefore[j]);
+            }
+        }
+
+        regex.setPattern(wildcard);
+    }
+
+    /* actually filter the list */
+    for(i = items.begin(); i != items.end(); ++i)
+    {
+        if(regex.exactMatch(*i))
+            result += *i;
+    }
+
+    return result;
+}
+

Modified: trunk/SDK/MYSQLPlus/Library/MResultPlus.h
===================================================================
--- trunk/SDK/MYSQLPlus/Library/MResultPlus.h	2006-11-07 21:51:10 UTC (rev 662)
+++ trunk/SDK/MYSQLPlus/Library/MResultPlus.h	2006-11-08 23:57:29 UTC (rev 663)
@@ -246,6 +246,11 @@
                                         const QVariant &variantGrantee,
                                         const QVariant &variantPrivilege,
                                         const QVariant &variantIsGrantable );
+
+    /*!
+        Filter a list of items by an SQL-style wildcard.
+    */
+    QStringList filterByWildcard(QStringList items, QString wildcard);
 };
 
 #endif

Modified: trunk/SDK/MYSQLPlus/Library/MResultRes.cpp
===================================================================
--- trunk/SDK/MYSQLPlus/Library/MResultRes.cpp	2006-11-07 21:51:10 UTC (rev 662)
+++ trunk/SDK/MYSQLPlus/Library/MResultRes.cpp	2006-11-08 23:57:29 UTC (rev 663)
@@ -317,7 +317,7 @@
     switch ( getBuffered() )
     {
         case BUFFERED_UNBUFFERED:
-            pRes = mysql_use_result( getMySQL() );      // bring rows to client as needed
                               // bring rows to client as needed
+            pRes = mysql_use_result( getMySQL() );      // bring rows to client as needed
             break;
         case BUFFERED_MYSQL_PLUS:
             pRes = mysql_use_result( getMySQL() );      // bring rows to client as needed

Thread
Connector/ODBC 5 commit: r663 - trunk/SDK/MYSQLPlus/Libraryjbalint9 Nov
  • Re: Connector/ODBC 5 commit: r663 - trunk/SDK/MYSQLPlus/LibraryPeter Harvey9 Nov