List:Commits« Previous MessageNext Message »
From:Peter Harvey Date:November 9 2006 10:17pm
Subject:Re: Connector/ODBC 5 commit: r663 - trunk/SDK/MYSQLPlus/Library
View as plain text  
This patch ok.

--
Peter

jbalint@stripped wrote:

>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�that is, a valid pointer to a string
> of length 
>-        zero � matches only the empty string ("").
>-    */
>-    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�that is, a valid pointer to a string
> of length 
>-        zero � matches only the empty string ("").
>-    */
>-    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�that is, a valid pointer to a string
> of length 
>-        zero � matches only the empty string ("").
>-    */
>-    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
>
>
>  
>


-- 
Peter Harvey, Software Developer
MySQL AB, www.mysql.com

Are you MySQL certified?  www.mysql.com/certification


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